官术网_书友最值得收藏!

5.2 數(shù)據(jù)操作語(yǔ)句

數(shù)據(jù)操作語(yǔ)句(Data Manipulation Language,DML)是使用戶能夠查詢數(shù)據(jù)庫(kù)及操作已有數(shù)據(jù)庫(kù)中數(shù)據(jù)的語(yǔ)句,其中包括數(shù)據(jù)庫(kù)插入語(yǔ)句、數(shù)據(jù)更改語(yǔ)句、數(shù)據(jù)刪除語(yǔ)句和數(shù)據(jù)查詢語(yǔ)句等。本節(jié)將介紹這些內(nèi)容。

5.2.1 數(shù)據(jù)的插入——INSERT

向已創(chuàng)建好的數(shù)據(jù)表中插入記錄,可以一次插入一條記錄,也可以一次插入多條記錄。插入表中的記錄中的值必須符合各個(gè)字段值數(shù)據(jù)類型及相應(yīng)的約束。INSERT語(yǔ)句基本語(yǔ)法格式如下:

  • table_name:指定要插入數(shù)據(jù)的表名。
  • column_list:指定要插入數(shù)據(jù)的那些列。
  • value_list:指定每個(gè)列對(duì)應(yīng)插入的數(shù)據(jù)。

提示

使用該語(yǔ)句時(shí)字段列和數(shù)據(jù)值的數(shù)量必須相同,value_list中的這些值可以是DEFAULT、NULL或者是表達(dá)式。DEFAULT表示插入該列在定義時(shí)的默認(rèn)值;NULL表示插入空值;表達(dá)式將插入表達(dá)式計(jì)算之后的結(jié)果。

在演示插入操作之前,將數(shù)據(jù)庫(kù)的名稱company重新修改為test_db,語(yǔ)句如下:

準(zhǔn)備一張數(shù)據(jù)表,這里定義名稱為teacher的表,可以在test_db數(shù)據(jù)庫(kù)中創(chuàng)建該數(shù)據(jù)表,創(chuàng)建表的語(yǔ)句如下:

執(zhí)行操作后刷新表節(jié)點(diǎn),即可看到新添加的teacher表,如圖5-2所示。

圖5-2 添加teacher表

【例5.8】向teacher表中插入一條新記錄,輸入語(yǔ)句如下。

執(zhí)行語(yǔ)句后,結(jié)果如圖5-3所示。

圖5-3 向teacher表中插入一條記錄

插入操作成功,可以從teacher表中查詢出一條記錄。

【例5.9】向teacher表中插入多條新記錄,T-SQL代碼如下。

執(zhí)行結(jié)果如圖5-4所示。

圖5-4 向teacher表中插入多條記錄

對(duì)比插入前后的查詢結(jié)果,可以看到現(xiàn)在表中已經(jīng)多了3條記錄,插入操作成功。

5.2.2 數(shù)據(jù)的更改——UPDATE

表中有數(shù)據(jù)之后,接下來(lái)可以對(duì)數(shù)據(jù)進(jìn)行更新操作,SQL Server使用UPDATE語(yǔ)句更新表中的記錄,可以更新特定的行或者同時(shí)更新所有的行。UPDATE語(yǔ)句的基本語(yǔ)法結(jié)構(gòu)如下:

column_name1,column_name2,……,column_nameN為指定更新的字段的名稱;value1,value2,……,valueN為相對(duì)應(yīng)的指定字段的更新值;condition指定更新的記錄需要滿足的條件。更新多個(gè)列時(shí),每個(gè)“列=值”對(duì)之間用逗號(hào)隔開,最后一列之后不需要逗號(hào)。

1.指定條件修改

【例5.10】在teacher表中,更新id值為1的記錄,將birthday字段值改為‘1980-8-8’,將cellphone字段值改為‘0018600’,輸入語(yǔ)句如下。

對(duì)比執(zhí)行前后的結(jié)果如圖5-5所示。

圖5-5 指定條件修改記錄

對(duì)比前后的查詢結(jié)果,可以看到,更新指定記錄成功。

2.修改表中所有記錄

【例5.11】在teacher表中,將所有老師的電話都修改為‘01008611’,輸入語(yǔ)句如下。

代碼執(zhí)行后的結(jié)果如圖5-6所示。

