sql的连接
92语法
- 语法规则:
select t1.column,t2.column
from t1,t2
where t1.c1 = t2.c1
-
在where子句中写入连接条件
-
当多个表中有重名的列,必须在列名之前加上表名
-
连接类型:
-
笛卡尔积
select 字段列表 from t1,t2,t3
检索出的行数是两个表的行数的乘积
检索出的列数是两个表的列数相加
应该保证所有联结都有where子句,不然数据库返回比想要的数据多得多的数据
-
等值连接 : equi join
select 字段列表 from t1,t2,t3 where t1.c1 = t2.c1 and t1.c2 = t3.c2
使用and操作符增加查询条件
多于两个表的连接
为了连接n个表,至少需要n-1个连接条件
-
非等值连接: non - equi join
-- !=, >, <, >=, <=, between and select 字段列表 from t1,t2,t3 where t1.c1 != t2.c1 and t1.c2 != t3.c2
-
外连接: outer join
外连接运算符是(+)
有左外连接和右外连接
-- 左外:主表在左边 select t1.c1,t1.c2,t2.c3 from t1,t2 where t1.c1 = t2.c1(+); -- 右外:主表在右边 select t1.c1,t1.c2,t2.c3 from t1,t2 where t1.c1(+) = t2.c1;
-
自连接: self join
select 字段列表 from t t1,t t2 where t1.c1 = t2.c2
-
99语法(现在使用的)
针对92语法的缺点进行改正;92语法的缺点:语句过滤条件和表连接条件都在where子句中当条件过多,连接多的时候容易造成混淆
新增table join句法结构:
-
cross join : 交叉连接
产生一个笛卡尔积
select t1.c,t2.c from t1 cross join t2
-
natural join
- 自然连接 natural join子句基于两个表中列名完全相同的列产生连接
- 两个表有相同的列
- 数据类型相同
- 从两个表中选出连接列的值相等的所有行
-
using子句
- using子句引用的列在sql任何地方不能使用表名或者别名做前缀,同样适合natural子句
-
on 子句
- 为了设置连接条件或者指定连接的列,需要使用on自居
- 连接条件与其他的查询条件分开书写
- 使用on子句查询语句更容易理解
-
left outer join
- 会返回所有左边表中的行,即使在左边的表中没有可对应的列值(left outer join的左边)
-
right outer join
- 会返回所有右边表中的行,即使在右边的表中没有可对应的列值(right outer join的右边)
-
full outer join
- 相当于左外和右外连接的和
-
inner outer join
- 两张表的连接查询,只会查询出有匹配记录的数据