目录
联结
- 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的相同。
给表指定别名
- 别名除了用于列名和计算机字段外,可以给表起别名,给表起别名的作用是:
- 缩短SQL语句;
- 允许在单条select语句中多次使用相同的表;
- 给结果集取别名,当成临时表用。
给表指定别名(实例)
- 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;
外联结
- 外联结分为:
- 左联结
- 右联结
左联结
- 以左边表为基准,按照过滤条件查找右边表的记录,如果匹配到,那么就组合成一行,并显示结果,如果没有匹配到,那么只显示左边表的字段,右边表中不存在的字段用空值来表示。
右联结
- 作用和左联结刚好想法,以右边表为基准,去匹配左边的表,如果左边表字段为空,那么就用空值来表示。
实例-student表
实例-左联结
- 以左边表为基准
- 关键字:left join on
实例-左联结
- 以左边表为基准
- 关键字:right join on