SQLoracle.docx
《SQLoracle.docx》由会员分享,可在线阅读,更多相关《SQLoracle.docx(149页珍藏版)》请在冰豆网上搜索。
![SQLoracle.docx](https://file1.bdocx.com/fileroot1/2022-11/15/06a33240-ec19-4aec-bc8a-75720174cb72/06a33240-ec19-4aec-bc8a-75720174cb721.gif)
SQLoracle
SQL的学习资料
SELECT
名称
SELECT—从表或视图中取出若干行.
SELECT[ALL|DISTINCT[ON(expression[,...])]]
expression[ASname][,...]
[INTO[TEMPORARY|TEMP][TABLE]new_table]
[FROMtable[alias][,...]]
[WHEREcondition]
[GROUPBYcolumn[,...]]
[HAVINGcondition[,...]]
[{UNION[ALL]|INTERSECT|EXCEPT}select]
[ORDERBYcolumn[ASC|DESC|USINGoperator][,...]]
[FORUPDATE[OFclass_name[,...]]]
LIMIT{count|ALL}[{OFFSET|,}start]
输入
expression
表的列/字段名或一个表达式.
name
使用AS子句为一个列/字段或一个表达式声明另一个名称.这个名称主要用于标记输出列。
name不能在WHERE,GROUPBY或HAVING子句中使用。
但是它可以在与ORDERBY子句里引用。
TEMPORARY,TEMP
该表是在这次会话中唯一的,并且将在会话结束后自动删除。
new_table
如果声明了INTOTABLE子句,查询的结果将存储在指出名称的另一个表中.目标表(new_table)将被自动创建并且在此命令执行之前不应该存在。
请参考SELECTINTO获取更多信息.
注意:
CREATETABLEAS语句也将从选择查询中创建新表.
table
FORM子句引用的一个现存的表的名称.
alias
正在处理的表table的别名,用于缩写或消除一个表内部联合时的含混.
condition
一个结果为真或假布尔表达式.参阅WHERE子句获取更多信息.
column
表的列/字段的名称.
select
一个可以有除ORDERBY子句外的所有特性的选择语句.
输出
Rows
查询返回的所有结果集的行.
count
查询返回的行的记数.
描述
SELECT将从一个或更多表中返回记录行。
选择的侯选行是满足WHERE条件的所有行。
或者如果省略了WHERE语句则选择表中的所有行.(参阅WHERE子句)
DISTINCT将从选择出来的结果集中删除所有的重复的行。
ALL(缺省)将返回所有侯选行,包括重复的行。
DISTINCTON删除匹配所有表达式的行,只保留每个重复集的第一行。
注意这里每个重复集的"第一行"是不可预料的,除非我们用ORDERBY来保证我们希望的行最先出现。
例如,
SELECTDISTINCTON(location)location,time,report
FROMweatherReports
ORDERBYlocation,timeDESC;
检索出每个地区的最近的天气预报。
但是如果我们没有使用ORDERBY来强制每个地区按时间值降续排列,我们得到的将是每个地区的不可预料的时间的报告。
GROUPBY子句允许用户将一个表分成概念上的组.(参阅GROUPBY子句。
)
HAVING子句声明一个分组了的表,该表是从前面声明的子句的结果集中去除了一些组后生成的.(参阅HAVING子句。
)
ORDERBY子句允许用户根据模式操作符(ASCending或DESCending)来表明他/她所希望的行的排序模式(参阅ORDERBY子句)。
UNION操作符允许结果集是那些涉及到的查询所返回的行的集合。
(参阅UNION子句。
)
INTERSECT给出两个查询公共的行。
(参阅INTERSECT子句。
)
EXCEPT给出存在于第一个查询而不存在于第二个查询的行。
(参阅EXCEPT子句。
)
FORUPDATE子句允许SELECT语句对选出的行执行排他锁。
LIMIT子句允许给用户返回一个查询生成的结果的子集。
(参阅LIMIT子句。
)
你必须有SELECT权限用来从表中读取数值(参阅GRANT/REVOKE语句).
WHERE子句
可选的WHERE条件有如下常见的形式:
WHEREboolean_expr
boolean_expr可以包含任意个得出布尔值的表达式。
通常表达式会是
exprcond_opexpr
或
log_opexpr
这里cond_op可以是下面之一:
=,<,<=,>,>=,<>或条件操作符象ALL,ANY,IN,LIKE等,或者用户定义的操作符,而log_op可以为:
AND,OR,NOT.比较返回的结果要么是TRUE要么是FALSET并且如果表达式的值是FALSE,所有记录都将被丢弃.
GROUPBY子句
GROUPBY声明一个分了组的表,该表源于应用使用下面的子句:
GROUPBYcolumn[,...]
GROUPBY将把所有在组合了的列上共享同样的值的行压缩成一行。
如果存在聚集函数,这些聚集函数将计算每个组的所有行,并且为每个组计算一个独立的值(如果没有GROUPBY,聚集函数对选出的所有行计算出一个数值)。
存在GROUPBY时,除了在聚集函数里面,对任何非组合列的引用都是非法的,因为对一个非组合列会有多于一个可能的返回值。
HAVING子句
可选的HAVING条件有如下形式:
HAVINGcond_expr
这里cond_expr与为WHERE子句里声明的相同.
HAVING子句声明一个从前面的子句的结果集中去除了一些不符合cond_expr组后分组的表.
在cond_expr里引用的每个列/字段应该清晰地指明一个组的列/字段,除非引用在一个聚集函数里。
ORDERBY子句
ORDERBYcolumn[ASC|DESC][,...]
column既可以是一个列/字段名也可以是一个序数。
序数指的是列/字段按顺序(从左到右)的位置.这个特性可以使得对没有一个合适名称的列/字段的排序成为可能.这一点可能永远没有用,因为总是可以通过AS子句给一个要计算的列/字段赋予一个名称,例如:
SELECTtitle,date_prod+1ASnewlenFROMfilmsORDERBYnewlen;
从PostgreSQL版本6.4开始,还可以ORDERBY任意表达式,包括那些没有出现在SELECT结果列表里面的域。
因此下面的语句现在是合法的:
SELECTnameFROMdistributorsORDERBYcode;
我们可以给ORDERBY子句里每个列/字段加一个关键字DESC(降序)或ASC(升序).如果不声明,ASC是缺省.我们还可以声明一个排序操作符来实现排序。
ASC等效于使用'<'而DESC等效于使用'>'。
UNION子句
table_queryUNION[ALL]table_query
[ORDERBYcolumn[ASC|DESC][,...]]
这里table_query表明任何没有ORDERBY子句的选择表达式.
UNION操作符允许结果集是那些涉及到的查询所返回的结果的集合。
两个做为UNION直接操作数的SELECT必须生成相同数目的字段,并且对应的字段必须有兼容的数据类型。
缺省地,UNION的结果不包含任何重复的行,除非声明了ALL子句.
同一SELECT语句中的多个UNION操作符是从左向右计算的.注意ALL关键字不一定是全局的,只是应用在当前一对表的结果上.
INTERSECT子句
table_queryINTERSECTtable_query
[ORDERBYcolumn[ASC|DESC][,...]]
这里table_query声明任何没有ORDERBY子句的选择表达式。
INTERSECT给出两个查询公共的行。
两个做为INTERSECT直接操作数的SELECT的结果必须有相同数目的字段,并且对应的字段必须有兼容的数据类型。
除非用圆括号指明顺序,同一SELECT语句中的多个INTERSECT操作符是从左向右计算的。
EXCEPT子句
table_queryEXCEPTtable_query
[ORDERBYcolumn[ASC|DESC][,...]]
这里table_query声明任何没有ORDERBY子句的选择表达式。
EXCEPT给出存在于第一个查询而不存在于第二个查询的行。
(参阅EXCEPT子句)。
两个做为EXCEPT直接操作数的SELECT的结果必须有相同数目的字段,并且对应的字段必须有兼容的数据类型。
除非用圆括号指明顺序,同一SELECT语句中的多个EXCEPT操作符是从左向右计算的。
LIMIT子句
LIMIT{count|ALL}[{OFFSET|,}start]
OFFSETstart
这里count声明返回的最大行数,而start声明开始返回行之前忽略的行数。
LIMIT允许你检索有查询其他部分生成的行的某一部分。
如果给出了限制计数,那么返回的行数不会超过哪个限制。
如果给出了一个偏移量,那么开始返回行之前会忽略那个数量的行。
在使用LIMIT时,一个好习惯是使用一个ORDERBY子句把结果行限制成一个唯一的顺序。
否则你会得到无法预料的查询返回的子集---你可能想要第十行到第二十行,但以什么顺序?
除非你声明ORDERBY,否则你不知道什么顺序。
在Postgres7.0,查询优化器在生成查询规划时把LIMIT考虑进去了,所以你很有可能因给出的LIMIT和OFFSET值不同而得到不同的规划(生成不同的行序)。
因此用不同的LIMIT/OFFSET值选择不同的查询结果的子集将不会产生一致的结果,除非你用ORDERBY强制生成一个可预计的结果顺序。
这可不是毛病;这是SQL生来的特点,因为除非用了ORDERBYE约束顺序,SQL不保证查询生成的结果有任何特定的顺序。
用法
将表films和表distributors联合在一起:
SELECTf.title,f.did,d.name,f.date_prod,f.kind
FROMdistributorsd,filmsf
WHEREf.did=d.did
title|did|name|date_prod|kind
-------------------------+---+----------------+----------+----------
TheThirdMan|101|BritishLion|1949-12-23|Drama
TheAfri