内连接之自然连接
1.7 内连接之自连接
案例:查询员工的上级领导,要求显示员工名和对应的领导名?
技巧:一张表看成两张表。
emp a 员工表
+-------+--------+------+
| 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 |
+-------+--------+------+
emp b 领导表
+-------+--------+------+
| 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.ename as'员工名',b.ename as '领导名' from emp a join emp b on a.mgr=b.empno;a.mgr = b.empno; //员工的领导编号 = 领导的员工编号
 
 13条记录,没有KING。《内连接》
以上就是内连接中的:自连接,技巧:一张表看做两张表
1.8 外连接

我们看到外连接有15条数据,其中有个NULL,这是因为right把右边看出主表;而内连接只有14条,只要不匹配就不显示
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。在外连接当中,两张表连接,产生了主次关系
外连接(左外连接):
// outer是可以省略的,带着可读性强。
select 
	e.ename,d.dname
from
	dept d 
left outer join 
	emp e
on
	e.deptno = d.deptno;
 
 带有right的是右外连接,又叫做右连接。
 带有left的是左外连接,又叫做左连接。
 任何一个右连接都有左连接的写法。
 任何一个左连接都有右连接的写法。
思考:外连接的查询结果条数一定是 >= 内连接的查询结果条数?
正确。
2.9 多表连接
语法:
		select 
			...
		from
			a
		join
			b
		on
			a和b的连接条件
		join
			c
		on
			a和c的连接条件
		right join
			d
		on
			a和d的连接条件
		
		一条SQL中内连接和外连接可以混合。都可以出现!
 
 案例:找出每个员工的部门名称以及工资等级,要求显示员工名、部门名、薪资、薪资等级?
select 
		e.ename,e.sal,d.dname,s.grade
	from
		emp e
	join
		dept d
	on 
		e.deptno = d.deptno
	join
		salgrade s
	on
		e.sal between s.losal and s.hisal;
 
 +--------+------+------------+-------+
| ename  | sal  | dname      | grade |
+--------+------+------------+-------+
| SMITH  |  800 | RESEARCH   |     1 |
| SMITH  |  800 | RESEARCH   |     1 |
| SMITH  |  800 | RESEARCH   |     1 |
| SMITH  |  800 | RESEARCH   |     1 |
| ALLEN  | 1600 | SALES      |     3 |
| ALLEN  | 1600 | SALES      |     3 |
| ALLEN  | 1600 | SALES      |     3 |
| ALLEN  | 1600 | SALES      |     3 |
| WARD   | 1250 | SALES      |     2 |
....
 
 案例:找出每个员工的部门名称以及工资等级,还有上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级?
select 
		e.ename,e.sal,d.dname,s.grade,l.ename
	from
		emp e
	join
		dept d
	on 
		e.deptno = d.deptno
	join
		salgrade s
	on
		e.sal between s.losal and s.hisal
	left join
		emp l
	on
		e.mgr = l.empno;
 
 ±-------±--------±-----------±------±------+
| ename | sal | dname | grade | ename |
±-------±--------±-----------±------±------+
| SMITH | 800.00 | RESEARCH | 1 | FORD |
| ALLEN | 1600.00 | SALES | 3 | BLAKE |
| WARD | 1250.00 | SALES | 2 | BLAKE |
| JONES | 2975.00 | RESEARCH | 4 | KING |
| MARTIN | 1250.00 | SALES | 2 | BLAKE |
| BLAKE | 2850.00 | SALES | 4 | KING |…
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)