这部分内容给的比较基础,以下总结参考部分网络内容。
- SQL 最强大的功能之一就是在数据检索查询的执行中联结(JOIN),在使用联结前,需要简单了解下关系表概念。
1 关系型数据库
简单来说,为了避免数据冗余,一个表中只会去放同一个“性质”的数据,不同性质的数据由二者之间的关系来维护——比如说货品供应相关的数据,会有产品信息、供应商信息,这两部分信息是可以放在一起的,但就会出现重复的情况:一家供应商会供应多个产品,于是供应商信息在表里就会有多个位置出现,对于存储、维护(供应商信息更新等)会带来压力。
在这个案例中,可以将供应商ID作为供应商表的主键,同时将供应商ID作为产品信息表中的一列(称之为外键),该ID定义了两个表之间的关系。
2 使用联结
联结查询可以替代子查询。
需要指定联结条件,否则可能返回按所查询表的行数*行数对应的笛卡尔积。
![](https://img.haomeiwen.com/i1987266/b565526461b8ee58.jpg)
以上联结中,内、左、右、全联结是四种最常见用法。
2.1 内联接 Inner Join
一般多表查询时使用where达成内联结的效果(输出:在两边表中均出现的):
select a.TradeNick,a.rank,b.Age_Guess_DOWN,b.Age_Guess_UP
from table_a as a,table_b as b
where a.TradeNick = b.TradeNick
标准的内联结写法:
select a.TradeNick,a.rank,b.Age_Guess_DOWN,b.Age_Guess_UP
from table_a as a INNER JOIN table_b as b
on a.TradeNick = b.TradeNick
此处需要用On,与where子句语法相同。
2.2 左联接 Left Join
select distinct(a.TradeNick) as a_nick, a.rank,b.Age_Guess_DOWN,b.Age_Guess_UP
from table_a as a LEFT JOIN table_b as b
on a.TradeNick = b.TradeNick
2.3 右联接 right Join
语法上都是一致的,重点是所期望获得的结果,参见文氏图。
另外测试,right join 与 right outer join 是同样效果。
select distinct(a.TradeNick) as a_nick, a.rank,b.Age_Guess_DOWN,b.Age_Guess_UP
from table_a as a RIGHT JOIN table_b as b
on a.TradeNick = b.TradeNick
2.4 全联接 Full outer Join
MySQL 好像不支持全联接,需要用替代方案(测试用的不支持)
替代方案:
先创建所有连接条件的并集,然后其他表都和这个并集进行左连接,即可得出全连接。
- left join + union(可去除重复数据)+ right join
- 两张表时:
select * from A left join B on A.id = B.id (where 条件)
union
select *from A right join B on A.id = B.id (where条件);
网友评论