内连接之自然连接

举报
xcc-2022 发表于 2022/11/28 18:59:19 2022/11/28
【摘要】 1.7 内连接之自连接案例:查询员工的上级领导,要求显示员工名和对应的领导名?技巧:一张表看成两张表。emp a 员工表+-------+--------+------+| empno | ename | mgr |+-------+--------+------+| 7369 | SMITH | 7902 || 7499 | ALLEN | 7698 || 7521 | W...

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; //员工的领导编号 = 领导的员工编号

image-20221030103855382

13条记录,没有KING。《内连接》

以上就是内连接中的:自连接,技巧:一张表看做两张表

1.8 外连接

image-20221030104738643

我们看到外连接有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 |

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。