注:select * from table1,table2 where table1.column1=table2.column1
这是一种可替代select *from table1 [inner] join table2 on boolean_expression 的快捷语法
单纯使用内链接的话能够像前者这样写,简便直白
table1 { [inner] | { left| right| full} [outer] } join table2 using ( join column list )
用 USING 关键词后接一个用逗号分隔的字段名列表,这些字段必须是链接表共有的而且其值必须相同,链接结果去重。(条件列同名,手动指定,去重)
所以,USING (a, b, c) 等效于 ON (table1.a = table2.a AND table1.b = table2.b AND table1.c = table2.c) ,结果中abc字段各仅一个。
table1 natural { [inner] | { left| right| full} [outer] } join table2
NATURAL 是 USING 的缩写形式:它自动造成一个由两个表中同名的字段组成的 USING 列表。
USING 和 NATURAL 的原理是同样的,靠两表中同名的字段链接值相同的部分,不够灵活。(条件列同名,自动寻列,去重)
三、简单的栗子
有两表A和B
A
B
无条件链接
select * from A cross join B
有条件链接
select * from A full join B on A.name = B.name
[指定条件,全外链接]
select * from A full join B using(name)
[指定条件,全外链接,去重]
select * from A natural join B
[自动寻找同名字段为条件,内链接,去重]
select * from A natural full join B
[自动寻找同名字段为条件,全外链接,去重]
四、更多表链接
链接ABCDE多个表能够这样: |
也能够这样: |
select * from ((( A inner join B on A.a = B.b) inner join C on C.c = A.a) inner join D on D.d = C.c) inner join E on E.e = D.d |
select * from A inner join B on A.a = B.b inner join C on C.c = A.a inner join D on D.d = C.c inner join E on E.e = D.d |
大多数数据库系统会分析整个from子句,而后尝试肯定组合链接表的最有效方式,也就是说数据库不不必定会从最里边的括号开始执行查询。这极可能打乱你的逻辑设计,获得意外的结果。一些数据库系统中的优化器对于join定义的顺序很敏感。若是你发现使用不少join的查询在一个较大的数据库上执行花很长时间,经过改变join顺序极可能可以使它运行的更快。
2、子查询(subquery)
在子查询中用到一些关键字,分别是“ANY、EXISTS、IN、SOME”,在这些关键字以前还能够添加“NOT”。
一般的用法如:
EXISTS (subquery)
expression [NOT] IN (subquery)
row_constructor [NOT] IN (subquery)
expression operator ANY (subquery)
expression operator SOME (subquery)
row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)
半链接:
对于“subquery”,使用IN、EXISTS等谓词表示存在便可,称之为半链接。
SELECT * FROM D
WHERE EXISTS
( SELECT * FROM E WHERE D.id= E.id
AND E.s > 2500)
ORDER BY x
反半链接:对于“subquery”,使用NOT IN谓词表示不存在便可,称之为反半链接。
SELECT * FROM E
WHERE id NOT IN
(SELECT id FROM D WHERE lid=1700)
ORDER BY id
整理自:
——
[原创]多表链接(join)小结 - ybwang1989 - 博客园
——
数据库查询中的表链接(一) - 那海蓝蓝的日志 - 网易博客
数据库查询中的表链接(二) - 那海蓝蓝的日志 - 网易博客
——
JOIN操做PostgreSql » InBi's Blog