7-8 MySQL表联结------MySQL数据库技术

目录

联结

笛卡尔乘积

笛卡尔乘积实例

笛卡尔乘积(说明)

创建联结

一、小朋友,请你先数一数,再联系。

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

多表联结

多表联结性能问题

内联结

内联结(说明)

给表指定别名

给表指定别名(实例)

 自联结

外联结

左联结

右联结

实例-student表

实例-左联结

实例-左联结


联结

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

笛卡尔乘积

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

笛卡尔乘积实例

笛卡尔乘积(说明)

  • 从上面的输出中可知,相应的笛卡积不是我们想要的,这里反悔了数据用每个供应商匹配了每个产品,它包括了供应商不正确的产品,实际上有的供应商根本就没有产品。

创建联结

  • 从多个表中查询数据时,指定所有要联结的表,以及他们是如何关联的。
  • 两表关联通过外键关联,但是不一定都得外键关联。
  • 但是外键一定存在两表数据存在关联关系。

一、小朋友,请你先数一数,再联系。

  • 根据需求得:图片与数字的关联

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

 

多表联结

  • SQL对一条select语句中可以联结的表的数目没有限制,创建联结的基本规则也相同。首先列出所有表,然后定义表之间的关系。

多表联结性能问题

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

内联结

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

select vendors.vend_name,prod_name,prod_price from vendors,products where vendors.vend_id=products.vend_id order by vend_name,prod_name;

等价于

select 
    vend_name, prod_name, prod_price
from
    vendors
        inner join
    products ON vendors.vend_id = products.vend_id;


#查询20005订单购买物品的产品ID、产品名称、供应商名称
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;

等价于

select 
    prod_name, vend_name, prod_price, quantity
from
    orderitems
        inner join
    products ON orderitems.prod_id = products.prod_id
        inner join
    vendors ON products.vend_id = vendors.vend_id
where
    orderitems.order_num = 20005;

内联结(说明)

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

给表指定别名

  • 别名除了用于列名和计算机字段外,可以给表起别名,给表起别名的作用是:
  1. 缩短SQL语句;
  2. 允许在单条select语句中多次使用相同的表;
  3. 给结果集取别名,当成临时表用。

给表指定别名(实例)

  • as 可以省略

 自联结

  • 自联结为在同一个表中做联结操作。
  • 例如:假如发现某物品(其ID为DTNTR)存在问题,因此想知道生产该物品的供应商生产的其他物品是否也存在问题。此查询要求首先找到生产ID为DTNTR的物品的供应商,然后找出这个供应商生产的其他物品。
#自联结:查询出英语成绩比数学成绩好的学生ID
select 
    a.sid,a.grade as '英语',b.sid as '数学'
from
    sc as a,
    sc as b
where
    a.sid = b.sid and a.cname = '英语'
        and b.cname = '数学'
        and a.grade > b.grade;
#给结果集取别名,当成临时表用
select 
    a.sid,a.grade as '英语',b.sid as '数学'
from
(select sid,grade from sc where cname='英语') as A,
(select sin,grade from sc where cname='数学') as B
where A.sid=B.sid and A.grade>B.grade;

外联结

  • 外联结分为:
  1. 左联结
  2. 右联结

左联结

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

右联结

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

实例-student表

​​​​​​​

实例-左联结

  • 以左边表为基准
  • 关键字:left join             on 

实例-左联结

  • 以左边表为基准
  • 关键字:right join             on 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值