您的位置:首页 > 数据库 > MySQL

MySQL复杂查询 —— 跨表/多表查询,如何解决MySQL不支持全连接的问题 —— 使用结果集的合并

2018-07-18 23:39 423 查看

  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

) ;

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