1.复杂查询
(1)聚合查询/分组查询
示例:查询出所有的员工数量
SELECT COUNT(ename) FROM emp;
练习:使用部门编号这一列查询员工的数量
SELECT COUNT(deptId) FROM emp;
推荐:使用员工编号查询员工数量
SELECT COUNT(eid) FROM emp;
查询所有员工的工资总和
SELECT SUM(salary) FROM emp;
查询出所有男员工的工资总和
SELECT SUM(salary) FROM emp WHERE sex=1;
查询出所有女员工的平均工资
SELECT AVG(salary) FROM emp WHERE sex=0;
SELECT SUM(salary)/COUNT(eid) FROM emp WHERE sex=0;
查询出男员工工资最高的是多少
SELECT MAX(salary) FROM emp WHERE sex=1;
查询出年龄最大的员工的生日是多少
SELECT MIN(birthday) FROM emp;
查询出男女员工平均工资,最高工资,最低工资分别是多少
SELECT sex,AVG(salary),MAX(salary),MIN(salary) FROM emp GROUP BY sex;
查询每个部门员工的数量,最高工资,平均工资
SELECT deptId,COUNT(eid),MAX(salary),AVG(salary) FROM emp GROUP BY deptId;
查询所有员工出生的年份
SELECT YEAR(birthday) FROM emp;
查询出1991年出生的员工有哪些
SELECT * FROM emp WHERE YEAR(birthday)=1991;
(2)子查询
查询出研发部下的员工有哪些
步骤1:查询出研发部的部门编号
SELECT did FROM dept WHERE dname='研发部';
步骤2:通过部门编号查询对应的员工
SELECT * FROM emp WHERE deptId=10;
综合:
SELECT * FROM emp WHERE deptId=( SELECT did FROM dept WHERE dname='研发部');
查询出比king工资高的员工有哪些
步骤1:查询出king的工资
SELECT salary FROM emp WHERE ename='king';
步骤2:查询出比10000工资高的员工
SELECT * FROM emp WHERE salary>10000;
SELECT * FROM emp WHERE salary>( SELECT salary FROM emp WHERE ename='king');
查询出和tom同一年出生的员工有哪些
步骤1:查询出tom出生的年份
SELECT YEAR(birthday) FROM emp WHERE ename='tom';
步骤2:查询出1990年出生的员工有哪些
SELECT * FROM emp WHERE YEAR(birthday)=1990;
SELECT * FROM emp WHERE YEAR(birthday)=( SELECT YEAR(birthday) FROM emp WHERE ename='tom') AND ename!='tom';
(3)多表查询(跨表查询)
示例: 查询出所有员工的姓名及其部门名称
SELECT ename,dname FROM emp,dept;
错误:笛卡尔积
解决:添加查询条件
SELECT ename,dname FROM emp,dept WHERE deptId=did;
1)内连接——和之前的查询结果一样
SELECT ename,dname FROM emp INNER JOIN dept ON deptId=did;
2)左外连接——左侧表中所有记录都显示
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did;
哪个表在前,哪一个就是左;OUTER可以省略
3)右外连接——右侧表中所有记录都显示
SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did;
哪个表在后,哪一个就是右;OUTER可以省略
4)全连接 FULL JOIN ... ON
同时显示左侧和右侧表中所有记录
mysql不支持
UNION ALL 不合并相同的记录
UNION 合并相同的记录
SELECT ename,dname FROM emp_bj
UNION
SELECT ename,dname FROM emp_cq;
SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did
SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did;
合并左外和右外连接就是全连接的结果