【一文看懂SQL系列】最麻烦的连接查询,看图秒懂

连接查询

又称为多表查询,应用于多表连接的情况下

问题引入:
当执行SELECT name, boy_name FROM beauty, boys 会出现笛卡尔积的情况

笛卡尔积:表1 有 m 行, 表2 有 n行, 结果为 m*n 行

发生原因:没有有效的连接情况

分类:

按功能分类
	内连接
			等值连接
			非等值连接
			自连接
	外连接
		   左外连接
		   右外连接
		   全外连接
   交叉连接  	   

SQL92(一)内连接

一、等值连接
SELECT name, boy_name  
FROM beauty, boys 
WHERE beauty.boy_id = boys.id

可以通过给表起别名来提高语句的简洁度,但是如果为表起了别名,则查询的字段就不能使用原来的表名去限定

二、非等值连接
SELECT e.salary, g.grade  
FROM employees e, job_grades g 
WHERE e.salary 
BETWEEN g.lowest_salary AND g.highest_salary
三、自连接
SELECT e.last_name, m.last_name  
FROM employees e, manager m 
WHERE e.employ_id = m.manager_id

SQL99 连接查询

语法SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 连接条件 【WHERE 筛选条件】 【GROUP BY 分组条件】【HAVING 筛选条件】【ORDER BY 排序列表】
分类

内连接 INNER
外连接 左外 LEFT OUTER 右外 RIGHT OUTER
全外 FULL OUTER
交叉连接 CROSS
(一)内连接

在这里插入图片描述

一、等值连接
SELECT name, boy_name  
FROM beauty 
INNER JOIN boys 
ON beauty.boy_id = boys.id
二、非等值连接
SELECT salary, grade  
FROM employees e 
INNER JOIN job_grades g 
ON e.salary 
BETWEEN g.lowest_salary AND g.highest_salary
三、自连接
SELECT e.last_name, m.last_name  
FROM employees e 
INNER JOIN manager m 
ON e.employ_id = m.manager_id
(二)外连接
一、左外右外连接

在这里插入图片描述
应用场景: 用于查询一个表中有,另一个表中没有的记录
特点

  1. 外连接的查询结果为主表中的所有记录。如果从表中没有与之匹配的,则显示NULL。外连接查询结果=内连接结果+主表中有从表中没有的记录
  2. 左外连接,LEFT JOIN 左边是主表;右外连接,RIGHT JOIN 右边是主表
  3. 左外由外交换两表的顺序可以实现同样的效果

左外案例

SELECT name, boy_name  
FROM beauty 
LEFT OUTER JOIN boys 
ON beauty.boy_id = boys.id

若想看主表中有从表中没有
在这里插入图片描述

SELECT name, boy_name  
FROM beauty 
LEFT OUTER JOIN boys 
ON beauty.boy_id = boys.id 
WHERE boys.id IS NULL
二、全外连接

在这里插入图片描述
特点:1. 全外连接 = 内连接结果 + 表1有表2没有 + 表1没有表2有

在这里插入图片描述

SELECT name, boy_name  
FROM beauty 
FULL OUTER JOIN boys 
ON beauty.boy_id = boys.id 
WHERE boys.id IS NULL
三、交叉连接
SELECT name, boy_name  
FROM beauty 
CROSS JOIN boys

交叉连接(笛卡尔乘积结果)

发布了21 篇原创文章 · 获赞 17 · 访问量 3696

猜你喜欢

转载自blog.csdn.net/qq_33892106/article/details/105163310