圖5-6 同時(shí)修改teacher表中所有記錄的cellphone字段

由結(jié)果可以看到,現(xiàn)在表中所有記錄的cellphone字段都有相同的值,修改操作成功。

5.2.3 數(shù)據(jù)的刪除——DELETE

數(shù)據(jù)的刪除將刪除表的部分或全部記錄,刪除時(shí)可以指定刪除條件從而刪除一條或多條記錄;如果不指定刪除條件,DELETE語(yǔ)句將刪除表中所有的記錄,清空數(shù)據(jù)表。DELETE語(yǔ)句的基本語(yǔ)法格式如下:

  • table_name為執(zhí)行刪除操作的數(shù)據(jù)表。
  • WHERE子句指定刪除的記錄要滿足的條件。
  • condition為條件表達(dá)式。
1.按指定條件刪除一條或多條記錄

【例5.12】刪除teacher表中id等于1的記錄,輸入語(yǔ)句如下。

執(zhí)行結(jié)果如圖5-7所示。

圖5-7 按指定條件刪除一條記錄

由結(jié)果可以看到,代碼執(zhí)行之后,SELECT語(yǔ)句的查詢結(jié)果為空,刪除記錄成功。

2.刪除表中所有記錄

使用不帶WHERE子句的DELETE語(yǔ)句可以刪除表中的所有記錄。

【例5.13】刪除teacher表中所有記錄,輸入語(yǔ)句如下。

執(zhí)行結(jié)果如圖5-8所示。

圖5-8 刪除表中所有記錄

對(duì)比刪除前后的查詢結(jié)果,可以看到,執(zhí)行DELETE語(yǔ)句之后,表中的記錄被全部刪除,所以第二條SELECT語(yǔ)句的查詢結(jié)果為空。

5.2.4 數(shù)據(jù)的查詢——SELECT

對(duì)于數(shù)據(jù)庫(kù)管理系統(tǒng)來(lái)說(shuō),數(shù)據(jù)查詢是執(zhí)行頻率最高的操作,是數(shù)據(jù)庫(kù)中非常重要的部分。T-SQL中使用SELECT語(yǔ)句進(jìn)行數(shù)據(jù)查詢,SELECT語(yǔ)句的基本語(yǔ)法結(jié)構(gòu)如下:

  • ALL:指定在結(jié)果集中可以包含重復(fù)行。
  • DISTINCT:指定在結(jié)果集中只能包含唯一行。對(duì)于DISTINCT關(guān)鍵字來(lái)說(shuō),NULL值是相等的。
  • {* | <字段列表>}:包含星號(hào)通配符和字段列表,“*”表示查詢所有的字段,“字段列表”表示查詢指定的字段,字段列至少包含一個(gè)子段名稱,如果要查詢多個(gè)字段,多個(gè)字段之間用逗號(hào)隔開,最后一個(gè)字段后不要加逗號(hào)。
  • FROM table_name | view_name:表示查詢數(shù)據(jù)的來(lái)源。table_name表示從數(shù)據(jù)表中查詢數(shù)據(jù),view_name表示從視圖中查詢。對(duì)于表和視圖,在查詢時(shí)均可指定單個(gè)或者多個(gè)。
  • WHERE <condition>:指定查詢結(jié)果需要滿足的條件。
  • GROUP BY <字段名>:該子句告訴SQL Server顯示查詢出來(lái)的數(shù)據(jù)時(shí),按照指定的字段分組。
  • [ORDER BY <字段名>]:該子句告訴SQL Server按什么樣的順序顯示查詢出來(lái)的數(shù)據(jù),可以進(jìn)行的排序有:升序(ASC)、降序(DESC)。

為了演示本節(jié)介紹的內(nèi)容,可以在指定的數(shù)據(jù)庫(kù)中建立下面的數(shù)據(jù)表,并插入記錄數(shù)據(jù)。

執(zhí)行語(yǔ)句后,查看stu_info表的數(shù)據(jù),結(jié)果如圖5-9所示。

圖5-9 創(chuàng)建stu_info表

1.基本SELECT查詢

【例5.14】查詢stu_info表中的所有學(xué)生信息,輸入語(yǔ)句如下。

執(zhí)行結(jié)果如圖5-10所示。

