2023年6月21日发(作者:)

SQL是用于访问和处理数据库的标准的计算机语言。什么是SQL?SQL指结构化查询语言SQL使我们有能力访问数据库SQL是一种ANSI的标准计算机语言编者注:ANSI,美国国家标准化组织SQL能做什么?SQL面向数据库执行查询SQL可从数据库取回数据SQL可在数据库中插入新的纪录SQL可更新数据库中的数据SQL可从数据库删除记录SQL可创建新数据库SQL可在数据库中创建新表SQL可在数据库中创建存储过程SQL可在数据库中创建视图SQL可以设置表、存储过程和视图的权限SQL是一种标准-但是...SQL是一门ANSI的标准计算机语言,用来访问和操作数据库系统。SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如MSAccess、DB2、Informix、MSSQLServer、Oracle、Sybase以及其他数据库系统。不幸地是,存在着很多不同版本的SQL语言,但是为了与ANSI标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。注释:除了SQL标准之外,大部分SQL数据库程序都拥有它们自己的私有扩展!在您的网站中使用SQL要创建发布数据库中数据的网站,您需要以下要素:RDBMS数据库程序(比如MSAccess,SQLServer,MySQL)服务器端脚本语言(比如PHP或ASP)SQLHTML/CSSRDBMSRDBMS指的是关系型数据库管理系统。RDBMS是SQL的基础,同样也是所有现代数据库系统的基础,比如MSSQLServer,IBMDB2,Oracle,MySQL以及MicrosoftAccess。RDBMS中的数据存储在被称为表(tables)的数据库对象中。表是相关的数据项的集合,它由列和行组成。SQL语法数据库表一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。下面的例子是一个名为"Persons"的表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing上面的表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。SQL语句您需要在数据库上执行的大部分工作都由SQL语句完成。下面的语句从表中选取LastName列的数据:SELECTLastNameFROMPersons在本教程中,我们将为您讲解各种不同的SQL语句。重要事项一定要记住,SQL对大小写不敏感!SQL语句后面的分号?某些数据库系统要求在每条SQL命令的末端使用分号。在我们的教程中不使用分号。分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。如果您使用的是MSAccess和SQLServer2000,则不必在每条SQL语句之后使用分号,不过某些数据库软件要求必须使用分号。SQLDML和DDL可以把SQL分为两个部分:数据操作语言(DML)和数据定义语言(DDL)。SQL(结构化查询语言)是用于执行查询的语法。但是SQL语言也包含用于更新、插入和删除记录的语法。查询和更新指令构成了SQL的DML部分:SELECT-从数据库表中获取数据UPDATE-更新数据库表中的数据DELETE-从数据库表中删除数据INSERTINTO-向数据库表中插入数据SQL的数据定义语言(DDL)部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。SQL中最重要的DDL语句:CREATEDATABASE-创建新数据库ALTERDATABASE-修改数据库CREATETABLE-创建新表ALTERTABLE-变更(改变)数据库表DROPTABLE-删除表CREATEINDEX-创建索引(搜索SQLSELECT语句本章讲解SELECT和SELECT*语句。SQLSELECT语句SELECT语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。SQLSELECT语法SELECT列名称FROM表名称以及:SELECT*FROM表名称注释:SQL语句对大小写不敏感。SELECT等效于select。SQLSELECT实例如需获取名为"LastName"和"FirstName"的列的内容(从名为"Persons"的数据库表),请使用类似这样的SELECT语句:SELECTLastName,FirstNameFROMPersons"Persons"表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing结果:LastNameAdamsBushCarterFirstNameJohnGeorgeThomasSQLSELECT*实例现在我们希望从"Persons"表中选取所有的列。请使用符号*取代列的名称,就像这样:SELECT*FROMPersons提示:星号(*)是选取所有列的快捷方式。结果:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing在结果集(result-set)中导航由SQL查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record等等。类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的ADO教程和PHP教程。SQLSELECTDISTINCT语句本章讲解SELECTDISTINCT语句。SQLSELECTDISTINCT语句在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词DISTINCT用于返回唯一不同的值。语法:SELECTDISTINCT列名称FROM表名称使用DISTINCT关键词如果要从"Company"列中选取所有的值,我们需要使用SELECT语句:SELECTCompanyFROMOrders"Orders"表:CompanyIBMW3SchoolAppleW3SchoolOrderNumber3532235646986953结果:CompanyIBMW3SchoolAppleW3School请注意,在结果集中,W3School被列出了两次。如需从Company"列中仅选取唯一不同的值,我们需要使用SELECTDISTINCT语句:SELECTDISTINCTCompanyFROMOrders结果:CompanyIBMW3SchoolApple现在,在结果集中,"W3School"仅被列出了一次。SQLWHERE子句WHERE子句用于规定选择的标准。WHERE子句如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。语法SELECT列名称FROM表名称WHERE列运算符值下面的运算符可在WHERE子句中使用:操作符=<>><>=<=BETWEENLIKE注释:在某些版本的SQL中,操作符<>可以写为!=。描述等于不等于大于小于大于等于小于等于在某个范围内搜索某种模式使用WHERE子句如果只希望选取居住在城市"Beijing"中的人,我们需要向SELECT语句添加WHERE子句:SELECT*FROMPersonsWHERECity='Beijing'"Persons"表LastNameFirstNameAddressCityYearAdamsBushCarterGatesJohnGeorgeThomasBillOxfordStreetFifthAvenueChanganStreetXuanwumen10LondonNewYorkBeijingBeijing1975结果:LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijingYear19801985引号的使用请注意,我们在例子中的条件值周围使用的是单引号。SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。文本值:这是正确的:SELECT*FROMPersonsWHEREFirstName='Bush'这是错误的:SELECT*FROMPersonsWHEREFirstName=Bush数值:这是正确的:SELECT*FROMPersonsWHEREYear>1965这是错误的:SELECT*FROMPersonsWHEREYear>'1965'SQLAND&OR运算符AND和OR运算符用于基于一个以上的条件对记录进行过滤。AND和OR运算符AND和OR可在WHERE子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。原始的表(用在例子中的):LastNameAdamsBushCarterCarterFirstNameJohnGeorgeThomasWilliamAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijingAND运算符实例使用AND来显示所有姓为"Carter"并且名为"Thomas"的人:SELECT*FROMPersonsWHEREFirstName='Thomas'ANDLastName='Carter'结果:LastNameCarterFirstNameThomasAddressChanganStreetCityBeijingOR运算符实例使用OR来显示所有姓为"Carter"或者名为"Thomas"的人:SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'结果:LastNameCarterFirstNameThomasAddressChanganStreetCityBeijingCarterWilliamXuanwumen10Beijing结合AND和OR运算符我们也可以把AND和OR结合起来(使用圆括号来组成复杂的表达式):SELECT*FROMPersonsWHERE(FirstName='Thomas'ORFirstName='William')ANDLastName='Carter'结果:LastNameCarterCarterFirstNameThomasWilliamAddressChanganStreetXuanwumen10CityBeijingBeijingSQLORDERBY子句ORDERBY语句用于对结果集进行排序。ORDERBY语句ORDERBY语句用于根据指定的列对结果集进行排序。ORDERBY语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用DESC关键字。原始的表(用在例子中的):Orders表:CompanyIBMW3SchoolOrderNumber35322356AppleW3School46986953实例1以字母顺序显示公司名称:SELECTCompany,OrderNumberFROMOrdersORDERBYCompany结果:CompanyAppleIBMW3SchoolW3SchoolOrderNumber4698353269532356实例2以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):SELECTCompany,OrderNumberFROMOrdersORDERBYCompany,OrderNumber结果:CompanyAppleIBMW3SchoolW3SchoolOrderNumber4698353223566953实例3以逆字母顺序显示公司名称:SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC结果:CompanyW3SchoolW3SchoolIBMAppleOrderNumber6953235635324698实例4以逆字母顺序显示公司名称,并以数字顺序显示顺序号:SELECTCompany,OrderNumberFROMOrdersOrderNumberASC结果:CompanyW3SchoolW3SchoolIBMAppleORDERBYCompanyDESC,OrderNumber2356695335324698注意:在以上的结果中有两个相等的公司名称(W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为nulls时,情况也是这样的。SQLINSERTINTO语句INSERTINTO语句INSERTINTO语句用于向表格中插入新的行。语法INSERTINTO表名称VALUES(值1,值2,....)我们也可以指定所要插入数据的列:INSERTINTOtable_name(列1,列2,...)VALUES(值1,值2,....)插入新的行"Persons"表:LastNameCarterSQL语句:INSERTINTOPersonsVALUES('Gates','Bill','Xuanwumen10','Beijing')FirstNameThomasAddressChanganStreetCityBeijing结果:LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijing在指定的列中插入数据"Persons"表:LastNameCarterGatesSQL语句:INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')FirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijing结果:LastNameCarterGatesWilsonFirstNameThomasBillAddressChanganStreetXuanwumen10Champs-ElyseesCityBeijingBeijingSQLUPDATE语句Update语句Update语句用于修改表中的数据。语法:UPDATE表名称SET列名称=新值WHERE列名称=某值Person:LastNameGatesWilsonFirstNameBillAddressXuanwumen10Champs-ElyseesCityBeijing更新某一行中的一个列我们为lastname是"Wilson"的人添加firstname:UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'结果:LastNameGatesWilsonFirstNameBillFredAddressXuanwumen10Champs-ElyseesCityBeijing更新某一行中的若干列我们会修改地址(address),并添加城市名称(city):UPDATEPersonSETAddress='Zhongshan23',City='Nanjing'WHERELastName='Wilson'结果:LastNameGatesFirstNameBillAddressXuanwumen10CityBeijingWilsonFredZhongshan23NanjingSQLDELETE语句DELETE语句DELETE语句用于删除表中的行。语法DELETEFROM表名称WHERE列名称=值Person:LastNameGatesWilsonFirstNameBillFredAddressXuanwumen10Zhongshan23CityBeijingNanjing删除某行"FredWilson"会被删除:DELETEFROMPersonWHERELastName='Wilson'结果:LastNameGatesFirstNameBillAddressXuanwumen10CityBeijing删除所有行可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:DELETEFROMtable_name或者:DELETE*FROMtable_nameSQL高级SQLTOP子句TOP子句TOP子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说,TOP子句是非常有用的。注释:并非所有的数据库系统都支持TOP子句。SQLServer的语法:SELECTTOPnumber|percentcolumn_name(s)FROMtable_nameMySQL和Oracle中的SQLSELECTTOP是等价的MySQL语法SELECTcolumn_name(s)FROMtable_nameLIMITnumber例子SELECT*FROMPersonsLIMIT5Oracle语法SELECTcolumn_name(s)FROMtable_nameWHEREROWNUM<=number例子SELECT*FROMPersonsWHEREROWNUM<=5原始的表(用在例子中的):Persons表:Id1234LastNameAdamsBushCarterObamaFirstNameJohnGeorgeThomasBarackAddressOxfordStreetFifthAvenueChanganStreetPennsylvaniaAvenueCityLondonNewYorkBeijingWashingtonSQLTOP实例现在,我们希望从上面的"Persons"表中选取头两条记录。我们可以使用下面的SELECT语句:SELECTTOP2*FROMPersons结果:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYorkSQLTOPPERCENT实例现在,我们希望从上面的"Persons"表中选取50%的记录。我们可以使用下面的SELECT语句:SELECTTOP50PERCENT*FROMPersons结果:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYorkSQLLIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。LIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。SQLLIKE操作符语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameLIKEpattern原始的表(用在例子中的):Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijingLIKE操作符实例例子1现在,我们希望从上面的"Persons"表中选取居住在以"N"开始的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'N%'提示:"%"可用于定义通配符(模式中缺少的字母)。结果集:Id2LastNameBushFirstNameGeorgeAddressFifthAvenueCityNewYork例子2接下来,我们希望从"Persons"表中选取居住在以"g"结尾的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%g'结果集:Id3LastNameCarterFirstNameThomasAddressChanganStreetCityBeijing例子3接下来,我们希望从"Persons"表中选取居住在包含"lon"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%lon%'结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon例子4通过使用NOT关键字,我们可以从"Persons"表中选取居住在不包含"lon"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityNOTLIKE'%lon%'结果集:Id23LastNameBushCarterFirstNameGeorgeThomasAddressFifthAvenueChanganStreetCityNewYorkBeijingSQL通配符在搜索数据库中的数据时,您可以使用SQL通配符。SQL通配符在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。SQL通配符必须与LIKE运算符一起使用。在SQL中,可使用以下通配符:通配符%_[charlist][^charlist]或者[!charlist]描述替代一个或多个字符仅替代一个字符字符列中的任何单一字符不在字符列中的任何单一字符原始的表(用在例子中的):Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing使用%通配符例子1现在,我们希望从上面的"Persons"表中选取居住在以"Ne"开始的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'Ne%'结果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork例子2接下来,我们希望从"Persons"表中选取居住在包含"lond"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%lond%'结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon使用_通配符例子1现在,我们希望从上面的"Persons"表中选取名字的第一个字符之后是"eorge"的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHEREFirstNameLIKE'_eorge'结果集:Id2LastNameBushFirstNameGeorgeAddressFifthAvenueCityNewYork例子2接下来,我们希望从"Persons"表中选取的这条记录的姓氏以"C"开头,然后是一个任意字符,然后是"r",然后是任意字符,然后是"er":我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERELastNameLIKE'C_r_er'结果集:Id3LastNameCarterFirstNameThomasAddressChanganStreetCityBeijing使用[charlist]通配符例子1现在,我们希望从上面的"Persons"表中选取居住的城市以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[ALN]%'结果集:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork例子2现在,我们希望从上面的"Persons"表中选取居住的城市不以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[!ALN]%'结果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijingSQLIN操作符IN操作符IN操作符允许我们在WHERE子句中规定多个值。SQLIN语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameIN(value1,value2,...)原始的表(在实例中使用:)Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijingIN操作符实例现在,我们希望从上表中选取姓氏为Adams和Carter的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERELastNameIN('Adams','Carter')结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon3CarterThomasChanganStreetBeijingSQLBETWEEN操作符BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围。BETWEEN操作符操作符AND会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。SQLBETWEEN语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameBETWEENvalue1ANDvalue2原始的表(在实例中使用:)Persons表:Id1234LastNameAdamsBushCarterGatesFirstNameJohnGeorgeThomasBillAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijingBETWEEN操作符实例如需以字母顺序显示介于"Adams"(包括)和"Carter"(不包括)之间的人,请使用下面的SQL:SELECT*FROMPersonsWHERELastNameBETWEEN'Adams'AND'Carter'结果集:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork重要事项:不同的数据库对AND操作符的处理方式是有差异的。某些数据库会列出介于"Adams"和"Carter"之间的人,但不包括"Adams"和"Carter";某些数据库会列出介于"Adams"和"Carter"之间并包括"Adams"和"Carter"的人;而另一些数据库会列出介于"Adams"和"Carter"之间的人,包括"Adams",但不包括"Carter"。所以,请检查你的数据库是如何处理AND操作符的!实例2如需使用上面的例子显示范围之外的人,请使用NOT操作符:SELECT*FROMPersonsWHERELastNameNOTBETWEEN'Adams'AND'Carter'结果集:Id34LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijingSQLAlias(别名)通过使用SQL,可以为列名称和表名称指定别名(Alias)。SQLAlias表的SQLAlias语法SELECTcolumn_name(s)FROMtable_nameASalias_name列的SQLAlias语法SELECTcolumn_nameASalias_nameFROMtable_nameAlias实例:使用表名称别名假设我们有两个表分别是:"Persons"和"Product_Orders"。我们分别为它们指定别名"p"和"po"。现在,我们希望列出"JohnAdams"的所有定单。我们可以使用下面的SELECT语句:D,me,ameFROMPersonsASp,Product_me='Adams'ame='John'不使用别名的SELECT语句:SELECTProduct_D,me,ameFROMPersons,Product_me='Hansen'ame='Ola'从上面两条SELECT语句您可以看到,别名使查询程序更易阅读和书写。Alias实例:使用一个列名别名表Persons:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon23BushCarterGeorgeThomasFifthAvenueChanganStreetNewYorkBeijingSQL:SELECTLastNameFROMPersonsASFamily,FirstNameASName结果:FamilyAdamsBushCarterNameJohnGeorgeThomasSQLJOINSQLjoin用于根据两个或多个表中的列之间的关系,从这些表中查询数据。Join和Key有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行join。数据库中的表可通过键将彼此联系起来。主键(PrimaryKey)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。请看"Persons"表:Id_P12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork3CarterThomasChanganStreetBeijing请注意,"Id_P"列是Persons表中的的主键。这意味着没有两行能够拥有相同的Id_P。即使两个人的姓名完全相同,Id_P也可以区分他们。接下来请看"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165请注意,"Id_O"列是Orders表中的的主键,同时,"Orders"表中的"Id_P"列用于引用"Persons"表中的人,而无需使用他们的确切姓名。请留意,"Id_P"列把上面的两个表联系了起来。引用两个表我们可以通过引用两个表的方式,从两个表中获取数据:谁订购了产品,并且他们订购了什么产品?me,ame,oFROMPersons,_P=_P结果集:LastNameAdamsAdamsFirstNameJohnJohnOrderNo2245624562CarterCarterThomasThomas7789544678SQLJOIN-使用Join除了上面的方法,我们也可以使用关键词JOIN来从两个表中获取数据。如果我们希望列出所有人的定购,可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo22456245627789544678不同的SQLJOIN除了我们在上面的例子中使用的INNERJOIN(内连接),我们还可以其他几种连接。下面列出了您可以使用的JOIN类型,以及它们之间的差异。JOIN:如果表中有至少一个匹配,则返回行LEFTJOIN:即使右表中没有匹配,也从左表返回所有的行RIGHTJOIN:即使左表中没有匹配,也从右表返回所有的行FULLJOIN:只要其中一个表中存在匹配,就返回行SQLINNERJOIN关键字SQLINNERJOIN关键字在表中存在至少一个匹配时,INNERJOIN关键字返回行。INNERJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1INNERJOINtable_name2ONtable__name=table__name注释:INNERJOIN与JOIN是相同的。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing内连接(INNERJOIN)实例现在,我们希望列出所有人的定购。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo22456245627789544678INNERJOIN关键字在表中存在至少一个匹配时返回行。如果"Persons"中的行在"Orders"中没有匹配,就不会列出这些行。SQLLEFTJOIN关键字SQLLEFTJOIN关键字LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。LEFTJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1LEFTJOINtable_name2ONtable__name=table__name注释:在某些数据库中,LEFTJOIN称为LEFTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing左连接(LEFTJOIN)实例现在,我们希望列出所有的人,以及他们的定购-如果有的话。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorgeOrderNo22456245627789544678LEFTJOIN关键字会从左表(Persons)那里返回所有的行,即使在右表(Orders)中没有匹配的行。SQLRIGHTJOIN关键字SQLRIGHTJOIN关键字RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。RIGHTJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1RIGHTJOINtable_name2ONtable__name=table__name注释:在某些数据库中,RIGHTJOIN称为RIGHTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon23"Orders"表:Id_O12345BushCarterGeorgeThomasFifthAvenueChanganStreetNewYorkBeijingOrderNo7789544678224562456234764Id_P331165右连接(RIGHTJOIN)实例现在,我们希望列出所有的定单,以及定购它们的人-如果有的话。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo2245624562778954467834764RIGHTJOIN关键字会从右表(Orders)那里返回所有的行,即使在左表(Persons)中没有匹配的行。SQLFULLJOIN关键字SQLFULLJOIN关键字只要其中某个表存在匹配,FULLJOIN关键字就会返回行。FULLJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1FULLJOINtable_name2ONtable__name=table__name注释:在某些数据库中,FULLJOIN称为FULLOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O1234OrderNo77895446782245624562Id_P3311LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing53476465全连接(FULLJOIN)实例现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorgeOrderNo2245624562778954467834764FULLJOIN关键字会从左表(Persons)和右表(Orders)那里返回所有的行。如果"Persons"中的行在表"Orders"中没有匹配,或者如果"Orders"中的行在表"Persons"中没有匹配,这些行同样会列出。SQLUNION和UNIONALL操作符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_ID01020304E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingEmployees_USA:E_ID0102E_NameAdams,JohnBush,George0304Carter,ThomasGates,Bill使用UNION命令实例列出所有在中国和美国的不同的雇员名:SELECTE_NameFROMEmployees_ChinaUNIONSELECTE_NameFROMEmployees_USA结果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeGates,Bill注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION命令只会选取不同的值。UNIONALLUNIONALL命令和UNION命令几乎是等效的,不过UNIONALL命令会列出所有的值。SQLStatement1UNIONALLSQLStatement2使用UNIONALL命令实例:列出在中国和美国的所有的雇员:SELECTE_NameFROMEmployees_ChinaUNIONALLSELECTE_NameFROMEmployees_USA结果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeCarter,ThomasGates,BillSQLSELECTINTO语句SQLSELECTINTO语句可用于创建表的备份复件。SELECTINTO语句SELECTINTO语句从一个表中选取数据,然后把数据插入另一个表中。SELECTINTO语句常用于创建表的备份复件或者用于对记录进行存档。SQLSELECTINTO语法您可以把所有的列插入新表:SELECT*INTOnew_table_name[INexternaldatabase]FROMold_tablename或者只把希望的列插入新表:SELECTcolumn_name(s)INTOnew_table_name[INexternaldatabase]FROMold_tablenameSQLSELECTINTO实例-制作备份复件下面的例子会制作"Persons"表的备份复件:SELECTINTO*Persons_backupFROMPersonsIN子句可用于向另一个数据库中拷贝表:SELECTINTO*PersonsIN''FROMPersons如果我们希望拷贝某些域,可以在SELECT语句后列出这些域:SELECTINTOLastName,FirstNamePersons_backupFROMPersonsSQLSELECTINTO实例-带有WHERE子句我们也可以添加WHERE子句。下面的例子通过从"Persons"表中提取居住在"Beijing"的人的信息,创建了一个带有两个列的名为"Persons_backup"的表:SELECTINTOLastName,FirstnamePersons_backupFROMPersonsWHERECity='Beijing'SQLSELECTINTO实例-被连接的表从一个以上的表中选取数据也是可以做到的。下面的例子会创建一个名为"Persons_Order_Backup"的新表,其中包含了从Persons和Orders两个表中取得的信息:me,oPersons_Order__P=_PSQLCREATEDATABASE语句CREATEDATABASE语句CREATEDATABASE用于创建数据库。SQLCREATEDATABASE语法CREATEDATABASEdatabase_nameSQLCREATEDATABASE实例现在我们希望创建一个名为"my_db"的数据库。我们使用下面的CREATEDATABASE语句:CREATEDATABASEmy_db可以通过CREATETABLE来添加数据库表。SQLCREATETABLE语句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语句向空表写入数据。SQL约束(Constraints)SQL约束约束用于限制加入表的数据的类型。可以在创建表时规定约束(通过CREATETABLE语句),或者在表创建之后也可以(通过ALTERTABLE语句)。我们将主要探讨以下几种约束:NOTNULLUNIQUEPRIMARYKEYFOREIGNKEYCHECKDEFAULT注释:在下面的章节,我们会详细讲解每一种约束。SQLNOTNULL约束SQLNOTNULL约束NOTNULL约束强制列不接受NULL值。NOTNULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。下面的SQL语句强制"Id_P"列和"LastName"列不接受NULL值:CREATETABLEPersons(Id_PintNOTNULL,NOTNULL,LastNamevarchar(255)FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))SQLUNIQUE约束SQLUNIQUE约束UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。PRIMARYKEY拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。SQLUNIQUEConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建UNIQUE约束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),UNIQUE(Id_P))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))撤销UNIQUE约束如需撤销UNIQUE约束,请使用下面的SQL:MySQL:ALTERTABLEPersonsDROPINDEXuc_PersonIDSQLServer/Oracle/MSAccess:ALTERTABLEPersonsDROPCONSTRAINTuc_PersonIDSQLPRIMARYKEY约束SQLPRIMARYKEY约束PRIMARYKEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表应该都一个主键,并且每个表只能有一个主键。SQLPRIMARYKEYConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建PRIMARYKEY约束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),PRIMARYKEY(Id_P))SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULLPRIMARYKEY,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))如果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:MySQL/SQLServer/Oracle/MSAccess: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语法:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEPersonsADDCONSTRAINTpk_PersonIDPRIMARYKEY(Id_P,LastName)注释:如果您使用ALTERTABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。撤销PRIMARYKEY约束如需撤销PRIMARYKEY约束,请使用下面的SQL:MySQL:ALTERTABLEPersons

