问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SQL语句详解:DQL查询

创作时间:
作者:
@小白创作中心

SQL语句详解:DQL查询

引用
CSDN
1.
https://blog.csdn.net/m0_72900498/article/details/146496735

本文将详细介绍SQL中的DQL查询语句,包括简单查询、条件筛选、分组查询、排序、筛选条数以及多表查询等内容。通过具体的SQL语句和示例,帮助读者系统地学习和掌握SQL查询语句。

DQL

1、简单查询

select 字段列表 from 表名
where 条件
group by 字段, 字段, ...
having 条件
order by 字段, 字段 desc, ....
limit m, n

1.1 基本的查询语句

最简单的select

select 字段列表 from 表名

在指定表中,查询指定字段,查询出所有的记录。

1) 字段列表,可以根据需要设定。

2) 也可以使用通配符*,代替所有的字段。效率低。

select * from 表名;

3) 可以使用as 为表,字段添加别名。as也可以省略。

select * from 表名 as 别名
select 字段名1 as 别名, 字段名2 as 别名 from 表名

5)如果字段/表名等与SQL中的关键字冲突,可以使用反单引号(``)(ESC下面的键)包括起来

6)SQL不区分大小写:

关键字不区分大小写

字符串的比较也不区分大小写(比如筛选TOM和tom,是一样的)

1.2 条件筛选

where子句(带条件筛选的语句)

在删除,更新,查询操作时,都可以使用where进行记录的筛选

对查询记录进行筛选。只有符合筛选条件的记录,才会出现在查询结果中。

where后面可以跟以下运算符:

1) 比较运算符

运算符 作用

null值不会参与比较运算

2) 逻辑运算符

**逻辑运算符的优先级小于比较运算符

not>and>or

使用()改变条件运算的顺序**

3)其他运算符:

1、 Null值的判断

空值的判断不可以使用=null (比如=null这种是查询不出来结果的)

必须使用is null 或者is not null

2、between…and…

判断范围符合一个区间的值,闭区间。

相当于 字段 >= 值 and 字段 <=值。

#工号在2-3之间的所有员工:
select * from staff where number between 2 and 3;
#等价表达:
select * from staff where number >= 2 and number <= 3;

3、模糊查询

模糊查询作用:查询时根据一部分进行查询

字段 like '_%'

规则: %:占位符,表示匹配任意多个任意字符,可以是0个,也可以是多个。

_:占位符,表示匹配任意的一个字符。

#模糊查询:查询姓名第2个字母是o的用户:
select * from staff where name like '_o%';
#姓名首字母是J:
select * from staff where name like 'j%';
#查询姓名尾字母是k的
select * from staff where name like '%k';
#名字中带e的:
select * from staff where name like '%e%';

SQL不区分大小写的,like,=都不区分大小写。

4、 in/not in(集合判断)

字段 in (值, 值, 值...)
字段 not in (值, 值, 值...)
#查询工号是1,2,3的员工
select * from staff where number in (1,2,3);
#查询工号不是1,2,3的员工
select * from staff where number not in (1,2,3);

1.3 分组查询

1.3.1 聚合函数

聚合函数:可以对查询记录进行统计的方法

可以对查询结果进行聚合运算,也可以与分组进行联用,此时以组为单位进行聚合。

聚合函数在运算时会忽略null值。

**注意:

count()括号里面的字段只能是*或者一个字段,不可以写两个字段

聚合函数可以用在查询字段筛选

在Where子句中不可以使用聚合函数**

#统计所有性别为男的员工数量:
select count(*) from staff where sex = '男';
#等价表达:
select count(sex) from staff where sex= '男';
#这样是不可以的:
select count(sex,name) from staff where sex = '男';
#找到年龄最大的员工
select min(birthday) from staff
#统计所有员工工号的和
select sum(number) from staff
#在Where子句中不可以使用聚合函数,下面表达是错误的:
select * from staff where number > min(number)

1.3.2 分组查询

使用group by 在查询到的数据中,进行分组,指定字段相同的记录会被合并为一组。

group by 字段名, ...
group by 1, 2, ...  // 字段的下标,从1开始
#根据性别进行分组:
select * from staff group by sex;
#分别统计性别不同的人数
select count(*) from staff group by sex;
#上述,当聚合函数与分组联用时,这时是对分组后的数组进行单独的统计

distinct

去重:去除指定字段重复数据

合并重复数据,将指定字段值相同的记录合并为一条记录。

只能显示合并的列的数据。

1.3.3 having

如果要对分组后的数据再进行筛选,可以在Group By之后使用having

select * from 表名 
where 子句
group by 字段
having 条件  

比如:分组统计不同性别的数量,再找出数量>2的

select sex,count(*) from staff group by sex having count(*)>2

having,可以使用聚合函数

having后面跟的也是条件,与where不同,having的条件是在分组之后进行筛选。

Select执行的过程:

