T-SQL高级查询

一.SELECT语句基本语法
1.Select语句主要是从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。select语句的基本语法如下:

在这里插入图片描述
2.Select语句的参数及说明:
在这里插入图片描述

二.指定公用表表达式
1.WITH子句用于指定临时命名的结果集,这些结果集称为公用表表达式(CTE)。该表达式源自简单查询,并且在单条SELECT、INSERT、UPDATE或DELETE语句的执行范围内定义。
语法如下:
[ WITH <common_table_expression> [ ,…n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,…n ] ) ]
AS
( CTE_query_definition )
参数说明:
expression_name:公用表表达式的有效标识符。
column_name:在公用表表达式中指定列名。
CTE_query_definition:指定一个其结果集填充公用表表达式的 SELECT 语句。

三.SELECT…FROM子句
SELECT表明要读取信息,FROM指定要从中获取数据的一个或多个表的名称。SELECT…FROM就够成了一个基本的查询语句。
语法如下:
SELECT [ ALL | DISTINCT ]
[ TOP expression [ PERCENT ] [ WITH TIES ] ]
<select_list> [ FROM { <table_source> } [ ,…n ] ]
<select_list> ::=
{
*
| { table_name | view_name | table_alias }.*
| {
[ { table_name | view_name | table_alias }. ]
{ column_name | $IDENTITY | $ROWGUID }
| udt_column_name [ { . | :: } { { property_name | field_name }
| method_name ( argument [ ,…n] ) } ]
| expression
[ [ AS ] column_alias ]
}
| column_alias = expression
} [ ,…n ]
<table_source> ::=
table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ]
[ WITH ( < table_hint > [ [ , ]…n ] ) ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ] [ (column_alias [ ,…n ] ) ]
| OPENXML <openxml_clause>
| derived_table [ AS ] table_alias [ ( column_alias [ ,…n ] ) ]
| <joined_table>
| <pivoted_table>
| <unpivoted_table>
| @variable [ [ AS ] table_alias ]
| @variable.function_call ( expression [ ,…n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,…n ] ) ]
}
<tablesample_clause> ::=
TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] )
[ REPEATABLE ( repeat_seed ) ]
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]
}
<join_type> ::=
[ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
JOIN
SELECT…FROM子句的参数及说明。
在这里插入图片描述
常用的行聚合函数和功能
在这里插入图片描述

四.INTO插入数据
创建新表并将来自查询的结果行插入新表中。
语法如下:
[ INTO new_table ]
参数说明:
new_table:根据选择列表中的列和WHERE子句选择的行,指定要创建的新表名。new_table的格式通过对选择列表中的表达式进行取值来确定。new_table中的列按选择列表指定的顺序创建。new_table中的每列与选择列表中的相应表达式具有相同的名称、数据类型和值。

五.指定搜索条件
WHERE子句用来指定查询返回的行的搜索条件。
语法如下:
WHERE <search_condition>
< search_condition > ::=
{ [ NOT ] | ( <search_condition> ) }
[ { AND | OR } [ NOT ] { | ( <search_condition> ) } ]
[ ,…n ]
::=
{ expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
| string_expression [ NOT ] LIKE string_expression
[ ESCAPE ‘escape_character’ ]
| expression [ NOT ] BETWEEN expression AND expression
| expression IS [ NOT ] NULL
| CONTAINS
( { column | * } , ‘< contains_search_condition >’ )
| FREETEXT ( { column | * } , ‘freetext_string’ )
| expression [ NOT ] IN ( subquery | expression [ ,…n ] )
| expression { = | < > | ! = | > | > = | ! > | < | < = | ! < }
{ ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery ) }
WHERE子句的参数及说明.
在这里插入图片描述

六.GROUP BY子句
GROUP BY表示按一个或多个列或表达式的值将一组选定行组合成一个摘要行集。针对每一组返回一行。
语法如下:
[ GROUP BY [ ALL ] group_by_expression[ ,…n ]
[ WITH { CUBE | ROLLUP } ] ]
参数说明:
ALL:包含所有组和结果集,甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。
group_by_expression :针对其执行分组操作的表达式。group_by_expression 也称为分组列。group_by _expression 可以是列或引用列的非聚合表达式。不能使用在 SELECT 列表中定义的列别名来指定组合列。
注意:
不能在group_by_expression中使用类型为text、ntext和image的列。
WITH CUBE:指定结果集内不仅包含由 GROUP BY 提供的行,同时还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。
WITH ROLLUP:指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。

七.HAVING子句
指定组或聚合的搜索条件。HAVING只能与SELECT语句一起使用。HAVING通常在GROUP BY子句中使用。如果不使用GROUP BY子句,则HAVING的行为与WHERE子句一样。
语法如下:
[ HAVING ]
参数说明:
<search_condition>:指定组或聚合应满足的搜索条件。
注意:
在HAVING子句中不能使用text、image和ntext数据类型。

八.指定排列顺序
指定在SELECT语句返回的列中所使用的排列顺序。除非同时指定了TOP,否则ORDER BY子句在视图、内联函数、派生表和子查询中无效。
[ ORDER BY
{
order_by_expression [ COLLATE collation_name ] [ ASC | DESC ]
} [ ,…n ]
]
参数说明:
order_by_expression:指定要排序的列。可以将排序列指定为一个名称或列别名。可指定多个排序列。
注意:
ntext、text、image或xml列不能用于ORDER BY子句。
COLLATE {collation_name}:指定根据 collation_name 中指定的排序规则,而不是表或视图中所定义的列的排序规则,应执行的 ORDER BY 操作。
ASC:指定按升序,从最低值到最高值对指定列中的值进行排序。
DESC:指定按降序,从最高值到最低值对指定列中的值进行排序。

九.去掉重复的记录
DISTINCT关键字主要用来从SELECT语句的结果集中去掉重复的记录。如果用户没有指定DISTINCT关键字,那么系统将返回所有符合条件的记录组成结果集,其中包括重复的记录。

十.TOP显示指定行
TOP关键字可以限制查询结果显示的行数,不仅可以列出结果集中的前几行,还可以列出结果集中的后几行。
TOP关键字的语法如下:
SELECT TOP n [PERCENT]
FROM table
WHERE
ORDER BY…
参数说明:
[PERCENT]:返回行的百分之n,而不是n行。
n:如果SELECT语句中没有ORDER BY子句,TOP n返回满足WHERE子句的前n条记录。如果子句中满足条件的记录少于n,那么仅返回这些记录。

扫描二维码关注公众号,回复: 5956477 查看本文章

十一.多表合并查询–区别合并与联接
合并操作与联接相似,因为它们都是将两个表合并起来形成另一个表的方法。然而,它们的合并方法有本质上的不同,结果表的形状。 注:A和B分别代表两个数据源表。
在这里插入图片描述
它们具体的不同如下:
(1)在合并中,两个表源列的数量与数据类型必须相同;在联接中,一个表的行可能与另一个表的行有很大区别,结果表的列可能来自第一个表、第二表或两个表的都有。
(2)在合并中,行的最大数量是两个表行的“和”;在联接中,行的最大数量是它们的“乘积”。

十二.多表合并查询–使用UNION ALL合并表
UNION加上关键字ALL,功能是不删除重复行也不对行进行自动排序。加上ALL关键字需要的计算资源少,所以尽可能使用它,尤其是处理大型表的时候。下列情况是应该使用UNION ALL的情况。
(1)知道有重复行并想保留这些行。
(2)知道不可能有任何重复的行。
(3)不在乎是否有任何重复的行。

十三.多表合并查询–在UNION中使用order by
合并表时有且只能有一个RDER BY子句,并且必须将它放置在语句的末尾。它在两个SELECT语句中都提供了用于合并所有行的排序。下面列出ORDER BY子句可以使用的排序依据。
(1)来自第一个SELECT子句的别名。
(2)来自第一个SELECT子句的列别名。
(3)UNION中列的位置的编号。

十四.多表合并查询–自动转换数据类型
合并表时,两个表源中对应的每个列数据类型必须相同吗?不,只要是数据类型兼容就可以。
首先说文本数据类型。假设合并的两个表源中第一列数据类型虽然都是文本类型,但长度不一致。当合并表时,字符长度短的列等于字符长度长的列的长度,这样长度长的列不会丢失任何数据。
其次说数值类型。当合并的两个表源中第一列数据类型虽然都是数值类型,但长度不同,合并表时,所有数字允许长度来消除它们数据类型的差别。
因为这种都是自动数据类型转换,所以说任何两个文本列都是兼容的,任何两个数字列也都是兼容的。

十五.多表合并查询–合并不同类型的数据
当合并表时,两个表源中相对应的列即使数据类型不一致也能合并,这时需要借助数据类型转换函数。
当合并的两个表源相对应的列数据类型不一致,例如,一个是数值型,另一个是字符型,如果数值型被转换成文本类型,完全可以合并两个表。
语法如下:
STR ( float_expression [ , length [ , decimal ] ] )
参数说明:
float_expression:带小数点的近似数字 (float) 数据类型的表达式。
Length:总长度。它包括小数点、符号、数字以及空格。默认值为 10。
decimal:是小数点右边的位数。

十六.多表合并查询–合并列数不同的表
当合并两个表源时列数不同,只要向其中一个表源中添加列,就可以使两表源的列数相同,这时即可合并列了。

十七.多表合并查询–使用UNION合并多表
可以把很多数量的表进行合并,表的数量可达10多个。但仍要遵循合并表时的规则。

十八.子查询与嵌套查询–子查询概述
子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。
子查询的语法
SELECT [ALL | DISTINCT]
FROM

[WHERE]
[GROUP BY
[HAVING ]])
语法规则
子查询的SELECT查询总使用圆括号括起来。
不能包括COMPUTE或FOR BROWSE子句。
如果同时指定TOP子句,则可能只包括ORDER BY子句。
子查询最多可以嵌套32层,个别查询可能会不支持32层嵌套。
任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。
如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中。
语法格式
WHERE 查询表达式 [NOT] IN (子查询)
WHERE 查询表达式 比较运算符 [ANY|ALL] (子查询)
WHERE [NOT] EXISTS (子查询)。
十九.子查询与嵌套查询–简介嵌套查询
嵌套查询是指将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询。
嵌套查询中上层的查询块称为外侧查询或父查询,下层查询块称为内层查询或子查询。SQL语言允许多层嵌套,但是在子查询中不允许出现ORDER BY子句,ORDER BY子句只能用在最外层的查询块中。
嵌套查询的处理方法是:先处理最内侧的子查询,然后一层一层向上处理,直到最外层的查询块。
嵌套查询中的内层子查询通常作为搜索条件的一部分呈现在WHERE或HAVING子句中。例如,把一个表达式的值和一个由子查询生成的一个值相比较,这个测试类似于简单比较测试。
子查询比较测试用到的运算符是:=、<>、<、>、<=、>=。子查询比较测试把一个表达式的值和由子查询产生的一个值进行比较,返回比较结果为TRUE的记录。

