对连接查询的知识总结
1、分类
a、内连接方式
分为三种形式:MySql的方言、SQL标准、自然
b、外连接方式
分为三种形式:左外连接、右外连接、全外连接
2、准备知识
a、关于笛卡尔积的理解
b、在进行多表操作的时候,一般会使用起别名的方式,来区分不同表
3、关于内连接的学习
a、内连接的特点
1、结果集的行=笛卡尔积的结果
2、结果集的列=a表的列+b表的列(即:两个表的列数之和)
b、MySql的方言
查询emp、dept中所有的结果集,即笛卡尔积
select *
from emp,dept;
———————
起别名,进行标识
select *
from emp e1,emp e2;
———————
查询emp和dept两表的结果集,查询所有员工信息及所在部门信息
select *
from emp e,dept d
where e.deptno=d.deptno; 这里是去积条件
———————
查询员工的名字及所在部门的名称
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno; 这里是去积条件
———————
查询张飞的工资及所在部门名称
select e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.ename=’张飞’;
——————————————-
c、SQL的标准方式
同样是上面的两个要求,使用标准格式进行改写
查询emp和dept两表的结果集,查询所有员工信息及所在部门信息
select *
from emp e inner join dept d on e.deptno=d.deptno;
----------------------------------------------------
查询员工的名字及所在部门的名称
select e.ename,d.dname
from emp e inner join dept d on e.deptno=d.deptno;
----------------------------------------------------
查询张飞所在部门信息及工资
select e.sal,d.*
from emp e inner join dept d on e.deptno=d.deptno
where e.ename='张飞';
----------------------------------------------------
d、自然方式查询
备注:自然方式查询与上面两种方式的区别:省去了去除笛卡尔积的操作
select *
from 表1 别名1 natural join 表2 别名2;
-------------------------------------------------------
select *
from emp e natural join dept d
where e.name='张飞';
*/
/下面是对内连接方式的练习/
/这些是MySql的方言/
SELECT *
FROM emp,dept;
SELECT * FROM emp;
SELECT *
FROM emp e,dept d;
SELECT *
FROM emp e,dept d
WHERE e.deptno=d.deptno
ORDER BY e.empno;
/这里丢失了张三,因为他没有部门/
SELECT *
FROM emp e,dept d
WHERE e.deptno=d.deptno AND e.ename=’张飞’;
SELECT e.ename,e.sal,d.*
FROM emp e,dept d
WHERE e.deptno=d.deptno AND e.ename=’张飞’;
/—————————————————/
/下面简单验证自然方式查询/
SELECT *
FROM emp e NATURAL JOIN dept d;
SELECT e.ename,e.sal,d.*
FROM emp e NATURAL JOIN dept d
WHERE e.ename=’张飞’;
/下面是内连接标准方式的学习/
SELECT *
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
ORDER BY e.empno;
SELECT e.ename,e.sal,d.*
FROM emp e INNER JOIN dept d ON e.deptno=d.deptno
WHERE e.ename=’张飞’;
/使用自然方式存在一些缺点:这种方式虽然完成了自动去积的操作,但是它同时把两张表的主外键进行了合并/
/=================================================================================================/
/*
DDD对于外连接知识的学习
备注:由于内连接存在查询过程中将一些数据丢失的问题,这里引入了外连接的知识
例如:上面的表中数据张三,由于没有隶属的部门,采用去积操作的时候,就被派出了
或者采用其他去积条件的时候仍然会丢失其他数据
1、分类
a、左外连接查询
b、右外连接查询
c、全外连接查询
2、左外连接的学习
a、语法格式
select *
from 表1 别名1 left outer join 表2 别名2 on 去积条件
----------------------------------------------------
b、具体操作实现
查询所有员工的信息及其对应的部门信息
select *
from emp e left outer join dept d on e.deptno=d.deptno;
-----------------------------------------------------
查询所有员工及其直接领导的姓名和员工编号
select
from emp e1 left outer join emp e2 on e1.mgr=e2.empno;
------------------------------------------------------
3、右外连接的学习
a、语法格式
select *
from 表1 别名1 right outer join 表2 别名2 on 去积条件;
------------------------------------------------------
b、对于上面想要达到的查询目的使用右外连接也可以实现
查询所有员工信息及所对应的部门信息
分析:由于存在员工不存存在隶属部门,所以想要把员工都显示出来,应当把员工表放在右边
select *
from dept d right outer join emp e on e.deptno=d.deptno;
-------------------------------------------------------
查询所有员工和他的直接上的名字和员工编号
分析:由于有的员工不存在直接上级,所以讲代表领导的那一张员工表放在右边
select e1.ename,e1.mgr,e2.ename,e2.empno
from emp e1 right outer join emp e2 on e1.mgr=e2.empno; e2表作为了领导表
-------------------------------------------------------------------------
4、全外连接的知识
备注:根据上面对左外连接和右外连接的学习,仍然会出现一种特殊情况,即:将左右两边的数据都显示出来
a、语法结构
select *
from emp full outer join dept on emp.deptno=dept.deptno;
———————————————————
b、但是这种全外连接的方式,在MySql中不支持
但是存在一种代替方式
使用union(去除重复)进行合并结果集的操作,即:将左外连接和右外连接的结果接进行union连接
5、总备注
a、对于单独的左外连接和右外连接,哪一张表放在左边或右边,它的数据就可以都显示出来,另一端的表没哟相关记录的时候
则使用null补足
b、对于全外连接下面的第一个测试是不正确的,进行union操作的时候要满足,列数相同、列类型相同的条件
c、左外连接:左边表数据完整,右边表数据不够,使用null补充
右外连接:右边表数据完整,左边表数据不够,使用null补充
*/
/对左外连接的学习验证/
SELECT e1.ename,e1.mgr,e2.empno,e2.ename
FROM emp e1 LEFT OUTER JOIN emp e2 ON e1.mgr=e2.empno;
SELECT e.ename,e.deptno,d.*
FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
/对右外连接的学习验证/
SELECT *
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno
ORDER BY e.empno;
SELECT *
FROM dept d RIGHT OUTER JOIN emp e ON e.deptno=d.deptno;
/全外连接,第一种验证不正确,看第二种/
SELECT *
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno
UNION
SELECT *
FROM dept d RIGHT OUTER JOIN emp e ON e.deptno=d.deptno;
SELECT *
FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno
UNION
SELECT *
FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno;
/**/