联接查询

一. 交叉联接
交叉联接的格式为:表 1 CROSS JOIN 表 2,主要目的是求出两张表的笛卡尔积,即
返回两张表数据的乘积组合。这里用户表和身份证表做演示:
//实现用户表和身份证表的笛卡尔积
SELECT * FROM think_user CROSS JOIN think_card;
所以笛卡尔积,就是两张表所有列的组合。如果用户表有 5 条数据,身份证表有 4 条
数据,那么最后的结果就是 5 * 4 = 20 条数据。
//过滤筛选出用户和身份证对应的信息
SELECT * FROM think_user u CROSS JOIN think_card c WHERE u.id=c.uid;
//联接指定的对应数据,结果同上
SELECT * FROM think_user u CROSS JOIN think_card c ON u.id=c.uid;
PS:WHERE 和 ON 都是过滤筛选,只不过 ON 是在两个表联接时就过滤不满足条件的数
据,而 WHERE 是把所有数据读完后再过滤掉数据。
二. 内联接
内联接格式为:表 1 INNER JOIN 表 2;在 MySQL 中,CROSS JOIN 交叉联接基本等
于 INNER JOIN 内联接,以上的三种写法,都可以使用 INNER JOIN。
一般来说,除非你就是要输出笛卡尔积表,可以使用 CROSS JOIN 来完成。而带有过滤
条件的,都建议使用 INNER JOIN。如果使用 INNER JOIN 却不带过滤条件,就等于 CROSS
JOIN。
//INNER JOIN 联接两张表
SELECT * FROM think_user u INNER JOIN think_card c ON u.id=c.uid;
//INNER JOIN 可以省略 INNER
SELECT * FROM think_user u JOIN think_card c ON u.id=c.uid;
//没有条件的 INNER JOIN 就是 CROSS JOIN 实现笛卡尔积
SELECT * FROM think_user INNER JOIN think_card;
//先使用 ON 来联接将要处理的数据表,然后在用 WHERE 过滤更精确的数据
SELECT * FROM think_user u INNER JOIN think_card c ON u.id=c.uid WHERE
u.id>2;
PS:ON 一般用于两张表字段的联接,而 WHERE 作为联接后的过滤来使用。
三. 外联接
外联接格式为:表 1 [LEFT|RIGHT] OUTER JOIN 表 2,在外联接联接两张表时,是
不可以使用 WHERE 的,必须使用 ON。
//通过左联接来查找对应的身份证信息,没有身份证的用户,身份证信息将为 NULL
SELECT * FROM think_user u LEFT OUTER JOIN think_card c ON u.id=c.uid;
//找出没有身份证的用户
SELECT * FROM think_user u LEFT OUTER JOIN think_card c ON u.id=c.uid
WHERE c.id IS NULL;
//通过右联接来查找对应的用户信息,没有找到的,用户信息将为 NULL
SELECT * FROM think_user u RIGHT OUTER JOIN think_card c ON u.id=c.uid;
PS:和 INNER JOIN 一样,这里的 OUTER 关键字可以省略。

posted @ 2015-04-20 16:08  yesterday679  阅读(150)  评论(0)    收藏  举报