联结表,就是关联表查询,主要功能是能在多表中使用一条SQL检索出期望值,但实际库表中是存在的,只在查询期间存在。
分类:
- 内连接和外连接使用的
join
关键字 - 联结表会返回一对多、一对一、多对多关系
- 联结表不建议超过三张表以上
1. 简单链接
SELECT username,order_name FROM customer,`order` WHERE customer.user_id = `order`.user_id;
- 语句分析:查询
customer
和order
两张表(username来自customer表,order_name来自order表)中user_id
相等的数据,返回username
和order_name
- 注意:简单联结
where
子句后面必须带上两张表的联结关系,否则会出现笛卡尔集(比如3行数据联结另一张表3行数据会产生3*3=9条) - 结果:
2. 内联结
内连接(inner join
) 又称等值联结,其查询结果跟之前的简单联结一致。
SELECT username,order_name FROM customer INNER JOIN `order` ON (customer.user_id = `order`.user_id);
- 语句分析:跟之前的简单联结稍微不同的是 等值条件 是放在
on
关键字之后,在等值条件后面还可以进行where
子句过滤条件查询 - 结果:
3. 自然联结
自然联结与标准的联结不同就是只返回值唯一的列,不会返回重复的列。
3.1. 自然联结示例
SELECT username,order_name FROM customer INNER JOIN `order` ON (customer.user_id = `order`.user_id);
- 结果:
3.2. 非自然联结
SELECT * FROM customer INNER JOIN `order` ON (customer.user_id = `order`.user_id);
- 结果:
重复的是user_id
。
4. 外联结
4.1. 右外联结
右外联结是相对于OUTER JOIN
右边的表,查询出右边表的所有数据和根据等值条件匹配左边表的数据,如果左边表的数据不匹配,那么其返回列的值是NULL
充当。
SELECT * FROM `order` RIGHT OUTER JOIN customer ON (customer.user_id = `order`.user_id);
- 结果:
4.2. 左外联结
左外联结是相对于OUTER JOIN
左边的表,查询出左边表的所有数据和根据等值条件匹配右边表的数据,如果右边表的数据不匹配,那么其返回列的值是NULL
充当。
SELECT * FROM customer LEFT JOIN `order` ON customer.user_id = `order`.user_id);
- 结果:
左右外联结的区别:其实没什么不同,只是查询表顺序不一致,通过置换表的相对位置可查询出一样的结果。