分组查询(重点)
介绍分组查询
分组的目的主要就是为了进行数据统计和汇总操作,可以将多行数据汇总成一行。
分组一般都会和聚合函数一起使用,常用的聚合函数:
sum(列名):对指定列的数据进行求和操作。
avg(列名):对指定的列的数据进行求平均值。
max(列名):求最大值
min(列名):求最小值
count():计算个数
【注意】:如果没有分组的情况下,如果要使用聚合函数则select后面只能存在聚合函数,不能有其他列名。
分组查询语法:
select [列名,列名,...],聚合函数,...from 表名
[where 过滤条件]
group by 分组列名,分组列名,...
[having 分组过滤条件]
【注意】:
1、在select后面出现的列名(聚合函数除外),则必须要出现在group by 后面,否则报错。2、在group by后面的列名并不一定要出现在select后面,按需要设置。
3、如果进行过滤的那个值是分组之后计算出来的值,则不能使用where过滤,必须要使用having。
4、为了提高查询效率,在分组之前能使用where过滤掉的数据进行提前过滤,然后再分组,不要使用having来过滤。
最后就是能用分组实现去重操作
排序查询
①order by
语法:order by 排序列 [desc|asc],排序列 …
- 如果在排序的时候使用了多个列,则先按照第一列进行排序,如果第一列有相同的数据,则再将相同的数据按照第二列排序,以此类推。
②行号:rownum
数据库中的表中默认没有行号的,
但是可以在查询的时候使用rownum来显示行号
使用方法:
SELECT *,ROWNUM 行号 FROM 表
多表关联查询
1、使用多表关联查询,会涉及众多表的操作,若表的名称过长,设置别名进行操作是一个好的选择。
from 表名 别名
;
关联查询:
普通关联:
语法:
select a.*,b.* from 表A a,表B b ……[where a.关联字段=b.关联字段,……]
;
【注意】:如果进行普通关联的时候没有设置关联条件则,最后的结果是一个笛卡尔积。
【执行结果】:符合关联条件的数据才会被查询出来,其他的被过滤掉。
内连接(inner join)
语法:
select * from 表A a [inner] join 表B b on a.关联字段=b.关联字段 join 表C c on c.关联字段=a|b.关联字段
;
如果内连接和普通连接都不加条件,出来的结果都将是笛卡尔积
外连接(outer join)
左外连接(left [outer] join):
语法:
select * from 左表 a left [outer] join 右表 b on a.关联字段=b.关联字段
;
【结果】:显示左表中所有的数据,右表只显示符合关联条件的数据
右外连接(right [outer] join)
语法:
select * from 左表 a right [outer] join 右表 b on a.关联字段=b.关联字段
;
【结果】:显示右表中所有的数据,左表只显示符合关联条件的数据
全外连接(full [outer] join)
语法:
select * from 左表 a full [outer] join 右表 b on a.关联字段=b.关联字段
;
【结果】:左右表都会显示全部的数据
自然连接(natural join)
语法:
select * from 表A natural join 表B
;
【注意】:自然连接不需要手动设置关联条件,系统会自动寻找两张表中名称相同的列进行关联,
如果没有相同列名的列,则最后结果是一个笛卡尔积
自连接(自己和自己连接)
如果表中有一列的值引用了自己的主键,则叫做自引式外键。
交叉连接(cross join)
语法:
select * from 表A cross join 表B
;
【注】:交叉连接的结果就是一个笛卡尔积
子查询
在一条sql语句中再嵌套一条或者是多条select语句,叫做子查询,简称:套娃
单行子查询:
当子查询返回的结果只有一行数据的时候叫做单行子查询。
一般单行子查询配合单行选择运算符一起使用
【注意】
1、单行子查询中只能返回一行数据,如果子查询的结果返回了多行,则提示:单行子查询返回多个行。
2、如果子查询返回的行中有多个列,则系统提示:值过多
多行子查询:
子查询的结果返回多行数据
一般配合多行选择运算符一起使用:any all in
关联子查询:
子查询执行离不开外查询,外查询的执行也必须要依赖子查询结果。