SQL表连接(Oracle)


子查询完全能用表连接代替,表连接才是重中之重!!!!!

表连接

定义:将多张表中的内容拼接到一起,拼接到一起成为了一张临时的数据源。
背景:当数据源不止一个的时候(多张表)
了解一下

笛卡尔集

是指将两张表的数据相乘,可以将两张表连接。

SELECT * FROM emp;   -21条数据
SELECT * FROM dept; -4条数据
笛卡尔集:
SELECT * FROM emp,dept;

在这里插入图片描述
56条数据,14*4
笛卡尔集是很危险的,不仅是因为里面有错误的数据,当他数据量过大时,可能会导致程序崩溃。所以工作中尽量避免。
我们可以用以下几种方式连接表

内连接 | INNER JOIN

内连接 | INNER JOIN
语法:

SELECT  * | 列名 | 常量|计算 | 函数 | 子查询
	FROM 表 | 子查询
		WHERE 分组前的过滤条件(不能使用带有聚合函数的条件)
			GROUP BY 分组内容	
				HAVING	--分组后的过滤条件(能使用聚合函数的条件)
					ORDER BY 排序内容 ASC  |  DESC
内连接
SELECT  * | 列名 | 常量|计算 | 函数 | 子查询
	FROM 表 1
			INNER JOIN 表2
				ON 关联条件
				INNER JOIN 表3
				ON 关联条件
				......
		WHERE 分组前的过滤条件(不能使用带有聚合函数的条件)
			GROUP BY 分组内容	
				HAVING	--分组后的过滤条件(能使用聚合函数的条件)
					ORDER BY 排序内容 ASC  |  DESC

将from后面的看成一张临时表使用。
内连接:按照条件将两张表连接在一起,只会显示匹配成功的数据,匹配不成功的数据会忽略不显示
当两张表都有的字段需要加表名归属
练习
查询部门地址时纽约的员工信息

SELECT * FROM emp INNER JOIN dept ON emp.deptno=dept.deptno WHERE loc = 'NEW YORK' ;

外连接

左外连接

LEFT [OUTER] JOIN
语法:

SELECT * FROM 表1 LEFT [OUTER] JOIN 表2 ON 关联条件.....

例题,用左连接将emp和dept进行连接

SELECT * FROM emp LEFT JOIN dept ON emp.deptno = dept.deptno;

左连接的特点:左表为主,左表数据全部都会显示,没有匹配成功的数据,右表以空值填充,右表没有匹配成功的数据则不显示。
练习:
查询员工姓名岗位编号薪资部门编号部门名称,用 左连接。

SELECT ename,job,sal,emp.deptno,dname FROM emp LEFT JOIN dept ON emp.deptno=dept.deptno;

查询员工姓名岗位编号薪资部门编号部门名称,用 左连接。要求只展示没有匹配成功的人。

SELECT ENAME, JOB, SAL, EMP.DEPTNO, DNAME
  FROM EMP
  LEFT JOIN DEPT
    ON EMP.DEPTNO = DEPT.DEPTNO
       WHERE emp.deptno NOT IN (dept.deptno);
       

右外连接

RIGHT [OUTER] JOIN
与左连接相反,以右表为主。用的少

SELECT * FROM 表1 RIGHT 表2 ON 关联条件

右连接:右表为主,右表全部会显示,匹配不成功的左表以空值填充。

全外连接

FULL [OUTER] JOIN
语法:

SELECT * FROM 表1 FULL 表2 ON 关联条件
SELECT * FROM emp FULL JOIN dept ON emp.deptno = dept.deptno;

在这里插入图片描述
全连接特点:
显示全部数据,不管匹配成功不成功,当匹配不成功的时候对应的表以空值填充。

交叉连接

–相当于笛卡尔集
CROSS JOIN
语法:

SELECT * FROM 表1 CROSS JOIN 表2  ---没有关联条件,结果与笛卡尔集相同

特殊连接

自然连接

自然连接
NATURAL JOIN
语法

SELECT  * FROM 表1 NATURAL JOIN 表2     ---没有关联条件

会将两张表自动的寻找相同列进行关联,只显示匹配成功的数据,会去除重复字段
在这里插入图片描述
如果字段名不相同则无法使用自然连接

自连接

没有关键词,只是表连接的一种特殊形式,自己表和自己表相连,需要自己去找关联条件。
例题:
查询员工信息以及对应的领导信息。

SELECT * 
	FROM emp a ---员工信息
		LEFT JOIN emp b  ---领导信息
			ON a.MGR = b.empno;

在这里插入图片描述
练习:
查询员工工资比该员工领导工资高的员工信息以及领导信息以及该员工对应的部门地址

SELECT a.*,b.*,c.loc
  FROM EMP A
  LEFT JOIN EMP B
    ON A.MGR = B.EMPNO
  LEFT JOIN DEPT C
    ON A.DEPTNO = C.DEPTNO
 WHERE A.SAL > B.SAL;

在这里插入图片描述

不等值连接

没有关键词,只是表连接的一种特殊形式。关联条件不是等号
例题:
查询员工信息以及该员工对应的工资等级
scott自带的表:salgrade 工资等级表
在这里插入图片描述

SELECT * FROM emp LEFT JOIN salgrade ON sal BETWEEN losal AND hisal;

在这里插入图片描述

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值