目录
什么是联结?内部联结?
联结或者说关联,指的就是在数据检索查询时,将多个表的数据联系起来,完成共同的查询。
比如这样进行搜索:
select vend_name,prod_name,prod_price from vendors,products
where vendors.id=products.id order by vend_name,prod_name;
在这个句子里面,发现from后面跟着两个表:vendors和products,连结的条件是:vendors.id=products.id。返回的字段中vend_name是属于vendors表的,而prod_name和prod_price是属于products表的,这就是将两个表的数据联合起来查询。
需要注意这里的条件where后面的字段,必须是字段的完全限定列名,即“表名.列名”。
这种联结方式基于两个表里面2个字段的值相等,我们把这种联结叫做等值联结,或者“内部联结”。
但是更为标准的写法是:
select vend_name,prod_name,prod_price from vendors inner join products on vendors.id=products.id ;
这其实也是我们更常见的写法,现在需要联结的表以及联结的条件由inner join 以及on来给出。
表的别名
比如:
select c.cust_name,c.cust_contact from customers AS c,orders AS o,
orderitems AS oi where c.cust_id = o.cust_id AND oi.order_num=o.order_num AND
prod_id='TNT2' ORDER BY c.cust_name;
这里就给2个表起了2个别名:c和o。使用别名可以缩短SQL语句,以及允许在单次的select语句中多次使用相同的表。
自联结
之前谈到了给表起别名,那么可能有人奇怪,什么叫:“允许在单次的select语句中多次使用相同的表”???
这里举一个例子:
比如一个产品表里面id=wenti(问题的拼音)的产品都有问题,然后想找到这个产品对应的生产商生产的其他的产品,在这个生产表里面的位置, 那么就可以写成下面这样:
select p1.prod_id ,p1.prod_name from products as p1,product as p2 where
p1.vend_id=p2.vend_id and p1.prod_id='wenti';
这里就是相同的一个表:produtc,但是要使用2次,因此就起了2个不同的别名。
外部联结
如果说内部联结只返回两个表之间关联的数据,那么外部联结,除了返回关联的数据,还返回剩下的数据。比如统计顾客下了哪些订单的时候,还会加上没下订单的客户。
比如有下面的订单表,a表是用户表(字段分别是用户的id和姓名),b表是订单表(字段分别是订单的id和内容)。
table_a表id | table_a表name | table_b表id | table_a表content |
1 | A000101 | 1 | B000201 |
2 | A000102 | 2 | B000202 |
3 | A000103 | 3 | B000203 |
4 | A000104 | 6 | B000204 |
5 | A000105 | 7 | B000205 |
8 | A000106 | 9 | B000206 |
1、内部联结
就是下面这样:
查询语句:
SELECT a.*,b.* FROM table_a a INNER JOIN table_b b ON a.id=b.id
返回的结果:
2、外部联结(left join)
查询:
SELECT a.*,b.* FROM table_a a LEFT JOIN table_b b ON a.id=b.id
返回结果:
3、 外部联结(right join)
查询:
SELECT a.*,b.* FROM table_a a RIGHT JOIN table_b b ON a.id=b.id
返回的结果:
1 | A000101 | 1 | B000201 |
2 | A000102 | 2 | B000202 |
3 | A000103 | 3 | B000203 |
(null) | (null) | 6 | B000204 |
(null) | (null) | 7 | B000205 |
(null) | (null) | 9 | B000206 |
参考:
《MySQL必知必会》
简书网站