联结表
提示:学习联结表前先熟悉一下什么是联结表,为什么使用联结表 |
其实SQL最强大的功能之一就是能在数据查询的执行重使用联结表。这里还要理解一下关系数据库,关系数据库就是设计时将信息分解成多个表,一类数据一个表,各个表通过某些共同的值相互关联。举个栗子:比如要设计一个数据库用来存储供应商信息和供应商产品信息,如果要是使用一个表是可以是实现的就是会出现很多重复数据。那么使用关系表的话就可以使用两个表实现,一个表存储供应商信息,一个表存储产品信息,每个供应商占一行,使用具有唯一标识,此标识就被称为主键,产品信息每行都有与其一致的主键,这样就可以通过关联表的方式将两个表联结起来,这样做的好处就是:
- 信息不重复,不会浪费时间和空间
- 如果信息变动,可以更改单表记录,其他表数据不需变动
- 单表数据一致,方便处理数据
注意:联结表并不是数据库实际存在的物理表,他只在执行查询期间存在。 |
1.1 创建联结
创建联结非常简单,只要指定要联结的所有表以及联结他们的方式即可
下面我们来看一个例子:
SQL语句:
SELECT vend_name,prod_name,prod_price
From Vendors,Products
WHERE Vendors.vend_id=Products.vend_id
输出结果
![]() |
SQL语句分析:SELECT语句与前面所有语句一样要指定检索的列,这里最大的区别就是所指定的两列(prod_name,prod_price)在一个表中,而第三列(vend_name)在另一个表中。我们再来看FROM子语句,与以前的SELECT语句不一样的是,这条语句的FROM子语句列出两个表,Vendors和Products,他们是这条语句联结表的名字,这条语句意思是将Vendors表中的vend_id与Products表中的vend_id匹配起来。
重点了解:
- 联结表WHERE条件语句中必须限定列名,就是要加上表名,否则会有歧义
- 联结表时必须使用条件子语句,WHERE或ON,没有使用条件子语句返回的结果位笛卡尔积,检索出的行的数目将是第一个表中的行数乘以第二个表的行数
1.2 内联结
我们目前使用的联结都称为内联结,它使用关键字INNER JOIN,他的使用稍微有点不同,下来我们看一个例子:
SQL语句:
SELECT vend_name,prod_name,prod_price
From Vendors INNER JOIN Products
ON Vendors.vend_id=Products.vend_id
输出结果:
![]() |
SQL语句分析:
这条语句中使用的SELECT与前面的SELECT语句相同,但FROM子语句不同,这里两个表之间的关系时以INNER JOIN指定的部分FROM子语句。这里使用这种语法,联结条件用特定的ON子语句而不是WHERER子语句。
1.3 多表联结
SQL并不限制一条SELECT语句中可以联结表的数量,都是相同的基本规则,首先列出所有表,然后定义表之间的关系。下来我们看一个例子:
SQL语句:
SELECT vend_name,prod_name,prod_price,quantity
From OrderItems,Vendors,Products
WHERE Vendors.vend_id=Products.vend_id
AND OrderItems.prod_id=Products.prod_id
AND order_num=20007
输出结果:
![]() |
总结:
联结时SQL中一个最重要的特性,内联结(INNER JOIN)也是常用的联结,使用联结时需要遵循基本规则,先用FROM列出所有表,然后使用WHERE或ON定义表之间的关系,至于什么时候使用INNER JOIN这个遵循方便原则。