4、聚合函数查询
一、聚合函数
(1)COUNT()函数
count(*) 返回数据表中的记录数(包含NULL值的空行)除count(*)外,其余聚合函数都会忽略空值
substring(被截取的字符串,从第几位开始截取,截取长度)查询图书编号第一位到第五位是97871的行数
Select count(distinct 列名/字段名) from 表名; distinct是为避免重复计算相同的值
(2)SUM()函数和AVG()函数
SUM()函数的作用是求出表中某个列取值的求和,AVG()函数的作用是求出表中某个列取值的平均值
(3)MAX()函数和MIN()函数
MAX()函数的作用是求出表中某个列取值的最大值,MIN()函数的作用是求出表中某个列取值的最小值
二、分组聚合查询
(1)GROUP BY子句
1_1按单列分组
按照ReaderID列进行分组,记录每个读者的借书次数
1_2按多列分组
(2)HAVING子句
分组之前的条件要用WHERE关键字筛选记录,而分组之后的条件要用关键字HAVING子句筛选记录。
(3)GROUP BY 子句与WITH ROLLUP
画框线的部分能够使汇总行输出并输出在最后一行
5、多表连接查询
一、交叉连接
其中框线内容可以省略,交叉连接是没有where子句的语句
二、内连接(等值连接、不等值连接、自然连接)
2_1等值连接
在ON子句中连接两个表的条件称为连接条件,当连接条件中的比较运算符是“=”时,称为等值连接,通过inner join 关键字把多个表连接;
2_2不等值连接
比较运算符为“!=”时,称为不等值连接
2_3自然连接
可同时连接多个表,在自然连接时,会自动根据两张表中相同的列名进行数据的匹配。
2_4自连接
在borrow表中,选出和BookID的ReaderID相同的ReaderID
三、外连接
外连接生成的结果集不仅包含符合连接条件的行数据,而且还包括左表(左外连接时的表)或右表(右外连接时的表)中所有的数据行。
3_1左连接
book是主表,borrow是从表
为从表中没有对应的地方添加NULL值
3_2右连接
右连接右边的是主表,左边是从表
从表中没有匹配值的地方添加NULL值
6、子查询
子查询的类型:标量子查询(包含一个行子查询和列子查询);表子查询(返回一个表);行子查询(返回一行);列子查询(返回一列)
子查询一般用在主查询的WHERE子句或HAVING子句中,与比较运算符或逻辑运算符一起构成WHERE筛选条件或HAVING筛选条件。
(1)选择列表中的子查询
子查询内部和外部一般不是同一个表,取book表中的Price来进行输出
(2)子查询生成派生表
当子查询的结果返回一个表(表子查询)时,则可以把该表子查询作为数据源。在from子句中可以使用子查询的结果集作为外层查询的源表,结果集也称为派生表,可以为派生表定义一个别名。
(3)WHERE子句中的子查询
3_1子查询与比较运算符组成条件
输出价格低于平均价格的书籍信息
3_2使用带IN关键字的子查询
当子查询的结果返回一行或返回一列时,就不能使用比较运算符,而要使用IN关键字,IN关键字用于检测给定的一个值是否存在于多个值的列表中
Where 查询表达式 IN (子查询语句)
3_3使用带EXISTS关键字的子查询
3_4使用ANY、SOME、或ALL的子查询
3_4_1使用ANY、SOME的子查询
查询男生中比某个女生出生年份晚的学生姓名和出生年份
3_4_2使用ALL的子查询
ALL的用法和ANY或SOME一样,也是把列值与子查询结果进行比较,但它不是要求任意结果值的列值为真,而是要求所有列的结果都为真。
查询男生中比所有女生出生年份晚的学生姓名和出生年份。
(4)用子查询插入、修改或删除记录
4_1用子查询插入记录
将book表中的BookID为9787111636222的行添加到book2表中
4_2用子查询修改记录
修改book2表中的BookID,将其改为数据结构这个书籍的BookID
4_3用子查询删除记录
删除book2表中,BookID和数据结构BookID相同的书籍的信息。