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;
相关推荐
人工智能培训1 小时前
世界模型内嵌,感知交互跃迁
大数据·数据库·人工智能·神经网络·生成对抗网络
隔壁阿布都1 小时前
ClickHouse完整指南
服务器·数据库·clickhouse
TDengine (老段)1 小时前
TDengine JOIN 完整语法 — Inner/Outer/ASOF/Window 全语法详解
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
ai_coder_ai1 小时前
编写自动化脚本,在自己后端服务中使用云原生Baas服务进行编码和解码相关操作
数据库·云原生·自动化
hehelm2 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++
Database_Cool_2 小时前
阿里云 Lindorm vs Elasticsearch 检索存储一体对比:多模数据库一站式方案首选
数据库·阿里云
大郭鹏宇2 小时前
下篇:LangChain Agent 智能体从入门到实战(二)—— 记忆管理、中间件与最佳实践
网络·数据库·人工智能
数行拙笔3 小时前
Redis---set类型
数据库·redis·缓存
Leon-Ning Liu3 小时前
【真实经验分享】Oradebug抓取阻塞源SQL语句
数据库
观远数据3 小时前
消费品牌选型BI的能力边界:三类差异化场景的适配清单与排除项
数据库·人工智能·microsoft