圖5-10 查詢stu_info表中所有學(xué)生信息

可以看到,使用星號(hào)(*)通配符時(shí),將返回所有列,列按照定義表的時(shí)候的順序顯示。

2.查詢記錄中指定字段

有時(shí)候,并不需要數(shù)據(jù)表中的所有字段的值,此時(shí),可以指定需要查詢的字段名稱,這樣不僅顯示的結(jié)果更清晰,而且能提高查詢的效率。

【例5.15】查詢stu_info數(shù)據(jù)表中學(xué)生的姓名和成績(jī),輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-11所示。

圖5-11 查詢stu_info數(shù)據(jù)表中學(xué)生的姓名和成績(jī)字段

3.在查詢結(jié)果中使用表達(dá)式

【例5.16】不修改數(shù)據(jù)表,查詢并顯示所有學(xué)生的成績(jī)降低5分后的結(jié)果,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-12所示。

圖5-12 在查詢結(jié)果中使用表達(dá)式

這里s_score-5表達(dá)式后面使用了AS關(guān)鍵字,該關(guān)鍵字表示為表達(dá)式列指定一個(gè)用于顯示的字段名稱,這里AS為一個(gè)可選參數(shù),也可以不使用。

提示

這里的s_score-5表達(dá)式中減號(hào)為英文狀態(tài)下輸入的符號(hào),如果在中文狀態(tài)下輸入,運(yùn)行將會(huì)報(bào)錯(cuò)。

4.顯示部分查詢結(jié)果

當(dāng)數(shù)據(jù)表中包含大量的數(shù)據(jù)時(shí),可以通過(guò)指定顯示記錄數(shù)限制返回的結(jié)果集中的行數(shù),方法是在SELECT語(yǔ)句中使用TOP關(guān)鍵字,其語(yǔ)法格式如下:

TOP后面有兩個(gè)可選參數(shù),n表示從查詢結(jié)果集返回指定的n行,PERCENT表示從結(jié)果集中返回指定的百分比數(shù)目的行。

【例5.17】查詢stu_info中所有的記錄,但只顯示前3條,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-13所示。

圖5-13 返回stu_info表中前3條記錄

5.帶限定條件的查詢

數(shù)據(jù)庫(kù)中如果包含大量的數(shù)據(jù),根據(jù)特殊要求,可能只須查詢表中的指定數(shù)據(jù),即對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。在SELECT語(yǔ)句中通過(guò)WHERE子句,對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。

【例5.18】查詢stu_info表中所有性別為‘男’的學(xué)生的信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-14所示。

圖5-14 帶限定條件的查詢

由返回結(jié)果可以看到,返回了4條記錄,這些記錄有一個(gè)共同的特點(diǎn),就是其s_sex字段值都為‘男’。

相反的,可以使用關(guān)鍵字NOT來(lái)查詢與條件范圍相反的記錄。

【例5.19】查詢stu_info表中所有性別不為‘男’的學(xué)生的信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-15所示。

圖5-15 NOT限定條件查詢

可以看到,返回的結(jié)果集中,所有記錄的s_sex字段值為非‘男’,即查詢女同學(xué)的信息。當(dāng)然,這里只是為了說(shuō)明NOT運(yùn)算符的使用方法,讀者也可以在WHERE子句中直接指定查詢條件為s_sex=‘女’。

6.帶AND的多條件查詢

使用SELECT查詢時(shí),可以增加查詢的限制條件,這樣可以使查詢的結(jié)果更加精確。SQL Server在WHERE子句中使用AND操作符,限定必須滿足所有查詢條件的記錄才會(huì)被返回。可以使用AND連接兩個(gè)甚至多個(gè)查詢條件,多個(gè)條件表達(dá)式之間用AND分開。

【例5.20】查詢stu_info表中性別為‘男’并且成績(jī)大于80的學(xué)生信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-16所示。

圖5-16 帶AND運(yùn)算符的查詢

返回查詢結(jié)果中所有記錄的s_sex字段值為‘男’,其成績(jī)都大于80,同時(shí)滿足這兩個(gè)查詢條件。

7.帶OR的多條件查詢

與AND相反,在WHERE聲明中使用OR操作符,表示只需要滿足其中一個(gè)條件的記錄即可返回。OR也可以連接兩個(gè)甚至多個(gè)查詢條件,多個(gè)條件表達(dá)式之間用OR分開。

【例5.21】查詢stu_info表中成績(jī)大于80,或者年齡大于18的學(xué)生信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-17所示。

圖5-17 帶OR運(yùn)算符多條件查詢

由返回結(jié)果可以看到,第1條和第4條記錄滿足WHERE子句中的第一個(gè)大于80分的條件,第2條和第3條記錄雖然其s_score字段值不滿足大于80分的條件,但是其s_age年齡字段滿足了WHERE子句中第二個(gè)年齡大于18歲的條件,因此也是符合查詢條件的。

8.使用LIKE運(yùn)算符進(jìn)行匹配查詢

前面介紹的各種查詢條件中,限定條件是確定的,但是某些時(shí)候,不能明確地指明查詢的限定條件,此時(shí),可以使用LIKE運(yùn)算符進(jìn)行模式匹配查詢,在查詢時(shí)可以使用如下的幾個(gè)通配符,如表5-2所示。

表5-2 各種通配符的含義

【例5.22】在stu_info數(shù)據(jù)表中,查詢所有姓‘馬’的學(xué)生信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-18所示。

圖5-18 查詢所有姓名以“馬”開頭同學(xué)的記錄

數(shù)據(jù)表中只有一條記錄的s_name字段值以字符‘馬’開頭,符合匹配字符串‘馬%’。

【例5.23】查詢stu_info表中所有姓“張”、姓“王”、姓“李”的學(xué)生信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-19所示。

圖5-19 查詢所有姓名以“張”、“王”或“李”開頭同學(xué)的記錄

由返回結(jié)果可以看到,這里返回的3條記錄的s_name字段值分別是以張、王或者李這3個(gè)姓中的某一個(gè)開頭的,只要是以這3個(gè)姓開頭的,不管后面還有多少個(gè)字符都是滿足LIKE運(yùn)算符中匹配條件的。

9.使用BETWEEN AND進(jìn)行查詢

BETWEEN AND運(yùn)算符可以對(duì)查詢值限定一個(gè)查詢區(qū)間。

【例5.24】查詢stu_info表中成績(jī)大于50小于90的學(xué)生信息,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-20所示。

圖5-20 使用BETWEEN AND運(yùn)算符查詢

由返回結(jié)果可以看到,這里3條記錄的s_score字段的值都是大于50小于90,滿足查詢條件。

10.對(duì)查詢結(jié)果排序

在說(shuō)明SELECT語(yǔ)句語(yǔ)法時(shí)介紹了ORDER BY子句,使用該子句可以根據(jù)指定的字段的值,對(duì)查詢的結(jié)果進(jìn)行排序,并且可以指定排序方式(降序或者升序)。

【例5.25】查詢stu_info表中所有學(xué)生信息,并按照成績(jī)由高到低進(jìn)行排序,輸入語(yǔ)句如下。

代碼執(zhí)行結(jié)果如圖5-21所示。

圖5-21 對(duì)查詢結(jié)果排序

查詢結(jié)果中返回了stu_info表的所有記錄,這些記錄根據(jù)s_score字段的值進(jìn)行了一個(gè)降序排列。ORDER BY子句也可以對(duì)查詢結(jié)果進(jìn)行升序排列,升序排列是默認(rèn)的排序方式,在使用ORDER BY子句升序排列時(shí),可以使用ASC關(guān)鍵字,也可以省略該關(guān)鍵字。讀者可以自己編寫升序排列的代碼,對(duì)比這里的結(jié)果。

主站蜘蛛池模板: 潼关县| 双鸭山市| 淅川县| 高密市| 浦县| 东阿县| 绥芬河市| 宁夏| 顺义区| 股票| 托里县| 固阳县| 桃园县| 长寿区| 梁山县| 苏尼特左旗| 长汀县| 永济市| 西乌珠穆沁旗| 巨鹿县| 遂平县| 公主岭市| 江孜县| 莆田市| 综艺| 禹城市| 慈利县| 克拉玛依市| 江陵县| 拉萨市| 陈巴尔虎旗| 富蕴县| 天镇县| 新竹县| 高清| 莱西市| 北海市| 元阳县| 嘉黎县| 武城县| 黑山县|