2023年6月21日发(作者:)

SQL是用于访问和处理数据库的标准的计算机语言。什么是SQL?SQL指结构化查询语言SQL使我们有能力访问数据库SQL是一种ANSI的标准计算机语言编者注:ANSI,美国国家标准化组织SQL能做什么?SQL面向数据库执行查询SQL可从数据库取回数据SQL可在数据库中插入新的纪录SQL可更新数据库中的数据SQL可从数据库删除记录SQL可创建新数据库SQL可在数据库中创建新表SQL可在数据库中创建存储过程SQL可在数据库中创建视图SQL可以设置表、存储过程和视图的权限SQL是一种标准-但是...SQL是一门ANSI的标准计算机语言,用来访问和操作数据库系统。SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如MSAccess、DB2、Informix、MSSQLServer、Oracle、Sybase以及其他数据库系统。不幸地是,存在着很多不同版本的SQL语言,但是为了与ANSI标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如SELECT、UPDATE、DELETE、INSERT、WHERE等等)。注释:除了SQL标准之外,大部分SQL数据库程序都拥有它们自己的私有扩展!在您的网站中使用SQL要创建发布数据库中数据的网站,您需要以下要素:RDBMS数据库程序(比如MSAccess,SQLServer,MySQL)服务器端脚本语言(比如PHP或ASP)SQLHTML/CSSRDBMSRDBMS指的是关系型数据库管理系统。RDBMS是SQL的基础,同样也是所有现代数据库系统的基础,比如MSSQLServer,IBMDB2,Oracle,MySQL以及MicrosoftAccess。RDBMS中的数据存储在被称为表(tables)的数据库对象中。表是相关的数据项的集合,它由列和行组成。SQL语法数据库表一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。下面的例子是一个名为"Persons"的表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing上面的表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。SQL语句您需要在数据库上执行的大部分工作都由SQL语句完成。下面的语句从表中选取LastName列的数据:SELECTLastNameFROMPersons在本教程中,我们将为您讲解各种不同的SQL语句。重要事项一定要记住,SQL对大小写不敏感!SQL语句后面的分号?某些数据库系统要求在每条SQL命令的末端使用分号。在我们的教程中不使用分号。分号是在数据库系统中分隔每条SQL语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。如果您使用的是MSAccess和SQLServer2000,则不必在每条SQL语句之后使用分号,不过某些数据库软件要求必须使用分号。SQLDML和DDL可以把SQL分为两个部分:数据操作语言(DML)和数据定义语言(DDL)。SQL(结构化查询语言)是用于执行查询的语法。但是SQL语言也包含用于更新、插入和删除记录的语法。查询和更新指令构成了SQL的DML部分:SELECT-从数据库表中获取数据UPDATE-更新数据库表中的数据DELETE-从数据库表中删除数据INSERTINTO-向数据库表中插入数据SQL的数据定义语言(DDL)部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。SQL中最重要的DDL语句:CREATEDATABASE-创建新数据库ALTERDATABASE-修改数据库CREATETABLE-创建新表ALTERTABLE-变更(改变)数据库表DROPTABLE-删除表CREATEINDEX-创建索引(搜索SQLSELECT语句本章讲解SELECT和SELECT*语句。SQLSELECT语句SELECT语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。SQLSELECT语法SELECT列名称FROM表名称以及:SELECT*FROM表名称注释:SQL语句对大小写不敏感。SELECT等效于select。SQLSELECT实例如需获取名为"LastName"和"FirstName"的列的内容(从名为"Persons"的数据库表),请使用类似这样的SELECT语句:SELECTLastName,FirstNameFROMPersons"Persons"表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing结果:LastNameAdamsBushCarterFirstNameJohnGeorgeThomasSQLSELECT*实例现在我们希望从"Persons"表中选取所有的列。请使用符号*取代列的名称,就像这样:SELECT*FROMPersons提示:星号(*)是选取所有列的快捷方式。结果:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing在结果集(result-set)中导航由SQL查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record等等。类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的ADO教程和PHP教程。SQLSELECTDISTINCT语句本章讲解SELECTDISTINCT语句。SQLSELECTDISTINCT语句在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词DISTINCT用于返回唯一不同的值。语法:SELECTDISTINCT列名称FROM表名称使用DISTINCT关键词如果要从"Company"列中选取所有的值,我们需要使用SELECT语句:SELECTCompanyFROMOrders"Orders"表:CompanyIBMW3SchoolAppleW3SchoolOrderNumber3532235646986953结果:CompanyIBMW3SchoolAppleW3School请注意,在结果集中,W3School被列出了两次。如需从Company"列中仅选取唯一不同的值,我们需要使用SELECTDISTINCT语句:SELECTDISTINCTCompanyFROMOrders结果:CompanyIBMW3SchoolApple现在,在结果集中,"W3School"仅被列出了一次。SQLWHERE子句WHERE子句用于规定选择的标准。WHERE子句如需有条件地从表中选取数据,可将WHERE子句添加到SELECT语句。语法SELECT列名称FROM表名称WHERE列运算符值下面的运算符可在WHERE子句中使用:操作符=<>><>=<=BETWEENLIKE注释:在某些版本的SQL中,操作符<>可以写为!=。描述等于不等于大于小于大于等于小于等于在某个范围内搜索某种模式使用WHERE子句如果只希望选取居住在城市"Beijing"中的人,我们需要向SELECT语句添加WHERE子句:SELECT*FROMPersonsWHERECity='Beijing'"Persons"表LastNameFirstNameAddressCityYearAdamsBushCarterGatesJohnGeorgeThomasBillOxfordStreetFifthAvenueChanganStreetXuanwumen10LondonNewYorkBeijingBeijing1975结果:LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijingYear19801985引号的使用请注意,我们在例子中的条件值周围使用的是单引号。SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。文本值:这是正确的:SELECT*FROMPersonsWHEREFirstName='Bush'这是错误的:SELECT*FROMPersonsWHEREFirstName=Bush数值:这是正确的:SELECT*FROMPersonsWHEREYear>1965这是错误的:SELECT*FROMPersonsWHEREYear>'1965'SQLAND&OR运算符AND和OR运算符用于基于一个以上的条件对记录进行过滤。AND和OR运算符AND和OR可在WHERE子语句中把两个或多个条件结合起来。如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。原始的表(用在例子中的):LastNameAdamsBushCarterCarterFirstNameJohnGeorgeThomasWilliamAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijingAND运算符实例使用AND来显示所有姓为"Carter"并且名为"Thomas"的人:SELECT*FROMPersonsWHEREFirstName='Thomas'ANDLastName='Carter'结果:LastNameCarterFirstNameThomasAddressChanganStreetCityBeijingOR运算符实例使用OR来显示所有姓为"Carter"或者名为"Thomas"的人:SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'结果:LastNameCarterFirstNameThomasAddressChanganStreetCityBeijingCarterWilliamXuanwumen10Beijing结合AND和OR运算符我们也可以把AND和OR结合起来(使用圆括号来组成复杂的表达式):SELECT*FROMPersonsWHERE(FirstName='Thomas'ORFirstName='William')ANDLastName='Carter'结果:LastNameCarterCarterFirstNameThomasWilliamAddressChanganStreetXuanwumen10CityBeijingBeijingSQLORDERBY子句ORDERBY语句用于对结果集进行排序。ORDERBY语句ORDERBY语句用于根据指定的列对结果集进行排序。ORDERBY语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用DESC关键字。原始的表(用在例子中的):Orders表:CompanyIBMW3SchoolOrderNumber35322356AppleW3School46986953实例1以字母顺序显示公司名称:SELECTCompany,OrderNumberFROMOrdersORDERBYCompany结果:CompanyAppleIBMW3SchoolW3SchoolOrderNumber4698353269532356实例2以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):SELECTCompany,OrderNumberFROMOrdersORDERBYCompany,OrderNumber结果:CompanyAppleIBMW3SchoolW3SchoolOrderNumber4698353223566953实例3以逆字母顺序显示公司名称:SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC结果:CompanyW3SchoolW3SchoolIBMAppleOrderNumber6953235635324698实例4以逆字母顺序显示公司名称,并以数字顺序显示顺序号:SELECTCompany,OrderNumberFROMOrdersOrderNumberASC结果:CompanyW3SchoolW3SchoolIBMAppleORDERBYCompanyDESC,OrderNumber2356695335324698注意:在以上的结果中有两个相等的公司名称(W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为nulls时,情况也是这样的。SQLINSERTINTO语句INSERTINTO语句INSERTINTO语句用于向表格中插入新的行。语法INSERTINTO表名称VALUES(值1,值2,....)我们也可以指定所要插入数据的列:INSERTINTOtable_name(列1,列2,...)VALUES(值1,值2,....)插入新的行"Persons"表:LastNameCarterSQL语句:INSERTINTOPersonsVALUES('Gates','Bill','Xuanwumen10','Beijing')FirstNameThomasAddressChanganStreetCityBeijing结果:LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijing在指定的列中插入数据"Persons"表:LastNameCarterGatesSQL语句:INSERTINTOPersons(LastName,Address)VALUES('Wilson','Champs-Elysees')FirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijing结果:LastNameCarterGatesWilsonFirstNameThomasBillAddressChanganStreetXuanwumen10Champs-ElyseesCityBeijingBeijingSQLUPDATE语句Update语句Update语句用于修改表中的数据。语法:UPDATE表名称SET列名称=新值WHERE列名称=某值Person:LastNameGatesWilsonFirstNameBillAddressXuanwumen10Champs-ElyseesCityBeijing更新某一行中的一个列我们为lastname是"Wilson"的人添加firstname:UPDATEPersonSETFirstName='Fred'WHERELastName='Wilson'结果:LastNameGatesWilsonFirstNameBillFredAddressXuanwumen10Champs-ElyseesCityBeijing更新某一行中的若干列我们会修改地址(address),并添加城市名称(city):UPDATEPersonSETAddress='Zhongshan23',City='Nanjing'WHERELastName='Wilson'结果:LastNameGatesFirstNameBillAddressXuanwumen10CityBeijingWilsonFredZhongshan23NanjingSQLDELETE语句DELETE语句DELETE语句用于删除表中的行。语法DELETEFROM表名称WHERE列名称=值Person:LastNameGatesWilsonFirstNameBillFredAddressXuanwumen10Zhongshan23CityBeijingNanjing删除某行"FredWilson"会被删除:DELETEFROMPersonWHERELastName='Wilson'结果:LastNameGatesFirstNameBillAddressXuanwumen10CityBeijing删除所有行可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:DELETEFROMtable_name或者:DELETE*FROMtable_nameSQL高级SQLTOP子句TOP子句TOP子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说,TOP子句是非常有用的。注释:并非所有的数据库系统都支持TOP子句。SQLServer的语法:SELECTTOPnumber|percentcolumn_name(s)FROMtable_nameMySQL和Oracle中的SQLSELECTTOP是等价的MySQL语法SELECTcolumn_name(s)FROMtable_nameLIMITnumber例子SELECT*FROMPersonsLIMIT5Oracle语法SELECTcolumn_name(s)FROMtable_nameWHEREROWNUM<=number例子SELECT*FROMPersonsWHEREROWNUM<=5原始的表(用在例子中的):Persons表:Id1234LastNameAdamsBushCarterObamaFirstNameJohnGeorgeThomasBarackAddressOxfordStreetFifthAvenueChanganStreetPennsylvaniaAvenueCityLondonNewYorkBeijingWashingtonSQLTOP实例现在,我们希望从上面的"Persons"表中选取头两条记录。我们可以使用下面的SELECT语句:SELECTTOP2*FROMPersons结果:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYorkSQLTOPPERCENT实例现在,我们希望从上面的"Persons"表中选取50%的记录。我们可以使用下面的SELECT语句:SELECTTOP50PERCENT*FROMPersons结果:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYorkSQLLIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。LIKE操作符LIKE操作符用于在WHERE子句中搜索列中的指定模式。SQLLIKE操作符语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameLIKEpattern原始的表(用在例子中的):Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijingLIKE操作符实例例子1现在,我们希望从上面的"Persons"表中选取居住在以"N"开始的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'N%'提示:"%"可用于定义通配符(模式中缺少的字母)。结果集:Id2LastNameBushFirstNameGeorgeAddressFifthAvenueCityNewYork例子2接下来,我们希望从"Persons"表中选取居住在以"g"结尾的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%g'结果集:Id3LastNameCarterFirstNameThomasAddressChanganStreetCityBeijing例子3接下来,我们希望从"Persons"表中选取居住在包含"lon"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%lon%'结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon例子4通过使用NOT关键字,我们可以从"Persons"表中选取居住在不包含"lon"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityNOTLIKE'%lon%'结果集:Id23LastNameBushCarterFirstNameGeorgeThomasAddressFifthAvenueChanganStreetCityNewYorkBeijingSQL通配符在搜索数据库中的数据时,您可以使用SQL通配符。SQL通配符在搜索数据库中的数据时,SQL通配符可以替代一个或多个字符。SQL通配符必须与LIKE运算符一起使用。在SQL中,可使用以下通配符:通配符%_[charlist][^charlist]或者[!charlist]描述替代一个或多个字符仅替代一个字符字符列中的任何单一字符不在字符列中的任何单一字符原始的表(用在例子中的):Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing使用%通配符例子1现在,我们希望从上面的"Persons"表中选取居住在以"Ne"开始的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'Ne%'结果集:IdLastNameFirstNameAddressCity2BushGeorgeFifthAvenueNewYork例子2接下来,我们希望从"Persons"表中选取居住在包含"lond"的城市里的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'%lond%'结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon使用_通配符例子1现在,我们希望从上面的"Persons"表中选取名字的第一个字符之后是"eorge"的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHEREFirstNameLIKE'_eorge'结果集:Id2LastNameBushFirstNameGeorgeAddressFifthAvenueCityNewYork例子2接下来,我们希望从"Persons"表中选取的这条记录的姓氏以"C"开头,然后是一个任意字符,然后是"r",然后是任意字符,然后是"er":我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERELastNameLIKE'C_r_er'结果集:Id3LastNameCarterFirstNameThomasAddressChanganStreetCityBeijing使用[charlist]通配符例子1现在,我们希望从上面的"Persons"表中选取居住的城市以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[ALN]%'结果集:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork例子2现在,我们希望从上面的"Persons"表中选取居住的城市不以"A"或"L"或"N"开头的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERECityLIKE'[!ALN]%'结果集:IdLastNameFirstNameAddressCity3CarterThomasChanganStreetBeijingSQLIN操作符IN操作符IN操作符允许我们在WHERE子句中规定多个值。SQLIN语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameIN(value1,value2,...)原始的表(在实例中使用:)Persons表:Id123LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijingIN操作符实例现在,我们希望从上表中选取姓氏为Adams和Carter的人:我们可以使用下面的SELECT语句:SELECT*FROMPersonsWHERELastNameIN('Adams','Carter')结果集:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon3CarterThomasChanganStreetBeijingSQLBETWEEN操作符BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围。BETWEEN操作符操作符AND会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。SQLBETWEEN语法SELECTcolumn_name(s)FROMtable_nameWHEREcolumn_nameBETWEENvalue1ANDvalue2原始的表(在实例中使用:)Persons表:Id1234LastNameAdamsBushCarterGatesFirstNameJohnGeorgeThomasBillAddressOxfordStreetFifthAvenueChanganStreetXuanwumen10CityLondonNewYorkBeijingBeijingBETWEEN操作符实例如需以字母顺序显示介于"Adams"(包括)和"Carter"(不包括)之间的人,请使用下面的SQL:SELECT*FROMPersonsWHERELastNameBETWEEN'Adams'AND'Carter'结果集:Id12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork重要事项:不同的数据库对AND操作符的处理方式是有差异的。某些数据库会列出介于"Adams"和"Carter"之间的人,但不包括"Adams"和"Carter";某些数据库会列出介于"Adams"和"Carter"之间并包括"Adams"和"Carter"的人;而另一些数据库会列出介于"Adams"和"Carter"之间的人,包括"Adams",但不包括"Carter"。所以,请检查你的数据库是如何处理AND操作符的!实例2如需使用上面的例子显示范围之外的人,请使用NOT操作符:SELECT*FROMPersonsWHERELastNameNOTBETWEEN'Adams'AND'Carter'结果集:Id34LastNameCarterGatesFirstNameThomasBillAddressChanganStreetXuanwumen10CityBeijingBeijingSQLAlias(别名)通过使用SQL,可以为列名称和表名称指定别名(Alias)。SQLAlias表的SQLAlias语法SELECTcolumn_name(s)FROMtable_nameASalias_name列的SQLAlias语法SELECTcolumn_nameASalias_nameFROMtable_nameAlias实例:使用表名称别名假设我们有两个表分别是:"Persons"和"Product_Orders"。我们分别为它们指定别名"p"和"po"。现在,我们希望列出"JohnAdams"的所有定单。我们可以使用下面的SELECT语句:D,me,ameFROMPersonsASp,Product_me='Adams'ame='John'不使用别名的SELECT语句:SELECTProduct_D,me,ameFROMPersons,Product_me='Hansen'ame='Ola'从上面两条SELECT语句您可以看到,别名使查询程序更易阅读和书写。Alias实例:使用一个列名别名表Persons:Id1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon23BushCarterGeorgeThomasFifthAvenueChanganStreetNewYorkBeijingSQL:SELECTLastNameFROMPersonsASFamily,FirstNameASName结果:FamilyAdamsBushCarterNameJohnGeorgeThomasSQLJOINSQLjoin用于根据两个或多个表中的列之间的关系,从这些表中查询数据。Join和Key有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行join。数据库中的表可通过键将彼此联系起来。主键(PrimaryKey)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。请看"Persons"表:Id_P12LastNameAdamsBushFirstNameJohnGeorgeAddressOxfordStreetFifthAvenueCityLondonNewYork3CarterThomasChanganStreetBeijing请注意,"Id_P"列是Persons表中的的主键。这意味着没有两行能够拥有相同的Id_P。即使两个人的姓名完全相同,Id_P也可以区分他们。接下来请看"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165请注意,"Id_O"列是Orders表中的的主键,同时,"Orders"表中的"Id_P"列用于引用"Persons"表中的人,而无需使用他们的确切姓名。请留意,"Id_P"列把上面的两个表联系了起来。引用两个表我们可以通过引用两个表的方式,从两个表中获取数据:谁订购了产品,并且他们订购了什么产品?me,ame,oFROMPersons,_P=_P结果集:LastNameAdamsAdamsFirstNameJohnJohnOrderNo2245624562CarterCarterThomasThomas7789544678SQLJOIN-使用Join除了上面的方法,我们也可以使用关键词JOIN来从两个表中获取数据。如果我们希望列出所有人的定购,可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo22456245627789544678不同的SQLJOIN除了我们在上面的例子中使用的INNERJOIN(内连接),我们还可以其他几种连接。下面列出了您可以使用的JOIN类型,以及它们之间的差异。JOIN:如果表中有至少一个匹配,则返回行LEFTJOIN:即使右表中没有匹配,也从左表返回所有的行RIGHTJOIN:即使左表中没有匹配,也从右表返回所有的行FULLJOIN:只要其中一个表中存在匹配,就返回行SQLINNERJOIN关键字SQLINNERJOIN关键字在表中存在至少一个匹配时,INNERJOIN关键字返回行。INNERJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1INNERJOINtable_name2ONtable__name=table__name注释:INNERJOIN与JOIN是相同的。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing内连接(INNERJOIN)实例现在,我们希望列出所有人的定购。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo22456245627789544678INNERJOIN关键字在表中存在至少一个匹配时返回行。如果"Persons"中的行在"Orders"中没有匹配,就不会列出这些行。SQLLEFTJOIN关键字SQLLEFTJOIN关键字LEFTJOIN关键字会从左表(table_name1)那里返回所有的行,即使在右表(table_name2)中没有匹配的行。LEFTJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1LEFTJOINtable_name2ONtable__name=table__name注释:在某些数据库中,LEFTJOIN称为LEFTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O12345OrderNo7789544678224562456234764Id_P331165LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing左连接(LEFTJOIN)实例现在,我们希望列出所有的人,以及他们的定购-如果有的话。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorgeOrderNo22456245627789544678LEFTJOIN关键字会从左表(Persons)那里返回所有的行,即使在右表(Orders)中没有匹配的行。SQLRIGHTJOIN关键字SQLRIGHTJOIN关键字RIGHTJOIN关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。RIGHTJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1RIGHTJOINtable_name2ONtable__name=table__name注释:在某些数据库中,RIGHTJOIN称为RIGHTOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P1LastNameAdamsFirstNameJohnAddressOxfordStreetCityLondon23"Orders"表:Id_O12345BushCarterGeorgeThomasFifthAvenueChanganStreetNewYorkBeijingOrderNo7789544678224562456234764Id_P331165右连接(RIGHTJOIN)实例现在,我们希望列出所有的定单,以及定购它们的人-如果有的话。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterFirstNameJohnJohnThomasThomasOrderNo2245624562778954467834764RIGHTJOIN关键字会从右表(Orders)那里返回所有的行,即使在左表(Persons)中没有匹配的行。SQLFULLJOIN关键字SQLFULLJOIN关键字只要其中某个表存在匹配,FULLJOIN关键字就会返回行。FULLJOIN关键字语法SELECTcolumn_name(s)FROMtable_name1FULLJOINtable_name2ONtable__name=table__name注释:在某些数据库中,FULLJOIN称为FULLOUTERJOIN。原始的表(用在例子中的):"Persons"表:Id_P123"Orders"表:Id_O1234OrderNo77895446782245624562Id_P3311LastNameAdamsBushCarterFirstNameJohnGeorgeThomasAddressOxfordStreetFifthAvenueChanganStreetCityLondonNewYorkBeijing53476465全连接(FULLJOIN)实例现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。您可以使用下面的SELECT语句:me,ame,_P=_me结果集:LastNameAdamsAdamsCarterCarterBushFirstNameJohnJohnThomasThomasGeorgeOrderNo2245624562778954467834764FULLJOIN关键字会从左表(Persons)和右表(Orders)那里返回所有的行。如果"Persons"中的行在表"Orders"中没有匹配,或者如果"Orders"中的行在表"Persons"中没有匹配,这些行同样会列出。SQLUNION和UNIONALL操作符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_ID01020304E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingEmployees_USA:E_ID0102E_NameAdams,JohnBush,George0304Carter,ThomasGates,Bill使用UNION命令实例列出所有在中国和美国的不同的雇员名:SELECTE_NameFROMEmployees_ChinaUNIONSELECTE_NameFROMEmployees_USA结果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeGates,Bill注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION命令只会选取不同的值。UNIONALLUNIONALL命令和UNION命令几乎是等效的,不过UNIONALL命令会列出所有的值。SQLStatement1UNIONALLSQLStatement2使用UNIONALL命令实例:列出在中国和美国的所有的雇员:SELECTE_NameFROMEmployees_ChinaUNIONALLSELECTE_NameFROMEmployees_USA结果E_NameZhang,HuaWang,WeiCarter,ThomasYang,MingAdams,JohnBush,GeorgeCarter,ThomasGates,BillSQLSELECTINTO语句SQLSELECTINTO语句可用于创建表的备份复件。SELECTINTO语句SELECTINTO语句从一个表中选取数据,然后把数据插入另一个表中。SELECTINTO语句常用于创建表的备份复件或者用于对记录进行存档。SQLSELECTINTO语法您可以把所有的列插入新表:SELECT*INTOnew_table_name[INexternaldatabase]FROMold_tablename或者只把希望的列插入新表:SELECTcolumn_name(s)INTOnew_table_name[INexternaldatabase]FROMold_tablenameSQLSELECTINTO实例-制作备份复件下面的例子会制作"Persons"表的备份复件:SELECTINTO*Persons_backupFROMPersonsIN子句可用于向另一个数据库中拷贝表:SELECTINTO*PersonsIN''FROMPersons如果我们希望拷贝某些域,可以在SELECT语句后列出这些域:SELECTINTOLastName,FirstNamePersons_backupFROMPersonsSQLSELECTINTO实例-带有WHERE子句我们也可以添加WHERE子句。下面的例子通过从"Persons"表中提取居住在"Beijing"的人的信息,创建了一个带有两个列的名为"Persons_backup"的表:SELECTINTOLastName,FirstnamePersons_backupFROMPersonsWHERECity='Beijing'SQLSELECTINTO实例-被连接的表从一个以上的表中选取数据也是可以做到的。下面的例子会创建一个名为"Persons_Order_Backup"的新表,其中包含了从Persons和Orders两个表中取得的信息:me,oPersons_Order__P=_PSQLCREATEDATABASE语句CREATEDATABASE语句CREATEDATABASE用于创建数据库。SQLCREATEDATABASE语法CREATEDATABASEdatabase_nameSQLCREATEDATABASE实例现在我们希望创建一个名为"my_db"的数据库。我们使用下面的CREATEDATABASE语句:CREATEDATABASEmy_db可以通过CREATETABLE来添加数据库表。SQLCREATETABLE语句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语句向空表写入数据。SQL约束(Constraints)SQL约束约束用于限制加入表的数据的类型。可以在创建表时规定约束(通过CREATETABLE语句),或者在表创建之后也可以(通过ALTERTABLE语句)。我们将主要探讨以下几种约束:NOTNULLUNIQUEPRIMARYKEYFOREIGNKEYCHECKDEFAULT注释:在下面的章节,我们会详细讲解每一种约束。SQLNOTNULL约束SQLNOTNULL约束NOTNULL约束强制列不接受NULL值。NOTNULL约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。下面的SQL语句强制"Id_P"列和"LastName"列不接受NULL值:CREATETABLEPersons(Id_PintNOTNULL,NOTNULL,LastNamevarchar(255)FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))SQLUNIQUE约束SQLUNIQUE约束UNIQUE约束唯一标识数据库表中的每条记录。UNIQUE和PRIMARYKEY约束均为列或列集合提供了唯一性的保证。PRIMARYKEY拥有自动定义的UNIQUE约束。请注意,每个表可以有多个UNIQUE约束,但是每个表只能有一个PRIMARYKEY约束。SQLUNIQUEConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建UNIQUE约束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),UNIQUE(Id_P))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))撤销UNIQUE约束如需撤销UNIQUE约束,请使用下面的SQL:MySQL:ALTERTABLEPersonsDROPINDEXuc_PersonIDSQLServer/Oracle/MSAccess:ALTERTABLEPersonsDROPCONSTRAINTuc_PersonIDSQLPRIMARYKEY约束SQLPRIMARYKEY约束PRIMARYKEY约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含NULL值。每个表应该都一个主键,并且每个表只能有一个主键。SQLPRIMARYKEYConstraintonCREATETABLE下面的SQL在"Persons"表创建时在"Id_P"列创建PRIMARYKEY约束:MySQL:CREATETABLEPersons(Id_PintNOTNULL,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255),PRIMARYKEY(Id_P))SQLServer/Oracle/MSAccess:CREATETABLEPersons(Id_PintNOTNULLPRIMARYKEY,LastNamevarchar(255)NOTNULL,FirstNamevarchar(255),Addressvarchar(255),Cityvarchar(255))如果需要命名PRIMARYKEY约束,以及为多个列定义PRIMARYKEY约束,请使用下面的SQL语法:MySQL/SQLServer/Oracle/MSAccess: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语法:MySQL/SQLServer/Oracle/MSAccess:ALTERTABLEPersonsADDCONSTRAINTpk_PersonIDPRIMARYKEY(Id_P,LastName)注释:如果您使用ALTERTABLE语句添加主键,必须把主键列声明为不包含NULL值(在表首次创建时)。撤销PRIMARYKEY约束如需撤销PRIMARYKEY约束,请使用下面的SQL:MySQL:ALTERTABLEPersons