关于mysql的多表查询

来源:互联网 发布:如何评价极限挑战知乎 编辑:程序博客网 时间:2024/06/09 19:59

对连接查询的知识总结
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;

/**/

原创粉丝点击