二十.子查询与嵌套查询–带IN的嵌套查询
带IN的嵌套查询语法格式为:WHERE查询表达式IN(子查询)。
一些嵌套内层的子查询会产生一个值,也有一些子查询会返回一列值,即子查询不能返回带几行和几列数据的表。原因在于子查询的结果必须适合外层查询的语句。当子查询产生一系列值时,适合用带IN的嵌套查询。
把查询表达式单个数据和由子查询产生的一系列的数值相比较,如果数值匹配一系列值中的一个,则返回TRUE。

二十一.子查询与嵌套查询–带NOT IN的嵌套查询
NOT IN的嵌套查询语法格式:
WHERE 查询表达式 NOT IN(子查询)
NOT IN和IN的查询过程相类似。

二十二.子查询与嵌套查询–带SOME的嵌套查询
SQL支持3种定量比较谓词:SOME、ANY和ALL。它们都是判断是否任何或全部返回值都满足搜索要求的。其中SOME和ANY谓词是存在量的,只注重是否有返回值满足搜索要求。这两种谓词含义相同,可以替换使用

二十三.子查询与嵌套查询–带ANY的嵌套查询
ANY属于SQL支持的3种定量谓词之一,且和SOME完全等价,即能用SOME的地方完全可以使用ANY。

二十四.子查询与嵌套查询–带ALL的嵌套查询
ALL谓词的使用方法和ANY或者SOME谓词一样,也是把列值与子查询结果进行比较,但是它不要求任意结果值的列值为真,而是要求所有列的查询结果都为真,否则就不返回行。

