我这些学习笔记,记录的都是我自己认为的知识点,可能以后再看的时候还要翻书,但是可以用来定位到准确的书中示例的位置,减少翻书重找的时间,利于自身知识体系的搭建。 self-transcendence
第8章 连接查询和集合查询
8.1 内连接查询
内连接包括等值连接和非等值连接。除了使用=,还可以使用on,using建立等值连接。
8.1.1 等值连接
Select * from 表1,表2,表3 where 表1.列名 = 表2.列名 and 表1.列名 = 表3.列名
Mysql中使用inner join对两个表进行等值连接:
Select * from 表1 inner join 表2 on 表1.列名 = 表2.列名
在等值的链接查询中,如果where中使用了and指定了其他查询条件,那么两个表之间相互关联的列(即使用=号连接条件的列)应该放在where子句的前面,以便提供查询效率。
8.1.2 非等值连接
除了使用=号以外的其他运算符<>等等...包括between...and运算符。
但是非等值连接一般跟等值连接一起使用,例:Select * from 表1,表2 where 表1.列名 = 表2.列名 and 表1.列名 > 表2.列名
8.1.3 使用on建立相等连接
Select * from a jion b on a.列名 = b.列名
8.1.4 使用using建立相等连接
Select * from a jion b using (列名) 这个列名就是相等列的列名
8.2 交叉连接
交叉连接返回的结果是一个笛卡儿积。所谓笛卡儿积,就是两个集合相乘的结果。假设集合a中有n个元素,集合b中有m个元素,最后返回的结果就是m*n。
这个目前不知道有什么用,等回头再来学习。
8.3 自连接查询
连接查询除了在不同表中进行,也可以在同一张表进行。
Select * from a as b,a as c where a.列名 =c.列名
因为是自连接,所以from语句中要为表定义不同的别名
8.4 外连接查询
查询不满足连接条件的部分记录,或者一个表在另一个表中不匹配的记录。
8.4.1 左外连接
左外连接不仅显示满足连接条的数据,还包括左侧表中不满足查询条件的记录。
Oracle使用+标识左外连接:
Select * from a ,b where a.列名 (+)= b.列名
如果where中有多个限制条件,则每一个条件都要加+,外连接不能用or和in,子查询中也不能用
Mysql和sql server使用left[outer] join关键字实现,outer可选:
Select * from a left jion b on a.列名 = b.列名
Select * from a left jion b using(列名)
两种都可以
8.4.2 右外连接
右外连接不仅显示满足连接条的数据,还包括右侧表中不满足查询条件的记录。
Select * from a ,b where a.列名= b.列名(+)
Oracle使用+标识右外连接:
如果where中有多个限制条件,则每一个条件都要加+,外连接不能用or和in,子查询中也不能用
Mysql和sql server使用right[outer] join关键字实现,outer可选:
Select * from a right jion b on a.列名 = b.列名
Select * from a right jion b using(列名)
两种都可以
8.4.3 全外连接
全外连接会把左表和右表中不满足条件的数据都显示出来。使用full[outer] join关键字显示。不包括重复行,并且mysql不能用,mysql只能用union关联左右外连接,实现全外连接。
Select * from a full join b on a.列名= b.列名
8.5 集合查询
集合查询包括:
并操作(union):两表数据相加自动去除重复数据,保留重复数据用union all。并且两个并的查询语句列数要相同。
交操作(intersect):取两表公共行,没有重复行,保留重复数据用intersect all,列数要相同,mysql不支持。
差操作(minus):明天看,今天看不进去这个