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;
相关推荐
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New6 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6756 小时前
数据库基础1
数据库
我爱松子鱼6 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)8 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231118 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql