簡單的Transact-SQL查詢只包括壹個選擇列表、壹個FROM子句和壹個WHERE子句。它們描述了被查詢的列、被查詢的
表格或視圖以及搜索條件等。
例如,以下語句查詢testtable表中名為“張三”的昵稱字段和電子郵件字段。
選擇昵稱、電子郵件
從測試表
其中name= '張三'
(1)選擇列表
Select list (select_list)表示查詢的列,可以是列名、星號、表達式、變量(包括局部變量)的列表
數量和全局變量)等等。
1,選擇所有列
例如,以下語句顯示testtable表中所有列的數據:
選擇*
從測試表
2.選擇壹些列並指定它們的顯示順序。
查詢結果集中的數據按照選擇列表中指定的列名的順序排列。
例如:
選擇昵稱、電子郵件
從測試表
3.更改列標題
在選擇列表中,您可以重新指定列標題。定義格式為:
列標題=列名
列名列標題
如果指定的列標題不是標準標識符格式,則應使用引號分隔符。例如,以下語句以中文字符顯示列。
標題:
選擇昵稱=昵稱,郵件=郵件。
從測試表
4.刪除重復的行
使用SELECT語句中的ALL或DISTINCT選項顯示表中所有符合條件的行,或者刪除重復的數據行。默認值為。
為了所有人。當使用DISTINCT選項時,對於所有重復的數據行,SELECT返回的結果集中只保留壹行。
5.限制返回的行數
使用TOP n [PERCENT]選項來限制返回的數據行數,其中TOP n表示返回n行,TOP n PERCENT表示n是。
表示百分比,並指定返回的行數等於總行數的百分比。
例如:
選擇前2名*
從測試表
選擇前20% *
從測試表
(2) FROM子句
FROM子句指定SELECT語句查詢以及與該查詢相關的表或視圖。在FROM子句中,最多可以指定256個表或視圖。
它們由逗號分隔。
當在FROM子句中同時指定多個表或視圖時,如果選擇列表中有相同的列,則這些列應該用對象名限定。
它所屬的表或視圖。例如,usertable和citytable中都有cityid列,當查詢這兩個表中的cityid時,您應該
使用以下語句格式進行限定:
選擇用戶名citytable.cityid
來自用戶表,城市表
其中usertable . city id = city table . city id
您可以使用以下兩種格式在FROM子句中為表或視圖指定別名:
表名作為別名
表名別名
例如,上述語句可以表的別名格式表示如下:
選擇用戶名b.cityid
從用戶表a,城市表b
其中a.cityid=b.cityid
SELECT不僅可以從表或視圖中檢索數據,還可以從其他查詢語句返回的結果集中查詢數據。
例如:
選擇a.au_fname+a.au_lname
來自作者a,書名作者ta
(SELECT title_id,標題
從標題
其中ytd _ sales & gt10000
)作為t
其中a.au_id=ta.au_id
並且ta.title_id=t.title_id
在本例中,SELECT返回的結果集被賦予壹個別名T,然後從中檢索數據。
(C)使用WHERE子句設置查詢條件
WHERE子句設置查詢條件並過濾掉不必要的數據行。例如,以下語句查詢20年前的數據:
選擇*
從用戶表
其中年齡& gt20
WHERE子句可以包括各種條件運算符:
比較運算符(大小比較): >、>=、=、& lt、& lt= 、& lt& gt、!& gt、!& lt
範圍運算符(表達式值是否在指定範圍內):介於…和…之間
不在…和…之間
列表運算符(判斷表達式是否為列表中的指定項):in (item 1,item 2...)
不在(項目1,項目2...)
模式匹配器(判斷值是否匹配指定的字符通配符格式):LIKE,NOT LIKE。
Null鑒別器(判斷表達式是否為空):IS NULL,NOT IS NULL。
邏輯運算符(用於多條件邏輯連接):NOT、AND、or
1,作用域運算符示例:age betwee EN 10和30相當於age >;=10且年齡& lt=30
2.列表運算符的示例:國家(德國、中國)
3.模式匹配器的例子:常用於模糊搜索,判斷列值是否匹配指定的字符串格式。可用於充電,
varchar、text、ntext、datetime和smalldatetime類型的查詢。
可以使用以下通配符:
百分號%:可以匹配任何類型和長度的字符。如果是中文,請用百分之二的符號,即%%。
Underline _:匹配單個任意字符,通常用於限制表達式的字符長度。
方括號[]:指定壹個字符、字符串或範圍,要求匹配對象為其中任意壹個。
[]:其值與[]相同,但它要求匹配對象是指定字符以外的任何字符。
例如:
限制以發布結尾,使用LIKE“% Publishing”
限制以:開頭,如“[A]%”
以a開頭的限制:如“[a]%”
4.年齡為空的空值判斷示例
5.邏輯運算符:優先級不是、與、或。
(4)查詢結果的排序
使用ORDER BY子句按壹列或多列對查詢返回的結果進行排序。ORDER BY子句的語法格式是:
ORDER BY { column _ name[ASC | desc]}[,…n]
其中ASC代表升序,是默認值,DESC代表降序。ORDER BY不能按ntext、text和image數據類型排序。
秩序。
例如:
選擇*
從用戶表
按年齡排序desc,用戶標識ASC
此外,還可以按表達式排序。
二、聯合查詢
union運算符可以將兩個或多個SELECT語句的查詢結果集組合成壹個結果集進行顯示,即執行UNION。
組合查詢。UNION的語法格式是:
select _語句
UNION[ALL]select語句
[UNION[ALL]select語句][…n]
其中SELECTstatement是要組合的選擇查詢語句。
ALL選項意味著所有行都合並到結果集中。如果不指定此項,則聯合查詢結果集中只保留壹個重復行。
好的。
在聯合查詢中,查詢結果的列標題是第壹條查詢語句的列標題。因此,要定義列標題,它必須在第壹個查詢中。
句子中的定義。在對聯合查詢的結果進行排序時,還必須在第壹個查詢語句中使用列名、列標題或列序號。
使用UNION運算符時,應該確保每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選擇
替代表達式應該具有相同的數據類型,或者可以自動轉換為相同的數據類型。在自動轉換中,對於數值類
類型,系統將低精度數據類型轉換為高精度數據類型。
在包含多個查詢的UNION語句中,執行順序是從左到右,並且可以使用括號來更改該執行順序。例如:
查詢1聯合(查詢2聯合查詢3)
三、連接查詢
通過連接操作符可以實現多表查詢。連接是關系數據庫模型的主要特征,也是區別於其他類型的特征。
數據庫管理系統的標誌。
在關系數據庫管理系統中,建立表時不需要確定數據之間的關系,壹個實體的所有信息往往都存儲在
在桌子上。在檢索數據時,可以通過join操作找到存儲在多個表中的不同實體的信息。連接操作給用戶帶來的
憑借極大的靈活性,他們可以隨時添加新的數據類型。為不同的實體創建新表,然後連接它們。
詢問。
可以在SELECT語句的FROM子句或WHERE子句中建立連接,這在FROM子句中指出時很有幫助。
區分WHERE子句中的連接操作和搜索條件。因此,建議在Transact-SQL中使用此方法。
SQL-92標準定義的FROM子句的連接語法格式是:
來自連接表連接類型連接表
[開(連接條件)]
其中join_table表示參與連接操作的表的名稱。Join可以對同壹個表、多個表和同壹個表進行操作。
表操作的連接也稱為自連接
Join_type表示連接類型,可分為三種:內部連接、外部連接和交叉連接。內部連接使用率
比較運算符比較表之間壹(壹些)列的數據,並列出這些表中符合連接條件的數據行。取決於所使用的內容
內部連接有三種類型:等連接、自然連接和不等連接。
外連接分為左外連接(左外連接或左連接)和右連接(右外連接或右連接)。
和完全外部連接或完全連接。與內部連接不同,外部連接不僅列出了連接條件。
用行,但列出左表(左連接時)、右表(右連接時)或兩表(整體連接時)中所有匹配的搜索條件。
數據行。
交叉聯接沒有WHERE子句。它返回連接表中所有數據行的笛卡爾積,而
數據行數等於第壹個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
連接操作中的ON (join_condition)子句表示連接條件,它由連接表中的列、比較運算符、邏輯
操作員等。
Text、ntext和image數據類型列不能通過任何類型的連接直接連接,但可以間接連接。
連接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub _ info AS p 1 INNER JOIN pub _ info AS p2
關於數據長度(p 1 . pr _ info)=數據長度(p2.pr_info)
(1)內部連接
內部聯接查詢操作列出符合聯接條件的數據行,並使用比較運算符來比較聯接列的列值。內部連接點
三種:
1,equijoin:在連接條件中使用等號(=)運算符比較連接列的列值,查詢結果列出連接列。
表中的所有列,包括重復的列。
2.不等聯接:在聯接條件下,將聯接列的列值與除等號運算符之外的其他比較運算符進行比較。這些
運算符包括>、>= 、& lt= 、& lt、!& gt、!& lt和
3.自然聯接:在聯接條件中,等號(=)運算符用於比較聯接列的列值,但它使用選擇列表來指示查詢。
結果集中包含的列,並刪除連接表中的重復列。
例如,equijoin用於在authors和publishers表中列出同壹城市的作者和出版商:
選擇*
從作者作為內部加入出版商作為p
在a.city=p.city
另壹個示例是使用自然連接刪除選擇列表中authors和publishers表中的重復列(city和state ):
SELECT a.*,p.pub_id,p.pub_name,p.country
從作者作為內部加入出版商作為p
在a.city=p.city
(2)外部連接
內部連接,查詢結果集中只返回匹配的查詢條件(WHERE搜索條件或HAVING條件)和連接條件。
好的。當使用外部連接時,它不僅返回滿足連接條件的行,還返回左表(外部左側)
連接時)、右表(右連接時)或兩個邊緣表中的所有數據行(全外連接)。
使用左側外部鏈接將論壇內容與作者信息連接起來,如下所示:
從左連接用戶表中選擇a.*,b.*作為b
在用戶名=用戶名上
讓我們使用完整的外部連接來連接城市表中的所有作者和用戶表中的所有作者,以及他們的城市:
選擇a.*,b.*
從作為完全外部聯接用戶的城市到作為b
在用戶名=用戶名上
(3)交叉連接
交叉聯接沒有WHERE子句。它返回連接的兩個表的所有數據行的笛卡爾積,並返回結果集中的數字。
數據行數等於第壹個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。
例如,titles表中有6種書,publishers表中有8個出版商,因此下面的交叉連接檢索到的記錄數將是相等的。
在6*8=48行中。
選擇類型,發布名稱
從標題交叉連接出版商
ORDER BY typeSQL核心語句(幾個非常實用的技巧)插入數據。
要向表中添加新記錄,應該使用SQL INSERT語句。下面是如何使用該語句的示例:
插入mytable (mycolumn)值(“壹些數據”)
該語句將字符串“some data”插入到表mytable的mycolumn字段中。要插入數據的字段名稱在第壹個括號中指定,實際數據在第二個括號中給出。
INSERT語句的完整語法如下:
INSERT[INTO]{表名|視圖名} [(列名)]{默認值|
值列表|選擇語句}
如果壹個表有多個字段,您可以通過用逗號分隔字段名稱和字段值,將數據插入到所有字段中。假設表mytable有三個字段:first_column、second_column和third_column。以下INSERT語句添加壹條完整的記錄,其中所有三個字段都有值:
插入我的表(第壹列,第二列,第三列)
值(“壹些數據”、“更多數據”、“更多數據”)
註意
您可以使用INSERT語句將數據插入文本字段。但是,如果需要輸入長字符串,應該使用WRITETEXT語句。這部分對於這本書來說太高深了,就不討論了。有關更多信息,請參考Microsoft SQL Sever的文檔。
如果在INSERT語句中只指定兩個字段和數據會怎樣?換句話說,您在表中插入了壹條新記錄,但是字段中沒有數據。在這種情況下,有四種可能性:
如果該字段有默認值,將使用該值。例如,假設您在插入新記錄時沒有為字段third_column提供數據,並且該字段具有默認值“某個值”。在這種情況下,創建新記錄時會插入值“某個值”。
如果該字段可以接受空值,並且沒有默認值,則將插入空值。
如果該字段不接受空值並且沒有默認值,將會發生錯誤。您將收到壹條錯誤消息:
表mytable中的列不能為空。
最後,如果該字段是壹個標識字段,它將自動生成壹個新值。當您向帶有已識別字段的表中插入新記錄時,只需忽略該字段,已識別字段將為自己賦予壹個新值。
註意
在將壹條新記錄插入到帶有標識字段的表中後,可以使用SQL變量@@identity來訪問這條新記錄。
的標識字段的值。考慮以下SQL語句:
插入mytable (first_column)值(“某個值”)
插入另壹個表(another_first,another_second)
值(@@identity,“某個值”)
如果表mytable有壹個identity字段,則該字段的值將被插入到表anothertable的another_first字段中。這是因為變量@@identity總是保存最後插入的標識字段的值。
字段another_first應該與字段first_column具有相同的數據類型。然而,字段another_first不能是應該被識別字段。other_first字段用於保存first_column字段的值。
刪除記錄
要從表中刪除壹條或多條記錄,需要使用SQL DELETE語句。您可以為DELETE語句提供WHERE子句。WHERE子句用於選擇要刪除的記錄。例如,以下DELETE語句僅刪除字段first_column的值等於“刪除我”的記錄:
刪除我的表,其中first_column='Deltet Me '
DELETE語句的完整語法如下:
刪除[FROM]{表名|視圖名} [WHERE子句]
可以在SQL SELECT語句中使用的任何條件都可以在delete語句的WHERE子句中使用。例如,以下DELETE語句僅刪除first_column字段中值為“goodbye”或second_column字段中值為“so long”的記錄:
刪除我的表,其中first_column='goodby '或second_column='so long '
如果不為DELETE語句提供WHERE子句,表中的所有記錄都將被刪除。妳不應該有這種想法。如果妳想刪除表中的所有記錄,妳應該使用第10章中提到的TRUNCATE TABLE語句。
註意
為什麽用TRUNCATE TABLE語句代替DELETE語句?使用TRUNCATE TABLE語句時,不會記錄記錄的刪除。換句話說,這意味著TRUNCATE TABLE比DELETE快得多。
更新記錄
要修改表中已經存在的壹條或多條記錄,應該使用SQL UPDATE語句。與DELETE語句壹樣,UPDATE語句可以使用WHERE子句來選擇更新特定的記錄。看看這個例子:
UPDATE my table SET first _ column = ' Updated!'其中second_column= '更新我的信息!'
此UPDATE語句將所有second_column字段的值更新為“Update Me!的記錄。對於所有選定的記錄,字段first_column的值被設置為“已更新!”。
以下是UPDATE語句的完整語法:
更新{表名|視圖名}集[{表名|視圖名}]
{列列表|變量列表|變量和列列表}
[,{列列表2 |變量列表2 |變量和列列表2}…
[,{列列表|變量列表|變量和列列表}]]
[WHERE子句]
註意
您可以對文本字段使用UPDATE語句。但是,如果需要更新長字符串,應該使用UPDATETEXT語句。這部分對於這本書來說太高深了,就不討論了。有關更多信息,請參考Microsoft SQL Sever的文檔。
如果不提供WHERE子句,表中的所有記錄都將被更新。有時候這是有用的。例如,如果要將標題表中所有書籍的價格翻倍,可以使用下面的UPDATE語句:
您也可以同時更新多個字段。例如,以下UPDATE語句同時更新first_column、second_column和third_column字段:
UPDATE my table SET first _ column = ' Updated!'
Second_column= '已更新!'
Third_column= '已更新!'
其中first_column='Update Me1 '
技能
SQL忽略語句中多余的空格。您可以用任何最容易閱讀的格式編寫SQL語句。
用SELECT創建記錄和表
您可能已經註意到,INSERT語句與DELETE語句和UPDATE語句略有不同。它壹次只對壹條記錄進行操作。但是,有壹種方法可以讓INSERT語句壹次添加多條記錄。為此,您需要將INSERT語句與SELECT語句結合起來,如下所示:
插入我的表(第壹列,第二列)
選擇另壹個_第壹,另壹個_第二
從另壹張桌子
其中另壹個_first= '復制我!'
該語句從另壹個表復制到我的表。只有另壹個表中字段another_first的值是“復制我!的記錄已被復制。
在表中創建記錄的備份時,這種形式的INSERT語句非常有用。在刪除壹個表中的記錄之前,可以用這種方法將它們復制到另壹個表中。
如果需要復制整個表,可以使用SELECT INTO語句。例如,以下語句創建壹個名為newtable的新表,其中包含表mytable的所有數據:
SELECT * INTO newtable FROM mytable
您還可以指定只使用特定的字段來創建這個新表。為此,只需在字段列表中指定要復制的字段。此外,可以使用WHERE子句來限制復制到新表中的記錄。下面的示例只復制second_columnd字段的值,等於“Copy Me!的記錄的first_column字段。
SELECT first_column到newtable
從我的表格
其中second_column= '復制我!'
使用SQL修改已建立的表是非常困難的。例如,如果您向表中添加了壹個字段,就沒有簡單的方法來刪除它。此外,如果您不小心給了壹個字段錯誤的數據類型,您將無法更改它。但是,您可以通過使用本節中描述的SQL語句來繞過這兩個問題。
例如,假設您想從表中刪除壹個字段。使用SELECT INTO語句,可以創建表的副本,但它不包含要刪除的字段。這允許您刪除字段並保留不想刪除的數據。
如果要更改字段的數據類型,可以創建壹個包含具有正確數據類型的字段的新表。創建表後,可以同時使用UPDATE語句和SELECT語句將原始表中的所有數據復制到新表中。這樣,妳不僅可以修改表的結構,還可以保存原始數據。