一、








简单查询






简单的


Transact-SQL


查询只包括选择列表、


FROM


子句和


WHERE


子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。





例如,下面的语句查询


testtable


表中姓名为





张三








nickname


字段和


email


字段。






SELECT nickname,email





FROM testtable





WHERE name='

张三

'





(





)


选择列表






选择列表


(select_list)


指出所查询列,它可以是一组列名列表、星号、表达式、变量


(


包括局部变量和全局变量


)


等构成。





1


、选择所有列





例如,下面语句显示


testtable


表中所有列的数据:







SELECT *





FROM testtable



2


、选择部分列并指定它们的显示次序





查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。





例如:







SELECT nickname,email





FROM testtable



3


、更改列标题





在选择列表中,可重新指定列标题。定义格式为:





列标题


=


列名





列名




列标题





如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列




标题:







SELECT


昵称


=nickname,


电子邮件


=email





FROM testtable



4.


删除重复行







SELECT


语句中使用


ALL





DISTINCT


选项来显示表中符合条件的所有行或删除其中重复的数据行,默认







ALL


。使用


DISTINCT


选项时,对于所有重复的数据行在


SELECT


返回的结果集合中只保留一行。





5


、限制返回的行数





使用


TOP n





PERCENT


]选项限制返回的数据行数,


TOP n


说明返回


n


行,而


TOP n PERCENT


时,说明


n







表示一百分数,指定返回的行数等于总行数的百分之几。





例如:








SELECT TOP 2 *







FROM testtable







SELECT TOP 20 PERCENT *







FROM testtable





(









) FROM




子句






FROM


子句指定


SELECT


语句查询及与查询相关的表或视图。在


FROM


子句中最多可指定


256


个表或视图,它们之间用逗号分隔。








FROM


子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在


usertable





citytable


表中同时存在


cityid


列,在查询两个表中的


cityid


时应




使用下面语句格式加以限定:






SELECT username,citytable.cityid





FROM usertable,citytable






WHERE usertable.cityid=citytable.cityid








FROM


子句中可用以下两种格式为表或视图指定别名:





表名


as


别名





表名




别名





例如上面语句可用表的别名格式表示为:






SELECT username,b.cityid





FROM usertable a,citytable b






WHERE a.cityid=b.cityid





SELECT


不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。





例如:






SELECT a.au_fname+a.au_lname





FROM authors a,titleauthor ta





(SELECT title_id,title





FROM titles





WHERE ytd_sales>10000





) AS t





WHERE a.au_id=ta.au_id






AND ta.title_id=t.title_id





此例中,将


SELECT


返回的结果集合给予一别名


t


,然后再从中检索数据。






(









)




使用




WHERE




子句设置查询条件






WHERE


子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于


20


的数据:








SELECT *







FROM usertable









WHERE age>20




WHERE


子句可包括各种条件运算符:





比较运算符


(


大小比较


)






>





>=





=





<





<=





<>





!>





!<




范围运算符


(


表达式值是否在指定的范围


)






BETWEEN…AND…;






NOT BETWEEN…AND…




列表运算符


(


判断表达式是否为列表中的指定项


)






IN (





1,





2……);






NOT IN (





1,





2……)




模式匹配符


(


判断值是否与指定的字符通配格式相符


):

LIKE




;


NOT LIKE




空值判断符


(


判断表达式是否为空


)






IS NULL


;




NOT IS NULL




逻辑运算符


(


用于多条件的逻辑连接


)






NOT


;


AND


;




OR






1


、范围运算符例:


age BETWEEN 10 AND 30


相当于


age>=10 AND age<=30





2


、列表运算符例:


country IN ('Germany','China')





3


、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于


char







varchar





text





ntext





datetime





smalldatetime


等类型查询。





可使用以下通配字符:






百分号


%



:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即


%%









下划线


_



:匹配单个任意字符,它常用来限制表达式的字符长度。






方括号 []:

指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。






[^




]:

其取值与[]




相同,但它要求所匹配对象为指定字符以外的任一个字符。





例如:





限制以


Publishing


结尾,使用


LIKE '%Publishing'



限制以


A


开头:


LIKE '





A





%'



限制以


A


开头外:


LIKE '





^A





%'





4


、空值判断符例


WHERE age IS NULL





5


、逻辑运算符:优先级为


NOT





AND





OR




(





)


查询结果排序






使用


ORDER BY


子句对查询返回的结果按一列或多列排序。


ORDER BY


子句的语法格式为:







ORDER BY {column_name





ASC|DESC





}





,…n








其中


ASC


