开发者社区> 余二五> 正文

多表查询

简介:
+关注继续查看
做一个简单的多表查询:
 • 查询emp表和dept表
  Emp表一共有14条记录
  Dept表一共有4条记录
SELECT * FROM emp,dept ;如果直接执行此语句,会发现产生了56条记录
 其中肯定存在大量的重复内容,此内容称为笛卡尔积(表1的数据量*表2的数据量)
那么该如何消除掉笛卡尔积呢?
 消除的方法就是找两张表的关联字段。
 Emp表中有一个deptno字段
 Dept表中有一个deptno字段
此时标准的多表查询语句就必须将两个关联字段进行联系
 SELECT * 
FROM emp,dept
WHERE emp.deptno=dept.deptno ;  去除笛卡尔积
有些时候如果表名称过长,则也可以为表名称起一个别名,之后使用此别名进行查询。
要求:
 查询出雇员的姓名、雇员编号、部门名称、部门位置、职务。
SELECT e.empno,e.ename,e.job,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno ;
思考:
 要求查询出每个雇员的编号、姓名、工资,及每个员工工资对应的等级
 • emp表和salgrade表关联
 • 关联字段是emp中的sal和salgrade的losal及hisal
SELECT e.empno,e.ename,e.sal,s.grade
FROM emp e,salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal ;
进一步思考:
 现在要求根据工资的等级进行以下的显示;
• 如果工资等级为1则显示为E等工资
• 如果工资等级为2则显示为D等工资
• 如果工资等级为3则显示为C等工资
• 如果工资等级为4则显示为B等工资
• 如果工资等级为5则显示为A等工资
要使用decode完成
SELECT e.empno,e.ename,e.sal,
decode(s.grade,1,'E等工资',2,'D等工资',3,'C等工资',4,'B等工资',5,'A等工资') 工资等级
FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal ;
要求:
 查询出每个雇员的姓名、职务及其直接上级的姓名、工资和职务
 Emp表要自己关联自己吧,所以此种关联称为自身连接。
 SELECT e.ename,e.job,m.ename 
FROM emp e,emp m
WHERE e.mgr=m.empno ;
观察以下的代码:
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno;
发现部门一共有四个:10、20、30、40,但是以上的查询中只出现3个部门
此时就需要进行外连接
 • 左外连接:
SELECT e.empno,e.ename,d.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno(+);
 • 右外连接:
 SELECT e.empno,e.ename,d.deptno,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno;
  所以此时40部门出现了
 • (+)在等号的左边表示右连接
 • (+)在等号的右边表示左连接
表连接的基本操作完了,但是除了这些之外SQL:1999语法中又定义了另外一套实现效果一样的语法。(了解)
 
CROSS JOIN表示返回笛卡尔积
 SELECT * 
FROM emp CROSS JOIN dept ;
NATURAL JOIN:根据两个表的关联字段自动进行匹配
SELECT * 
FROM emp NATURAL JOIN dept ;
USING子句:指定要产生连接的列
SELECT * 
FROM emp JOIN dept USING(deptno) ;
 限制:要求emp表和dept表中都必须同时存在deptno列,列的名字不能不一致。
ON子句:指定要进行连接匹配的列
SELECT * 
FROM emp e JOIN dept d ON(e.deptno=d.deptno) ;
右外连接:
 SELECT * 
FROM emp e RIGHT OUTER JOIN dept d ON(e.deptno=d.deptno) ; 
左外连接:
 SELECT * 
FROM emp e LEFT OUTER JOIN dept d ON(e.deptno=d.deptno) ;









本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91210,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL基础-多表查询之内连接
内连接的语法分为两种: 隐式内连接、显式内连接。先来学习一下具体的语法结构。
17 0
MySQL基础-自连接&联合查询
自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接的查询语法:
49 0
MySQL基础-多表查询之外连接
外连接分为两种,分别是:左外连接 和 右外连接。具体的语法结构为:
24 0
多表查询练习第 10 题|学习笔记
快速学习多表查询练习第 10 题
35 0
多表查询练习第 2 题|学习笔记
快速学习多表查询练习第 2 题
41 0
多表查询练习第 7 题|学习笔记
快速学习多表查询练习第 7 题
55 0
多表查询练习第 13 题|学习笔记
快速学习多表查询练习第 13 题
90 0
多表查询练习第 5 题|学习笔记
快速学习多表查询练习第 5 题
56 0
多表查询练习第 8 题|学习笔记
快速学习多表查询练习第 8 题
57 0
多表查询练习第 11 题|学习笔记
快速学习多表查询练习第 11 题
39 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载