轻松理解SQL中的各种join和union

简单理解:
join本意是连接,就是把多张表的数据横向连接起来(横向扩展)(字段不一样);
union本以是合并,就是把多个表结果集纵向合并起来(纵向扩展)(字段及顺序一样).

下面列出了 JOIN 类型,以及它们之间的差异

JOIN: 只返回俩表匹配的行(一一对应,要避免笛卡尔积)
LEFT JOIN: 返回左右表匹配的行及左表不匹配的行
RIGHT JOIN: 返回左右表匹配的行及右表不匹配的行
FULL JOIN: 返回左右表匹配行及左表右表各自不匹配的行

JOIN

SELECT * FROM table1,table2 WHERE xxx
SELECT * FROM table1 JOIN table2 ON xxx
俩种语法得到的结果是一样的,并且如果不写条件都会得到一个笛卡尔积.

当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销, 而用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。

在表中存在至少一个匹配时,INNER JOIN 关键字返回行.
INNER JOIN语法:
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
使用场景: 希望只列出俩表有一一对应关系的数据.例如列出用户的订购.

LEFT JOIN

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行.
LEFT JOIN语法:
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
使用场景: 希望列出左表的所有数据和与之匹配的右表数据.例如列出所有的用户,以及他们的定购 - 如果有的话.

RIGHT JOIN

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行.
RIGHT JOIN语法:
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
使用场景: 希望列出右表的所有数据和与之匹配的左表数据.例如列出所有的定单,以及定购它们的用户 - 如果有的话.

FULL JOIN

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行.
FULL JOIN语法:
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
使用场景: 希望列出左右表匹配的数据及左右表各自不匹配的数据.例如列出所有的用户,以及他们的定单,以及所有的定单,以及定购它们的用户.

UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同.
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名.

UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

区别: UNION有去重效果,UNION ALL没有

其它SQL相关内容可根据此地址学习.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值