1) 先从表中根据Where提取数据。

2) 再进行分组。

3) 分组后,再进行having筛选。

having和where的区别:

1) 语法: where写在group by 的前面,having是写在group by的后面。(having之前也可以没有group by)注意:group by 可以没有,where 后面也可以跟having。

2) 执行时机: where先执行where条件判断是在从表中筛选记录,having是在分组后执行。

3) 聚合: where不能与聚合函数联用,having是可以的。

1.4 排序

order by

对查询结果按照一定的顺序进行排序。

order by 字段 asc/desc, 字段 asc/desc...
select * from 表名
where 子句
group by字段
having 条件
order by 字段 asc/desc, 字段 asc/desc...

1) asc表示升序,desc降序。

升序:默认是升序排序,asc可以省略。

降序:desc必须要写

2) 排序时可以有多个字段,首先按照第一个字段进行排序,当第一字段值存在相同时,这时才按第二字段进行排序。

#姓名升序
select * from staff order by name;
#姓名降序
select * from staff order by name desc;
#先按照性别排序,性别相同的再按照姓名排序
select * from staff order by sex desc,name desc;

1.5 筛选条数

limit

对查询记录进行截取。

limit n      // 从下标为0的记录提取,总共提取n条记录
limit m, n   // 从下标为m的记录提取,总共提取n条记录

比如:

select *from staff order by name limit 2,2;
limit作用:常用于对查询数据进行分页。 
如果现在每页要显示10条记录,那么第N页应该查询哪些记录。
分析:第1页,从0开始
     第2页,从10开始
     第3页,从20开始
     ......
     第N页,从(N-1)*10开始,则limit (N-1)*10,10
如果现在每页要显示10条记录,一共有M条记录。那么总共有多少页才能把M条记录打印出来?(页面数如何计算?)
(M+9)/10
select * from 表名
where 子句
group by字段
having 条件
order by 字段 asc/desc, 字段 asc/desc...
limit 参数

至此,简单查询的sql语句全部完成。

2、多表查询

2.1 子查询

在一个SQL语句中,又包含了另一个SQL语句。子查询可以存在于insert,update,delete,select语句中。

2.1.1 insert语句中的子查询

insert into 表名 (字段列表) select ...

子查询的字段,必须与插入字段一一对应,不要求名字对应。

delete

delete的子查询包含在where子句中。

update

updeta的子查询包含在where子句中。

select

1、作为查询字段

select 字段列表, (select ...) from 表名;

要求:

1) 子查询,最多只能返回一条结果。

2) 子查询,最多只能有一个列。

2、子查询代替表

select 字段列表 from (select ...) as 别名;

注意:子查询必须给一个别名。

2.1.2 where 中使用子查询

1) in/not in

where 字段 in (select ...) 
where 字段 not in (select ...)

int/not in 时,null值的记录,都会被过滤掉

子查询只能返回一个列。

先执行子查询,再执行父查询。

2) exists 存在/not exists

where exists (子查询)
where not exists (子查询)
select * from staff where exists(select * from staff_temp where staff.name =staff_temp.name);

子查询中可以使用父查询的字段进行判断。

先执行父查询,将每一条要筛选的记录,带入到子查询,

如果子查询的结果为空,则父查询的记录不满足条件。

如果子查询的结果不为空,则父查询的记录满足条件。

先执行父查询,再执行子查询。每检查一条父查询中的记录,都会执行一次子查询。

因此,这个查询效率很低。

3) any,all,some

select 字段列表 from 表名
where 字段 比较运算符 any/all/some (select ....)

2.1.3 使用子查询代替表

select * from(select * from ....)as 别名

注意:必须为子查询指定一个别名

2.1.4 使用子查询作为字段的值

select 
(select ...)
from ....

2.2 多表连接查询

交叉连接/等值连接

select * from 表1, 表2
where 表1.字段 = 表2.字段

上述操作得到的是两个表记录的迪卡尔乘积。

内连接

select * from 表1
inner join 表2 on 连接条件

inner 是可以省略的。

外连接

分为左外连接和右外连接

在使用内连接和交叉连接时,只有两个表中有对应数据的记录,才会出现在查询结果中。

外连接在进行连接查询时,可以保证主表中的记录,无论在从表中是否有对应记录,都会出现在查询结果中。

如果在从表中没有对应记录,这时将使用null值填充从表中的所有数据。

左外连接

select 字段列表 from 主表
left outer join 从表 on 连接条件

左连接时,左表是主表,右表是从表。

outer也是可以省略。

右外连接

select 字段列表 from 从表
right outer join 主表 on 连接条件

当统计数据时,有一个表中的所有的记录都必须出现在查询结果中,这时必须得用外连接。

查询结果的拼接(笔试和面试重点)

select ...
union   / union all
select ...

union拼接时,会合并相同的记录。

union all拼接时,不会合并相同的记录。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号