SQL學(xué)習(xí)知識點總結(jié)
//創(chuàng)建表
createtableuser(
idint(11)notnullauto_increment,namevarchar(50)defaultnull,passwordvarchar(50)defaultnull,primarykey(id))
//distinct關(guān)鍵字是查詢數(shù)據(jù)庫中不相等的數(shù)據(jù)如果有相同的數(shù)據(jù)則顯示一條數(shù)據(jù)SELECTdistinctnameFROMuser
//and(并且)or(或)查詢where語句的條件
SELECT*FROMuserwhereCity="上海"andname="admian3"SELECT*FROMuserwhereCity="上海"orname="admian3"http://如果and和or結(jié)合來用的時候則要用到()處理
SELECT*FROMuserwhere(City="上海"orname="admian3")andname="xxx"
//orderby(關(guān)鍵字排序)(按照名字的順序來做升序排序)select*fromuserorderbyname
//orderby后面可以接多個排序列表中間用,隔開select*fromuserorderbyname,City,....//desc(降序的關(guān)鍵字)
select*fromuserorderbynamedesc
//asc(升序的關(guān)鍵字orderby后面不跟有降序的關(guān)鍵字那么就是默認(rèn)為升序)select*fromuserorderbynamedesc,Cityasc//添加數(shù)據(jù)
insertintouser(name,password,Address,City,OrderNumber)values("ddsds","ssss","廣東","廣州",1234656)
//更新數(shù)據(jù)
upateusersetname="ffff"whereid=6//刪除數(shù)據(jù)
deletefromuserwhereid=6
//limit(關(guān)鍵字是查詢數(shù)據(jù)庫中多少條數(shù)據(jù)再mysql里面用如果是sqlserver用則用top)select*formuserlimit2
//in(關(guān)鍵字允許我們在where語句中存在多個條件)select*fromuserwherenamein("xxxxs","zdasdsa")
//between....and..(關(guān)鍵字是處理在什么之間到什么之間的操作)select*fromuserwherenamebetween"fffff"and"ssss"http://as(關(guān)鍵字是用于給表或數(shù)據(jù)庫起一個別名)select*nameasn,passwordaspfromuser
//innerjoin(關(guān)鍵字使用了內(nèi)連接來查詢兩個表的數(shù)據(jù),其中還有l(wèi)eftjoin(左連接)right
join(右連接)fulljoin(左右連接))
selectu.name,u.Address,n.numberfromuserasu“innerjoin”numberasnonu.id=n.user_idorderbyu.Address
//union(命令將兩條sql語句拼接起來)select*fromuserunion
select*fromnumber
//selectinto(關(guān)鍵字是為了把一個表的數(shù)據(jù)插入到另一個表當(dāng)中)select*intouserfromnumber
//createdatabase(創(chuàng)建數(shù)據(jù)庫)createdatabasemy_db
//createtable(創(chuàng)建表)createtablePersons(
idint(10),
lastNamevarchar(25)........)
//約束
notnull(不為null值)unique(唯一)primarykey(主鍵)foreignkey(外鍵)check(查詢約束)default(默認(rèn)值約束)
//createindex(創(chuàng)建索引)
createindexffonuser(name,Address)
擴(kuò)展閱讀:SQL學(xué)習(xí)總結(jié)
SelectFromWhereGroupbyHavingOrderbyNull
Like
ESCAPE"escape_character"
允許在字符串中搜索通配符,而不是將其作為通配符使用。escape_character是放在通配符前表示此特殊用法的字符。例:
select*fromcourse
wherecnamelike"cssa_%"escape"a"會得到’css_’打頭的所有行
CubeCaseIn
InsertUpdateDelete
CreateAlterDrop
子查詢in、any、all、exists聯(lián)合查詢union、join查詢語句的性能優(yōu)化
搜索條件not/and/or
謂詞between/contains/exists/freetext/in/is[not]null/like
一、select子句
語法:
SELECT[ALL|DISTINCT]
[TOPn[PERCENT][WITHTIES]]
{*|{table_name|view_name|table_alias}.*
|{column_name|expression|IDENTITYCOL|ROWGUIDCOL}
[[AS]column_alias]|column_alias=expression}[,...n]
參數(shù):
ALL指定結(jié)果集中可以顯示重復(fù)行。是默認(rèn)設(shè)置
DISTINCT指定在結(jié)果集中只能顯示唯一行。空值被認(rèn)為是相等的
TOPn[PERCENT]指定從結(jié)果集中輸出前n行。n是介于0和4294967295之間的整數(shù)。如果還指定了PERCENT,則只從結(jié)果集中輸出前百分之n行。當(dāng)指定時帶PERCENT時,n必須是介于0和100之間的整數(shù)。
如果查詢包含ORDERBY子句,將輸出由ORDERBY子句排序的前n行(或前百分之n行)。如果查詢沒有ORDERBY子句,行的順序?qū)⑷我狻?/p>
WITHTIES指定從基本結(jié)果集中返回附加的行,這些行包含與出現(xiàn)在TOPn(PERCENT)行最后的ORDERBY列中的值相同的值。如果指定了ORDERBY子句,則只能指定TOP...WITHTIES。
為結(jié)果集選擇的列。
::=選擇列表是以逗號分割的一系列表達(dá)式。
*指定在FRPM子句中內(nèi)返回的所有表和視圖內(nèi)的所有列。列按FROM子句所指定的由表或視圖返回,并按它們在表或視圖內(nèi)的順序返回
Table_name|view_name|table_alias將*的作用限制為指定的表或視圖。Cloumn_name要返回的列名。要限定列名,以避免二義性引用。參照FROM子句Expression是列名、常量、函數(shù)以及由運(yùn)算符連接的列名、常量和函數(shù)的任意組合,或者是子查詢。
IDENTITYCOL返回標(biāo)識列。如果FROM子句中的多個表內(nèi)包含標(biāo)識列,那么就要避免二義性引用來對標(biāo)識列加以限定。具體方法參照ROWGUIDCOL。
ROWGUIDCOL返回行全局唯一標(biāo)識列。如果在From子句中多個表包含ROWGUIDCOL屬性列,則必須通過特定的表名來限定(例如:T1.ROWGUIDCOL)ROWGUIDCOL。
Column_alias是查詢結(jié)果集內(nèi)替換列名的可選名。例如:可以為名為‘sanme’指定別名,如‘姓名’。
別名還可以為表達(dá)式的結(jié)果指定名稱,例如:
selectAVG(grade)as"平均分"fromsc
備注:column_alias可用于ORDERBY子句。但是不能用于WHERE、GROUPBY或HAVING子句。如果查詢表達(dá)式是DECLARECURSOR語句一部分,則column_alias不能用在FORUPDATE子句中。
Select子句是select語句的開始部分,它限定了查詢結(jié)果返回的列
通常情況下不要使用*關(guān)鍵字來返回所有列,除非有明確的需求要查詢所有字段,因為*關(guān)鍵字會大大降低查詢的效率,一般應(yīng)指名具體的查詢列。
當(dāng)輸入的字段名包括空格和標(biāo)點符號時,用方括號把它括起來
例如:要查詢表student中前5條記錄,要求返回兩列數(shù)據(jù):學(xué)生姓名和所在系
selecttop5snameas"姓名",sdeptas"所在系"fromstudent
WHERE、GROUPBY和HAVING子句的處理順序
以下步驟顯示帶WHERE子句、GROUPBY子句和HAVING子句的SELECT語句的處理順序:1、FROM子句返回初始結(jié)果集。
2、WHERE子句排除不滿足搜索條件的行。
3、GROUPBY子句將選定的行收集到GROUPBY子句中各個唯一值的組中。4、選擇列表中指定的聚合函數(shù)可以計算各組的匯總值。5、此外,HAVING子句排除不滿足搜索條件的行。
二、from子句
語法:
From
參數(shù)
指定要在Transact-SQL語句中使用的表、視圖或派生表源(有無別名均可)。雖然語句中可用的表源個數(shù)的限值根據(jù)可用內(nèi)存和查詢中其他表達(dá)式的復(fù)雜性而有所不同,但一個語句中最多可使用256個表源。單個查詢可能不支持最多有256個表源?蓪able變量指定為表源。
注意:
如果查詢中引用了許多表,查詢性能會受到影響。編譯和優(yōu)化時間也受到其他因素的影響。這些因素包括:每個是否有索引和索引視圖,以及SELECT語句中的大小。
表源在FROM關(guān)鍵字后的順序不影響返回的結(jié)果集。如果FROM子句中出現(xiàn)重復(fù)的名稱,SQLServer會返回錯誤。
From子句跟在SELECT語句后面,指定要從中查詢數(shù)據(jù)的表,可以是一個表,也可以是視圖、派生表或是多個表的聯(lián)合
當(dāng)From子句中的兩個表中包含重復(fù)名的列時,要對列名加上限定。例如,在表sc和course表內(nèi)都有名為課程號cno列。如果在查詢中連接兩個表,可以在選擇列表中將課程號指定為sc.cno
例如:查詢每門課的平均成績,要求返回課程名與平均分
selectcname,AVG(grade)as"平均分"fromsc
leftjoincourseonsc.cno=course.cnogroupbycourse.cname
備注:有諸如sum、avg等聚合函數(shù)時候一般要有GROUPBY
三、where子句
語法
[WHERE]
參數(shù)
定義要返回的行應(yīng)滿足的條件。對搜索條件中可以包含的謂詞數(shù)量沒有限制。WHERE是可選的,但是在使用時必須放在FROM之后,用來限定查詢結(jié)果,只有符合條件的記錄才會顯示出來。WHERE子句可以是單一條件,也可以是組合而成的復(fù)雜條件。
備注:WHERE子句中可以嵌套子查詢
四、groupby子句
語法
ISO-CompliantSyntax
GROUPBY::=
[,...n]::=||
||::=::=
ROLLUP()::=
CUBE()::=[,...n]::=
|()::=[,...n]::=
GROUPINGSETS()::=[,...n]::=
||()::=()
::=||
::=[,...n]
Non-ISO-CompliantSyntax
[GROUPBY[ALL]group_by_expression[,...n][WITH{CUBE|ROLLUP}]]
參數(shù)
ROLLUP()
生成簡單的GROUPBY聚合行以及小計行或超聚合行,還生成一個總計行。
返回的分組數(shù)等于中的表達(dá)式數(shù)加一。例如,下面的語句。
SELECTa,b,c,SUM()FROMT
GROUPBYROLLUP(a,b,c)
會為(a,b,c)、(a,b)和(a)值的每個唯一組合生成一個帶有小計的行。還將計算一個總計行。
列是按照從右到左的順序匯總的。列的順序會影響ROLLUP的輸出分組,而且可能會影響結(jié)果集內(nèi)的行數(shù)。CUBE()
生成簡單的GROUPBY聚合行、ROLLUP超聚合行和交叉表格行。
CUBE針對中表達(dá)式的所有排列輸出一個分組。
生成的分組數(shù)等于(2n),其中n=中的表達(dá)式數(shù)。例如,下面的語句。
SELECTa,b,c,SUM()FROMT
GROUPBYCUBE(a,b,c)
會為(a,b,c)、(a,b)、(a,c)、(b,c)、(a)、(b)和(c)值的每個唯一組合生成一個帶有小計的行,還會生成一個總計行。
列的順序不影響CUBE的輸出。
GROUPINGSETS()
在一個查詢中指定數(shù)據(jù)的多個分組。僅聚合指定組,而不聚合由CUBE或ROLLUP生成的整組聚合。其結(jié)果與針對指定的組執(zhí)行UNIONALL運(yùn)算等效。GROUPINGSETS可以包含單個元素或元素列表。GROUPINGSETS可以指定與ROLLUP或CUBE返回的內(nèi)容等效的分組?梢园琑OLLUP或CUBE。
()空組生成總計。
WITHCUBE
后續(xù)版本的MicrosoftSQLServer將刪除該功能。請避免在新的開發(fā)工作中使用該功能,并著手修改當(dāng)前還在使用該功能的應(yīng)用程序。指定結(jié)果集內(nèi)不僅包含由GROUPBY提供的行,同時還包含匯總行。GROUPBY匯總行針對每個可能的組和子組組合在結(jié)果集內(nèi)返回。使用GROUPING函數(shù)可確定結(jié)果集內(nèi)的空值是否為GROUPBY匯總值。
結(jié)果集內(nèi)的匯總行數(shù)取決于GROUPBY子句內(nèi)包含的列數(shù)。由于CUBE返回每個可能的組和子組組合,因此不論在列分組時指定使用什么順序,行數(shù)都相同。
WITHROLLUP
后續(xù)版本的MicrosoftSQLServer將刪除該功能。請避免在新的開發(fā)工作中使用該功能,并著手修改當(dāng)前還在使用該功能的應(yīng)用程序。指定結(jié)果集內(nèi)不僅包含由GROUPBY提供的行,同時還包含匯總行。按層次結(jié)構(gòu)順序,從組內(nèi)的最低級別到最高級別匯總組。組的層次結(jié)構(gòu)取決于列分組時指定使用的順序。更改列分組的順序會影響在結(jié)果集內(nèi)生成的行數(shù)。
groupby子句按一個或多個列或表達(dá)式的值將一組選定行組合成一個摘要行集。針對每一組返回一行。SELECT子句列表中的聚合函數(shù)提供有關(guān)每個組(而不是各行)的信息。
GROUPBY指出了對查詢結(jié)果分組的依據(jù),并且如果在SELECT子句中包含聚合函數(shù),則計算每組的匯總值。指定GROUPBY時,選擇列表中任一非聚合表達(dá)式內(nèi)所有列都應(yīng)包含在GROUPBY列表中,或者GROUPBY表達(dá)式必須與選擇列表表達(dá)式完全匹配。
備注
GROUPBY子句中的表達(dá)式可以包含F(xiàn)ROM子句中表、派生表或視圖的列。這些列不必顯示在SELECT子句列表中。
列表中任何非聚合表達(dá)式中的每個表列或視圖列都必須包括在GROUPBY列表中
注意:text、ntext和image類型的數(shù)據(jù)不能夠用于GROUPBY子句。
SELECTsno,avg(grade)FROMscGROUPBYsno
五、having子句
指定組或聚合的搜索條件。HAVING只能與SELECT語句一起使用。HAVING通常在GROUPBY子句中使用。如果不使用GROUPBY子句,則HAVING的行為與WHERE子句一樣。HAVING和WHERE類似,可用來決定顯示哪些記錄,在使用GROUPBY對這些記錄分組后,HAVING會決定應(yīng)顯示的記錄。在HAVING子句中不能使用text、ntext和image數(shù)據(jù)類型。SELECTsno,avg(grade)asavg_gradeFROMscGROUPBYsno
havingavg(grade)>80
六、orderby子句
語法
[ORDERBY{
order_by_expression[COLLATEcollation_name][ASC|DESC]}[,...n]]
參數(shù)
order_by_expression
指定要排序的列?梢詫⑴判蛄兄付橐粋名稱或列別名,也可以指定一個表示該名稱或別名在選擇列表中所處位置的非負(fù)整數(shù)。order_by_expression出現(xiàn)在排名函數(shù)中時,不能指定整數(shù)。列名和別名可由表名或視圖名加以限定。在SQLServer中,限定的列名和別名將解析為FROM子句中列出的列。如果order_by_expression未限定,則該值在SELECT語句列出的所有列中必須是唯一的。
COLLATE{collation_name}
指定根據(jù)collation_name中指定的排序規(guī)則,而不是表或視圖中所定義的列的排序規(guī)則,應(yīng)執(zhí)行的ORDERBY操作。collation_name可以是Windows排序規(guī)則名稱或SQL排序規(guī)則名稱。COLLATE僅適用于char、varchar、nchar和nvarchar數(shù)據(jù)類型的列。
ASC
指定按升序,從最低值到最高值對指定列中的值進(jìn)行排序。默認(rèn)為升序。DESC
指定按降序,從最高值到最低值對指定列中的值進(jìn)行排序。
SELECTsno,avg(grade)asavg_gradeFROMscGROUPBYsno
havingavg(grade)>80orderbysnodesc
七、insert語句
語法
[WITH[,...n]]
INSERT
[TOP(expression)[PERCENT]][INTO]
{|rowset_function_limited[WITH([...n])]}{[(column_list)][]
{VALUES(({DEFAULT|NULL|expression}[,...n])[,...n])|derived_table|execute_statement||DEFAULTVALUES}}[;]
::={
[server_name.database_name.schema_name.|database_name.[schema_name].|schema_name.]
table_or_view_name}
::=SELECT
FROM()
[AS]table_alias[(column_alias[,...n])][WHERE][OPTION([,...n])]
參數(shù)
TOP(expression)[PERCENT]
指定將插入的隨機(jī)行的數(shù)目或百分比。expression可以是行數(shù)或行的百分比。在和INSERT、UPDATE或DELETE語句結(jié)合使用的TOP表達(dá)式中引用的行不按任何順序排列。
在INSERT、UPDATE和DELETE語句中,需要使用括號分隔TOP中的expression。INTO
一個可選的關(guān)鍵字,可以將它用在INSERT和目標(biāo)表之間。VALUES
引入要插入的數(shù)據(jù)值的列表。對于column_list(如果已指定)或表中的每個列,都必須有一個數(shù)據(jù)值。必須用圓括號將值列表括起來。
如果VALUES列表中的各值與表中各列的順序不相同,或者未包含表中各列的值,則必須使用column_list顯式指定存儲每個傳入值的列。
若要插入多行值,VALUES列表的順序必須與表中各列的順序相同,且此列表必須包含與表中各列或column_list對應(yīng)的值以便顯式指定存儲每個傳入值的列?梢栽趩蝹INSERT語句中插入的最大行數(shù)為1000。若要插入超過1000行的數(shù)據(jù),請創(chuàng)建多個INSERT語句,或者通過使用bcp實用工具或BULKINSERT語句大容量導(dǎo)入數(shù)據(jù)。
DEFAULT
強(qiáng)制數(shù)據(jù)庫引擎加載為列定義的默認(rèn)值。如果某列并不存在默認(rèn)值,并且該列允許Null值,則插入NULL。對于使用timestamp數(shù)據(jù)類型定義的列,插入下一個時間戳值。DEFAULT對標(biāo)識列無效。INSERT語句用來向表中追加數(shù)據(jù),可以以此追加一行數(shù)據(jù),也可以從另外的表或查詢中追加數(shù)據(jù),配合OPENROWSE可以從其他的數(shù)據(jù)庫系統(tǒng)中追加數(shù)據(jù)。
INSERT將一行新的數(shù)據(jù)追加到表中,但是如果INSERT語句違反約束或規(guī)則,或者它有列的數(shù)據(jù)與類型不兼容的值,那么該語句就會失敗。
可以使用INSERT…SELECT語句從其他表或視圖添加數(shù)據(jù),該語句對于批量添加特別有效。必須保證目標(biāo)表的字段個數(shù),順序與來源表的字段個數(shù)、順序完全一致,并且添加到新表中要符合數(shù)據(jù)完整性約束。(用SELECT…INTO也能實現(xiàn)這樣的效果)
八、update語句
語法
[WITH[...n]]UPDATE
[TOP(expression)[PERCENT]]{|rowset_function_limited
[WITH([...n])]}
SET
{column_name={expression|DEFAULT|NULL}
|{udt_column_name.{{property_name=expression|field_name=expression}
|method_name(argument[,...n])}}
|column_name{.WRITE(expression,@Offset,@Length)}|@variable=expression
|@variable=column=expression
|column_name{+=|-=|*=|/=|%=|&=|^=||=}expression|@variable{+=|-=|*=|/=|%=|&=|^=||=}expression
|@variable=column{+=|-=|*=|/=|%=|&=|^=||=}expression}[,...n][]
[FROM{}[,...n]][WHERE{|{[CURRENTOF
{{[GLOBAL]cursor_name}|cursor_variable_name}]}}]
[OPTION([,...n])][;]
::={
[server_name.database_name.schema_name.|database_name.[schema_name].|schema_name.]
table_or_view_name}
參數(shù)
SET
指定要更新的列或變量名稱的列表。column_name包含要更改的數(shù)據(jù)的列。column_name必須已存在于table_orview_name中。不能更新標(biāo)識列。
DEFAULT
指定用為列定義的默認(rèn)值替換列中的現(xiàn)有值。如果該列沒有默認(rèn)值并且定義為允許Null值,則該參數(shù)也可用于將列更改為NULL。
WHERE
指定條件來限定所更新的行。根據(jù)所使用的WHERE子句的形式,有兩種更新形式:搜索更新指定搜索條件來限定要刪除的行。
定位更新使用CURRENTOF子句指定游標(biāo)。更新操作發(fā)生在游標(biāo)的當(dāng)前位置。UPDATE語句用于更新一個表中選定行的一列或多列的值。要更新的目標(biāo)表在語句中定義,SET子句則指定要更新那些列并計算它們的值。UPDATE語句總是包含WHERE語句。因為UPDATE語句具有不可逆轉(zhuǎn)性,所以要慎用。
利用WHERE子句,可以使用UPDATE語句更新符合條件的記錄,如果該條件來自于其它的表,則可以利用子查詢來指定外部條件。
九、delete語句
語法
[WITH[,...n]]
DELETE
[TOP(expression)[PERCENT]][FROM]
{|rowset_function_limited
[WITH([...n])]}
[][FROM[,...n]][WHERE{|{[CURRENTOF
{{[GLOBAL]cursor_name}|cursor_variable_name}]}}]
[OPTION([,...n])][;]
::={
[server_name.database_name.schema_name.|database_name.[schema_name].|schema_name.]
table_or_view_name}
參數(shù)
WHERE
指定用于限制刪除行數(shù)的條件。如果沒有提供WHERE子句,則DELETE刪除表中的所有行。
基于WHERE子句中所指定的條件,有兩種形式的刪除操作:
搜索刪除指定搜索條件以限定要刪除的行。例如,WHEREcolumn_name=value。定位刪除使用CURRENTOF子句指定游標(biāo)。刪除操作在游標(biāo)的當(dāng)前位置執(zhí)行。這比使用WHEREsearch_condition子句限定要刪除的行的搜索DELETE語句更為精確。如果搜索條件不唯一標(biāo)識單行,則搜索DELETE語句刪除多行。
DELETE用于從表中刪除數(shù)據(jù),可以與WHERE子句配合使用,用于刪除符合條件的記錄。當(dāng)使用DELETE刪除記錄后,不能取消此操作。如果想要知道哪些記錄已被刪除,建議首先驗證使用相同條件的選定查詢的結(jié)果。
注意:如果要刪除表中的所有行,則TRUNCATETABLE比DELETE快。DELETE以物理方式一次刪除一行,并在事務(wù)日志中記錄每個刪除的行。TRUNCATETABLE則釋放所有與表關(guān)聯(lián)的頁。因此TRUNCATETABLE比DELETE快且需要的事務(wù)日志空間更少。TRUNCATETABLE在功能上與不帶WHERE子句的DELETE相當(dāng)。
與DELETE語句相比,TRUNCATETABLE具有以下優(yōu)點:1.所用的事務(wù)日志空間較少。
DELETE語句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一個項。TRUNCATETABLE通過釋放用于存儲表數(shù)據(jù)的數(shù)據(jù)頁來刪除數(shù)據(jù),并且在事務(wù)日志中只記錄頁釋放。
2.使用的鎖通常較少。
當(dāng)使用行鎖執(zhí)行DELETE語句時,將鎖定表中各行以便刪除。TRUNCATETABLE始終鎖定表和頁,而不是鎖定各行。
3.如無例外,在表中不會留有任何頁。
執(zhí)行DELETE語句后,表仍會包含空頁。例如,必須至少使用一個排他(LCK_M_X)表鎖,才能釋放堆中的空表。如果執(zhí)行刪除操作時沒有使用表鎖,表(堆)中將包含許多空頁。對于索引,刪除操作會留下一些空頁,盡管這些頁會通過后臺清除進(jìn)程迅速釋放。
TRUNCATETABLE刪除表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變。若要刪除表定義及其數(shù)據(jù),請使用DROPTABLE語句。
如果表包含標(biāo)識列,該列的計數(shù)器重置為該列定義的種子值。如果未定義種子,則使用默認(rèn)值1。若要保留標(biāo)識計數(shù)器,請使用DELETE。
不能對以下表使用TRUNCATETABLE:1.由FOREIGNKEY約束引用的表。(您可以截斷具有引用自身的外鍵的表。)2.參與索引視圖的表。
3.通過使用事務(wù)復(fù)制或合并復(fù)制發(fā)布的表。
對于具有以上一個或多個特征的表,請使用DELETE語句。
TRUNCATETABLE不能激活觸發(fā)器,因為該操作不記錄各個行刪除。
十、數(shù)據(jù)定義語言(DDL)
數(shù)據(jù)定義語言(DDL)用來定義數(shù)據(jù)的結(jié)構(gòu),如創(chuàng)建、修改或者刪除數(shù)據(jù)庫對象。常用的數(shù)據(jù)定義語言有:CREATE,ALTER,DROP
1、CREATETABLE
語法
CREATETABLE
[database_name.[schema_name].|schema_name.]table_name({||}[][,...n])
[ON{partition_scheme_name(partition_column_name)|filegroup|"default"}]
[{TEXTIMAGE_ON{filegroup|"default"}]
[FILESTREAM_ON{partition_scheme_name|filegroup|"default"}]
[WITH([,...n])][;]
::=column_name[FILESTREAM]
[COLLATEcollation_name][NULL|NOTNULL][
[CONSTRAINTconstraint_name]DEFAULTconstant_expression]|[IDENTITY[(seed,increment)][NOTFORREPLICATION]][ROWGUIDCOL][[...n]][SPARSE]::=
[type_schema_name.]type_name
[(precision[,scale]|max|
[{CONTENT|DOCUMENT}]xml_schema_collection)]::=
[CONSTRAINTconstraint_name]{{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED][
WITHFILLFACTOR=fillfactor
|WITH(
[ON{partition_scheme_name(partition_column_name)|filegroup|"default"}]|[FOREIGNKEY]
REFERENCES[schema_name.]referenced_table_name[(ref_column)][ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][NOTFORREPLICATION]
|CHECK[NOTFORREPLICATION](logical_expression)}
::=
column_nameAScomputed_column_expression[PERSISTED[NOTNULL]][
[CONSTRAINTconstraint_name]{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED][
WITHFILLFACTOR=fillfactor
|WITH([,...n])]
|[FOREIGNKEY]
REFERENCESreferenced_table_name[(ref_column)][ONDELETE{NOACTION|CASCADE}][ONUPDATE{NOACTION}][NOTFORREPLICATION]
|CHECK[NOTFORREPLICATION](logical_expression)[ON{partition_scheme_name(partition_column_name)|filegroup|"default"}]]
::=
column_set_nameXMLCOLUMN_SETFORALL_SPARSE_COLUMNS::=
[CONSTRAINTconstraint_name]{
{PRIMARYKEY|UNIQUE}
[CLUSTERED|NONCLUSTERED]
(column[ASC|DESC][,...n])[
WITHFILLFACTOR=fillfactor
|WITH([,...n])]
[ON{partition_scheme_name(partition_column_name)|filegroup|"default"}]|FOREIGNKEY(column[,...n])
REFERENCESreferenced_table_name[(ref_column[,...n])][ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][ONUPDATE{NOACTION|CASCADE|SETNULL|SETDEFAULT}][NOTFORREPLICATION]
|CHECK[NOTFORREPLICATION](logical_expression)}
::={
DATA_COMPRESSION={NONE|ROW|PAGE}
[ONPARTITIONS({|}[,...n])]}
::={
PAD_INDEX={ON|OFF}|FILLFACTOR=fillfactor
|IGNORE_DUP_KEY={ON|OFF}
|STATISTICS_NORECOMPUTE={ON|OFF}|ALLOW_ROW_LOCKS={ON|OFF}|ALLOW_PAGE_LOCKS={ON|OFF}
|DATA_COMPRESSION={NONE|ROW|PAGE}
[ONPARTITIONS({|}[,...n])]}
::=
TO參數(shù)
IDENTITY
指示新列是標(biāo)識列。在表中添加新行時,數(shù)據(jù)庫引擎將為該列提供一個唯一的增量值。標(biāo)識列通常與PRIMARYKEY約束一起用作表的唯一行標(biāo)識符。可以將IDENTITY屬性分配給tinyint、smallint、int、bigint、decimal(p,0)或numeric(p,0)列。每個表只能創(chuàng)建一個標(biāo)識列。不能對標(biāo)識列使用綁定默認(rèn)值和DEFAULT約束。必須同時指定種子和增量,或者兩者都不指定。如果二者都未指定,則取默認(rèn)值(1,1)。
seed
是裝入表的第一行所使用的值。CONSTRAINT
可選關(guān)鍵字,表示PRIMARYKEY、NOTNULL、UNIQUE、FOREIGNKEY或CHECK約束定義的開始。constraint_name
約束的名稱。約束名稱必須在表所屬的架構(gòu)中唯一。PRIMARYKEY
是通過唯一索引對給定的一列或多列強(qiáng)制實體完整性的約束。每個表只能創(chuàng)建一個PRIMARYKEY約束。
UNIQUE
一個約束,該約束通過唯一索引為一個或多個指定列提供實體完整性。一個表可以有多個UNIQUE約束。
CLUSTERED|NONCLUSTERED
指示為PRIMARYKEY或UNIQUE約束創(chuàng)建聚集索引還是非聚集索引。PRIMARYKEY約束默認(rèn)為CLUSTERED,UNIQUE約束默認(rèn)為NONCLUSTERED。
在CREATETABLE語句中,可只為一個約束指定CLUSTERED。如果在為UNIQUE約束指定CLUSTERED的同時又指定了PRIMARYKEY約束,則PRIMARYKEY將默認(rèn)為NONCLUSTERED。
FOREIGNKEYREFERENCES
為列中的數(shù)據(jù)提供引用完整性的約束。FOREIGNKEY約束要求列中的每個值在所引用的表中對應(yīng)的被引用列中都存在。FOREIGNKEY約束只能引用在所引用的表中是PRIMARYKEY或UNIQUE約束的列,或所引用的表中在UNIQUEINDEX內(nèi)的被引用列。計算列上的外鍵也必須標(biāo)記為PERSISTED。
ONDELETE{NOACTION|CASCADE|SETNULL|SETDEFAULT}
指定如果已創(chuàng)建表中的行具有引用關(guān)系,并且被引用行已從父表中刪除,則對這些行采取的操作。默認(rèn)值為NOACTION。
NOACTION數(shù)據(jù)庫引擎將引發(fā)錯誤,并回滾對父表中相應(yīng)行的刪除操作。CASCADE
如果從父表中刪除一行,則將從引用表中刪除相應(yīng)行。SETNULL
如果父表中對應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須可為空值。
SETDEFAULT
如果父表中對應(yīng)的行被刪除,則組成外鍵的所有值都將設(shè)置為默認(rèn)值。若要執(zhí)行此約束,所有外鍵列都必須有默認(rèn)定義。如果某個列可為空值,并且未設(shè)置顯式的默認(rèn)值,則將使用NULL作為該列的隱式默認(rèn)值。
如果該表將包含在使用邏輯記錄的合并發(fā)布中,則不要指定CASCADE。有關(guān)邏輯記錄的詳細(xì)信息,請參閱通過邏輯記錄對相關(guān)行的更改進(jìn)行分組。
如果表中已存在ONDELETE的INSTEADOF觸發(fā)器,則不能定義ONDELETE的CASCADE操作。
CREATETABLE語句完成數(shù)據(jù)表的定義。典型語法結(jié)構(gòu)如下:
CREATETABLEtable_name(
Field_namedata_type[NOTNULL|NULL],[PRIMARYKEY]…)
2、ALTERTABLE
語法
ALTERTABLE[database_name.[schema_name].|schema_name.]table_name{
ALTERCOLUMNcolumn_name{
[type_schema_name.]type_name[({precision[,scale]|max|xml_schema_collection})][COLLATEcollation_name][NULL|NOTNULL]|{ADD|DROP}
{ROWGUIDCOL|PERSISTED|NOTFORREPLICATION|SPARSE}}
|[WITH{CHECK|NOCHECK}]|ADD{
|||}[,...n]|DROP{
[CONSTRAINT]constraint_name
[WITH([,...n])]|COLUMNcolumn_name}[,...n]
|[WITH{CHECK|NOCHECK}]{CHECK|NOCHECK}CONSTRAINT{ALL|constraint_name[,...n]}|{ENABLE|DISABLE}TRIGGER
{ALL|trigger_name[,...n]}|{ENABLE|DISABLE}CHANGE_TRACKING
[WITH(TRACK_COLUMNS_UPDATED={ON|OFF})]
|SWITCH[PARTITIONsource_partition_number_expression]TOtarget_table
[PARTITIONtarget_partition_number_expression]
|SET(FILESTREAM_ON={partition_scheme_name|filegroup|"default"|"NULL"})|REBUILD
[[PARTITION=ALL][WITH([,...n])]|[PARTITION=partition_number
[WITH([,...n])]]]
|()}
[;]
::=
column_set_nameXMLCOLUMN_SETFORALL_SPARSE_COLUMNS::={
MAXDOP=max_degree_of_parallelism|ONLINE={ON|OFF}
|MOVETO{partition_scheme_name(column_name)|filegroup|"default"}}
::={
SET(LOCK_ESCALATION={AUTO|TABLE|DISABLE})}
::={
SORT_IN_TEMPDB={ON|OFF}
|MAXDOP=max_degree_of_parallelism
|DATA_COMPRESSION={NONE|ROW|PAGE}}}
參數(shù)
COLLATE
指定更改后的列的新排序規(guī)則。如果未指定,則為該列分配數(shù)據(jù)庫的默認(rèn)排序規(guī)則。排序規(guī)則名稱既可以是Windows排序規(guī)則名稱,也可以是SQL排序規(guī)則名稱。
COLLATE子句只能用來更改數(shù)據(jù)類型為char、varchar、nchar和nvarchar的列的排序規(guī)則。若要更改用戶定義別名數(shù)據(jù)類型列的排序規(guī)則,必須執(zhí)行單獨(dú)的ALTERTABLE語句,將列改為SQLServer系統(tǒng)數(shù)據(jù)類型,并更改其排序規(guī)則,然后重新將列改為別名數(shù)據(jù)類型。
如果出現(xiàn)以下一種或多種情況,則ALTERCOLUMN不能更改排序規(guī)則:1.CHECK約束、FOREIGNKEY約束或計算列引用了更改后的列。2.已為列創(chuàng)建了索引、統(tǒng)計信息或全文索引。如果更改了列的排序規(guī)則,則將刪除為更改后的列自動創(chuàng)建的統(tǒng)計信息。
3.架構(gòu)綁定視圖或函數(shù)引用了列。NULL|NOTNULL
指定列是否可接受空值。如果列不允許空值,則只有在指定了默認(rèn)值或表為空的情況下,才能用ALTERTABLE語句添加該列。只有同時指定了PERSISTED時,才能為計算列指定NOTNULL。如果新列允許空值,但沒有指定默認(rèn)值,則新列在表中的每一行都包含一個空值。如果新列允許空值,并且指定了新列的默認(rèn)值,則可以使用WITHVALUES將默認(rèn)值存儲到表中每個現(xiàn)有行的新列中。
如果新列不允許空值,并且表不為空,那么DEFAULT定義必須與新列一起添加;并且,加載新列時,每個現(xiàn)有行的新列中將自動包含默認(rèn)值。
在ALTERCOLUMN語句中指定NULL,可以強(qiáng)制NOTNULL列允許空值,但PRIMARYKEY約束中的列除外。只有列中不包含空值時,才可以在ALTERCOLUMN中指定NOTNULL。必須將空值更新為某個值后,才允許執(zhí)行ALTERCOLUMNNOTNULL語句
WITHCHECK|WITHNOCHECK指定表中的數(shù)據(jù)是否用新添加的或重新啟用的FOREIGNKEY或CHECK約束進(jìn)行驗證。如果未指定,對于新約束,假定為WITHCHECK,對于重新啟用的約束,假定為WITHNOCHECK。
如果不想根據(jù)現(xiàn)有數(shù)據(jù)驗證新的CHECK或FOREIGNKEY約束,請使用WITHNOCHECK。除極個別的情況外,建議不要進(jìn)行這樣的操作。在以后所有數(shù)據(jù)更新中,都將計算該新約束。如果添加約束時用WITHNOCHECK禁止了約束沖突,則將來使用不符合該約束的數(shù)據(jù)來更新行時,可能導(dǎo)致更新失敗。
查詢優(yōu)化器不考慮使用WITHNOCHECK定義的約束。在使用ALTERTABLEtableCHECKCONSTRAINTALL語句重新啟用這些約束之前,將忽略這些約束。
ADD
指定添加一個或多個列定義、計算列定義或者表約束。DROP{[CONSTRAINT]constraint_name|COLUMNcolumn_name}
指定從表中刪除constraint_name或column_name。可以列出多個列或約束。
可通過查詢sys.check_constraint、sys.default_constraints、sys.key_constraints和sys.foreign_keys目錄視圖來確定約束的用戶定義名稱或系統(tǒng)提供的名稱。
如果表中存在XML索引,則不能刪除PRIMARYKEY約束。
無法刪除以下列:1.用于索引的列。
2.用于CHECK、FOREIGNKEY、UNIQUE或PRIMARYKEY約束的列。
3.與默認(rèn)值(由DEFAULT關(guān)鍵字定義)相關(guān)聯(lián)的列,或綁定到默認(rèn)對象的列。4.綁定到規(guī)則的列。
ALTERTABLE語句可以完成對現(xiàn)有表的修改。可以更改、添加、除去列和約束,或者啟用和禁用約束和觸發(fā)器。典型語法結(jié)構(gòu)如下
ALTERTABLEtable_name
ADDCOLUMNfield_namedatatype通常表的結(jié)構(gòu)可以用Createtable一次創(chuàng)建,但是當(dāng)發(fā)現(xiàn)表的定義不符合要求或者要求建立新的約束的時候,可以用ALTERTABLE來調(diào)整表結(jié)構(gòu)。
3、DROPtable
DROPTABLE語句完成從數(shù)據(jù)庫中刪除表的操作。同時刪除該表的所有數(shù)據(jù)、索引、觸發(fā)器、約束和權(quán)限規(guī)范。典型語法結(jié)構(gòu)如下:
DROPTABLEtable_name
DROPTABLE語句不能用于除去由FOREIGNKEY約束引用的表。必須先除去引用的FOREIGNKEY約束或引用的表。除去表時,表上的規(guī)則或默認(rèn)值將解除綁定,任何與表關(guān)聯(lián)的約束和觸發(fā)器將自動除去。如果重新創(chuàng)建表,必須重新綁定適當(dāng)?shù)囊?guī)則和默認(rèn)值,重新創(chuàng)建任何觸發(fā)器并添加必要的約束。如果使用DELETEtablename刪除表中的所有行或使用TRUNCATETABLE語句,則在被移除之前,表將一直存在。
刪除使用了超過128個區(qū)的大型表和索引時,需要分兩個單獨(dú)的階段:邏輯和物理階段。在邏輯階段中,對表使用的現(xiàn)有分配單元進(jìn)行標(biāo)記以便釋放,并對其進(jìn)行鎖定,直到事務(wù)提交為止。在物理階段,標(biāo)記為要釋放的IAM頁被成批地物理刪除。
在刪除表之前,可以用系統(tǒng)存儲過程sp_depends檢查依存關(guān)系,顯示有關(guān)數(shù)據(jù)庫對象相關(guān)性的信息,格式為:sp_dependstablename
在系統(tǒng)表中不能使用DROPTABLE語句
例如:從當(dāng)前數(shù)據(jù)庫中刪除student表及其數(shù)據(jù)和索引DROPTABLEstudent十一、子查詢
子查詢是一個嵌套在SELECT、INSERT、UPDATE或DELETE語句或其他子查詢中的查詢。任何允許使用表達(dá)式的地方都可以使用子查詢。
子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的語句也稱為外部查詢或外部選擇。許多包含子查詢的Transact-SQL語句都可以改用聯(lián)接表示。其他問題只能通過子查詢提出。在Transact-SQL中,包含子查詢的語句和語義上等效的不包含子查詢的語句在性能上通常沒有差別。但是,在一些必須檢查存在性的情況中,使用聯(lián)接會產(chǎn)生更好的性能。否則,為確保消除重復(fù)值,必須為外部查詢的每個結(jié)果都處理嵌套查詢。所以在這些情況下,聯(lián)接方式會產(chǎn)生更好的效果。
嵌套在外部SELECT語句中的子查詢包括以下組件:
1.包含常規(guī)選擇列表組件的常規(guī)SELECT查詢。
2.包含一個或多個表或視圖名稱的常規(guī)FROM子句。3.可選的WHERE子句。4.可選的GROUPBY子句。
5.可選的HAVING子句。
子查詢的SELECT查詢總是使用圓括號括起來。它不能包含COMPUTE或FORBROWSE子句,如果同時指定了TOP子句,則只能包含ORDERBY子句。
子查詢可以嵌套在外部SELECT、INSERT、UPDATE或DELETE語句的WHERE或HAVING子句內(nèi),也可以嵌套在其他子查詢內(nèi)。盡管根據(jù)可用內(nèi)存和查詢中其他表達(dá)式的復(fù)雜程度的不同,嵌套限制也有所不同,但嵌套到32層是可能的。個別查詢可能不支持32層嵌套。任何可以使用表達(dá)式的地方都可以使用子查詢,只要它返回的是單個值。
如果某個表只出現(xiàn)在子查詢中,而沒有出現(xiàn)在外部查詢中,那么該表中的列就無法包含在輸出(外部查詢的選擇列表)中。
包含子查詢的語句通常采用以下格式中的一種:1.WHEREexpression[NOT]IN(subquery)
2.WHEREexpressioncomparison_operator[ANY|ALL](subquery)3.WHERE[NOT]EXISTS(subquery)有三種基本的子查詢。它們是:
1.在通過IN或由ANY或ALL修改的比較運(yùn)算符引入的列表上操作。2.通過未修改的比較運(yùn)算符引入且必須返回單個值。3.通過EXISTS引入的存在測試。
用ANY、SOME或ALL修改的比較運(yùn)算符
可以用ALL或ANY關(guān)鍵字修改引入子查詢的比較運(yùn)算符。SOME是與ANY等效的ISO標(biāo)準(zhǔn)。通過修改的比較運(yùn)算符引入的子查詢返回零個值或多個值的列表,并且可以包括GROUPBY或HAVING子句。這些子查詢可以用EXISTS重新表述。
以>比較運(yùn)算符為例,>ALL表示大于每一個值。換句話說,它表示大于最大值。例如,>ALL(1,2,3)表示大于3。>ANY表示至少大于一個值,即大于最小值。因此>ANY(1,2,3)表示大于1。若要使帶有>ALL的子查詢中的行滿足外部查詢中指定的條件,引入子查詢的列中的值必須大于子查詢返回的值列表中的每個值。同樣,>ANY表示要使某一行滿足外部查詢中指定的條件,引入子查詢的列中的值必須至少大于子查詢返回的值列表中的一個值。
使用EXISTS的子查詢
使用EXISTS關(guān)鍵字引入子查詢后,子查詢的作用就相當(dāng)于進(jìn)行存在測試。外部查詢的WHERE子句測試子查詢返回的行是否存在。子查詢實際上不產(chǎn)生任何數(shù)據(jù),它只返回TRUE或FALSE值。
使用EXISTS引入的子查詢的語法如下:WHERE[NOT]EXISTS(subquery)
注意,使用EXISTS引入的子查詢在下列方面與其他子查詢略有不同:1.EXISTS關(guān)鍵字前面沒有列名、常量或其他表達(dá)式。
2.由EXISTS引入的子查詢的選擇列表通常幾乎都是由星號(*)組成。由于只是測試是否存在符合子查詢中指定條件的行,因此不必列出列名。
3.由于通常沒有備選的、非子查詢的表示法,因此EXISTS關(guān)鍵字很重要。盡管一些使用EXISTS創(chuàng)建的查詢不能以任何其他方法表示,但許多查詢都可以使用IN或者由ANY或ALL修改的比較運(yùn)算符來獲取類似結(jié)果。
子查詢本身收到以下條件的限制:
1、通過比較運(yùn)算符引入的子查詢的選擇列表只能包括一個表達(dá)式或列名稱(分別對SELECT*或列表盡興EXISTS和IN操作除外)
2、如果外部查詢的WHERE子句包括某個列名,則該子句必須與子查詢的選擇列表中的該列在連接上兼容
3、子查詢的選擇列中不允許出現(xiàn)ntext,text,image數(shù)據(jù)類型
4、由于必須返回單個值,所以由無修改的比較運(yùn)算符(指其后未接關(guān)鍵字ANY或ALL)引入的子查詢不能包括GROUPBY和HAVING子句。
5、包括GROUPBY的子查詢不能使用DISTINCT關(guān)鍵字
6、不能指定COMPUTE和INTO子句。
7、只有同時指定了TOP,才可以指定ORDERBY
8、按約定,通過EXISTS引入的子查詢的選擇列表由(*)組成,而不使用單個列名。由于通過EXISTS引入的子查詢進(jìn)行了存在測試,并返回TRUE或FALSE而非數(shù)據(jù),所以這些子查詢的規(guī)則與標(biāo)準(zhǔn)選擇列表的規(guī)則完全相同。
備注:如果不是特別的需要,盡量不要使用子查詢,因為子查詢不如用連接執(zhí)行的效率高,一般的子查詢語句都可以用連接代替。
十二、聯(lián)合查詢
查詢結(jié)果可以來自多個表,使用UNION可以實現(xiàn)查詢結(jié)果的合并。也可以用連接實現(xiàn)從多個表中返回數(shù)據(jù)。連接分為內(nèi)連接,外連接和交叉連接。內(nèi)連接(INNERJION)使用比較運(yùn)算符進(jìn)行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。外連接分為左外連接(LEFTOUTERJOIN或LEFTJOIN)、右外連接(RIGHTOUTERJOIN或RIGHTJOIN)和全外連接(FULLOUTERJOIN或FULLJOIN)三種。交叉連接(CROSSJOIN)沒有WHERE子句,它返回列表中所有數(shù)據(jù)行的笛卡爾積。
若要把多個SELECT語句的結(jié)果合并為一個結(jié)果,可用UNION操作來完成,使用UNION將多個查詢結(jié)果合并起來,形成一個完整的查詢結(jié)果時,系統(tǒng)會自動去掉重復(fù)的記錄。
注意:參加UNION操作的各數(shù)據(jù)項數(shù)目必須相同;對應(yīng)項的數(shù)據(jù)類型也必須相同。ALL關(guān)鍵字與UNION一起使用,作為它的一個可選參數(shù),使用了ALL關(guān)鍵字以后,在查詢結(jié)果中將包含所有的行(包括重復(fù)行),默認(rèn)的情況是不用ALL,刪除重復(fù)行
JOIN
指示指定的聯(lián)接操作應(yīng)在指定的表源或視圖之間執(zhí)行。
ON指定聯(lián)接所基于的條件。盡管常常使用列運(yùn)算符和比較運(yùn)算符,但此條件可指定任何謂詞,例如:
selectsname,cname,cteacherfromstudentassjoinscons.sno=sc.snojoincourseasc
onsc.cno=c.cno
當(dāng)條件指定列時,列不一定必須具有相同的名稱或數(shù)據(jù)類型;但是,如果數(shù)據(jù)類型不相同,則這些列要么必須相互兼容,要么是SQLServer能夠隱性轉(zhuǎn)換的類型。如果數(shù)據(jù)類型不能隱式轉(zhuǎn)換,則在條件中必須使用CONVERT函數(shù)顯式轉(zhuǎn)換數(shù)據(jù)類型。
內(nèi)連接INNERJOIN是SQLServer中默認(rèn)的連接類型,返回兩個表中相匹配的記錄,而相連接的兩個表中不匹配的記錄則不顯示。在一個JOIN語句中可以鏈接多個ON子句。
鏈接的過程是先從相連接的表中生成笛卡爾積,然后根據(jù)指定的條件進(jìn)行篩選。注意:在一個INNERJOIN之中,可以嵌套LEFTJOIN或RIGHTJOIN,但是在LEFTJOIN或RIGHTJOIN中不能選擇嵌套INNERJOIN。
相對于內(nèi)連接,LEFTJOIN和RIGHTJOIN都屬于外連接,使用LEFTJOIN來創(chuàng)建一個左邊外部外連接。左邊外部連接將包含了第一個(左邊)開始的兩個表中的全部記錄,即使在第二個表中并沒有相符值的記錄。使用RIGHTJOIN來創(chuàng)建一個右邊外部外連接。右邊外部連接將包含了第二個(右邊)開始的兩個表中的全部記錄,即使在第一個(左邊)表中并沒有相符值的記錄。
通過使用交叉連接(CROSSJOIN),可以返回兩個表的笛卡爾積,就像使用了INNERJOIN而沒有指定WHERE子句一樣。CROSSJOIN是簡單地,不加任何約束條件的吧表組合。CROSSJOIN后結(jié)果的行數(shù)是連接前兩個表行數(shù)的乘積。如果對兩個分別有好幾千行的表進(jìn)行連接,那么結(jié)果行數(shù)將是巨大的。
十三、查詢優(yōu)化
1、用于對運(yùn)行慢的查詢進(jìn)行分析的清單
引起查詢或更新的執(zhí)行時間超過預(yù)期時間的原因有多種。查詢運(yùn)行慢,可能是由與運(yùn)行SQLServer的網(wǎng)絡(luò)或計算機(jī)相關(guān)的性能問題引起的,也可能是由物理數(shù)據(jù)庫設(shè)計問題引起的。查詢和更新運(yùn)行慢的常見原因有多種:
1.網(wǎng)絡(luò)通訊速度慢。
2.服務(wù)器的內(nèi)存不足,或者沒有足夠的內(nèi)存供SQLServer使用。3.索引列上缺少有用的統(tǒng)計信息。4.索引列上的統(tǒng)計信息過期。5.缺少有用的索引。
6.缺少有用的索引視圖。7.缺少有用的數(shù)據(jù)條帶化。8.缺少有用的分區(qū)。
當(dāng)查詢或更新花費(fèi)的時間比預(yù)期時間長時,請考慮以下問題,找到可解答前一節(jié)中列出的查詢運(yùn)行慢的原因:
1.是與組件而不是與查詢相關(guān)的性能問題嗎?例如,是網(wǎng)絡(luò)性能低的問題嗎?有其他可能引起或造成性能降低的組件嗎?Windows系統(tǒng)監(jiān)視器可用于監(jiān)視與SQLServer和非SQLServer相關(guān)的組件的性能。
2.如果性能問題與查詢相關(guān),那么涉及到的是哪個或哪組查詢?使用SQLServerProfiler幫助識別速度緩慢的查詢。使用sys.dm_exec_query_stats和sys.dm_exec_requests動態(tài)管理視圖查找共同消耗大量資源的類似查詢。
3.如何分析運(yùn)行慢的查詢的性能?標(biāo)識了運(yùn)行慢的一個或多個查詢之后,可以通過生成顯示計劃來進(jìn)一步分析查詢性能,該顯示計劃可以是查詢優(yōu)化器生成的文本、XML或查詢執(zhí)行計劃的圖形表示形式。您可以使用Transact-SQLSET選項、SQLServerManagementStudio或SQLServerProfiler來生成顯示計劃。由這些工具收集的信息使您能夠確定SQLServer查詢優(yōu)化器如何執(zhí)行查詢以及使用的是哪些索引。利用這些信息,可以確定通過重寫查詢、更改表上的索引或修改數(shù)據(jù)庫設(shè)計等方法能否提高性能。
4.是否已經(jīng)用有用的統(tǒng)計信息優(yōu)化查詢?SQLServer自動在索引列上創(chuàng)建對列內(nèi)值的分布情況的統(tǒng)計信息。也可以手動(使用SQLServerManagementStudio或CREATESTATISTICS語句)或自動(如果將AUTO_CREATE_STATISTICS數(shù)據(jù)庫選項設(shè)置為TRUE)在非索引列上創(chuàng)建這些統(tǒng)計信息。查詢處理器可以利用這些統(tǒng)計信息來確定最佳的查詢評估策略。在聯(lián)接操作所涉及的非索引列上維護(hù)附加的統(tǒng)計信息可以提高查詢性能。使用SQLServerProfiler或SQLServerManagementStudio內(nèi)的圖形執(zhí)行計劃來監(jiān)視查詢,以確定查詢是否有足夠的統(tǒng)計信息。
5.查詢統(tǒng)計是最新的嗎?統(tǒng)計信息是自動更新的嗎?SQLServer自動在索引列上創(chuàng)建并更新查詢統(tǒng)計信息(只要沒有禁用對查詢統(tǒng)計信息的自動更新)。另外,也可以手動(使用SQLServerManagementStudio或UPDATESTATISTICS語句)或自動(如果將AUTO_UPDATE_STATISTICS數(shù)據(jù)庫選項設(shè)置為TRUE)在非索引列上更新統(tǒng)計信息。最新的統(tǒng)計信息不取決于日期或時間數(shù)據(jù)。如果尚未執(zhí)行UPDATE操作,則查詢統(tǒng)計信息仍是最新的。如果沒有將統(tǒng)計信息設(shè)置為自動更新,請進(jìn)行設(shè)置。
6.有合適的索引嗎?添加一個或多個索引會不會提高查詢性能?數(shù)據(jù)庫引擎優(yōu)化顧問也可能建議創(chuàng)建必要的統(tǒng)計信息。
7.有數(shù)據(jù)熱點或索引熱點嗎?請考慮使用磁盤條帶化。使用0級RAID(獨(dú)立磁盤冗余陣列)可實現(xiàn)磁盤條帶化,在這種RAID上,數(shù)據(jù)分布在多個磁盤驅(qū)動器上。
8.是否為查詢優(yōu)化器提供了優(yōu)化復(fù)雜查詢的最有利條件?9.如果數(shù)據(jù)量很大,需要將其分區(qū)嗎?便于數(shù)據(jù)管理是分區(qū)的主要優(yōu)點,而如果將數(shù)據(jù)的表和索引進(jìn)行相似的分區(qū),則分區(qū)還可以提高查詢性能。
友情提示:本文中關(guān)于《SQL學(xué)習(xí)知識點總結(jié)》給出的范例僅供您參考拓展思維使用,SQL學(xué)習(xí)知識點總結(jié):該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請聯(lián)系我們及時刪除。