SELECT sex, MAX(salary), MIN(salary), AVG(salary)
FROM emp
GROUP BY sex;
5.MySQL复杂查询 —— 跨表/多表查询 —— 了解
查询结果集中的数据来自于多个不同的表。
示例:查询每个员工的姓名及其所在部门的名称
SELECT ename, dname
FROM emp, dept ; #笛卡尔积!错误!
-----------------------------------------------------------
SELECT ename, deptId, did, dname
FROM emp, dept
WHERE deptId = did ; #跨表查询必须有连接条件
注意:上述写法是SQL-92版本中的写法。存在一定的缺陷:
(1)无法显示没有部门的员工 —— KING
(2)无法显示没有员工的部门 —— 测试部
SQL-99标准对此进行了改变,但是SQL变得很复杂,有四种写法:
(1)内连接查询:inner join ... on ...
SELECT ename, dname
FROM emp INNER JOIN dept
ON deptId=did ;
#内连接的效果与SQL-92标准完全一样
(2)左外连接查询: left outer join ... on ...
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON deptId=did ; #13+1
#可以显示出“左侧表”中所有的记录!即使右侧表中没有对应的记录
(3)右外连接查询:right outer join ... on ...
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON deptId=did ; #13+1
#可以显示出“右侧表”中所有的记录!即使左侧表中没有对应的记录
(4)全外连接查询:full join ... on ...
SELECT ename, dname
FROM emp FULL JOIN dept
ON deptId=did ; #13+1+1
#可以显示出“右侧表”和“右侧表”中所有的记录!—— MySQL不支持
课外小知识:如何解决MySQL不支持全连接的问题 —— 使用结果集的合并 select ename, salary from emp_us ; select ename, salary from emp_cn ; |
结果集的合并:UNION,把两条查询语句的结果合并为一个大结果 (select ename, salary from emp_us) UNION (select ename, salary from emp_cn) ; 两个结果集中的相同数据只显示一次 |
(select ename, salary from emp_us) UNION ALL (select ename, salary from emp_cn) ; 两个结果集中的相同数据各自显示 |
练习:查询出员工姓名及其所在部门的名字,要求必须显示出所有的员工和所有的部门:左外连接合并上右外连接 ( SELECT ename, dname FROM emp LEFT OUTER JOIN dept ON deptId=did ) UNION ( SELECT ename, dname FROM emp RIGHT OUTER JOIN dept ON deptId=did ) ;
|
练习:查询出员工姓名及其所在部门的名字,要求必须显示出所有的员工和所有的部门:左外连接合并上右外连接 ( SELECT ename, dname FROM emp LEFT OUTER JOIN dept ON deptId=did ) UNION ( SELECT ename, dname FROM emp RIGHT OUTER JOIN dept ON deptId=did ) ; |