二十五.子查询与嵌套查询–带EXISTS的嵌套查询
EXISTS谓词只注重子查询是否返回行。如果子查询返回一个或多个行,谓词返回为真值,否则为假。EXISTS搜索条件并不真正地使用子查询的结果。它仅仅测试子查询是否产生任何结果。
用带in的嵌套查询也可以用带EXISTS的嵌套查询改写。

二十六.建立联接查询–实现内部联接
内部联接是使用比较运算符比较要联接列中的值的联接。内联接也叫联接,是最早的一种联接,最早被称为普通联接或自然联接。内联接是从结果中删除其他被联接表中没有匹配行的所有行,所以内联接可能会丢失信息。
内部联接使用JOIN进行联接,具体语法如下:
SELECT fieldlist
FROM table1 [INNER] JOIN table2
ON table1.column=table2.column
参数说明:
fieldlist:搜索条件。
table1 [INNER] JOIN table2:将table1 表与table2表进行内部联接。
table1.column=table2.column:table1表中与table2表中相同的列。

二十七.建立联接查询–创建外部联接
外部联接则扩充了内联接的功能,会把内联接中删除表源中的一些保留下来,由于保留下来的行不同,可将外部联接分为左向外部联接、右向外部联接或完整外部联接。
1.左向外联接
左向外部联接使用LEFT JOIN进行联接,左向外部联接的结果集包括LEFT JOIN子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某一行在右表中没有匹配行,则在关联的结果集行中,来自右表的所有选择列表列均为空值。
左向外联接的语法:
SELECT fieldlist
FROM table1 left JOIN table2
ON table1.column=table2.column
参数说明:
fieldlist:搜索条件。
table1 LEFT JOIN table2:将table1 表与table2表进行外部联接。
table1.column=table2.column:table1表中与table2表中相同的列。
2.右向外联接
右向外部联接使用RIGHT JOIN进行联接,是左向外部联接的反向联接。将返回右表的所有行。如果右表的某一行在左表中没有匹配行,则将为左表返回空值。
右外联接的语法:
SELECT fieldlist
FROM table1 right JOIN table2
ON table1.column=table2.column
3.完整外连接
完整外部联接使用FULL JOIN进行联接,将返回左表和右表中的所有行。当某一行在另一个表中没有匹配行时,另一个表的选择列表列将包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
完整外连接的语法如下:
SELECT fieldlist
FROM table1 full JOIN table2
ON table1.column=table2.column

