《MySQL必知必会》——创立联结

联结表

关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各个表通过某些常用值(即关系设计中的关系)相互关联。

联结是一种机制,用来在一条SELECT 语句中关联表

  • 可伸缩性:能够适应不断增加的工作量而不失败。

  • 主键:用来唯一标示某一行的列称为主键

  • 外键:表中的一列,包含了另外一个表的主键值,定义了两个表的关系。

     SELECT id,name,price FROM tables1,tables2 WHERE tables1.name=tables2.name;
    

    在联结两个表时,实际上做的是将第一个表中的每一行与第二个表中的每一行进行匹配,WHERE子句作为过滤条件,它只包含那些匹配给定的行,没有WHERE子句,那检索出来的行的数目将是第一个表中的行数乘以第二个表中的行数。

内部联结

内部联结也称为等值联结,它基于两个表之间的相等测试。
实现两个或多个表的联结可以使用INNER JOIN ON关键字

SELECT name, price FROM tables1 INNER JOIN tables2 ON tables1.id=tables2.id 

SQL对一条SELECT语句中可以联结的表的数目没有限制,首先列出所有表,然后定义表之间的关系。但是这种处理非常耗费资源,联结的表越多,性能下降的越厉害。

自联结

自己联结自己表,自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。

SELECT p1.id, p1.name from products AS p1,products AS p2 WHERE p1.id=p2.id AND p1.name='LINING';

自然联结

自然联结排除多次出现的列,使每个列只返回一次。一般是通过对表使用通配符SELECT *,对所有其他表的列使用明确的子集来完成

SELECT c.*,o.num,p.name FROM customer AS c,order AS o, products AS p WHERE c.id = o.id AND o.num=p.num AND c.name='LINING';

外部联结

包含了那些在相关表中没有关联行的行,这种联结称为外部联结。
使用关键字OUTER JOIN来指定联结的类型。在使用OUTER JOIN时,必须指定RIGHT 或LEFT关键字包括其所有行的表

SELECT customers.id ,orders.num from customers RIGHT OUTER JOIN orders ON orders.id=customers.id;

左外联结和右外联结,它们之间唯一的差别就是所关联的表的顺序不同。左外联结可以通过颠倒FROM或WHERE子句中的顺序转换为右外联结,因此两种类型的外部联结可以互换使用。

带聚集函数的联结

聚集函数用来汇总数据,聚集函数可以和联结一起使用

SELECT name,id COUNT(order_num) AS num FROM
customer INNER JOIN orders ON 
customer.id = order.id GROUP BY customer.id;

使用联结合联结的条件

  • 注意使用联结的类型,一般使用内部联结,但外部联结也是有效的。
  • 应该总是提供联结条件,否则会得到笛卡尔积
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值