表示升序,为默认值,


DESC


为降序。


ORDER BY


不能按


ntext





text





image


数据类型进行排




序。





例如:








SELECT *







FROM usertable









ORDER BY age desc,userid ASC




另外,可以根据表达式进行排序。












二、 联合查询








UNION


运算符可以将两个或两个以上上


SELECT


语句的查询结果集合合并成一个结果集合显示,即执行联




合查询。


UNION


的语法格式为:








select_statement







UNION





ALL





selectstatement








UNION





ALL





selectstatement


][


…n









其中


selectstatement


为待联合的


SELECT


查询语句。





ALL


选项表示将所有行合并到结果集合中。不指定该项时,被联合查询的结果集合中重复行将只保留一




行。





联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语




句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。





在使用


UNION


运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选




择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类




型,系统将低精度的数据类型转换为高精度的数据类型。





在包括多个查询的


UNION


语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:




查询


1 UNION (


查询


2 UNION


查询


3)










三、连接查询






通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型




数据库管理系统的一个标志。





在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在




一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。





连接可以在


SELECT


语句的


FROM


子句或


WHERE


子句中建立,似是而非在


FROM


子句中指出连接时有助于




将连接操作与


WHERE


子句中的搜索条件区分开来。所以,在


Transact-SQL


中推荐使用这种方法。







SQL-92


标准所定义的


FROM


子句的连接语法格式为:








FROM join_table join_type join_table








ON (join_condition)









其中


join_table


指出参与连接操作的表名,

连接可以对同一个表操作,也可以对多表操作

,对同一




个表操作的连接又称做自连接。





join_type


指出连接类型,可分为三种:

内连接、外连接和交叉连接





内连接



(INNER JOIN)


使用比




较运算符进行表间某


(





)


列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。






外连接

分为左外连接


(LEFT OUTER JOIN





LEFT JOIN)


、右外连接


(RIGHT OUTER JOIN





RIGHT JOIN)




和全外连接


(FULL OUTER JOIN





FULL JOIN)


三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表


(


左外连接时


)


、右表


(


右外连接时


)


或两个表


(


全外连接时


)


中所有符合搜索条件的数据行。






交叉连接



(CROSS JOIN)


没有


WHERE


子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的




数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。





连接操作中的


ON (join_condition)


子句指出连接条件,它由被连接表中的列和比较运算符、逻辑




运算符等构成。





无论哪种连接都不能对


text





ntext





image


数据类型列进行直接连接,但可以对这三种列进行间接




连接。例如:








SELECT p1.pub_id,p2.pub_id,p1.pr_info







FROM pub_info AS p1 INNER JOIN pub_info AS p2









ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)





(





)


内连接






内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分




三种:





1


、等值连接:



在连接条件中使用等于号


(=)


运算符比较被连接列的列值,其查询结果中列出被连接




表中的所有列,包括其中的重复列。





2


、不等连接:





在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些




运算符包括


>





>=





<=





<





!>





!<





<>








3


、自然连接:



在连接条件中使用等于


(=)


运算符比较被连接列的列值,但它使用选择列表指出查询




结果集合中所包括的列,并删除连接表中的重复列。





例如,下面使用等值连接列出


authors





publishers


表中位于同一城市的作者和出版社:








SELECT *







FROM authors AS a INNER JOIN publishers AS p









ON a.city=p.city




又如使用自然连接,在选择列表中删除


authors





publishers


表中重复列


(city





state)











SELECT a.*,p.pub_id,p.pub_name,p.country







FROM authors AS a INNER JOIN publishers AS p









ON a.city=p.city





(





)


外连接






内连接时,返回查询结果集合中的仅是符合查询条件


( WHERE


搜索条件或


HAVING


条件


)


和连接条件




的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表


(


左外




连接时


)


、右表


(


右外连接时


)


或两个边接表


(


全外连接


)


中的所有数据行。





如下面使用左外连接将


****


内容和作者信息连接起来:








SELECT a.*,b.* FROM luntan as a LEFT JOIN usertable as b









ON a.username=b.username




下面使用全外连接将


city


表中的所有作者以及


user


表中的所有作者,以及他们所在的城市:








SELECT a.*,b.*







FROM city as a FULL OUTER JOIN user as b









ON a.username=b.username





(





)


交叉连接






交叉连接不带


WHERE


子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数




据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。





例,


titles


表中有


6


类图书,而


publishers


表中有


8


家出版社,则下列交叉连接检索到的记录数将等







6*8=48


行。








SELECT type,pub_name







FROM titles CROSS JOIN publishers









ORDER BY type