【MySQL必知必会】第15章:

15.1 联结

SQL最强大的功能之一就是能在数据检索查询的执行中联结(join)表,但在掌握联结之前需要了解一下的名词概念:

关系表

关系表是指包含了共同关联列的众多表格,一般表格的数量大于等于2

主键和外键

  • 主键指一个表中的唯一标识字段(简单理解为身份证ID)
  • 外键是指的是一个表中的某列是另一个表中的主键值

15.2 创建联结

简单联结

基本的联结通过WHERE子句就可以进行创建:

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
  • 在这里通过WHERE以及完全限定列名来建立起两个表格中的vend_id的联结,并且将结果返回
  • 为了保证返回结果的准确性,在使用WHERE子句时需要保证其正确

笛卡尔积

没有联结条件的表返回的结果为笛卡尔积,即检索出的行的数目N是第一个表中的行树n乘以第二个表中的行数m
可以近似理解为,当第一列中只有5个值($n=5$),第二列中有10个值($m=10$),那么返回的笛卡尔积就是50($N=nm=510$),此时返回的行数就50行

15.3 内联结

使用WHERE语句来进行联结是等值联结(即一一对应),等值联结也称为内联结,但是其并不使用WHERE子句,而是使用其他语法:

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
  • 这里INNER JOIN表明了两个表之间的关系,然后通过ON来传递条件(实际与WHERE传递)相同
  • 虽然使用WHERE子句定义联结的确比较简单,但是使用明确的联结语法能够确保不会忘记联结件;不过有时候这样做也影响性能

15.4 多表联结

SELECT语句中可联结的表的数目没有限制,创建联结也基本类似:

SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
    AND orderitems.prod_id = products.prod_id
    AND order_num = 20005;
  • 这里通过WHERE和AND的灵活组合,可以指定多个联结条件
  • 但是正如前面提到的,使用过多的联结会导致性能下降,这就需要减少不必要联结的表

你可能感兴趣的:(【MySQL必知必会】第15章:)