MySQL连接查询-笛卡尔乘积

前言

SQL查询时,一般会涉及到多张表的字段,这时就需要表连接,然后不断匹配。

一、笛卡尔积

当from后跟多个表时,这些表的每行进行全排列,这就是笛卡尔积,也就是无条件的全排列连接。

二、SQL92(支持内连接)

通过表内的一些条件来连接,有内等值连接、非等值连接、自连接(自表引用)

# 一、sql92标准
# 1.内连接
# a 等值连接
# 注:表名如果取了别名,在形成的视图上有了新名,也只有新名,重名字段就应该用新名调用
SELECT
	boyName,
	`name` 
FROM
	beauty,
	boys 
WHERE
	boys.id = boyfriend_id # 内连接+筛选
SELECT
	boyName,
	beauty.NAME 
FROM
	beauty,
	boys 
WHERE
	boys.id = boyfriend_id 
	AND LENGTH( beauty.NAME ) > 9 # 注:一个汉字三个字节
# 内连接+ 三表连接
# 员工名、部门名、城市名
	USE myemployees;
SELECT
	e.last_name,
	d.department_name,
	l.city 
FROM
	employees e,
	departments d,
	locations l 
WHERE
	e.department_id = d.department_id 
	AND d.location_id = l.location_id # b 非等值连接  大于小于不等于 等
# 查询最高工资>10000的部门名
SELECT DISTINCT
	d.department_name 
FROM
	employees e,
	departments d 
WHERE
	e.department_id = d.department_id 
GROUP BY
	e.department_id 
HAVING
	MAX( salary ) > 10000 # c 自连接 表的自引用时才用,比如员工的上司也是员工
SELECT
	e1.last_name,
	e2.last_name 
FROM
	employees e1,
	employees e2 
WHERE
	e1.employee_id = e2.manager_id

三、SQL99(内、外、交叉)

1、内连接

等值、非等值、自连接。

/* 
 sql99语法
select 查询列表
from table1 别名 【连接类型】
[注:内连接 [INNER] 左右外 left|right [outer] 全外 full【outer】
交叉连接 cross]
join table2 on 连接条件 
[where]
[GROUP BY]
[HAVING]
[ORDER BY]
*/
#  一、内连接
# 1.可添加排序分组筛选 2.inner可省略 3.连接条件放在on后面,其它条件放在where后面 
SELECT
	* 
FROM
	employees e
	INNER JOIN departments d ON e.department_id = d.department_id # 三表内等值连接
SELECT
	* 
FROM
	employees e
	INNER JOIN departments d ON e.department_id = d.department_id
	INNER JOIN locations l ON d.location_id = l.location_id

2、外连接

2.1、左右外连接

/* 
 sql99语法
select 查询列表
from table1 别名 【连接类型】
[注:内连接 [INNER] 左右外 left|right [outer] 全外 full【outer】
交叉连接 cross]
join table2 on 连接条件 
[where]
[GROUP BY]
[HAVING]
[ORDER BY]
*/ #  一、内连接
# 1.可添加排序分组筛选 2.inner可省略 3.连接条件放在on后面,其它条件放在where后面
# 左右外连接,查询一个表中有,另一个表中没有的行
# 左外连接 = 内连接+主表没涉及到的行
# 查看没有男朋友的女神
USE girls;
SELECT
	* 
FROM
	beauty a
	LEFT JOIN boys b ON a.boyfriend_id = b.id;

WHERE
	b.id IS NULL

2.2、全外连接

SQL99有其规范,但是MySQL还未支持

/* 
/* 
 sql99语法
select 查询列表
from table1 别名 【连接类型】
[注:内连接 [INNER] 左右外 left|right [outer] 全外 full【outer】
交叉连接 cross]
join table2 on 连接条件 
[where]
[GROUP BY]
[HAVING]
[ORDER BY]
*/ #  一、内连接
# 1.可添加排序分组筛选 2.inner可省略 3.连接条件放在on后面,其它条件放在where后面

# 全外连接,MySQL不支持 其效果 = 左外连接+右外连接
# 找出单身的
SELECT
	a.NAME 
FROM
	beauty a
	FULL JOIN boys b ON a.boyfriend_id = b.id 
WHERE
	a.id IS NULL 
	AND b.id IS NULL;

3、交叉连接(MySQL支持)

/* 
 sql99语法
select 查询列表
from table1 别名 【连接类型】
[注:内连接 [INNER] 左右外 left|right [outer] 全外 full【outer】
交叉连接 cross]
join table2 on 连接条件 
[where]
[GROUP BY]
[HAVING]
[ORDER BY]
*/ #  一、内连接
# 1.可添加排序分组筛选 2.inner可省略 3.连接条件放在on后面,其它条件放在where后面
# 外连接 sql99中表达笛卡尔积的方式
SELECT
	a.NAME 
FROM
	beauty a
	CROSS JOIN boys b;

总结

1)SQL99语法功能更加细致和强大
2)多表连接查询

参考文献

[1] MySQL 尚硅谷

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值