19 连接查询
什么是连接查询?
在实际开发中,大部分的情况下都不是从但表中查询数据,一般都是多张表联合查询取出最终的结果。
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。
stuno stuname classno calssname
------------------------------
1 zs 1 哈哈哈哈
2 ls 1 哈哈哈哈
...
学生和班级信息存储到一张表中,结果就像上面一样,数据会存在大量重复,导致数据冗余。
连接查询的分类?
根据语法出现的年代来划分的话,包括
SQL92(一些老的DBA可能还在使用这种语法。DBA:DataBase Administrator,数据库管理员)
SQL99(比较新的语法)
根据表的连接方式来划分,包括:
内连接
等值连接
非等值连接 between...and
自连接
外连接
左外连接(左连接)
右外连接(右连接)
全连接(很少用)
在表的连接查询方面有一种现象被称为:笛卡尔积现象。(笛卡尔乘积现象)
案例:找出每一个员工的部门名称,要求显示员工名和部门名。
select ename,deptno from emp;
+--------+--------+
| ename | deptno |
+--------+--------+
| SMITH | 20 |
| ALLEN | 30 |
| WARD | 30 |
| JONES | 20 |
| MARTIN | 30 |
| BLAKE | 30 |
| CLARK | 10 |
| SCOTT | 20 |
| KING | 10 |
| TURNER | 30 |
| ADAMS | 20 |
| JAMES | 30 |
| FORD | 20 |
| MILLER | 10 |
+--------+--------+
select * from dept;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
这个就是著名的笛卡尔积现象
select ename,dname from emp,dept;
+--------+------------+
| ename | dname |
+--------+------------+
| SMITH | ACCOUNTING |
| SMITH | RESEARCH |
| SMITH | SALES |
| SMITH | OPERATIONS |
| ALLEN | ACCOUNTING |
| ALLEN | RESEARCH |
| ALLEN | SALES |
| ALLEN | OPERATIONS |
| WARD | ACCOUNTING |
| WARD | RESEARCH |
| WARD | SALES |
| WARD | OPERATIONS |
| JONES | ACCOUNTING |
| JONES | RESEARCH |
| JONES | SALES |
| JONES | OPERATIONS |
| MARTIN | ACCOUNTING |
| MARTIN | RESEARCH |
| MARTIN | SALES |
| MARTIN | OPERATIONS |
| BLAKE | ACCOUNTING |
| BLAKE | RESEARCH |
| BLAKE | SALES |
| BLAKE | OPERATIONS |
| CLARK | ACCOUNTING |
| CLARK | RESEARCH |
| CLARK | SALES |
| CLARK | OPERATIONS |
| SCOTT | ACCOUNTING |
| SCOTT | RESEARCH |
| SCOTT | SALES |
| SCOTT | OPERATIONS |
| KING | ACCOUNTING |
| KING | RESEARCH |
| KING | SALES |
| KING | OPERATIONS |
| TURNER | ACCOUNTING |
| TURNER | RESEARCH |
| TURNER | SALES |
| TURNER | OPERATIONS |
| ADAMS | ACCOUNTING |
| ADAMS | RESEARCH |
| ADAMS | SALES |
| ADAMS | OPERATIONS |
| JAMES | ACCOUNTING |
| JAMES | RESEARCH |
| JAMES | SALES |
| JAMES | OPERATIONS |
| FORD | ACCOUNTING |
| FORD | RESEARCH |
| FORD | SALES |
| FORD | OPERATIONS |
| MILLER | ACCOUNTING |
| MILLER | RESEARCH |
| MILLER | SALES |
| MILLER | OPERATIONS |
+--------+------------+
56 rows in set (0.00 sec)
笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
关于表的别名
select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno;
表的别名有什么好处?
第一:执行效率高。
第二:可读性好。
如何避免笛卡尔积现象?当然是加条件进行过滤。
思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
不会,次数还是56次,只不过显示的是有效记录。
案例:找出每一个员工的部门名称,要求显示员工名和部门名。
select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno; // SQL92,以后不用
+--------+------------+
| ename | dname |
+--------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+--------+------------+
内连接中的等值连接:最大的特点是:条件是等量关系。
案例:查询每个员工的部门名称,要求显示员工名和部门名?
SQL92:(太老了,不用了)
select a.ename,b.dname from emp a,dept b where a.deptno = b.deptno;
SQL99:(常用的)
select a.ename,b.dname from emp a join dept b on a.deptno = b.deptno;
语法:
...
A
join
B
on
连接条件
where
...
SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。
select a.ename,b.dname from emp a join dept b on a.deptno = b.deptno;
// inner可以省略的,带着inner目的是可读性好一些。
select a.ename,b.dname from emp a inner join dept b on a.deptno = b.deptno; // 他和上面的sql语句一样,只不过没有inner
+--------+------------+
| ename | dname |
+--------+------------+
| CLARK | ACCOUNTING |
| KING | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH | RESEARCH |
| JONES | RESEARCH |
| SCOTT | RESEARCH |
| ADAMS | RESEARCH |
| FORD | RESEARCH |
| ALLEN | SALES |
| WARD | SALES |
| MARTIN | SALES |
| BLAKE | SALES |
| TURNER | SALES |
| JAMES | SALES |
+--------+------------+
内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系。
案例: 找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select ename,sal from emp;
+--------+---------+
| ename | sal |
+--------+---------+
| SMITH | 800.00 |
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
select * from salgrade;
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
找出每个员工的工资等级,要求显示员工名、工资、工资等级。
select a.ename,a.sal,b.grade from emp a inner join salgrade b on a.sal between b.losal and b.hisal;
+--------+---------+-------+
| ename | sal | grade |
+--------+---------+-------+
| SMITH | 800.00 | 1 |
| ALLEN | 1600.00 | 3 |
| WARD | 1250.00 | 2 |
| JONES | 2975.00 | 4 |
| MARTIN | 1250.00 | 2 |
| BLAKE | 2850.00 | 4 |
| CLARK | 2450.00 | 4 |
| SCOTT | 3000.00 | 4 |
| KING | 5000.00 | 5 |
| TURNER | 1500.00 | 3 |
| ADAMS | 1100.00 | 1 |
| JAMES | 950.00 | 1 |
| FORD | 3000.00 | 4 |
| MILLER | 1300.00 | 2 |
+--------+---------+-------+
自连接:最大的特点是:一张表看做两张表。自己连接自己。
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
select empno,ename,mgr from emp;
+-------+--------+------+
| empno | ename | mgr |
+-------+--------+------+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
+-------+--------+------+
select a.empno,a.ename,b.ename from emp a inner join emp b where a.mgr = b.empno;
+-------+--------+-------+
| empno | ename | ename |
+-------+--------+-------+
| 7369 | SMITH | FORD |
| 7499 | ALLEN | BLAKE |
| 7521 | WARD | BLAKE |
| 7566 | JONES | KING |
| 7654 | MARTIN | BLAKE |
| 7698 | BLAKE | KING |
| 7782 | CLARK | KING |
| 7788 | SCOTT | JONES |
| 7844 | TURNER | BLAKE |
| 7876 | ADAMS | SCOTT |
| 7900 | JAMES | BLAKE |
| 7902 | FORD | JONES |
| 7934 | MILLER | CLARK |
+-------+--------+-------+
外连接?
什么是外连接,和内连接有什么区别?
内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
AB两张表没有主副之分,两张表是平等的。
外连接:
假设A表和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,
当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与之匹配。
外连接的分类?
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。
左连接有右连接的写法,右连接也会有对应的左连接的写法。
案例:找出每个员工的上级领导?
select a.empno,a.ename,b.ename from emp a left join emp b on a.mgr = b.empno;(左外连接/左连接)
// outer是可以省略的
select a.empno,a.ename,b.ename from emp a left outer join emp b on a.mgr = b.empno;(左外连接/左连接)
+-------+--------+-------+
| empno | ename | ename |
+-------+--------+-------+
| 7369 | SMITH | FORD |
| 7499 | ALLEN | BLAKE |
| 7521 | WARD | BLAKE |
| 7566 | JONES | KING |
| 7654 | MARTIN | BLAKE |
| 7698 | BLAKE | KING |
| 7782 | CLARK | KING |
| 7788 | SCOTT | JONES |
| 7839 | KING | NULL |
| 7844 | TURNER | BLAKE |
| 7876 | ADAMS | SCOTT |
| 7900 | JAMES | BLAKE |
| 7902 | FORD | JONES |
| 7934 | MILLER | CLARK |
+-------+--------+-------+
select a.empno,a.ename,b.ename from emp b right join emp a on a.mgr = b.empno;(右外连接/右连接)
+-------+--------+-------+
| empno | ename | ename |
+-------+--------+-------+
| 7369 | SMITH | FORD |
| 7499 | ALLEN | BLAKE |
| 7521 | WARD | BLAKE |
| 7566 | JONES | KING |
| 7654 | MARTIN | BLAKE |
| 7698 | BLAKE | KING |
| 7782 | CLARK | KING |
| 7788 | SCOTT | JONES |
| 7839 | KING | NULL |
| 7844 | TURNER | BLAKE |
| 7876 | ADAMS | SCOTT |
| 7900 | JAMES | BLAKE |
| 7902 | FORD | JONES |
| 7934 | MILLER | CLARK |
+-------+--------+-------+
外连接最重要的特点是:主表的数据无条件的全部查询出来。
案例:找出哪个部门没有员工?
select a.deptno,b.deptno,a.ename from emp a right join dept b on a.deptno = b.deptno;
+--------+--------+--------+
| deptno | deptno | ename |
+--------+--------+--------+
| 10 | 10 | CLARK |
| 10 | 10 | KING |
| 10 | 10 | MILLER |
| 20 | 20 | SMITH |
| 20 | 20 | JONES |
| 20 | 20 | SCOTT |
| 20 | 20 | ADAMS |
| 20 | 20 | FORD |
| 30 | 30 | ALLEN |
| 30 | 30 | WARD |
| 30 | 30 | MARTIN |
| 30 | 30 | BLAKE |
| 30 | 30 | TURNER |
| 30 | 30 | JAMES |
| NULL | 40 | NULL |
+--------+--------+--------+
select b.* from emp a right join dept b on a.deptno = b.deptno where a.empno is null;
+--------+------------+--------+
| DEPTNO | DNAME | LOC |
+--------+------------+--------+
| 40 | OPERATIONS | BOSTON |
+--------+------------+--------+
三张表怎么连接查询?
案例:找出每一个员工的部门名称以及工资等级。
select a.ename as '员工名称',b.dname as '部门名称',a.sal as '工资',c.grade as '工资等级' from emp a
join dept b on a.deptno = b.deptno
join salgrade c on a.sal between c.losal and c.hisal;
+----------+------------+---------+----------+
| 员工名称 | 部门名称 | 工资 | 工资等级 |
+----------+------------+---------+----------+
| SMITH | RESEARCH | 800.00 | 1 |
| ALLEN | SALES | 1600.00 | 3 |
| WARD | SALES | 1250.00 | 2 |
| JONES | RESEARCH | 2975.00 | 4 |
| MARTIN | SALES | 1250.00 | 2 |
| BLAKE | SALES | 2850.00 | 4 |
| CLARK | ACCOUNTING | 2450.00 | 4 |
| SCOTT | RESEARCH | 3000.00 | 4 |
| KING | ACCOUNTING | 5000.00 | 5 |
| TURNER | SALES | 1500.00 | 3 |
| ADAMS | RESEARCH | 1100.00 | 1 |
| JAMES | SALES | 950.00 | 1 |
| FORD | RESEARCH | 3000.00 | 4 |
| MILLER | ACCOUNTING | 1300.00 | 2 |
+----------+------------+---------+----------+
案例:找出每一个员工的部门名称、工资等级、以及上级领导。
select a.ename as '员工名称',b.dname as '部门名称',a.sal as '工资',c.grade as '工资等级',d.ename as '上级领导' from emp a
join dept b on a.deptno = b.deptno
join salgrade c on a.sal between c.losal and c.hisal
left join emp d on a.mgr = d.empno;
+----------+------------+---------+----------+----------+
| 员工名称 | 部门名称 | 工资 | 工资等级 | 上级领导 |
+----------+------------+---------+----------+----------+
| SMITH | RESEARCH | 800.00 | 1 | FORD |
| ALLEN | SALES | 1600.00 | 3 | BLAKE |
| WARD | SALES | 1250.00 | 2 | BLAKE |
| JONES | RESEARCH | 2975.00 | 4 | KING |
| MARTIN | SALES | 1250.00 | 2 | BLAKE |
| BLAKE | SALES | 2850.00 | 4 | KING |
| CLARK | ACCOUNTING | 2450.00 | 4 | KING |
| SCOTT | RESEARCH | 3000.00 | 4 | JONES |
| KING | ACCOUNTING | 5000.00 | 5 | NULL |
| TURNER | SALES | 1500.00 | 3 | BLAKE |
| ADAMS | RESEARCH | 1100.00 | 1 | SCOTT |
| JAMES | SALES | 950.00 | 1 | BLAKE |
| FORD | RESEARCH | 3000.00 | 4 | JONES |
| MILLER | ACCOUNTING | 1300.00 | 2 | CLARK |
+----------+------------+---------+----------+----------+