在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:

INNER JOIN:取交集,如果表中有至少一个匹配,则返回行
 LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行(在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN)
 RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
 FULL JOIN:只要其中一个表中存在匹配,则返回行(MySQL不支持FULL JOIN)

1.内关联:查出两表关联字段等值的数据

select * from a,b where a.id=b.id —等值连接
 select * from a inner join b on a.id = b.id -----内连接


两种写法都可以,只是现在推崇下面的方式。

内连接和等值连接结果相同,inner join也可以写成join

2.外连接
左连接:LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL
右连接:RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

如果用left join,因为左表只有三行,最后结果为三行,如果表位置调换,则求得结果与期望不符 select

c.class,c.name,c.score from (select class,max(score) as score from
 student group by class) t inner join student c on t.class=c.class and
 t.score=c.score ;

外连接与条件配合使用
条件在join子句

select * from t_institution i left outer join t_teller t on i.inst_no = t.inst_no and i.inst_no = “5801”


结果是:

inst_no inst_name inst_no teller_no teller_name
 5801 天河区 5801 0001 tom
 5801 天河区 5801 0002 david
 5802 越秀区
 5803 白云区


条件在where子句

select * from t_institution i left outer join t_teller t on i.inst_no = t.inst_no where i.inst_no = “5801”


结果是:

inst_no inst_name inst_no teller_no teller_name
 5801 天河区 5801 0001 tom
 5801 天河区 5801 0002 david

3.union的使用:

MySQL Full Join的实现因为MySQL不支持FULL JOIN,下面是替代方法
 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条件);

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。(因为有相同数量的列,所以union的B表的数据的字段名是A表)

带有 WHERE 的 SQL UNION ALL

SELECT uid,umobile,realname FROM users WHERE vip IN (8, 9)
 UNION
 SELECT uid,umobile,realname FROM users WHERE vip NOT IN (8, 9) AND amount > 0
 ORDER BY uid desc limit 10

如果想group by,而且还有条件,那么:

select uid,umobile,realname from (
 select uid,umobile,realname from users WHERE vip IN (8, 9)
 union all select uid,umobile,realname from users WHERE vip NOT IN (8, 9) AND amount > 0) t
 GROUP by uid ORDER BY uid desc limit 10

注意: 在union的括号后面必须有个别名,否则会报错