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;
相关推荐
做运维的阿瑞12 分钟前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
Seraphina3621 分钟前
DVWA(SQL Injection-High,XSS Reflected-Medium,XSS Stored-Medium)
数据库·经验分享·sql·网络安全·xss
@Mike@22 分钟前
12-数据库学习笔记(五种连接算法)
数据库·笔记·学习
Omics Pro34 分钟前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
龙亘川39 分钟前
探索智慧文化服务:建设初衷、整体架构、技术支撑、发展现状与实践影响
大数据·数据库·架构
风早爽太43 分钟前
Python 学习笔记:数据库迁移工具 ‌Alembic
数据库·python·fastapi·alembic
2501_933670791 小时前
2027风控策略岗秋招准备:SQL、Excel、建模的优先级与项目路径
人工智能·sql·excel
java1234_小锋1 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
其实防守也摸鱼1 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
jason.zeng@15022072 小时前
canal做mysql的异步传输工具
数据库·mysql·linq