关系型数据库中允许表和表之间存在关系,这种关系可以把两个甚至多个表的数据联系在一起。利用这种关系,可以查询出某种符合条件的数据,这些数据将是一套符合实际业务逻辑的数据,而数据中这些表和表之间的关系将不存在。换句话说,获取真实世界的原始数据后,根据某种规则吧它们拆分成各种独立的数据,加入想从数据库中再次获取数据,那么需要依靠当初拆分的规则。而这种规则也可以看成表和表之间的联系,要再次实现这种联系,需要用到连接查询。连接分为内连接、外链接和全连接,还有一种叫做自连接,其中最常用的是内连接和外连接。
1、最简单的连接查询
最简单的逻辑查询是利用逗号完成的,它利用逗号把FROM后的表名分隔开,这就构成了最简单的逻辑查询。但这样做的意义不大。
例如:teacher表中有4行,course表中有4行,
使用 SELECT te.*,co.* FROM teacher te , course co 则返回一个有16行的表。
利用这种方式查询数据将得到两个表的笛卡尔积,也就是得到两个表中记录数的乘积。而这么做没什么意义。关于笛卡尔积,就是一个表中的每一行与另一个表中的每一行连接在一起而形成的新表,也就是查询结果。查询结果的记录数就是这两个记录数的乘积。
2、内连接
内连接也称为简单连接,它会把两个或多个表进行连接,只能查询出匹配的记录,不匹配的记录将无法查询出来,这种连接查询是平时常用的查询。内连接中最常用的就是等值连接 和不等值连接。
(1)等值连接:连接条件中使用“=”连接两个条件列表。
SELECT te.*,co.* FROM teacher te ,course co where te.tno= co.tno
SELECT te.*,co.* FROM teacher te INNER JOIN course co ON te.tno= co.tno
这两段脚本的功能是一样的。只是写法不同
(2)不等值连接:是指连接条件中使用>,<,<=,>=,!=,between...and ,in 等连接两个条件列表,但这种方式通常需要和其它等值运算一起使用,否则检索出的数据很可能没有实际意义
内连接中的关键字inner join 可以直接写成 join,系统会把join识别成内连接。但是on关键字不能省略。
3、自连接
所谓自连接,就是把自身表的一个引用作为第二个表来处理,这样就会获取表内一些特殊的数据。
例如:获取主键列不同,而其它列相同的内容。获取表PRODUCTINFO中数量相同的不同产品。
select p.productname, p.productrice, p.quantity
from productinfo p, productinfo pr
where p.productid != pr.productid and p.quantity = pr.quantity
4、外连接
外连接分为左外连接、右外连接和全外连接。它们所表示的含义:
- 左外连接:又称为左向外连接。使用左外连接的查询,返回的结果不仅仅符合连接条件的记录,还包含了左边表中的全部记录。也就是说,如果左边的某行记录在右边表中没有匹配项,则在返回结果中右表的所有选择列表项都为空。
- 右外连接:又称为右向外连接。它与左外连接相反,将右边表中所有的数据与左边进行匹配,返回的结果除了匹配成功的记录,还包含了右表中未匹配成功的记录,并在其左表对应的列补空值。
- 全外连接:返回所有匹配成功的记录,并返回左表未匹配成功的记录,也返回右表未匹配成功的记录
(1)左外连接
示例 :检索出productinfo表中每个产品对应的产品类型名称。
select p.productname, p.productprice, p.category,c.categoryid, c.categoryname
from productinfo p left join categoryinfo c on p.category = c.categoryid ;