二十八.建立联接查询–交叉联接两个表
交叉联接使用CROSS JOIN进行联接,没有WHERE子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
1
交叉连接中列和行的数量是这样计算的:
交叉连接中的列 = 原表中列的数量的总和(相加)。
交叉连接中的行 = 原表中的行数的积(相乘)。
交叉连接的语法如下:
SELECT fieldlist
FROM table1
cross JOIN table2
其中忽略on方法来创建交叉连接。
注意:
由于交叉连接的结果集中行数是两个表所有行数的乘积,所以避免对大型表使用交叉连接,否则会导致大型计算机的瘫痪。

二十九.建立联接查询–联接多表
1.在WHERE子句中联接多表
在FROM子句中写联接多个表的名称,然后将任意两个表的联接条件分别写在WHERE子句后。
在WHERE子句中联接多表的语法如下:
SELECT fieldlist
FROM table1 , table2 , table3 …
where table1.column=table2.column
and table2.column=table3.column and …
2.在FROM子句中联接多表
在FROM子句中联接多个表是内部联接的扩展。在FROM子句中联接多表的语法如下:
SELECT fieldlist
FROM table1
join table2
join table3 …
on table1.column=table2.column
and table2.column=table3.column

三十.在select中使用group by出错
select中使用group by时提示:选择列表中的列无效,该列没有包含在聚合函数或group by子句中。如下:
select A,B COUN© from table_xx
group by A --出错
这是因为group by要求group by后面所有列(没有使用聚合函数的)都必须出现在group by后面。

三十一.区分NULL和0值
数据库中,NULL是指不确定的,未知的,可以指定字段属性。它不是0,也不是空字符串。NULL 可以接受任何数据类型,0值只是整数类型。

三十二 多表连接时,注意要加条件约束

猜你喜欢

转载自blog.csdn.net/wuke666666/article/details/88287681