MySQL复杂查询 —— 跨表/多表查询,如何解决MySQL不支持全连接的问题 —— 使用结果集的合并
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 ) ; |
- 如何解决PHP使用mysql_query查询超大结果集超内存问题
- 如何解决PHP使用mysql_query查询超大结果集超内存问题
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 在sqlserver中如何使用CTE解决复杂查询问题
- 在sqlserver中如何使用CTE解决复杂查询问题
- JSP连接MYSQL查询编码问题解决
- Mysql联合查询UNION和Order by同时使用报错问题的解决办法
- Linq 此提供程序只支持对返回实体或投影(包含所有标识列)的有序查询使用 问题的解决
- Delphi7使用MyODBC连接Mysql乱码问题解决
- 使用连接查询解决一对一实体关联查询时的懒加载问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题(非原创,摘自书中)
- Mac os 解决无法使用localhost连接mysql问题
- mysql:如何合并两个查询的结果集的数据
- 新手求助:测试连接MYSQL时提示如下,请教问题出在哪?如何解决?
- 如何用dot net连接MySQL,及中文乱码问题解决
- MYSQL索引问题:索引在查询中如何使用?
- 如何解决使用远程工具登陆mysql,缺乏权限的问题
- 如何用dot net连接MySQL,及中文乱码问题解决
- mysql不支持远程连接的解决办法(#报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用lo
- 如何解决补丁KB967723造成的MYSQL连接错误问题