【网学网提醒】:网学会员,鉴于大家对SQL语法(整理自w3school)十分关注,会员在此为大家搜集整理了“SQL语法(整理自w3school)”一文,供大家参考学习!
SQLSELECT语法
SELECT列名称FROM表名称
以及:
SELECT*FROM表名称
SQLSELECT实例如需获取名为"LastName"和"FirstName"的列的内容(从名为"Persons"的数据库表),请使用类似这样的SELECT语句:
SELECTLastName,FirstNameFROMPersons
"Persons"表:
Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
结果:
LastNameAdamsBushCarterFirstNameJohnGeorgeThomas
SQLSELECT*实例现在我们希望从"Persons"表中选取所有的列。请使用符号*取代列的名称,就像这样:
SELECT*FROMPersons
如需从Company"列中仅选取唯一不同的值,我们需要使用SELECTDISTINCT语句:
SELECTDISTINCTCompanyFROMOrders
现在,在结果集中,"W3School"仅被列出了一次。WHERE子句如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。语法
SELECT列名称FROM表名称WHERE列运算符值
使用WHERE子句如果只希望选取居住在城市"Beijing"中的人,我们需要向SELECT语句添加WHERE子句:
SELECT*FROMPersonsWHERECity='Beijing'
"Persons"表
LastNameAdamsBushCarterGatesFirstNameJohnGeorgeThomasBillAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijingYear1970197519801985
结果:
LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijingYear19801985
引号的使用请注意,我们在例子中的条件值周围使用的是单引号。SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。文本值:
这是正确的:SELECT*FROMPersonsWHEREFirstName='Bush'这是错误的:SELECT*FROMPersonsWHEREFirstName=Bush
数值:
这是正确的:SELECT*FROMPersonsWHEREYear>1965这是错误的:SELECT*FROMPersonsWHEREYear>'1965'
AND和OR运算符AND和OR可在WHERE子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。原始的表(用在例子中的):
LastNameAdamsBushCarterCarterFirstNameJohnGeorgeThomasWilliamAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijing
AND运算符实例使用AND来显示所有姓为"Carter"并且名为"Thomas"的人:
SELECT*FROMPersonsWHEREFirstName='Thomas'ANDLastName='Carter'
OR运算符实例使用OR来显示所有姓为"Carter"或者名为"Thomas"的人:
SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'
结合AND和OR运算符我们也可以把AND和OR结合起来(使用圆括号来组成复杂的表达式):
SELECT*FR
OMPersonsWHERE(FirstName='Thomas'ORFirstName='William')ANDLastName='Carter'
结果:
LastNameCarterCarterFirstNameThomasWilliamAddressChanganStreetXuanwumen10CityBeijingBeijing
ORDERBY语句ORDERBY语句用于根据指定的列对结果集进行排序。ORDERBY语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用DESC关键字。原始的表(用在例子中的):
Orders表:CompanyIBMOrderNumber3532
W3SchoolAppleW3School
235646986953
实例1以字母顺序显示公司名称:
SELECTCompany,OrderNumberFROMOrdersORDERBYCompany
实例2以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECTCompany,OrderNumberFROMOrdersORDERBYCompany,OrderNumber
实例3以逆字母顺序显示公司名称:
SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC
实例4以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC,OrderNumberASC
INSERTINTO语句INSERTINTO语句用于向表格中插入新的行。语法
INSERTINTO表名称VALUES(值1,值2,....)
我们也可以指定所要插入数据的列:
INSERTINTOtable_name(列1,列2,...)VALUES(值1,值2,....)
插入新的行
"Persons"表:LastNameCarterFirstNameThomasAddressChanganStreetCityBeijing
SQL语句:
INSERTINTOPersonsVALUES('Gates','Bill','Xuanwumen10','Beijing')
在指定的列中插入数据SQL语句:
INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')
Update语句Update语句用于修改表中的数据。语法:
UPDATE表名称SET列名称=新值WHERE列名称=某值
Person:
LastNameGatesWilsonFirstNameBillAddressXuanwumen10Champs-ElyseesCityBeijing
更新某一行中的一个列我们为lastname是"Wilson"的人添加firstname:
UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'
更新某一行中的若干列我们会修改地址(address),并添加城市名称(city):
UPDATEPersonSETAddress='Zhongshan23',City='Nanjing'WHERELastName='Wilson'
DELETE语句DELETE语句用于删除表中的行。语法
DELETEFROM表名称WHERE列名称=值
Person:
LastNameGatesWilsonFirstNameBillFredAddressXuanwumen10Zhongshan23CityBeijingNanjing
删除某行
"FredWilson"会被删除:
DELETEFROMPersonWHERELastName='Wilson'
删除所有行可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETEFROMtable_name
或者:
DELETE*FROMtable_name
TOP子句TOP子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说,TOP子句是非常有用的。注释:并非所有的数据库系统都支持TOP子句。SQLServer的语法:
SELECTTOPnumber|percentcolum
n_name(s)FROMtable_name
MySQL和Oracle中的SQLSELECTTOP是等价的
MySQL语法
SELECTcolumn_name(s)FROMtable_nameLIMITnumber
例子
SELECT*FROMPersonsLIMIT5
Oracle语法
SELECTcolumn_name(s)FROMtable_nameWHEREROWNUM<=number
例子
SELECT*FROMPersonsWHEREROWNUM<=5
原始的表(用在例子中的):Persons表:
Id1234LastNameAdamsBushCarterObamaFirstNameJohnGeorgeThomasBarackAddressOxfordStreetFifthAvenueChanganStreetPennsylvaniaAvenueCityLondonNewYorkBeijingWashington
SQLTOP实例现在,我们希望从上面的"Persons"表中选取头两条记录。我们可以使用下面的SELECT语句:
SELECTTOP2*FROMPersons
结果:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork
SQLTOPPERCENT实例现在,我们希望从上面的"Persons"表中选取50%的记录。我们可以使用下面的SELECT语句:
SELECTTOP50PERCENT*FROMPersons
LIKE操作符用于在WHERE子句中搜索列中的指定模式。
LIKE操作符
LIKE操作符用于在WHERE子句中搜索列中的指定模式。
SQLLIKE操作符语法
SELECTcolumn_name(s)
FROMtable_nameWHEREcolumn_nameLIKEpattern
原始的表(用在例子中的):Persons表:
Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
LIKE操作符实例例子1现在,我们希望从上面的"Persons"表中选取居住在以"N"开始的城市里的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'N%'
提示:"%"可用于定义通配符(模式中缺少的字母)。结果集:
Id2LastNameBushFirstNameGeorgeAddressFifthAvenueCityNewYork
例子2接下来,我们希望从"Persons"表中选取居住在以"g"结尾的城市里的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'%g'
例子3接下来,我们希望从"Persons"表中选取居住在包含"lon"的城市里的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'%lon%'
例子4
通过使用NOT关键字,我们可以从"Persons"表中选取居住在不包含"lon"的城市里的人:
我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityNOTLIKE'%lon%'
在搜索数据库中的数据时,您可以使用SQL通配符。
SQL通配符在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。SQL通配符必须与LIKE运算符一起使用。在SQL中,可使用以下通配符:
通配符%_[charlist][^charlist]或者[!charlist]描述替代一个或多个字符仅替代一个字符字符列中的任何单一字符不在字符列中的任何单一字符
原始的表(用在例子中的):
Persons表:Id123LastNameAdamsBushCarterFirstNameJ
ohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
使用%通配符例子1现在,我们希望从上面的"Persons"表中选取居住在以"Ne"开始的城市里的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'Ne%'
例子2
接下来,我们希望从"Persons"表中选取居住在包含"lond"的城市里的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'%lond%'
结果集:
Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon
使用_通配符例子1现在,我们希望从上面的"Persons"表中选取名字的第一个字符之后是"eorge"的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHEREFirstNameLIKE'_eorge'
例子2接下来,我们希望从"Persons"表中选取的这条记录的姓氏以"C"开头,然后是一个任意字符,然后是"r",然后是任意字符,然后是"er":我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERELastNameLIKE'C_r_er'
使用[charlist]通配符例子1现在,我们希望从上面的"Persons"表中选取居住的城市以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'[ALN]%'
结果集:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork
例子2
现在,我们希望从上面的"Persons"表中选取居住的城市不以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERECityLIKE'[!ALN]%'
IN操作符
IN操作符允许我们在WHERE子句中规定多个值。SQLIN语法
SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameIN(value1,value2,...)
原始的表(在实例中使用:)Persons表:
Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
IN操作符实例现在,我们希望从上表中选取姓氏为Adams和Carter的人:我们可以使用下面的SELECT语句:
SELECT*FROMPersonsWHERELastNameIN('Adams','Carter')
BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围。
BETWEEN操作符操作符BETWEEN...AND会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。SQLBETWEEN语法
SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameBETWEENvalue1ANDvalue2
原始的表(在实例中使用:)Persons表:
Id1234
LastNameAdamsBushCarterGates
FirstNameJohnGeorgeThomasBill
AddressOxfordStreetFifthAvenueChanganStreetXuanwumen10
CityLondonNewYorkBeijingBeijing
BETWEEN操作符实例如需以字母顺序显示介于"Adams"(包括)和"Carter"(不包括)之间的人,请使用下面的SQL:
SELECT*
FROMPersonsWHERELastNameBETWEEN'Adams'AND'Carter'
结果集:
Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork
重要事项:不同的数据库对BETWEEN...AND操作符的处理方式是有差异的。某些数据库会列出介于"Adams"和"Carter"之间的人,但不包括"Adams"和"Carter";某些数据库会列出介于"Adams"和"Carter"之间并包括"Adams"和"Carter"的人;而另一些数据库会列出介于"Adams"和"Carter"之间的人,包括"Adams",但不包括"Carter"。所以,请检查你的数据库是如何处理BETWEEN....AND操作符的!实例2如需使用上面的例子显示范围之外的人,请使用NOT操作符:
SELECT*FROMPersonsWHERELastNameNOTBETWEEN'Adams'AND'Carter'
通过使用SQL,可以为列名称和表名称指定别名(Alias)。SQLAlias
表的SQLAlias语法
SELECTcolumn_name(s)FROMtable_name
ASalias_name
列的SQLAlias语法
SELECTcolumn_nameASalias_nameFROMtable_name
Alias实例:使用表名称别名假设我们有两个表分别是:"Persons"和"Product_Orders"。我们分别为它们指定别名"p"和"po"。现在,我们希望列出"JohnAdams"的所有定单。我们可以使用下面的SELECT语句:
SELECTpo.OrderID,p.LastName,p.FirstNameFROMPersonsASp,Product_OrdersASpoWHEREp.LastName='Adams'ANDp.FirstName='John'
不使用别名的SELECT语句:
SELECTProduct_Orders.OrderID,Persons.LastName,Persons.FirstNameFROMPersons,Product_OrdersWHEREPersons.LastName='Adams'ANDPersons.FirstName='John'
从上面两条SELECT语句您可以看到,别名使查询程序更易阅读和书写。Alias实例:使用一个列名别名表Persons:
Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
SQL:
SELECTLastNameASFamily,FirstNameASNameFROMPersons
结果:
FamilyName
AdamsBushCarter
JohnGeorgeThomas
SQLjoin用于根据两个或多个表中的列之间的关系,从这些表中查询数据。Join和Key有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行join。数据库中的表可通过键将彼此联系起来。主键(PrimaryKey)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。请看"Persons"表:
Id_P123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
请注意,"Id_P"列是Persons表中的的主键。这意味着没有两行能够拥有相同的Id_P。即使两个人的完全相同,Id_P也可以区分他们。接下来请看"Orders"表:
Id_O12345OrderNo7789544678224562456234764Id_P331165
请注意,"Id_O"列是Orders表中的的主键,同时,"Orders"表中的"Id_P"列用于引用"Persons"表中的人,而无需使用他们的确切。请留意,"Id_P"列把上面的两个表联系了起来。引用两个表我们可以通过引用两个表的方式,从两个表中获取数据:谁订购了产品,并且他们订购了什么产品?
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersons,OrdersWHEREPersons.Id_P=Orders.Id_P
SQLJOIN-使用Join除了上面的方法,我们也可以使用关键词JOIN来从两个表中获取数据。如果我们希望列出所有人的定购,可以使用下面的SELECT语句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName
SQLINNERJOIN关键字
在表中存在至少一个匹配时,INNERJOIN关键字返回行。INNERJOIN关键字语法
SELECTcolumn_name(s)FROMtable_name1INNERJOINtable_name2ONtable_name1.column_name=table_name2.column_name
注释:INNERJOIN与JOIN是相同的。
内连接(INNERJOIN)实例现在,我们希望列出所有人的定购。同上例结果集:
LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo22456245627789544678
INNERJOIN关键字在表中存在至少一个匹配时返回行。如果"Persons"中的行在"Orders"中没有匹配,就不会列出这些行。SQLLEFTJOIN关键字LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。LEFTJOIN关键字语法
SELECTcolumn_name(s)FROMtable_name1LEFTJOINtable_name2
ONtable_name1.column_name=table_name2.column_name
注释:在某些数据库中,LEFTJOIN称为LEFTOUTERJOIN。
左连接(LEFTJOIN)实例现在,我们希望列出所有的人,以及他们的定购-如果有的话。您可以使用下面的SELECT语句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsLEFTJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName
结果集:
LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorgeOrderNo22456245627789544678
LEFTJOIN关键字会从左表(Persons)那里返回所有的行,即使在右表(Orders)中没有匹配的行。SQLRIGHTJOIN关键字RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。RIGHTJOIN关键字语法
SELECTcolumn_name(s)FROMtable_name1RIGHTJOINtable_name2ONtable_name1.column_name=table_name2.column_name
注释:在某些数据库中,RIGHTJOIN称为RIGHTOUTERJOIN。
右连接(RIGHTJOIN)实例现在,我们希望列出所有的定单,以及定购它们的人-如果有的话。
您可以使用下面的SELECT语
句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsRIGHTJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName
结果集:
LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo2245624562778954467834764
RIGHTJOIN关键字会从右表(Orders)那里返回所有的行,即使在左表(Persons)中没有匹配的行。
SQLFULLJOIN关键字
只要其中某个表存在匹配,FULLJOIN关键字就会返回行。FULLJOIN关键字语法
SELECTcolumn_name(s)FROMtable_name1FULLJOINtable_name2ONtable_name1.column_name=table_name2.column_name
注释:在某些数据库中,FULLJOIN称为FULLOUTERJOIN。全连接(FULLJOIN)实例现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。您可以使用下面的SELECT语句:
SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersonsFULLJOINOrdersONPersons.Id_P=Orders.Id_P
ORDERBYPersons.LastName
结果集:
LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorge34764OrderNo22456245627789544678
FULLJOIN关键字会从左表(Persons)和右表(Orders)那里返回所有的行。如果"Persons"中的行在表"Orders"中没有匹配,或者如果"Orders"中的行在表"Persons"中没有匹配,这些行同样会列出。
SQLUNION操作符
UNION操作符用于合并两个或多个SELECT语句的结果集。请注意,UNION内部的SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT语句中的列的顺序必须相同。SQLUNION语法
SELECTcolumn_name(s)FROMtable_name1UNIONSELECTcolumn_name(s)FROMtable_name2
注释:默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNIONALL。SQLUNIONALL语法
SELECTcolumn_name(s)FROMtable_name1UNIONALLSELECTcolumn_name(s)FROMtable_name2
另外,UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。下面的例子中使用的原始表:
Employees_China:
E_IDE_Name
01020304
Zhang,HuaWang,WeiCarter,ThomasYang,Ming
Employees_USA:
E_ID01020304E_NameAdams,JohnBush,GeorgeCarter,ThomasGates,Bill
使用UNION命令实例列出所有在中国和美国的不同的雇员名:
SELECTE_NameFROMEmployees_ChinaUNIONSELECTE_NameFROMEmployees_USA
结果
E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeGates,Bill
注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION命令只会选取不同的值。UNIONALLUNIONALL命令和UNION命令几乎是等效的,不过UNIONALL命令会列出所有的值。
SQLStatement1UNIONALL
SQLStatement2
使用UNIONALL命令实例:列
出在中国和美国的所有的雇员:
SELECTE_NameFROMEmployees_ChinaUNIONALLSELECTE_NameFROMEmployees_USA
结果倒数第二行多个Cater,Thomas
SQLSELECTINTO语句可用于创建表的备份复件。
SELECTINTO语句SELECTINTO语句从一个表中选取数据,然后把数据插入另一个表中。SELECTINTO语句常用于创建表的备份复件或者用于对记录进行存档。SQLSELECTINTO语法您可以把所有的列插入新表:
SELECT*INTOnew_table_name[INexternaldatabase]FROMold_tablename
或者只把希望的列插入新表:
SELECTcolumn_name(s)INTOnew_table_name[INexternaldatabase]FROMold_tablename
SQLSELECTINTO实例-制作备份复件下面的例子会制作"Persons"表的备份复件:
SELECT*INTOPersons_backupFROMPersons
IN子句可用于向另一个数据库中拷贝表:
SELECT*
INTOPersonsIN'Backup.mdb'FROMPersons
如果我们希望拷贝某些域,可以在SELECT语句后列出这些域:
SELECTLastName,FirstNameINTOPersons_backupFROMPersons
SQLSELECTINTO实例-带有WHERE子句我们也可以添加WHERE子句。下面的例子通过从"Persons"表中提取居住在"Beijing"的人的信息,创建了一个带有两个列的名为"Persons_backup"的表:
SELECTLastName,FirstnameINTOPersons_backupFROMPersonsWHERECity='Beijing'
SQLSELECTINTO实例-被连接的表从一个以上的表中选取数据也是可以做到的。下面的例子会创建一个名为"Persons_Order_Backup"的新表,其中包含了从Persons和Orders两个表中取得的信息:
SELECTPersons.LastName,Orders.OrderNoINTOPersons_Order_BackupFROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_P
CREATEDATABASE语句CREATEDATABASE用于创建数据库。SQLCREATEDATABASE语法
CREATEDATABASEdatabase_name
SQLCREATEDATABASE实例现在我们希望创建一个名为"my_db"的数据库。我们使用下面的CREATEDATABASE语句:
CREATEDATABASEmy_db
可以通过CREATETABLE来添加数据库表。CREATETABLE语句CREATETABLE语句用于创建数据库中的表。SQLCREATETABLE语法
CREATETABLE表名称(列名称1数据类型,列名称2数据类型,列名称3数据类型,....)
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:数据类型integer(size)int(size)smallint(size)tinyint(size)描述仅容纳整数。在括号内规定数字的最大位数。
decimal(size,d)numeric(size,d)
容纳带有小数的数字。"size"规定数字的最大位数。"d"规定小数点右侧的最大位数。
char(size)
容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。在括号中规定字符串的长度。
varchar(size)
容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。在括号中规定字符串的最大长度。
date(yyyymmdd
)
容纳日期。
SQLCREATETABLE实例本例演示如何创建名为"Person"的表。该表包含5个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address"以及"City":
CREATETABLEPersons(Id_Pint,LastNamevarchar(255),FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
Id_P列的数据类型是int,包含整数。其余4列的数据类型是varchar,最大长度为255个字符。空的"Persons"表类似这样:
Id_PLastNameFirstNameAddressCity
可使用INSERTINTO语句向空表写入数据。SQLNOTNULL约束NOTNULL约束强制列不接受NULL值。NOTNULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。下面的SQL语句强制"Id_P"列和"LastName"列不接受NULL值:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
SQLUNIQUE约束
UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。PRIMARYKEY拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。SQLUNIQUEConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建UNIQUE约束:SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULLUNIQUE,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如果需要命名UNIQUE约束,以及为多个列定义UNIQUE约束,请使用下面的SQL语法:MySQL/SQLServer/Oracle/MSAccess:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName))
SQLUNIQUEConstraintonALTERTABLE当表已被创建时,如需在"Id_P"列创建UNIQUE约束,请使用下列SQL:
ALTERTABLEPersonsADDUNIQUE(Id_P)
如需命名UNIQUE约束,并定义多个列的UNIQUE约束,请使用下面的SQL语法:MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsADDCONSTRAINTuc_PersonIDUNIQUE(Id_P,LastName)
撤销UNIQUE约束如需撤销UNIQUE约束,请使用下面的SQL:SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsDROPCONSTRAINTuc_PersonID
SQLPRIMARYKEY约束PRIMARYKEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表都应该有一个主键,并且每个表只能有一个主键。SQLPRIMARYKEYConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建PRIMARYKEY约束:
CREATETABLEPersons(Id_PintNOTNULLPRIMARYKEY,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如
果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),
Addressvarchar(255),Cityvarchar(255),CONSTRAINTuc_PersonIDPRIMARYKEY(Id_P,LastName))
SQLPRIMARYKEYConstraintonALTERTABLE如果在表已存在的情况下为"Id_P"列创建PRIMARYKEY约束,请使用下面的SQL:MySQL/SQLServer/Oracle/MSAccess:
ALTERTABLEPersonsADDPRIMARYKEY(Id_P)
如果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:
ALTERTABLEPersonsADDCONSTRAINTpk_PersonIDPRIMARYKEY(Id_P,LastName)
注释:如果您使用ALTERTABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。撤销PRIMARYKEY约束如需撤销PRIMARYKEY约束,请使用下面的SQL:
ALTERTABLEPersonsDROPCONSTRAINTpk_PersonID
SQLFOREIGNKEY约束一个表中的FOREIGNKEY指向另一个表中的PRIMARYKEY。让我们通过一个例子来解释外键。请看下面两个表:"Persons"表:
Id_P123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
"Orders"表:Id_O1OrderNo77895Id_P3
234
446782245624562
311
请注意,"Orders"中的"Id_P"列指向"Persons"表中的"Id_P"列。"Persons"表中的"Id_P"列是"Persons"表中的PRIMARYKEY。"Orders"表中的"Id_P"列是"Orders"表中的FOREIGNKEY。FOREIGNKEY约束用于预防破坏表之间连接的动作。FOREIGNKEY约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。SQLFOREIGNKEYConstraintonCREATETABLE下面的SQL在"Orders"表创建时为"Id_P"列创建FOREIGNKEY:
CREATETABLEOrders(O_IdintNOTNULLPRIMARYKEY,OrderNointNOTNULL,Id_PintFOREIGNKEYREFERENCESPersons(Id_P))
如果需要命名FOREIGNKEY约束,以及为多个列定义FOREIGNKEY约束,请使用下面的SQL语法:
CREATETABLEOrders(O_IdintNOTNULL,OrderNointNOTNULL,Id_Pint,PRIMARYKEY(O_Id),CONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P))
SQLFOREIGNKEYConstraintonALTERTABLE如果在"Orders"表已存在的情况下为"Id_P"列创建FOREIGNKEY约束,请使用下面的SQL:
ALTERTABLEOrders
ADDFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
如果需要命名FOREIGNKEY约束,以及为多个列定义FOREIGNKEY约束,请使用下面的SQL语法:ALTERTABLEOrders
ADDCONSTRAINTfk_PerOrdersFOREIGNKEY(Id_P)REFERENCESPersons(Id_P)
撤销FOREIGNKEY约束如需撤销FOREIGNKEY约束,请使用下面的SQL:
ALTERTABLEOrdersDROPCONSTRAINTfk_PerOrders
SQLCHECK约束CHECK约束用于限制列中的值的范围。如果对单个列定义CHEC
K约束,那么该列只允许特定的值。如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。SQLCHECKConstraintonCREATETABLE下面的SQL在"Persons"表创建时为"Id_P"列创建CHECK约束。CHECK约束规定"Id_P"列必须只包含大于0的整数。
CREATETABLEPersons(Id_PintNOTNULLCHECK(Id_P>0),LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
CREATETABLEPersons(
Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),CONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes'))
SQLCHECKConstraintonALTERTABLE如果在表已存在的情况下为"Id_P"列创建CHECK约束,请使用下面的SQL:
ALTERTABLEPersonsADDCHECK(Id_P>0)
如果需要命名CHECK约束,以及为多个列定义CHECK约束,请使用下面的SQL语法:
ALTERTABLEPersonsADDCONSTRAINTchk_PersonCHECK(Id_P>0ANDCity='Sandnes')
撤销CHECK约束如需撤销CHECK约束,请使用下面的SQL:
ALTERTABLEPersonsDROPCONSTRAINTchk_Person
SQLDEFAULT约束DEFAULT约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。SQLDEFAULTConstraintonCREATETABLE下面的SQL在"Persons"表创建时为"City"列创建DEFAULT约束:
CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),
Cityvarchar(255)DEFAULT'Sandnes')
通过使用类似GETDATE()这样的函数,DEFAULT约束也可以用于插入系统值:
CREATETABLEOrders(Id_OintNOTNULL,OrderNointNOTNULL,Id_Pint,OrderDatedateDEFAULTGETDATE())
SQLDEFAULTConstraintonALTERTABLE如果在表已存在的情况下为"City"列创建DEFAULT约束,请使用下面的SQL:
ALTERTABLEPersonsALTERCOLUMNCitySETDEFAULT'SANDNES'
撤销DEFAULT约束如需撤销DEFAULT约束,请使用下面的SQL:
ALTERTABLEPersonsALTERCOLUMNCityDROPDEFAULT
CREATEINDEX语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。索引您可以在表中创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。SQLCREATEINDEX语法在表上创建一个简单的索引。允许使用重复的值:
CREATEINDEXindex_nameONtable_name(column_name)
注释:"column_name"规定需要索引的列。
SQLCREATEUNIQUEINDEX语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATEUNIQUEINDEXindex_nameONtable_name(column_name)
CREATEINDEX实例本例会创建一个简单的索引,名为"PersonIndex",在Person表的LastName列:
CREATEINDEXPersonIndexONPerson(LastName)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字DESC:
CREATEINDEXPersonIndexONPerson(LastNameDESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATEINDEXPersonIndexONPerson(LastName,FirstName)
通过使用DROP语句,可以轻松地删除索引、表和数据库。
SQLDROPINDEX语句我们可以使用DROPINDEX命令删除表格中的索引。用于MicrosoftSQLJet(以及MicrosoftAccess)的语法:
DROPINDEXindex_nameONtable_name
用于MSSQLServer的语法:
DROPINDEXtable_name.index_name
SQLDROPTABLE语句DROPTABLE语句用于删除表(表的结构、属性以及索引也会被删除):
DROPTABLE表名称
SQLDROPDATABASE语句DROPDATABASE语句用于删除数据库:
DROPDATABASE数据库名称
SQLTRUNCATETABLE语句如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?请使用TRUNCATETABLE命令(仅仅删除表格中的数据):
TRUNCATETABLE表名称
ALTERTABLE语句ALTERTABLE语句用于在已有的表中添加、修改或删除列。SQLALTERTABLE语法如需在表中添加列,请使用下列语法:
ALTERTABLEtable_nameADDcolumn_namedatatype
要删除表中的列,请使用下列语法:
ALTERTABLEtable_nameDROPCOLUMNcolumn_name
注释:某些数据库系统不允许这种在数据库表中删除列的方式(DROPCOLUMNcolumn_name)。要改变表中列的数据类型,请使用下列语法:
ALTERTABLEtable_nameALTERCOLUMNcolumn_namedatatype
原始的表(用在例子中的):Persons表:
Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing
SQLALTERTABLE实例现在,我们希望在表"Persons"中添加一个名为"Birthday"的新列。我们使用下列SQL语句:
ALTERTABLEPersonsADDBirthdaydate
请注意,新列"Birthday"的类型是date,可以存放日期。数据类型规定列中可以存放的数据的类型。
改变数据类型实例现在我们希望改变"Persons"表中"Birthday"列的数据类型。我们使用下列SQL语句:
ALTERTABLEPersonsALTERCOLUMNBirthdayyear
请注意,"Birthday"列的数据类型是year,可以存放2位或4位格式的年份。DROPCOLUMN实例接下来,我们删除"Person"表中的"Birthday"列:
ALTERTABLEPersonDROPCOLUMNBirthday
Auto-increment会在新记录插入表中时生成一个唯一的数字。
AUTOIN
CREMENT字段我们通常希望在每次插入新记录时,自动地创建主键字段的值。我们可以在表中创建一个auto-increment字段。下列SQL语句把"Persons"表中的"P_Id"列定义为auto-increment主键:
CREATETABLEPersons(P_IdintPRIMARYKEYIDENTITY,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))
MSSQL使用IDENTITY关键字来执行auto-increment任务。默认地,IDENTITY的开始值是1,每条新记录递增1。要规定"P_Id"列以20起始且递增10,请把identity改为IDENTITY(20,10)要在"Persons"表中插入新记录,我们不必为"P_Id"列规定值(会自动添加一个唯一的值):
INSERTINTOPersons(FirstName,LastName)VALUES('Bill','Gates')
上面的SQL语句会在"Persons"表中插入一条新记录。"P_Id"会被赋予一个唯一的值。"FirstName"会被设置为"Bill","LastName"列会被设置为"Gates"。
视图是可视化的表。
什么是视图?在SQL中,视图是基于SQL语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加SQL函数、WHERE以及JOIN语句,我们也可以提交数据,就像这些来自于某个单一的表。注释:数据库的设计和结构不会受到视图中的函数、where或join语句的影响。SQLCREATEVIEW语法
CREATEVIEWview_nameASSELECTcolumn_name(s)FROMtable_nameWHEREcondition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用SQL语句来重建数据。
SQLCREATEVIEW实例可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join等等,我们可以向用户精确地提交我们希望提交的数据。样本数据库Northwind拥有一些被默认安装的视图。视图"CurrentProductList"会从Products表列出所有正在使用的产品。这个视图使用下列SQL创建:
CREATEVIEW[CurrentProductList]ASSELECTProductID,ProductNameFROMProductsWHEREDiscontinued=No
我们可以查询上面这个视图:
SELECT*FROM[CurrentProductList]
Northwind样本数据库的另一个视图会选取Products表中所有单位价格高于平均单位价格的产品:
CREATEVIEW[ProductsAboveAveragePrice]ASSELECTProductName,UnitPriceFROMProducts
WHEREUnitPrice>(SELECTAVG(UnitPrice)FROMProducts)
我们可以像这样查询上面这个视图:
SELECT*FROM[ProductsAboveAveragePrice]
另一个来自Northwind数据库的视图实例会计算在1997年每个种类的销售总数。请注意,这个视图会从另一个名为"ProductSalesfor1997"的视图那里选取数据:
CREATEVIEW[CategorySalesFor1997]ASSELECTDISTINCTCategoryName,Sum(Product
Sales)ASCategorySalesFROM[ProductSalesfor1997]GROUPBYCategoryName
我们可以像这样查询上面这个视图:
SELECT*FROM[CategorySalesFor1997]
我们也可以向查询添加条件。现在,我们仅仅需要查看"Beverages"类的全部销量:
SELECT*FROM[CategorySalesFor1997]WHERECategoryName='Beverages'
SQL更新视图您可以使用下面的语法来更新视图:
SQLCREATEORREPLACEVIEWSyntaxCREATEORREPLACEVIEWview_nameASSELECTcolumn_name(s)FROMtable_nameWHEREcondition
现在,我们希望向"CurrentProductList"视图添加"Category"列。我们将通过下列SQL更新视图:
CREATEVIEW[CurrentProductList]ASSELECTProductID,ProductName,CategoryFROMProducts
WHEREDiscontinued=No
SQL撤销视图您可以通过DROPVIEW命令来删除视图。
SQLDROPVIEWSyntaxDROPVIEWview_name
函数的语法内建SQL函数的语法是:
SELECTfunction(列)FROM表
定义和用法AVG函数返回数值列的平均值。NULL值不包括在计算中。SQLAVG()语法
SELECTAVG(column_name)FROMtable_name
例子1现在,我们希望计算"OrderPrice"字段的平均值。我们使用如下SQL语句:
SELECTAVG(OrderPrice)ASOrderAverageFROMOrders
例子2现在,我们希望找到OrderPrice值高于OrderPrice平均值的客户。我们使用如下SQL语句:
SELECTCustomerFROMOrdersWHEREOrderPrice>(SELECTAVG(OrderPrice)FROMOrders)
COUNT()函数返回匹配指定条件的行数。
SQLCOUNT()语法SQLCOUNT(column_name)语法COUNT(column_name)函数返回指定列的值的数目(NULL不计入):
SELECTCOUNT(column_name)FROMtable_name
SQLCOUNT(*)语法
COUNT(*)函数返回表中的记录数:
SELECTCOUNT(*)FROMtable_name
SQLCOUNT(DISTINCTcolumn_name)语法COUNT(DISTINCTcolumn_name)函数返回指定列的不同值的数目:
SELECTCOUNT(DISTINCTcolumn_name)FROMtable_name
现在,我们希望计算客户"Carter"的订单数。我们使用如下SQL语句:
SELECTCOUNT(Customer)ASCustomerNilsenFROMOrdersWHERECustomer='Carter'
现在,我们希望计算"Orders"表中不同客户的数目。我们使用如下SQL语句:
SELECTCOUNT(DISTINCTCustomer)ASNumberOfCustomersFROMOrders
FIRST()函数FIRST()函数返回指定的字段中第一个记录的值。提示:可使用ORDERBY语句对记录进行排序。SQLFIRST()语法
SELECTFIRST(column_name)FROMtable_name
现在,我们希望查找"OrderPrice"列的第一个值。我们使用如下SQL语句:
SELECTFIRST(OrderPrice)ASFirstOrderPriceFROMOrders
MAX()函数MAX函数返回一列中的最大值。NULL值不包括在计算中。SQLMAX()语法
SELECTMAX(column_name)FROMtable_name
注释:MIN和MAX也可用于文本列,以获得按字母顺序排列的最高或最低值。现在,我们希望查找"OrderPrice"列的最大值。我们使用如下SQL语句:
SELECTMAX(Or
derPrice)ASLargestOrderPriceFROMOrders
SUM()函数
SUM函数返回数值列的总数(总额)。
SQLSUM()语法
SELECTSUM(column_name)FROMtable_name
现在,我们希望查找"OrderPrice"字段的总数。我们使用如下SQL语句:
SELECTSUM(OrderPrice)ASOrderTotalFROMOrders
合计函数(比如SUM)常常需要添加GROUPBY语句。GROUPBY语句GROUPBY语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQLGROUPBY语法
SELECTcolumn_name,aggregate_function(column_name)FROMtable_nameWHEREcolumn_nameoperatorvalueGROUPBYcolumn_name
SQLGROUPBY实例
我们拥有下面这个"Orders"表:O_Id123456OrderDate2008/12/292008/11/232008/10/052008/09/282008/08/062008/07/21OrderPrice100016007003002000100CustomerBushCarterBushBushAdamsCarter
现在,我们希望查找每个客户的总金额(总订单)。我们想要使用GROUPBY语句对客户进行组合。我们使用下列SQL语句:
SELECTCustomer,SUM(OrderPrice)FROMOrdersGROUPBYCustomer
结果集类似这样:
CustomerBushCarterAdams
SUM(OrderPrice)200017002000
很棒吧,对不对?让我们看一下如果省略GROUPBY会出现什么情况:
SELECTCustomer,SUM(OrderPrice)FROMOrders
结果集类似这样:
CustomerBushCarterBushBushAdamsCarterSUM(OrderPrice)570057005700570057005700
上面的结果集不是我们需要的。那么为什么不能使用上面这条SELECT语句呢?解释如下:上面的SELECT语句指定了两列(Customer和SUM(OrderPrice))"SUM(OrderPrice)"返回一个单独的值。("OrderPrice"列的总计),而"Customer"返回6个值(每个值对应"Orders"表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUPBY语句解决了这个问题。GROUPBY一个以上的列我们也可以对一个以上的列应用GROUPBY语句,就像这样:
SELECTCustomer,OrderDate,SUM(OrderPrice)FROMOrdersGROUPBYCustomer,OrderDate
HAVING子句在SQL中增加HAVING子句原因是,WHERE关键字无法与合计函数一起使用。SQLHAVING语法
SELECTcolumn_name,aggregate_function(column_name)FROMtable_nameWHEREcolumn_nameoperatorvalueGROUPBYcolumn_name
HAVINGaggregate_function(column_name)operatorvalue
SQLHAVING实例
我们拥有下面这个"Orders"表:O_Id123456OrderDate2008/12/292008/11/232008/10/052008/09/282008/08/062008/07/21OrderPrice100016007003002000100CustomerBushCarterBushBushAdamsCarter
现在,我们希望查找订单总金额少于2000的客户。我们使用如下SQL语句:
SELECTCustomer,SUM(OrderPrice)FROMOrdersGROUPBYCustomerHAVINGSUM(OrderPrice)<2000
结果集类似:CustomerCarterSUM(OrderPrice)1700
现在我们希望查找客户"Bush"或"Adams"拥有超过1500的订单总金额。我们在SQL语句中增加了
一个普通的WHERE子句:
SELECTCustomer,SUM(OrderPrice)FROMOrdersWHERECustomer='Bush'ORCustomer='Adams'GROUPBYCustomerHAVINGSUM(OrderPrice)>1500