MySQL查询操作(2)
5 统计查询
5.1 单字段分组统计
eg1: 查询每个部门的人数
eg2: 查询每个部门的部门名称,部门人数,平均工资
如下若使用左连接,我们可以看到结果中少了一个部门,因此正确的做法是使用右连接。
通过右连接解决eg2的问题,并将无人的部门平均工资null设为0输出:
5.2 多字段分组统计
eg: 查询每个部门的部门编号,部门名称,部门人数、平均工资
注:上述语法在MySQL中正确,但在Oracle中语法不正确,在Oracle中必须最后再加一个d.deptNo。由此可见,GROUP BY和ORDER BY后面是可以加多个字段的。
5.3 HAVING
HAVING一般和GROUP BY一起使用,用于完成分组之后的二次筛选工作。
eg1: 查询所有工资大于2000元的职位名称,平均工资,员工人数
eg2: 求出部门人数大于5人的部门,要求显示部门名称,部门编号,部门人数
6 子查询
子查询是在指一个完整的查询语句中,嵌套若干个不同功能的小查询,从而完成一个复杂的查询。
6.1 子查询返回单行单列数据
eg: 查询基本工资比Allen低的员工信息
想要完成这个查询,首先需要查询出Allen的工资,然后将它当做一个条件再去查询。
6.2 子查询返回单行多列数据
eg: 查询与员工7566从事同一工作且领导相同的全部员工信息
想要完成这个查询,首先需要查询出员工7566从事的工作以及他的领导,然后将它当做一个条件再去查询。
6.3 子查询返回多行多列数据
eg: 查询与员工7566,7369从事同一工作且领导相同的全部员工信息
6.4 在FROM语句中使用子查询
如果子查询返回的数据都是多行多列,则可以将其当做一张数据表,并且这种子查询一般出现在FROM语句中。
eg: 查询每个部门的部门编号,部门名称,部门人数,平均工资
6.5 在WHERE语句中使用子查询
如果返回的数据是单行单列,也可以在WHERE语句中使用子查询。
eg: 查询部门名称为accounting的所有员工信息
6.6 在SELECT语句中使用子查询
注:此方式的效率极低。
eg: 查询每个员工的部门名称
7 分页
在使用查询语句时,通常要返回前几条或中间某几行数据,这时可以利用LIMIT来完成。LIMIT语句可以被用于强制SELECT语句返回指定的记录数。
LIMIT接受一个或两个数字参数,参数必须是整数常量。如果给定两个参数,第一个参数是指定第一个返回记录行的偏移量(从0开始),第二个参数是指定返回记录行的最大数目。
语法如下:
SELECT 字段 FROM 表 LIMIT 偏移量,数量
SELECT 字段 FROM 表 LIMIT 偏移量,数量
eg1: 查询emp表的前3条数据
eg2: 在emp表中从第3行开始查询5条数据
8 练习题
针对MySQL查询操作有相应的60道经典练习题。