07:表联结MySQL笔记7

本篇大纲

表联结

笛卡尔积

内部联结

外联结

自联结

联合查询

01:联结

  • SQL最强大的功能之一就是能在数据检索查询的执行中联结表
  • 数据是存储在关系中的,关系表的设计原则是保证把信息分解为多个表,一类数据一个表,各表通过某些常用的值互相关联

02:表关联

  • 两个表之间的关联关系通过外键来关联
  • 外键是某个表中的一列,它包含另一个表的主键值,定义了两个表之间的联系

03:创建联结

  • 创建联结,指定要联结的所有表以及他们如何关联的

image.png

04:笛卡尔乘积

  • 笛卡尔积是由没有联结条件的表关系返回的结果,检索出的行的数目将是第一个表中的行数乘以第二个表中的行数

image.png

说明:从上面的输出中可知,相应的笛卡尔积不是我们所想要的,这里返回了数据用每个供应商匹配了每个产品,它包括了供应商不正确的产品,实际上有的供应商根本没有产品

05:内联结

  • 内联结也成为等值联结,它基于两个表之间的相等测试

image.png

06:内联结(说明)

  • 上述语句中的select与前面的select语句相同,但from子句不同,这里两个表之间的关系是from子句的组成部分,以Inner Join指定。在使用这种语法时,联结条件用特定的ON子句而不是where子句。传递给ON的实际条件与传递给where的相同

07:多表联结

  • SQL对一条select语句中可以联结的表的数目没有限制,创建联结的基本规则也相同

首先列出所有表,然后定义表直接的关系

image.png

多表联结(说明)

  • 本例子显示编号为20005的订单中的物品。订单物品储存在orderitems表中,每个产品按其产品ID储存,它引用products表中的产品。这些产品通过供应商ID联结到vendors表中相应的供应商,供应商ID储存在每个产品的记录中。这里的from子句列出了3个表,而where子句定义了这两个联结条件,而第三个联结条件用来过滤出订单20005中的物品

08:多表联结性能问题

  • 注意:MySQL在运行时关联指定的每个表以处理联结,这种处理可能非常消耗资源,因此不要联结不必要的表,联结的表越多,性能下降越厉害

09:给表指定别名

  • 别名除了用于列名和计算字段外,可以给表起别名,给表起别名的作用是:
  1. 缩短SQL语句
  2. 运行在单条SELECT语句中多次使用相同的表

10:给表指定别名(实例)

  • from 子句中3个表都创造了别名

customers AS c,建立c作为customers的别名。这使得,可以使用c来代替customers

image.png

11:自联结

  • 自联结为在同一个表中做联结操作
  • 例1:假如发现某物品(其ID为DTNTR)存在问题,因此想知道生产该物品的供应商生产的其他物品是否也在

问题。此查询要求首先找到生产ID为DTNTR的物品供应商,然后找出这个供应商生产的其他物品

注意:自联结的执行效率高于子查询

image.png

12:外联结

  • 外联结分为:
  • 左联结
  • 右联结

13:左联结

以左边表为基准,按照过滤条件查找右边表的记录,如果匹配到,那么就组合成一行,并显示结果,如果没有匹配到,那么只显示左边表额度字段,右边表中不存在的字段用空值来表示

14:右联结

作用和左联结刚好相反,以右边表为基准,去匹配左边的表,如果左边表字段为空,那么就用空值来表示

15:实例

image.png

image.png

image.png

image.png

16:联合查询

  • 利用UNION关键字
  • 可以将多条select语句组合起来,将它们的结果组合成单个结果集

17:联合查询(实例)

把两个查询结合在一起使用

image.png

联合查询(说明)

  • UNION关键字指示MySQL执行两条SELECT语句,并把输出结果组合成单个查询结果
  • 注意:UNION必须由两条或两条以上的select语句组成,语句之间用关键字
  • UNION分割;UNION中的每个查询必须包含相同的列;列数据类型必须兼容

 

猜你喜欢

转载自www.cnblogs.com/kelly11/p/13188863.html