版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SQL的学习资料
SELECT
名称
SELECT—从表或视图中取出若干行.
SELECT[ALLIDISTINCT[ON(expression[,...])]]
expression[ASname][,…]
INTO[TEMPORARYITEMP][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,聚集函数对选出的所有行计算出一个数值)。存在GROUP
BY时,除了在聚集函数里面,对任何非组合列的引用都是非法的,因为对一个
非组合列会有多于一个可能的返回值。
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
fORDERBYcolumn[ASCIDESC][,...]]
这里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|101BritishLion|1949-12-23|Drama
TheAfricanQueen|101BritishLion11951-08-111Romantic
UneFemmeestuneFemme102JeanLucGodard|1961-03-12|Romantic
Vertigo103IParamount1958-11-14Action
Becket103Paramount|1964-02-03|Drama
48Hrs103Paramount1982-10-22Action
WarandPeace|104Mosfilm|1967-02-12|Drama
WestSideStory,105UnitedArtists|1961-01-03|Musical
Bananas105UnitedArtists|1971-07-13|Comedy
Yojimbo1106Toho11961-06-161Drama
There,saGirlinmySoup107Columbia|1970-06-11|Comedy
TaxiDriver107Columbia1975-05-15Action
AbsenceofMalice107Columbia|1981-11-15|Action
Storiadiunadonna108Westward|1970-08-15|Romantic
TheKingandI109|20thCenturyFox|1956-08-11|Musical
DasBoot,1101BavariaAtelier11981-11-111Drama
BedKnobsandBroomsticks111IWaltDisneyIMusical
统计用kind分组的所有电影和组的歹V字段的len(长度)的和:
SELECTkind,SUM(len)AStotalFROMfilmsGROUPBYkind;
kind|total
Action|07:34
Comedy|02:58
Drama|14:28
Musical|06:42
Romantic|04:38
统计所有电影(films),组的列/字段len(长度)的和,用kind分组并且
显示小于5小时的组总和:
SELECTkind,SUM(len)AStotal
FROMfilms
GROUPBYkind
HAVINGSUM(len)<INTERVAL'5hour';
kind|total
Comedy|02:58
Romantic|04:38
下面两个例子是根据第二列(name)的内容对单独的结果排序的经典的方法.
SELECT*FROMdistributorsORDERBYname;
SELECT*FROMdistributorsORDERBY2;
didname
——+-----------------
109|20thCenturyFox
110IBavariaAtelier
101|BritishLion
107|Columbia
102|JeanLucGodard
113|Lusofilms
104|Mosfilm
103|Paramount
106|Toho
105|UnitedArtists
111|WaltDisney
112|WarnerBros.
108|Westward
这个例子演示如何获得表distributors和actors的联合,只将每个表中以字
母W开头的取出来.因为只取了不相关的行,所以关键字ALL被省略了:
distributors:actors:
did|nameid|name
——+------------一一+---------------
108IWestward11WoodyAllen
111WaltDisney2|WarrenBeatty
112|WarnerBros.3|WalterMatthau
SELECTdistributors,name
FROMdistributors
WHEREdistributors,nameLIKE'W%'
UNION
SELECTactors,name
FROMactors
WHEREactors,nameLIKE'W%'
name
WaltDisney
WalterMatthau
WarnerBros.
WarrenBeatty
Westward
WoodyAllen
兼容性
扩展
Postgres允许我们在一个查询里省略FROM子句。这个特性是从最初的
PostQuel查询语言里保留下来的:
SELECTdistributors.*WHEREname='Westwood';
did|name
108|Westward
SQL92
SELECT子句
在SQL92规范里,可选的关键字"AS”是多余的,可以忽略掉而不对语句产生
任何影响.Postgres分析器在重命名列/字段时需要这个关键字,因为类型扩展
的特性会导致上下文语意不清.
DISTINCTON语法不是SQL92的标准。LIMIT和OFFSET也不是。
UNION子句
SQL92的UNION语法允许一个附加的CORRESPONDINGBY子句:
table_queryUNION[ALL]
[CORRESPONDING[BY(column[,...])]]
table_query
CORRESPONDINGBY目前还不被Postgres支持.
SELECTINTO
名称
SELECTINTO一从当前表或视图中创建一个新表
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]
输入
所有输入的域都在SELECT中有详细描述.
输出
所有输入的域都在SELECT中有详细描述.
描述
SELECTINTO从一个查询中创建一个新表.比较典型的是这个查询从一个现存的
表中提取数据,但实际上任何SQL查询都可以.
注意:CREATETABLEAS功能上和SELECTINTO命令相等.
CREATETABLE
名称
CREATETABLE一创建一个新表
CREATE[TEMPORARY|TEMP]TABLEtable(
columntype
[NULL|NOTNULL][UNIQUE][DEFAULTvalue]
[column_constraint_clause\PRIMARYKEY}[...]]
[,PRIMARYKEY(column[,...])]
[,CHECK(condition)]
[,table_constraint_clause]
)[INHERITS(inherited_table[,・・・])]
输入
TEMPORARY
此表只是为这次会话创建,并且在会话结束后自动删除。当临时表存在时,同名的
永久表是不可见的。
table
将要创建的新表的名称.
column
列/字段名.
type
列/字段类型.这里可以包括数组的声明.请参考PostgreSQL用户手册获取关于数
据类型和数组的详细信息.
DEFAULTvalue
一个列/字段的缺省值.请参考DEFAULT子句获取更多信息.
column_constraint_clause
可选的列/字段约束子句,声明一系列整合的约束和测试,当对表进行更新或插入操
作时必须满足这些约束条件才能成功.每个约束必须生成一个布尔式.尽管SQL92
需要column_constraint_clause用于指定某一行,Postgres允许在用■•个列/
字段的约束索引多个列.请/考列约束子句获取更多信息.
table_constraint_clause
可选的表(约束)CONSTRAINT子句,声明一系列整合的约束,当对表进行更新
或插入时必须满足这些约束.每个约束必须生成一个布尔表达式.可以对多列使用
同一个约束.一个表只能声明一个PRIMARYKEY子句:PRIMARYKEYcolumn
(表约束)和PRIMARYKEY(列/字段约束)是互斥的.请参考表约束子句获取
更多信息.
INHERITSinherited_table
可选的(继承)INHERITS子句声明一系列表名,这个表将自动从这些表继承所有
字段.如果任何继承域出现的次数超过一次,Postgres将报告一个错误.Postgres自
动地允许所创建的表继承所有其父表的函数.
另外:函数的继承是按照通用Lisp对象系统(CLOS)的习惯进行的.
输出
CREATE
成功创建表后的返回信息.
ERROR
如果创建表失败,返回此信息.通常还跟随一些描述文本,例如:ERROR:Relation
'tabl^alreadyexists在运行时出现,因为所声明的表已经在数据库中存在.
ERROR:DEFAULT:typemismatched
如果缺省数值的类型和字段定义的类型不一样,返回此错误.
描述
CREATETABLE将向当前数据库中追加一个表.表将为执行命令者''所有
每个type可以是简单类型,复合(集)类型或者一个数组类型。每个属性都可
以声明为非空并且每个都可以有一个缺省值,用DEFAULT子句声明。
注意:对于Postgresv6.0,一个属性内的数组唯数的一致性不是强制的。这一
点在以后的版本中将改变。
可选的INHERITS子句声明一个表集合,所创建的表自动从这个表集合里的表继
承所有字段。如果任何继承的字段出现次数多于一次,Postgres报告一个错误。
Postgres自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。
函数的继承是根据公共Lisp对象系统(CommonLispObjectSystem(CLOS))
的习惯进行的。
每个新表或表table自动被创建为一个类型。因此表中的一条或更多实例自动
就是一个类型,因而可以用于ALTERTABLE或其他CREATETABLE语句。
新表将作为一个没有初始值的堆创建.一个表可以有不超过1600(事实上,这
是因为受字段大小必须小于8192字节的限制)歹U,但是这个限制在一些节点上
可以通过配置降低.一个表不能和系统表同名.
DEFAULT子句
DEFAULTvalue
输入
value
缺省的表达式值可以是:
・一个文本值
・一个用户函数
•a(译注:?不会翻译)niladicfunction
输出
无
描述
DEFAULT子句向某列赋一个初始值.(通过在CREATETABLE语句里面定义).缺
省值的类型必须和列/字段定义的数据类型.
一个INSERT操作如果包括一个没有缺省值的列/字段,这时如果没有显式地提
供该/列字段的数据值,将用一个NULL代替.缺省的literal意味着缺省值是
声明的常量.缺省的niladic-function或user-function意味着缺省值是在
INSERT时声明的函数值.
有两类(?)niladic函数:
niladicUSER
CURRENT_USER/USER
参阅CURRENTUSER函数
SESSION_USER
还不支持
SYSTEM_USER
还不支持
niladicdatetime
CURRENTDATE
参阅CURRENT_DATE函数
CURRENTTIME
参阅CURRENTDATE函数
CURRENT_TIMESTAMP
参阅CURRENTTIMESTAMP函数
在当前的版本(v6.5),Postgres在定义表的时候就计算所有缺省表达式的
值.因为这样一些"不可缓存"的函数像CURRENT」IMESTAMP可能不会产生预期
的结果.对于日期/时间类型的一些特殊情况,馥们可以通过使用一些手段绕过
这些情况,象用“DEFAULTTEXT'now'”代替"DEFAULT'now'"或
“DEFAULTCURRENT/IMESTAMP”.这就强制Postgres把日期/时间类型看成字
符串常量然后在运行时将它们转换成(时标)timestamp值.
用法
给列/字段did和number赋予一个常量值作为缺省值,一个字串赋予列/字段
did:
CREATETABLEvideo_sales(
didVARCHAR(40)DEFAULT'lusofilms),
numberINTEGERDEFAULT0,
totalCASHDEFAULT'$0.0'
);
将…个现有的序列作为列did的缺省值,并且给列/字段name一个字符串值:
CREATETABLEdistributors(
didDECIMAL(3)DEFAULTNEXTVAL('serial'),
nameVARCHAR(40)DEFAULT'lusofilms)
);
歹”字段CONSTRAINT子句
[CONSTRAINTname]{[
NULL|NOTNULL]|UNIQUE|PRIMARYKEY|CHECKconstraint}
输入
name
赋予整个约束的任意名称.如果没有声明name,将从表和列名称中生成一个唯一
的名称用于name.
NULL
列允许包含NULL值。这是缺省值。
NOTNULL
列不允许包含NULL值.与包含CHECK的列/字段相同(C。/“而aNOTNULL).
UNIQUE
列/字段必须有一个唯一值.在Postgres这是通过在表上隐含地创建•个唯一索引实
现的.
PRIMARYKEY
本列是一个主键,暗示着其唯一性是由系统强制提供的而且其他表可能依赖此列/
字段作为行标识.请参考PRIMARYKEY获取更多的信息.
constraint
约束的定义.
描述
可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时,新的或者
更新的记录必须满足这个约束或测试时操作才能成功。每个约束必须得出一个布
尔表达式。多个字段/属性可以在一个约束里面引用。作为表约束的PRIMARYKEY
的使用是与作为列约束的PRIMARYKEY互相冲突不可兼容的。
约束是一个命名的规则:它是一个SQL对象,它通过对INSERT,UPDATE或
DELETE等对基本表的操作结果进行限制,进而可以获得有效的结果集.
有两种方法定义整合约束:表约束(随后提到),歹U/字段约束(将在这里说明).
一个列/字段约束是作为列定义的一部分定义的一个整合约束,而且逻辑上一旦
创建就会成为表约束.可用的列约束:
PRIMARYKEY
REFERENCES
UNIQUE
CHECK
NOTNULL
注意:Postgres还不支持(版本6.5)REFERENCES整合约束.分析器接受
REFERENCES语法,但将忽略之.
NOTNULL约束
[CONSTRAINTname]NOTNULL
NOTNULL约束表明一个列只能包含非空(non-null)数值的规则.NOTNULL约
束只是一个列约束,不允许作为一个表约束.
输出
status
ERROR:ExecAppend:Failtoaddnullvalueinnotnullattribute
“columrt'.
当试图向一个有NOTNULL约束的列插入一个空值时返回此运行时错误.
描述
用法
在表distributors上定义两个(非空)NOTNULL列约束,其中一个是命名约
束:
CREATETABLEdistributors(
didDECIMAL(3)CONSTRAINTno_nullNOTNULL,
nameVARCHAR(40)NOTNULL
);
UNIQUE约束
[CONSTRAINTname]UNIQUE
输入
CONSTRAINTname
赋予一个约束的任意标记.
输出
status
ERROR:Cannotinsertaduplicatekeyintoauniqueindex.
如果试图向列/字段中插入一个重复数值,返回此运行时错误.
描述
UNIQUE约束表明一个这样的规则:表中一组由一个或多个独立列组成的集合中
只能包含一个唯一的数值.
一个列/字段定义包含了UNIQUE约束,不一定要包含NOTNULL约束.在一个
没有NOTNULL约束的列/字段列如果有多个空值并不违反UNIQUE约束.(这
与SQL92定义不一致,但却是更有意义的习惯.请参阅兼容性部分获取更多细
节.)
每个UNIQUE列约束必须赋予一个该表中没有被其他UNIQUE或PRIMARYKEY
约束定义过的列/字段上.
注意:Postgres自动为每个UNIQUE约束创建…个唯一索引,以保证数据完整
性.请参阅CREATEINDEX获取更多信息.
用法
为表distributors定义一个UNIQUE列约束.UNIQUE列约束只能给表中一个
列定义:
CREATETABLEdistributors(
didDECIMALS),
nameVARCHAR(40)UNIQUE
);
与下面的表约束相同:
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40),
UNIQUE(name)
);
CHECK(检查)约束
[CONSTRAINTname]CHECK
(condition[,...1)
输入
name
赋予约束的任意名称.
condition
任何有效的产生一个布尔值的条件表达式.
输出
status
ERROR:ExecAppend:rejectedduetoCHECKconstraint〃table_columri\
如果试图向列/字段中插入一个违反CHECK约束的数值,生成此运行时错误.
描述
CHECK约束声明一个列中允许的数据的限制.CHECK约束也可以做表约束.
SQL92CHECK列约束只能对表中的一列/字段进行定义或使用.Postgres没有这
个限制.
PRIMARYKEY约束
[CONSTRAINTname]PRIMARYKEY
输入
CONSTRAINTname
约束的任意名称.
输出
ERROR:Cannotinsertaduplicatekeyintoauniqueindex.
当你试图向一个有PRIMARYKEY约束的列插入一个重复的数值时,将返回这个运
行时信息.
描述
PRIMARYKEY列约束表明表中的一个列/字段只能包含唯一的(不重复),非空
的数值.在该列/字段的PRIMARYKEY约束定义中不需要显式的包括NOTNULL约
束.
一个表只能声明一个PRIMARYKEY.
注意
Postgres自动创建一个唯一索引以保证数据的完整性.(参阅CREATEINDEX语句)
在同一个表中PRIMARYKEY约束定义的列应该应该和其他定义了UNIQUE约束
的列不同名(不是同一列).因为这会导致等价索引的重复和增加不必要的处
理.然而,Postgres并没有明文禁止这些.
表(约束)CONSTRAINT子句
[CONSTRAINTname]{PRIMARYKEY|UNIQUE}(column[,...])
[CONSTRAINTname]CHECK(constraint)
输入
CONSTRAINTname
整合约束的任意名称.
column
用于定义唯一索引,或PRIMARYKEY,或NOTNULL约束的列/字段名.
CHECK(constraint)
要作为约束进行估值的布尔表达式.
输出
表约束子句的可能输出和对应的列/字段约束的输出一样.
描述
表约束是对一个基本表的一个或多个列/字段定义的整合约束.”表约束”的四个
元素是:
UNIQUE
CHECK
PRIMARYKEY
FOREIGNKEY
注意:Postgres目前(版本6.5)还不支持FOREIGNKEY整合约束.分析器
可以理解FOREIGNKEY语法,但只是打印一个声明或者是忽略这个子句.外部
键字(Foreignkeys)可以部分的用触发器防真.(参考CREATETRIGGER语
句).(译注:在版本7.0中已经支持外键了。Y2K-03-13)
UNIQUE约束
[CONSTRAINTname]UNIQUE(column[,...])
输入
CONSTRAINTname
赋予约束的任意名称.
column
某表中的列/字段名.
输出
status
ERROR:Cannotinsertaduplicatekeyintoauniqueindex
如果试图向列中插入个重复的值,将返回此错误.
描述
UNIQUE约束表明表中由一个或若干个独立的列/字段组成的集合只能包含唯一
的数值.表的UNIQUE约束和对应的列/字段约束的特性是一样的,区别是表约
束可以跨越多个列/字段.
请参考列/字段的UNIQUE约束获取更多细节.
用法
给一个表distributors定义一个UNIQUE表约束:
CREATETABLEdistributors(
didDECIMAL(03),
nameVARCHAR(40),
UNIQUE(name)
);
PRIMARYKEY约束
[CONSTRAINTname]PRIMARYKEY(column[,...])
输入
CONSTRAINTname
赋予约束的任意名称.
column[,...]
表中的一个或者多个列.
输出
status
ERROR:Cannotinsertaduplicatekeyintoauniqueindex.
如果试图向一个有PRIMARYKEY约束的表中插入重复值,返回这个运行时命令。
描述
PRIMARYKEY约束表明某个表的由一个或多个列/字段组成的集合只能包含唯
一,(不重复),非空数值.对声明的列定义的PRIMARYKEY约束不需要包括NOT
NULL约束.
PRIMARYKEY表约束与歹!J/字段约束相似,区别是它具有控制多歹U/字段的能力.
请参考PRIMARYKEY歹U/字段约束部分获取更多信息.
用法
创建表films和表distributors:
CREATETABLEfilms(
codeCHARACTER(5)CONSTRAINTfirstkeyPRIMARYKEY,
titleCHARACTERVARYING(40)NOTNULL,
didDECIMALS)NOTNULL,
date_prodDATE,
kindCHAR(10),
lenINTERVALHOURTOMINUTE
);
CREATETABLEdistributors(
didDECIMAL(03)PRIMARYKEYDEFAULTNEXTVALfserial*),
nameVARCHAR(40)NOTNULLCHECK(name<>'')
);
创建一个有2维数组的表:
CREATETABLEarray(
vectorINT[][]
);
给films表定义一个UNIQUE表约束.UNIQUE可以定义在表的一•个或多个列/
字段上:
CREATETABLEfilms(
codeCHAR(5),
titleVARCHAR(40),
didDECIMAL(03),
date_prodDATE,
kindCHAR(10),
lenINTERVALHOURTOMINUTE,
CONSTRAINTproductionUNIQUE(date_prod)
);
定义一个CHECK列约束:
CREATETABLEdistributors(
didDECIMAL(3)CHECK(did>100),
nameVARCHAR(40)
定义一个CHECK表约束:
CREATETABLEdistributors(
didDECIMAL(3),
nameVARCHAR(40)
CONSTRAINTconiCHECK(did>100ANDname>'')
);
为表films定义一个PRIMARYKEY表约束.PRIMARYKEY表约束可以对一个或
多个列/字段进行定义:
CREATETABLEfilms(
codeCHAR(05),
titleVARCHAR(40),
didDECIMAL(03),
date_prodDATE,
kindCHAR(10),
lenINTERVALHOURTOMINUTE,
CONSTRAINTcode_titlePRIMARYKEY(code,title)
);
为表distributors定义一个PRIMARYKEY列约束.PRIMARYKEY列约束只能
对表中的一个列/字段定义.(下面两个例子是相当的):
CREATETABLEdistributors(
didDECIMAL(03),
nameCHARVARYING(40),
PRIMARYKEY(did)
);
CREATETABLEdistributors(
didDECIMAL(03)PRIMARYKEY,
nameVARCHAR(40)
);
注意
CREATETABLE/INHERITS是Postgres语言扩展.
兼容性
SQL92
除了本地可见的临时表外,SQL92还定义了一条CREATEGLOBALTEMPORARYTABLE
语句,和一个可选的ONCOMMIT子句:
CREATEGLOBALTEMPORARYTABLEtable(columntype[
DEFAULTvalue][CONSTRAINTcolumn_constraint][,...])
[CONSTRAINTtable_constraint][ONCOMMIT{DELETE|PRESERVE}
ROWS]
对于临时表,CREATETEMPORARYTABLE语句定义一个其他客户端可见的新表和
定义表的列/字段和约束。
CREATETEMPORARYTABLE可选的ONCOMMIT子句用于声明当COMMIT事务时,
是否需要将临时表的行清空.如果ONCOMMIT子句省略了,(缺省值),就设
为ONCOMMITDELETEROWS(当COMMIT时清空).
要创建一个临时表:
CREATETEMPORARYTABLEactors(
idDECIMAL(03),
nameVARCHAR(40),
CONSTRAINTactor_idCHECK(id<150)
)ONCOMMITDELETEROWS;
UNIQUE子句
SQL92对UNIQUE定义了一些附加的功能.
表约束定义:
[CONSTRAINTname]UNIQUE(column[,...])
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
列/字段约束定义:
[CONSTRAINTname]UNIQUE
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
NULL子句
NULL"约束"(实际上不是一个约束)是一•个Postgres对SQL92的扩展,把它
包含进来是为了和NOTNULL子句对称。因为这是任何列的缺省,它的出现只是
添乱。
[CONSTRAINTname]NULL
NOTNULL子句
SQL92对NOTNULL声明了一些附加的功能:
[CONSTRAINTname]NOTNULL
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
CONSTRAINT子句
SQL92对约束声明了一些附加的功能,并且还定义了断言和域(domain)约束.
注意:Postgres还不支持域(domain)和断言.
一个断言是一种特殊类型的整合约束,并且和其他约束共享相同的名字空间
(namespace).不过,一个断言不象约束那样必须依赖于某个基本表,所以
SQL-92提供了一个CREATEASSERTION语句作为定义约束的一个可选的手段:
CREATEASSERTIONnameCHECK(condition)
域约束是用CREATEDOMAIN或ALTERDOMAIN语句定义的:
域约束:
[CONSTRAINTname]CHECKconstraint
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
表约束定义:
[CONSTRAINTname]{PRIMARYKEY(column,...)|FOREIGNKEYconstraint
IUNIQUEconstraint|CHECKconstraint}
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
列约束定义:
[CONSTRAINTname]{NOTNULL|PRIMARYKEY|FOREIGNKEYconstraint|
UNIQUE|CHECKconstraint}
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
一个CONSTRAINT(约束)定义可以包含一个任意顺序的延迟属性的子句和/或
一个初始化约束式子句.
NOTDEFERRABLE
意味着每条SQL语句执行后都必须校验是否违反约束规则.
DEFERRABLE
意味着,当事务开始后,对约束的检查可以推迟到晚些时候,但不晚于当前事务的
结束
每个约束的约束模式总是有一个初始化缺省值,该值在事务开始时为该约束设
定。
INITIALLYIMMEDIATE
意思是,从事务开始时开始,在每条SQL语句执行后约束都必须对其规则进行合
法性检查,看看有无违反。
INITIALLYDEFERRED
意思是,从事务开始时开始,对约束的检查可以推迟到稍后进行,但是不迟于本次
事务的结束。
CHECK子句
SQL92对CHECK声明了一些附加功能,不管是表约束还是列/字段约束.
表约束定义:
[CONSTRAINTname]CHECK(VALUEcondition)
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
列约束定义:
[CONSTRAINTname]CHECK(VALUEcondition)
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE)]
[[NOT]DEFERRABLE]
PRIMARYKEY子句
SQL92为PRIMARYKEY声明了一些附加的功能:
表约束定义:
[CONSTRAINTname]PRIMARYKEY(column[,...])
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
列约束定义:
[CONSTRAINTname]PRIMARYKEY
[{INITIALLYDEFERRED|INITIALLYIMMEDIATE}]
[[NOT]DEFERRABLE]
4.1ORACLE的SQL介绍
SQL成了关系数据库事实上的工业标准。全部主要的关系数据库管理系统都
支持SQL的某些型式,大多数RDBMS开发商打算ANSI标准去完善自己的产
品,Oracle也不例外。
一、SQL命令集
命令说明
SELECT这是用得最普遍的命令,它用来从数据库查索数据。
INSERT这三个命令分别用来在数据库表中插入
UPDATE新行(ROWS)、改变已存在的行和去掉
DELETE不需要的行。它们有时被统称为DML,即数据操纵语言
命令。
CREATE这三个命令用来动态地创建、改变和去掉。
ALTER任何数据结构,例如表、视图和索引等。
DROP有时被统称为DDL,即数据定义语言命令。
GRANT这两个命令用来对ORACLE数据库。
REVOKE和其中的结构授与或去掉访问权限。
注意:还有更多的其它SQL命令详见ORACLE软件的帮助。
二、基本的查询语句
SELECT语句从数据库中查索信息,执行全部关系代数的运算符。
其最简单的语句型式必须包括:
(1)一个SELECT子句,列出要显示的列(Columns)0
(2)一个FROM子句,指定所包含的表。
例4.1:显示EMP表中的部门号、雇员名和员工号,可用如下语句:
SELECT部门号,雇员名,员工号
FROMEMP;
部门号雇员名员工号
20刘炎6801
10郭洁6702
10周敏6705
30郭丹丹7008
30局山7018
注意:列名由逗号分隔开。
三、ORDERBY子句
通常查询结果行的顺序没有限定。ORDERBY子句可以用来排序行。使用时,
ORDERBY子句必须总是放在SELECT语句的最后。
例4.2:以员工号排序,可用如下语句:
SELECT员工号,雇员名,职务,工资
FROMEMP
ORDERBY员工号;
员工号雇员名职务工资*12
6702郭洁秘书6000
6705周敏高级工程师12000
6801刘炎软件工程师7200
7008郭丹丹硬件工程师7200
7018局山办事员6000
数据的默认排序是升序(ASCENDING):
.最小的数值放最前面。
.最早的日期放最前面。
.字符值按字母顺序。
四、WHERE子句
WHERE子句与关系代数的限制(Restriction)运算符对应,它包括将显示的行
必须满足的条件。使用时,WHERE子句必须跟在FROM子句后面,
其格式如下:
SELECT〈查询的列〉
FROM〈表)
[WHERE〈条件〉]
这里WHERE子句表示要满足一定的条件,即可以比较列中的值、文字值、算
术表达式或函数。WHERE子句一般要求三个部分:
(1)一个列名。
⑵比较运算符。
(3)一个列名、常数或值的列表。
在WHERE子句中使用的比较运算符分为逻辑和SQL两类。
五、SQL运算符
有四个SQL运算符用于全部数据类型的操作:
运算符意义
BETWEEN...AND...在两个值之间(包含两值)。
IN(list)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度门窗行业市场推广与宣传合同4篇
- 二零二五年智慧社区安防监控系统安装合同5篇
- 二零二五年度城市广场场地租赁合同2篇
- 2025年度全国棉花运输服务合同范本4篇
- 二零二五年外墙涂料翻新工程施工安全监管与隐患排查合同3篇
- 2025年度特种用途面包车租赁合同范本4篇
- 2025年度企业员工股票购买贷款合同终止后贷款处理协议
- 二零二五年度教育培训机构教师绩效管理与聘用合同
- 2025年度著作权登记及维权代理服务合同范本3篇
- 2025年度时尚行业模特经纪代理服务合同4篇
- 运动技能学习与控制课件第十一章运动技能的练习
- 虫洞书简全套8本
- 射频在疼痛治疗中的应用
- 四年级数学竖式计算100道文档
- “新零售”模式下生鲜电商的营销策略研究-以盒马鲜生为例
- 项痹病辨证施护
- 职业安全健康工作总结(2篇)
- 怀化市数字经济产业发展概况及未来投资可行性研究报告
- 07FD02 防空地下室电气设备安装
- 教师高中化学大单元教学培训心得体会
- 弹簧分离问题经典题目
评论
0/150
提交评论