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;
相关推荐
cookqq10 小时前
MySQL 5.7 大表删除部分数据:.ibd 文件会变小吗?磁盘会释放吗?
数据结构·数据库·mysql
IT 行者10 小时前
告别硬编码!Spring Boot 优雅实现 Controller 路径前缀统一管理
数据库·spring boot·python
曹牧10 小时前
Oracle 大表数据分区存储
数据库·oracle
win x10 小时前
Redis 持久化
数据库·redis·缓存
程序猿202310 小时前
MySQL的锁(行锁)
数据库·mysql
W001hhh10 小时前
数据库实训Day005下午
数据库
lechcat10 小时前
多角色协同巡检流程设计技术教程
大数据·数据库·数据挖掘
小沈同学呀10 小时前
基于时间片划分的提醒算法设计与实现
服务器·数据库·算法
曹牧10 小时前
Oracle:单一索引和联合索引
数据库·oracle
Gauss松鼠会10 小时前
【GaussDB】从 sqlplus 到 gsql:Shell 中执行 SQL 文件方案的迁移与改造
数据库·sql·database·gaussdb