




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。练掌握SQL是数据库用户的宝贵财富。在本文中,我们将引导你掌握四条最基本的数据操作语句一SQL的核心功能一来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。在我们开始之前,先使用CREATETABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句一数据操作语言(DML)语句进行处理。SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。INSERT语句用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员JohnSmith的记录插入到本例的表中,可以使用如下语句:INSERTINTOEMPLOYEESVALUES('Smith','John','1980-06-10','LosAngles',16,45000);通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中......以此类推。我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:INSERTINTOEMPLOYEESVALUES('Bunyan','Paul','1970-07-04','Boston',12,70000);INSERTINTOEMPLOYEESVALUES('John','Adams','1992-01-21','Boston',20,100000);INSERTINTOEMPLOYEESVALUES('Smith','Pocahontas','1976-04-06','LosAngles',12,100000);INSERTINTOEMPLOYEESVALUES('Smith','Bessie','1940-05-02','Boston',5,200000);INSERTINTOEMPLOYEESVALUES('Jones','Davy','1970-10-10','Boston',8,45000);INSERTINTOEMPLOYEESVALUES('Jones','Indiana','1992-02-01','Chicago',NULL,NULL);在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:INSERTINTOEMPLOYEES(FIRST_NAME,LAST_NAME,HIRE_DATE,BRANCH_OFFICE)VALUE('Indiana','Jones','1992-02-01','Indianapolis');这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。让我们来看一看上述INSERT语句的语法图:INSERTINTOtable[(column{,column})]VALUES(columnvalue[{,columnvalue}]);和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。SELECT语句SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(directSQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算一“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。SELECT语句最简单的语法如下:SELECTcolumnsFROMtables;当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:SELECTBRANCH_OFFICEFROMEMPLOYEES;以上SELECT语句的执行将产生如图2中表2所示的结果。由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEES;这次查询的结果如表3所示。现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDERBY子句就可以按照升序或降序来排列结果:SELECTDISTINCTBRANCH_OFFICEFROMEMPLOYEESORDERBYBRANCH_OFFICEASC;这一查询的结果如表4所示。请注意在ORDERBY之后是如何放置列名BRANCH_OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。同样我们应该指出ORDERBY子句只将临时表中的结果进行排序;并不影响原来的表。假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:SELECTBRANCH_OFFICE,FIRST_NAME,LAST_NAME,SALARYHIRE_DATEFROMEMPLOYEESORDERBYSALARYDESC,HIRE_DATEDESC;这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:SELECT*FROMEMPLOYEES;这次查询返回整个EMPLOYEES表,如表1所示。下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):SELECT[DISTINCT](column[{,columns}])!*FROMtable[{,table}][ORDERBYcolumn[ASC]IDESC[{,column[ASC]IDESC}]];定义选择标准在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:SELECTcolumnsFROMtables[WHEREpredicates];WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones';LAST_NAME='Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。使用最多的六种比较我们上例中的断言包括一种基于“等值”的比较(LAST_NAME='Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:等于=不等于<>小于<大于>小于或等于<=大于或等于>=下面给出了不是基于等值比较的一个例子:SELECT*FROMEMPLOYEESWHERESALARY>50000;这一查询将返回年薪高于$50,000.00的职员(参见表7)。逻辑连接符有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看DavyJones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员DavyJones的记录,用户可以输入如下语句:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ANDFIRST_NAME='Davy';在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:SELECT*FROMEMPLOYEESWHERELAST_NAME='Jones'ORLAST_NAME='Smith';有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:SELECT*FROMEMPLOYEESWHERENOT(BRANCH_OFFICE='Boston');关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:SELECT*FROMEMPLOYEESWHERE(LAST_NAME='Jones'ANDFIRST_NAME='Indiana')OR(LAST_NAME='Smith'ANDFIRST_NAME='Bessie');SQL沿用数学上标准的表达式求值的约定一圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:SELECT[DISTINCT](column[{,column}])|*FROMtable[{,table}][ORDERBYcolumn[ASC]|[DESC[{,column[ASC]|[DESC}]]WHEREpredicate[{logical-connectorpredicate}];NULL和三值逻辑在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句:SELECT*FROMEMPLOYEESWHERESALARYISNULL;相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句:SELECT*FROMEMPLOYEESWHERESALARYISNOTNULL;请注意我们在列名之后使用了关键字ISNULL或ISNOTNULL,而不是标准的比较形式:COLUMN=NULL、COLUMN<>NULL或是逻辑操作符NOT(NULL)。这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。例如,回过头来看我们图1中的EM-PLOYEES表,可以看到IndianaJones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询:SELECT*FROMEMPLOYEESWHEREGRADE<=SALARY;此时,IndianaJones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,IndianaJones并没有出现在查询的结果中,为什么?正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符ISNULL和ISNOTNULLoUPDATE语句UPDATE语句允许用户在已知的表中对现有的行进行修改。例如,我们刚刚发现IndianaJones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)oUPDATEEMPLOYEESSETGRADE=16,SALARY=40000WHEREFIRST_NAME='Indiana'ANDLAST_NAME='Jones';上面的例子说明了一个单行更新,但是UPDATE语句可以对多行进行操作。满足WHERE条件的所有行都将被更新。如果,你想让Boston办事处中的所有职员搬到NewYork,你可以使用如下语句:UPDATEEMPLOYEESSETBRANCH_OFFICE='NewYork'WHEREBRANCH_OFFICE='Boston';如果忽略WHERE子句,表中所有行中的部门值都将被更新为'NewYork'。UPDATE语句的语法流图如下面所示:UPDATEtableSETcolumn=value[{,column=value}][WHEREpredicate[{logical-connectorpredicate}]];DELETE语句DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。由于SQL中没有UNDO语句或是“你确认删除吗?”之类的警告,在执行这条语句时千万要小心。如果决定取消LosAngeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:DELETEFROMEMPLOYEESWHEREBRANCH_OFFICE='LosAngeles';如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。DELETE语句的语法流图如下面所示:DELETEFROMtable[WHEREpredicate[{logical-connectorpredicate}]];
SQL语句集锦--语句功能--数据操作SELECT--从数据库表中检索数据行和列INSERT--向数据库表添加新数据行DELETE--从数据库表中删除数据行UPDATE--更新数据库表中的数据--数据定义CREATETABLE--创建一个数据库表DROPTABLE--从数据库中删除表ALTERTABLE--修改数据库表结构CREATEVIEW--创建一个视图DROPVIEW--从数据库中删除视图CREATEINDEX--为数据库表创建一个索引DROPINDEX--从数据库中删除索引CREATEPROCEDURE--创建一个存储过程DROPPROCEDURE--从数据库中删除存储过程CREATETRIGGER--创建一个触发器select@id='10010001'DROPTRIGGER--从数据库中删除触发器CREATESCHEMADROPSCHEMA--向数据库添加一个新模式--从数据库中删除一个模式CREATEDOMAINALTERDOMAIN--创建一个数据值域--改变域定义DROPDOMAIN--从数据库中删除一个域--数据控制GRANT--授予用户访问权限DENY--拒绝用户访问REVOKE--解除用户访问权限--事务控制COMMIT--结束当前事务ROLLBACKDROPTRIGGER--从数据库中删除触发器CREATESCHEMADROPSCHEMA--向数据库添加一个新模式--从数据库中删除一个模式CREATEDOMAINALTERDOMAIN--创建一个数据值域--改变域定义DROPDOMAIN--从数据库中删除一个域--数据控制GRANT--授予用户访问权限DENY--拒绝用户访问REVOKE--解除用户访问权限--事务控制COMMIT--结束当前事务ROLLBACK--中止当前事务SETTRANSACTION--定义当前事务数据访问特征--程序化SQLDECLARE--为查询设定游标EXPLAN--为查询描述数据访问计划OPEN--检索查询结果打开一个游标FETCH--检索一行查询结果CLOSE--关闭游标PREPARE--为动态执行准备SQL语句EXECUTE--动态地执行SQL语句DESCRIBE--描述准备好的查询---局部变量declare@idchar(10)--set@id='10010001'print'x>y'--打印字符串'x>y'elseif@y>@zprint'y>z'elseprint'z>y'--CASEusepanguupdateemployeesete_wage=casewhenjob_level=’1’thene_wage*1.08whenjob_level=’2’thene_wage*1.07whenjob_level=’3’thene_wage*1.06elsee_wage*1.05end--WHILECONTINUEBREAKdeclare@xint@yint@cintselect@x=1@y=1while@x<3beginprint@x--打印变量x的值while@y<3beginselect@c=100*@x+@yprint@c--打印变量c的值select@y=@y+1endselect@x=@x+1select@y=1end--WAITFOR--例等待1小时2分零3秒后才执行SELECT语句waitfordelay’01:02:03’select*fromemployee--例等到晚上11点零8分后才执行SELECT语句waitfortime’23:08:00’select*fromemployee***SELECT***select*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex:(宿主)select*fromstock_informationwherestockid=str(nid)stockname='str_name'stocknamelike'%findthis%'stocknamelike'[a-zA-Z]%'([]指定值的范围)stocknamelike'[AF-M]%'(人排除指定范围)只能在使用like关键字的where子句中使用通配符)orstockpath='stock_path'orstocknumber<1000andstockindex=24notstocksex='man'stocknumberbetween20and100stocknumberin(10,20,30)orderbystockiddesc(asc)排序,desc-降序,asc-升序orderby1,2by列号stockname=(selectstocknamefromstock_informationwherestockid=4)子查询除非能确保内层select只返回一个行的值,否则应在外层where子句中用一个in限定符selectdistinctcolumn_nameformtable_namedistinct指定检索独有的列值,不重复selectstocknumber,"stocknumber+10"=stocknumber+10fromtable_nameselectstockname,"stocknumber"=count(*)fromtable_namegroupbystocknamegroupby将表按行分组,指定列中有相同的值havingcount(*)=2having选定指定的组select*fromtable1,table2wheretable1.id*=table2.id左外部连接,table1中有的而table2中没有得以null表示table1.id=*table2.id右外部连接selectstocknamefromtable1union[all]union合并查询结果集,all-保留重复行selectstocknamefromtable2***insert***insertintotable_name(Stock_name,Stock_number)value("xxx","xxxx")value(selectStockname,StocknumberfromStock_table2)---value为select语句***update***updatetable_namesetStockname="xxx"[whereStockid=3]Stockname=defaultStockname=nullStocknumber=Stockname+4***delete***deletefromtable_namewhereStockid=3truncatetable_name删除表中所有行,仍保持表的完整性droptabletable_name完全删除表***altertable***---修改数据库表结构altertabledatabase.owner.table_nameaddcolumn_namechar(2)null.....sp_helptable_name——显示表已有特征createtabletable_name(namechar(20),agesmallint,lnamevarchar(30))insertintotable_nameselect实现删除列的方法(创建新表)altertabletable_namedropconstraintStockname_default——删除Stockname的default约束***function(/*常用函数*/)***----统计函数----AVG--求平均值COUNT--统计数目MAX--求最大值MIN--求最小值SUM--求和--AVGusepanguselectavg(e_wage)asdept_avgWagefromemployeegroupbydept_id--MAX--求工资最高的员工姓名usepanguselecte_namefromemployeewheree_wage=(selectmax(e_wage)fromemployee)--STDEV()--STDEV()函数返回表达式中所有数据的标准差--STDEVP()--STDEVP()函数返回总体标准差--VAR()--VAR()函数返回表达式中所有值的统计变异数--VARP()--VARP()函数返回总体变异数----算术函数----/***三角函数***/SIN(float_expression)--返回以弧度表示的角的正弦COS(float_expression)--返回以弧度表示的角的余弦TAN(float_expression)--返回以弧度表示的角的正切COT(float_expression)--返回以弧度表示的角的余切/***反三角函数***/ASIN(float_expression)--返回正弦是FLOAT值的以弧度表示的角ACOS(float_expression)--返回余弦是FLOAT值的以弧度表示的角ATAN(float_expression)-返回正切是FLOAT值的以弧度表示的角ATAN2(float_expression1,float_expression2)--返回正切是float_expression1/float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)--把弧度转换为角度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT类型RADIANS(numeric_expression)--把角度转换为弧度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT类型EXP(float_expression)--返回表达式的指数值LOG(float_expression)--返回表达式的自然对数值LOG10(float_expression)--返回表达式的以10为底的对数值SQRT(float_expression)--返回表达式的平方根/***取近似值函数***/CEILING(numeric_expression)--返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT类型FLOOR(numeric_expression)--返回<=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT类型ROUND(numeric_expression)--返回以integer_expression为精度的四舍五入值返回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型ABS(numeric_expression)--返回表达式的绝对值返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT类型SIGN(numeric_expression)--测试参数的正负号返回0零值1正数或-1负数返回的数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型PI()--返回值为n即3.1415926535897936RAND([integer_expression])--用任选的[integer_expression]做种子值得出0-1间的随机浮点数----字符串函数----ASCII()--函数返回字符表达式最左端字符的ASCII码值CHAR()--函数用于将ASCII码转换为字符--如果没有输入0〜255之间的ASCII码值CHAR函数会返回一个NULL值LOWER()--函数把字符串全部转换为小写UPPER()--函数把字符串全部转换为大写STR()--函数把数值型数据转换为字符型数据LTRIM()--函数把字符串头部的空格去掉RTRIM()--函数把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING()--函数返回部分字符串CHARINDEX(),PATINDEX()--函数返回字符串中某个指定的子串出现的开始位置SOUNDEX()--函数返回一个四位字符码--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0值DIFFERENCE。--函数返回由SOUNDEX函数返回的两个字符表达式的值的差异--0两个SOUNDEX函数返回值的第一个字符不同--1两个SOUNDEX函数返回值的第一个字符相同--2两个SOUNDEX函数返回值的第一二个字符相同--3两个SOUNDEX函数返回值的第一二三个字符相同--4两个SOUNDEX函数返回值完全相同QUOTENAME()--函数返回被特定字符括起来的字符串/*selectquotename('abc','(')quotename('abc')运行结果如下{{abc}[abc]*/REPLICATE()--函数返回一个重复character_expression指定次数的字符串/*selectreplicate('abc',3)replicate('abc',-2)运行结果如下abcabcabcNULL*/REVERSE()--函数将指定的字符串的字符排列顺序颠倒REPLACE()--函数返回被替换了指定子串的字符串/*selectreplace('abc123g','123','def)运行结果如下abcdefg*/SPACE()--函数返回一个有指定长度的空白字符串STUFF()--函数用另一子串替换字符串指定位置长度的子串----数据类型转换函数----CAST()函数语法如下CAST()(<expression>AS<data_type>[length])CONVERT()函数语法如下CONVERT()(<data_type>[length],<expression>[,style])selectcast(100+99aschar)convert(varchar(12),getdate())运行结果如下199Jan152000----日期函数----DAY()--函数返回date_expression中的日期值MONTH()--函数返回date_expression中的月份值YEAR()--函数返回date_expression中的年份值DATEADD(<datepart>,<number>,<date>)--函数返回指定日期date加上指定的额外日期间隔number产生的新日期DATEDIFF(<datepart>,<number>,<date>)--函数返回两个指定日期在datepart方面的不同之处DATENAME(<datepart>,<date>)--函数以字符串的形式返回日期的指定部分DATEPART(<datepart>,<date>)--函数以整数值的形式返回日期的指定部分GETDATE()--函数以DATETIME的缺省格式返回系统当前的日期和时间----系统函数----APP_NAME()--函数返回当前执行的应用程序的名称COALESCE()--函数返回众多表达式中第一个非NULL表达式的值COL_LENGTH(<'table_name'>,<'column_name'>)--函数返回表中指定字段的长度值COL_NAME(<table_id>,<column_id>)--函数返回表中指定字段的名称即列名DATALENGTH()--函数返回数据表达式的数据的实际长度DB_ID(['database_name'])--函数返回数据库的编号DB_NAME(database_id)--函数返回数据库的名称HOST_ID()--函数返回服务器端计算机的名称HOST_NAME()--函数返回服务器端计算机的名称IDENTITY(<data_type>[,seedincrement])[AScolumn_name])--IDENTITY()函数只在SELECTINTO语句中使用用于插入一个identitycolumn列到新表中/*selectidentity(int,1,1)ascolumn_nameintonewtablefromoldtable*/ISDATE()--函数判断所给定的表达式是否为合理日期ISNULL(<check_expression>,<replacement_value>)--函数将表达式中的NULL值用指定值替换ISNUMERIC()--函数判断所给定的表达式是否为合理的数值NEWID()--函数返回一个UNIQUEIDENTIFIER类型的数值NULLIF(<expression1>,<expression2>)--NULLIF函数在expression]与expression2相等时返回NULL值若不相等时则返回expression1的值主要SQL语句详解CREATEDATABASEdatabase_name[WITHLOGIN“pathname”]创建数据库。database_name:数据库名称。“pathname”:事务处理日志文件。创建一database_name.dbs目录,存取权限由GRANT设定,无日志文件就不能使用BEGINWORK等事务语句(可用STARTDATABASE语句来改变)。可选定当前数据库的日志文件。如:selectdirpathformsystableswheretabtype="L”;例:createdatabsecustomerdbwithlogin"/usr/john/log/customer.log”;DATABASEdatabse-name[EXCLUSIVE]选择数据库。database_name:数据库名称。EXCLUSIVE:独占状态。存取当前目录和DBPATH中指定的目录下的数据库,事务中处理过程中不要使用此语句。例:dtabasecustomerdb;CLOSEDATABASE关闭当前数据库。database_name:数据库名称。此语句之后,只有下列语句合法:CREATEDATABASEDATABASEDROPDATABSE;ROLLFORWARDDATABASE删除数据库前必须使用此语句。例:closedatabase;DROPDATABASEdat<base_name删除指定数据库。database_name:数据库名称。用户是DBA或所有表的拥有者;删除所有文件,但不包括数据库目录;不允许删除当前数据库(须先关闭当前数据库);事务中处理过程中不能使用此语句,通过ROLLBACKWORK也不可将数据库恢复。例:dropdatabsecustomerdb;CREATE[TEMP]TABLEtable-name(column_namedatatype[NOTNULL],...)[IN"pathname”]创建表或临时表。table-name:表名称。column_name:字段名称。data-type:字段数据类型。path-name:指定表的存放位置TEMP用于指定建立临时表;表名要唯一,字段要唯一;有CONNECT权限的用户可建立临时表;创建的表缺省允许CONNECT用户存取,但不可以ALTERo例:createtableuser(c0serialnotnull,c1char(10),c2char(2),c3smallint,c4decimal(6,3),c5date)in“usr/john/customer.dbs/user;ALTERTABLEALTERTABLEtable-name(ADD(newcol_namenewcol_type[BEFOREoldcol_name],...)|DROP(oldcol_name,...)|MODIFY(oldcol_namenewcol_type[NOTNULL],...)},...修改表结构。table-name:表名称。newcol_name:新字段名称newcol_type:新字段类型oldcol_name:老字段名称可以使用单个或多个ADD子句、DROP子句、MODIFY子句,但某个字句失败,操作即中止;原字段是NULL,不允许MODIFY为NOTNULL,除非所有NULL字段中均非空,反之可以;ALTER使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。例:altertableuseradd(c6char(20)beforec5);RENAMETABLEoldnameTOnewname修改表名。oldname:原名称。newname:新名称。RENAME使用者是表的拥有者或拥有DBA权限,或被授权;事务中处理过程中不要使用此语句。例:renameusertobbb;DROPTABLEtable-name删除表。table-name:表名称。删除表意味着删除其中所有数据、各字段上的索引及对表的赋权、视图等;用户不能删除任何系统目录表;语句使用者是表拥有者或拥有DBA权限,事务中处理过程中不要使用此语句。RENAMECOLUMNtable.oldcolumn,TOnewcolumn修改字段名。table.oldcolumn:表名及原字段名称newcolumn:新字段名称。语句使用者是表的拥有者或拥有DBA权限或有ALTER权限的用户,事务中处理过程中不要使用此语句。例:renamecolumnuser.c6toc7;CREATEVIEWview-namecolumn-listCREATEVIEWview-namecolumn-listASselect_statement[WITHCHECKOPTION]创建视图。view-name:视图名称。column-list:字段列表。select_statement:SELECT语句。以下语句不使用视图:ALTERTABLEDROPINDEX,ALTERINDEX,LOCKTABLE,CREATEINDEX,RENAMETABLE;视图将延用基表的字段名,对表达式等虚字段和多表间字段重名必须指明标识其字段名;若对视图中某些字段命名,则所有字段都必须命名;视图中数据类型延用基表中的数据类型,虚字段起诀于表达式;不能使用ORDERBY和UNION子句;对视图中所有的字段要有SELECT权限;事务中处理过程中使用此语句,即使事务回滚,视图也将建立,不能恢复。例:createviewv_userasselect*fromuserwherec1=“B1”;DROPVIEWview-name删除视图。view-name:视图名称。用户可删除自己建立的视图;视图的后代视图也被删除;事务中处理中不要使用此语句。例:dropviewv_user;CREATEINDEXCREATE[UNIQUE/DISTINCT][CLUSTER]INDEXindex_nameONtable_name([column_nameASC/DESC],...)创建索引。index_name:索引名称。table_name:表名称。column_name:字段名称。UNIQUE/DISTINCT:唯一索引。CLUSTER:使表的物理存放顺序按索引排列。ASC/DESC:升序或降序,缺省升序。语句执行时,将表的状态置为EXCLUSIVE;复合索引最多包含8个字段,所有字段长度和不得大于120字节;事务中处理过程中使用此语句,即使事务回滚,索引将建立,不能恢复。例:createclusterindexix_useronuser(c5);-ALTERINDEXindex-nameTO[NOT]CLUSTER修改索引性质。index-name:索引名称。TO[NOT]CLUSTER:去掉或加上CLUSTER属性。语句执行时,将表的状态置为EXCLUSIVE;事务中处理过程中使用此语句,即使事务回滚,索引性质将改变,不能恢复。例:alterindexix_usertonotcluster;-DROPINDEXindex-name删除索引。index-name:索引名称。语句使用者是索引的拥有者或拥有DBA权限,事务中处理过程中不要使用此语句,否则事务无法恢复。例:dropindexix_user;CREATESYNONYMsynonymFORtable-name创建同义名。synonym:同义名table-name:表名称数据库的创建者可以使用同义名;没有赋予同义名权限的用户不能使用同义名;同义名不能和表名相同;事务中处理过程中不要使用此语句。例:createsynonymuser_aliasforuser;DROPSYNONYMsynonym删除同义名。synonym:同义名可以删除自己建立的同义名;事务中处理过程中不要使用此语句,否则无法恢复。例:dropsynonymuser_alias;UPDATESTATISTICS[FORTABLEtablename]更新数据库的统计数字。table-name:表名称此语句仅作用于当前数据库;可提高查询效率;只有执行此语句,才改变统计数据。例:updatestatisticsfortableuser;GRANT{DBA|RESOURCE|CONNECT}TO{PUBLIC|user-list授权命令。PUBLIC|user-list:全部或指定的用户。三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。例:grantresourcetopulbic;GRANTtab-privilegeONtable-nameTO{PUBLIC|user-list}[WITHGRANTOPTION]授表级权限。tab-privilege:表级权限。table-name:表名称。PUBLIC|user-list:全部或指定的用户。[WITHGRANTOPTION]:表示被授权用户有否权限进行二次授权。用户可以在自己建立表达式或被[WITHGRANTOPTION]准许的表中进行赋权;限定越多的权限优先级越高。例:grantupdate(c1,c6)onusertodickwithgrantoption;附(INFORMIX的权限)数据库的权限(控制对数据库的访问以及数据库中表的创建和删除)DBA权限:全部权利,修改系统表,建立和删除表与索引、增加和恢复表数据,以及授予其他用户数据库权限等;RESOURCE权限:允许对数据库表中的数据进行存取,建立永久性表以及索引。CONNECT权限:只允许对数据库表中的数据进行存取,建立和删除视图与临时表。表级权限(对表的建立、修改、检索和更新等权限)ALTER:更改权限DELETE:删除权限INDEX:索引权限INSERT:插入权限SELECT[(cols)]:指定字段或所有字段上的查询权限,不指明字段缺省为所有字段。UPDATE[(cols)]:指定字段或所有字段上的更新权限,不指明字段缺省为所有字段。ALL[PRIVILEGES]:以上所有表级权限REVOKE{DBA|RESOURCE|CONNECT}FROM{PUBLIC|user-list}收权命令。PUBLIC|user-list:全部或指定的用户。三种权限居且仅居其一,事务处理过程中不要执行GRANT语句。例:revokeresourcefromjohn;REVOKEtab-privilegeONtable-nameFROM{PUBLIC|user-list}收表级权限。tab-privilege:表级权限。table-name:表名称。PUBLIC|user-list:全部或指定的用户。[WITHGRANTOPTION]:表示被授权用户有否权限进行二次授权。用户只能取消由其本人赋予其他用户的表级存取权限;不能取消自己的权限,对SELECT和UPDATE作取消时,将取消所有表中字段的SELECT和UPDATE权限。例;revokeupdateonuserfromdick;•LOCKTABLEtable-nameIN{SHARE|EXCLUSIVE}MODE记录级加锁和表级加锁或文件加锁。table-name:表名称。SHARE:允许读表中数据,但不允许作任何修改EXCLUSIVE:禁止其他任何形式访问表每次只能对表琐定一次;事务处理过程中,BEGINWORK后立即执行LOCKTABLE以取代记录级加锁,COMMITWORK和ROLLBACKWORK语句取消所有对表的加锁;若没有事务处理,锁将保持到用户退出或执行UNLOCK为止。例:locktableuserinexclusivemode;•UNLOCKTABLEtable-name取消记录级加锁和表级加锁或文件加锁。table-name:表名称。例:unlockuser;-SETLOCKMODETO[NOT]WAIT改变锁定状态。TO[NOT]:等待解锁,有可能被死锁或不等待并提示错误信息,表示此记录被锁,缺省值。访问一个EXCLUSIVE状态下的记录,将返回一个错误。-STARTDATABSEdb_name[WITHLOGIN“pathname”]启动事务处理。“pathname”:事务处理日志文件。执行该语句前,需要先关闭当前数据库。例;clostdatabase;startdatabsecustomerwithlogin“/usr/john/log/customer.log”;-BEGINWORK开始事务。例:beginwork;-COMMITWORK提交(正常结束)事务。例:commitwork;-ROLLBACKWORK回滚(非正常结束)事务。例:rollbackwork;-SELECTSELECTselect_listFROMtab_name|view_nameWHEREconditionGROUPBYcolumn_nameHAVINGconditionORDERBYcolumn_listINTOTEMPtable_name查询语句。select_list:选择表或*tab_name:表名称view_name:视图名称。condition:查询条件,可使用BETWEEN、IN、LIKE、ISNULL、LIKE、MATCHES、NOT、AND、OR、=、!=或<>、>、>=、<=、<、ALL、ANY、SOMEcolumn_name:分组字段名称condition:群聚条件column_list:排序字段列表,缺省ASC,可指定DSC;排序时,NULL值小于非零值。table_name:临时表名称例:略附(常用函数)(1)集合函数:count(*)、sum(数据项/表达式)、avg(数据项/表达式)、max(数据项/表达式)、min(数据项/表达式)count(distinct数据项/表达式)、sum(distinct数据项/表达式)、avg(distinct数据项/表达式)(2)代数函数和三角函数HEX(数据项/表达式)、ROUND(数据项/表达式)、TRUNC(数据项/表达式)、TAN(数据项/表达式)、ABS(数据项/表达式)、MOD(被除数,除数)统计函数标准差,stdev()、方差,variance()、范围,rang()时间函数DAY(日期/时间表达式):返回数字型MONTH(日期/时间表达式):返回整数WEEKDAY^期/时间表达式):06,0星期天,1星期一;返回整数YEAR(日期/时间表达式)、返回整数DATE(非日期表达式):返回日期型EXTEND(日期/时间表达式,[第一个至最后一个]):返回指定的整数MDY(月,日,年):返回日期型CURRENT:返回日期型时间函数ROUND(),四舍五入。如:ROUND(10.95,position)position进行四舍五入的前一位置TRUNC(),截取。如:TRUNC(10.95,0)position截取的位置INFORMIX临时表在下列情况下自动取消:人.退出数据库访问工具(如DBACCESS)SQL通话结束(DISCONNECT)发出取消表语句。.退出程序时INSERTINSERTINTOview_nameltable_name[(column_list)]VALUES(value_list)或INSERTINTOview_nameltable_name[(column_list)]select_statement插入数据view_nameltable_name:视图名或表名称column_list:数据项列表。value_list:值列表select_statement:查询语句。例:略DELETEFROMview_nameltable_nameWHEREsearch-conditions删除语句。view_nameltable_name:视图名或表名称search-conditions;删除条件例:略UPDATEUPDATEview_nameltable_nameSETcolumn_1=value_1istWHEREsearch_conditions或UPDATEview_nameltable_nameSETcolumn_1l*=value_1istWHEREsearch_conditions更新数据语句。view_nameltable_name:表名称或视图表名称value_1ist:字段值search_conditions:更新数据的条件例:略31.CHECKTABLEtable-name检查索引语句。语句使用者是表的拥有者或拥有DBA权限;不能对systable使用此语句。例:略REPAIRTABLEtable-name修复索引。语句使用者是表的拥有者或拥有DBA权限;不能对systable使用此语句。例:略LOADFROM“file-name”INSERTINTOtable_name[(column_name[,...])]将文本数据栽入表中。例:loadfOrm“aa.txt''insertintouser;UNLOADTO“pathname”将表中数据卸为文本。例:unloadto“aa.txt”select*fromuser;INFO系统信息查询。INFOTABLES:得到当前数据库上表的名字。INFOcolumnsFORtable_name:指定表上的字段信息。INFOINDEXESFORtable_name:指定表上的索引信息。INFO[ACCESS|PRIVILEGES]FORtable_name:指定表上的存取权限。INFOSTATUSFORtable_name指定表的状态信息。例:infotables;SQL查询语句使用一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。SELECTnickname,emailFROMtesttableWHEREname=张三'选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。1、选择所有列例如,下面语句显示testtable表中所有列的数据:SELECT*FROMtesttable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:SELECTnickname,emailFROMtesttable3、更改列标题在选择列表中,可重新指定列标题。定义格式为:列标题=列名列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符。例如,下列语句使用汉字显示列标题:SELECT昵称=nickname,电子邮件=emailFROMtesttable4、删除重复行SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。5、限制返回的行数使用TOPn[PERCENT]选项限制返回的数据行数,TOPn说明返回n行,而TOPnPERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。例如:SELECTTOP2*FROMtesttableSELECTTOP20PERCENT*FROMtesttable(二)FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:SELECTusername,citytable.cityidFROMusertable,citytableWHEREusertable.cityid=citytable.cityid在FROM子句中可用以下两种格式为表或视图指定别名:表名as别名表名别名例如上面语句可用表的别名格式表示为:SELECTusername,b.cityidFROMusertablea,citytablebWHEREa.cityid=b.cityidSELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。例如:SELECTa.au_fname+a.au_lnameFROMauthorsa,titleauthorta(SELECTtitle_id,titleFROMtitlesWHEREytd_sales>10000)AStWHEREa.au_id=ta.au_idANDta.title_id=t.title_id此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。(三)使用WHERE子句设置查询条件WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:SELECT*FROMusertableWHEREage>20WHERE子句可包括各种条件运算符:比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<范围运算符(表达式值是否在指定的范围):BETWEEN...AND...NOTBETWEEN...AND...列表运算符(判断表达式是否为列表中的指定项):IN(项1,项2......)NOTIN(项1,项2)模式匹配符(判断值是否与指定的字符通配格式相符):LIKE>NOTLIKE空值判断符(判断表达式是否为空):ISNULL、NOTISNULL逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR1、范围运算符例:ageBETWEEN10AND30相当于age>=10ANDage<=302、列表运算符例:countryIN('Germany','China')3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。可使用以下通配字符:百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[人]:其取值也[]相同,但它要求所匹配对象为指定字符以外的任一个字符。例如:限制以Publishing结尾,使用LIKE'%Publishing'限制以A开头:LIKE'[A]%'限制以A开头外:LIKE'[AA]%'4、空值判断符例WHEREageISNULL5、逻辑运算符:优先级为NOT、AND、OR(四)查询结果排序使用ORDERBY子句对查询返回的结果按一列或多列排序。ORDERBY子句的语法格式为:ORDERBY{column_name[ASC|DESC])[,...n]其中ASC表示升序,为默认值,DESC为降序。ORDERBY不能按ntext、text和image数据类型进行排序。例如:SELECT*FROMusertableORDERBYagedesc,useridASC另外,可以根据表达式进行排序。二、联合查询UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:select_statementUNION[ALL]selectstatement[UNION[ALL]selectstatement][...n]其中selectstatement为待联合的SELECT查询语句。ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。在使用UNION运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:查询1UNION(查询2UNION查询3)三、连接查询通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。连接可以在SELECT语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。SQL-92标准所定义的FROM子句的连接语法格式为:FROMjoin_tablejoin_typejoin_table[ON(join_condition)]其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。join_type指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNERJOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFTOUTERJOIN或LEFTJOIN)、右外连接(RIGHTOUTERJOIN或RIGHTJOIN)和全外连接(FULLOUTERJOIN或FULLJOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。交叉连接(CROSSJOIN)没有WHERE子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。连接操作中的ON(join_condition)子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:SELECTp1.pub_id,p2.pub_id,p1.pr_infoFROMpub_infoASp1INNERJOINpub_infoASp2ONDATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)内连接内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。2、不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括〉、>=、<=、<、!>、!<和<>。3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:SELECT*FROMauthorsASaINNERJOINpublishersASpONa.city=p.city又如使用自然连接,在选择列表中删除authors和publishers表中重复列(city和state):SELECTa.*,p.pub_id,p.pub_name,p.countryFROMauthorsASaINNERJOINpublishersASpONa.city=p.city外连接内连接时,返回查询结果集合中的仅是符合查询条件(WHERE搜索条件或HAVING条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:SELECTa.*,b.*FROMluntanLEFTJOINusertableasbONa.username=b.username下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:SELECTa.*,b.*FROMcityasaFULLOUTERJOINuserasbONa.username=b.username(三)交叉连接交叉连接不带WHERE子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。SELECTtype,pub_nameFROMtitlesCROSSJOINpublishersORDERBYtype跟我学SQLSQL(StructuredQueryLanguage,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。使用SQL的常见关系数据库管理系统有:Oracle、Sybase>MicrosoftSQLServer、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 夏季五防安全培训课件
- 2023四年级数学上册 6 除数是两位数的除法2笔算除法练习课(第5~6课时)教学实录 新人教版
- 10《我们当地的风俗》第一课时(教学设计)-部编版道德与法治四年级下册
- 创意气球系列课件
- 园长给教师培训自主游戏观察
- Unit 4 A good read (ReadingI) 教学设计 2024-2025学年牛津译林版英语八年级下册
- 2025租房装修合同模板
- 江苏省镇江市八年级生物下册 第22章 第1节 生物的遗传教学实录 (新版)苏科版
- 八年级地理下册 第5章 第一节 亚洲的自然环境教学实录 中图版
- 2025标准化租赁合同模板
- 云南省2024年中考道德与法治真题试卷【附真题答案】
- 品牌联合声明书
- 工商业分布式光伏屋面勘察要点
- 《安徽省幼儿园保育教育质量自评指导手册》(文本)
- 医保统计信息管理制度
- 如何阐述自己的观点 高中语文统编版必修下册第一单元写作课课件
- 中考数学一轮考点复习课件 专题01 实数(含答案)
- 2024年全球电动自行车销量飙升
- 产业工人安全培训考试附有答案
- 经鼻高流量氧疗小讲课护理课件
- 电动叉车安全培训课件
评论
0/150
提交评论