er Bros. 3 | Walter Matthau
... ...
SELECT distributors.name
FROM distributors
WHERE distributors.name LIKE 'W%'
UNION
SELECT actors.name
FROM actors
WHERE actors.name LIKE 'W%'
name
----------------
Walt Disney
Walter Matthau
Warner Bros.
Warren Beatty
Westward
Woody Allen
兼容性
扩展
PostgreSQL 允许我们在一个查询里省略 FROM 子句。 这个特性是从最初的 PostQuel 查询语言里保留下来的 它的最直接用途就是计算简单的常量表达式的结果:
SELECT 2+2;
?column?
----------
4
其它有些 DBMS 不能这么做,除非引入一个单行的伪表做 select 的 from.这个特性的另外一个不太明显的用途是把一个普通的从一个或多个表的 select 缩写:
SELECT distributors.* WHERE distributors.name = 'Westward';
did | name
-----+----------
108 | Westward
这样也可以运行是因为我们给查询中引用了但没有在 FROM 中提到的每个表都加了一个隐含的 FROM 项.尽管这是个很方便的写法,但它却容易误用.比如,下面的查询
SELECT distributors.* FROM distributors d;
可能就是个错误;用户最有可能的意思是
SELECT d.* FROM distributors d;
而不是下面的他实际上得到的无约束的连接
SELECT distributors.* FROM distributors d, distributors distributors;
为了帮助检测这种错误, PostgreSQL 7.1 以及以后的版本将在你使用一条即有隐含 FROM 特性又有明确的 FORM 子句的查询的时候给出警告.
SQL92
SELECT 子句
在 SQL92 规范里, 可选的关键字 "AS" 是多余的,可以忽略掉而不对语句产生任何影响. PostgreSQL 分析器在重命名列/字段时需要这个关键字, 因为类型扩展的特性会导致上下文语意不清. 不过,"AS" 在 FROM 项里是可选的.
DISTINCT ON 语法不是SQL92 的标准。 LIMIT 和 OFFSET 也不是。
在 SQL92里, 一个 ORDER BY 子句只可以使用在结果列名称或者序号上, 而 GROUP BY 子句只能用于输入列/字段上. PostgreSQL 把这 两个子句都扩展为允许另一种选择(但是如果出现冲突则使用标准的解释). PostgreSQL 还允许两个子句声明任意的表达式. 请注意,在表达式里出现的名称将总是被当做输入列/字段的名称, 而不是结果列/字段名称.
UNION/INTERSECT/EXCEPT 子句
SQL92 的 UNION/INTERSECT/EXCEPT 语法允许一个附加的 CORRESPONDING BY 选项:
table_query UNION [ALL]
[CORRESPONDING [BY (column [,...])]]
table_query
CORRESPONDING BY 目前还不被 PostgreSQL支持.
?
SQL语句(inner join,left out join,right out join三者的不同用法)
jion 语句有三种,inner join, left outer join 和 right outer join 都可以简写,分别为jion,left join,right jion。
jion语句可以用来组合两个表中的记录,只要在公共字段之中有相符的值即可,该语句联合两个表查询得到的结果是可以添加新的数据,可以把它看成将两个具有相关内容的表联
接在一起新生成的表,而一般的select 语句没有这个功能。
1) 内连接,inner join ... on
语句格式:
FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表X
ON Member.字段号=表X.字段号
例子:
SELECT *
FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel)
INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock
ORDER BY MemberDate DESC
内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。
2) 左外连接,left outer join ... on
语句格式:
FROM [表名1] LEFT JOIN [表名2]
ON [表名1.字段A] 〈关系运算符〉[表名2.字段B]
其实LEFT JOIN 的功能就是将LEFT左边的表名1中的所有记录全部保留,而将右边的表名2中的字段B与表名1.字段A相对应的记录显示出来(当使用SELECT * 时)。而RIGHT JOIN
和LEFT JOIN 相反。
外连接的功能是,把LEFT左边的表中的所有记录保留,而右边表只保留相关联的记录,也就是先执行一次INNER JOIN,然后把LEFT左边的表中的与右边表没有任何关联的记录也
保留,而右边表的字段为null.
使用左向外联接
假设在 city 列上联接 authors 表和 publishers 表。结果只显示在出版商所在城市居住的作者(本例中为 Abraham Bennet 和 Cheryl Carson)。
若要在结果中包括所有的作者,而不管出版商是否住在同一个城市,请使用 SQL-92 左向外联接。下面是 Transact-SQL 左向外联接的查询和结果:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC
【也就是先把authors表中的所有数据列出,由于authors表中没有pub_name字段,所以为null 】
下面是结果集:
au_fname au_lname pub_name
-------------------- ------------------------------ -----------------
Reginald Blotchet-Halls NULL
Michel DeFrance NULL
Innes del Castillo NULL
Ann Dull NULL
Mar