您现在的位置是:网站首页> 编程资料编程资料
Mysql学习之数据库检索语句DQL大全小白篇_Mysql_
2023-05-27
444人已围观
简介 Mysql学习之数据库检索语句DQL大全小白篇_Mysql_
1.简单检索数据
博客内容中student表为:

1.1.检索单个列
select + 列名 + from + 表名
1.2.检索多个列
select + 列名1,列名2,列名3......列n + from + 表名
1.3.检索所有列
select + *(表示通配符) +from + 表名
1.4.检索不同的行
使用distinct关键字
select + distinct + 列名 + from + 表名
举个例子:我们想要查询一个班级学生的性别有多少种,那么就不需要把每一个同学的性别都显示出来,只需要把不同性别显示出来就行即distinct返回唯一值
这里有一个注意点,distinct关键字应用于所有列前,不仅仅是前置它的列,如果给出两个列,那么除非指定的两个列都不同,否则所有的行都会被检测出来
1.5.限制检索结果
使用limit关键字
selet + 列名 + from + 表名 + limit + 数字
我们平时select语句返回匹配的行数,我们可以使用limit来限定返回的行数,比如select结果可以返回10行,我们只要前5行,那么就可以使用limit后边参数为5,如果select返回4行,而limit限制的是5行,那么会返回4行。当然limit后边的参数可以有两个,有两种写法
即:
1.selet + 列名 + from + 表名 + limit + 数字1,数字2
2.selet + 列名 + from + 表名 + limit + 数字2 + offset + 数字1
意思是从数字1所代表的行数开始,检索数字2行,第二种写法是在MySQL5之后才支持的
注意检索的第一行为行0,而不是1
1.6.使用完全限制的表名检索
select + 表名.列名 + from + 数据库名.表名
2.排序检索数据
2.1.基本语法
使用order by关键字
select + 列名(可以多个列) + from + 表名 + order by + 列名
两个列名可以不一样
我们日常都可以对员工的工资进行排序,但是有的员工工资一样,这样我们可以在员工工资一样的基础上对年龄等进行排序,这就是按照多个列进行排序
即:
select + 列名(可以多个列) + from + 表名 + order by + 列1,列2
意思是在列1一致的情况下按照列2进行排序,如果列1不一致那么就不会按照列2排序
2.2.指定排序方向
上面我们讲到的排序其实都是默认排序,默认是按照升序(字母按'A'到‘Z‘,数字从小到大)
我们一样可以降序排列
使用desc关键字
select + 列名(可以多个列) + from + 表名 + order by + 列名 desc
那么多个排序规则咋办呢,即我们把一个班的同学按照总分进行降序排序,那么总分一样的按照语文成绩也降序排列,这里我们注意
desc关键字只应用到直接位于其前面的列
所有当我们需要按照多个字段排序只需要在对应字段后边写上对应的排序规则,那么比如我们需要两个字段都降序:
select + 列名(可以多个列) + from + 表名 + order by + 列名1 desc,列名2 desc
其实升序的话我们不用写,因为默认是升序,关键字是asc
按照上边学的,我们做一个例子:
列出年龄最大的学生的姓名性别和数学成绩:
select sname,ssex,smath from student ORDER BY sage desc LIMIT 1
注意order by和limit的位置顺序
3.检索过滤数据
3.1使用简单where子句
select + 列名 + from + 表名 where + 判断条件
where一个特殊操作符:
1.
<>:不等于,其实和!=是一样的
2.between:和and连用表示在指定的两个值之间例如:select age from student where age between 18 and 20
where进行空值检查:
select + 列名 + from + 表名 + where + 列名 + is null
注意这里用到的是is不是=
3.2组合where子句
| 操作符 | 作用 |
|---|---|
| and | 要同时满足and左右两边的条件 |
| or | 满足or一边的条件就行 |
| in | 用来指定条件范围 |
| not | 用来否定条件里边的内容 |
作用and要同时满足and左右两边的条件or满足or一边的条件就行in用来指定条件范围not用来否定条件里边的内容
拿student表来举例子:
1.and:我们查找女生中数学超过90分的学生的所有信息
SELECT * FROM student where ssex=“女” and smath>90
2.or:我们查找年龄大于19岁学生的姓名,或者英语成绩大于90的学生姓名
SELECT sname FROM student where sage>19 or senglish>90
3.in:我们查找年龄为18和19岁学生的姓名
select sname from student where sage in(18,19)
4.not:我们查找除了年龄为18和19岁学生的姓名
select sname from student where sage not in(18,19)
5.我们查找年龄不是20岁的学生的所有信息并且把他们按照数学成绩降序排列,只要第二行的内容:
select * from student where sage not in(20) GROUP BY smath desc LIMIT 1,1
我们注意他们各个关键字的顺序和limit后边参数代表的含义
3.3使用通配符
通配符:用来匹配值的一部分的特殊符号
like: 根据通配符匹配而不是直接相等匹配进行比较
| 通配符 | 作用 |
|---|---|
| % | 表示任何字符出现的任意的次数 |
| _ | 匹配单个字符串长度 |
拿student表来举例子:
1.%:我们查找姓名里边带花的同学的所有信息
select * from student where sname like “%花%”
会有两条结果翠花和如花似玉,%只会匹配一侧(不限字符串长度),如果只是“%花”,那么如花似玉就不会被查找出来。当然,我们想要查找如花似玉也可以这么来查:
select * from student where sname like “%花%玉”
2._:我们查找如花似玉这名优秀的同学:
select * from student where sname like “_花_玉”
%能匹配0个字符和不限长度的字符串,而_只能而且必须匹配1个字符
4.使用正则表达式检索数据
正则表达式是用来匹配文本的特殊串,将一个模式(正则表达式)与一个文本串进行比较
正则表达式常用符号:
| 符号 | 符号作用 |
|---|---|
| . | 匹配单个字符 |
| | | 相当于或的意思 |
| […] | 或的另一种表现形式 |
| - | 表示匹配范围 |
| \\ | 匹配特殊字符 |
| * | 0个或者多个匹配 |
| + | 1个或多个匹配等于{1,} |
| ? | 0个或者一个匹配等于{0,1} |
| {n} | 指定数目的匹配 |
| {n,} | 不少于指定数目的匹配 |
| {n,m} | 匹配数目的范围m不超过255 |
| ^ | 文本的开始 |
| $ | 文本的结尾 |
| [[ :<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
关键字:regexpselect + 列名(可以多个列) + from + 表名 + where + 列名 + regexp + 正则表达式
拿student表来说:
1 . 先说日regexp和like的区别
like匹配整个串然而regexp则是匹配子串
举个例子:
我们用like匹配别为1的学生的姓名
select sname from student where othername like “1”
结果:
风姐
我们把like换成regexp:
select sname from student where othername regexp “1”
结果:
翠花
凤姐
秋香
现在是不是对区别有了很明显的认识 2 ..就是匹配任意一个字符
举个例子,我们查找语文成绩个位数为8的同学的名字:
select sname from student where schinese regexp “.8”
结果:
凤姐
秋香
3.|
举个例子我们查找别名中含1 ton或2的同学的姓名
select sname from student where othername regexp “1 ton|2”
查找结果:
翠花
旺财
如花似玉
4.[....]
举个例子,我们查找别名为1 ton或者2 ton的学生的姓名
select sname from student where othername regexp “[1|2] ton”
运行结果:
翠花
旺财
其实上边就等同于select sname from student where othername regexp “1 ton|2 ton”
也等同于select sname from student where othername regexp “[12] ton” 5.-
举个例子,查找别名中含有小写英文字母的同学的姓名
select sname from student where othername regexp “[a-z]”
运行结果:
翠花
旺财
秋香
如花似玉
6.\\
举个例子我们查找别名中含有.这个字符的同学的姓名
select sname from student where othername regexp “\\.”
查找结果;
无
我们所接触的特殊符号\,[,],等等都可以用\\来转义
7.?我们不拿student表举例子,把书上的例子拿过来:

注意这一句话:?匹配它前面的任何字符的0次和1次
8 .{n}再拿书上的一个例子(其他的几个大括号同理):

这里有一个匹配字符类:

9.^还是书上的例子:

当然^不止可以指串的开始,还可以在集合中(就是[]中)表示否定含义
为表示否定含义举个例子:
[^a-z]:意思是匹配不是a-z的字符
我们拿student表举例子:查找别名不是以a和1开头的同学的名字
select sname from student where othername regexp “^[^a1]”
第一个^限制开头,第二个^表示否定
10.补充一点,不大小写查询
关键字:binary
我们平时查询的字符串都会忽略大小写,所以,可以使用binary不忽略大小写
select + 列名(可以多个列) + from + 表名 + where +
