《第07章 基本SQL語句課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《第07章 基本SQL語句課件.ppt(36頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、第 7章 基 本 SQL語 句Transact-SQL語言是Microsoft為SQL Server開發(fā)的一種標(biāo)準(zhǔn)化SQL語言的實(shí)現(xiàn),也是SQL Server的核心。不過,Transact-SQL并非嚴(yán)格按照標(biāo)準(zhǔn)化SQL語言實(shí)現(xiàn),而是對標(biāo)準(zhǔn)化SQL語言進(jìn)行了一定程度上的裁剪和拓展。本章主要介紹Transact-SQL語言的基本語句。 7.1 Transact-SQL語 言Transact-SQL語言是對標(biāo)準(zhǔn)SQL語言的實(shí)現(xiàn)。不過,由于不同的數(shù)據(jù)庫系統(tǒng),廠商實(shí)現(xiàn)的SQL語言并不相同,這就導(dǎo)致了數(shù)據(jù)庫的具體SQL語言間存在一定程度上的差異。所以,用戶在使用SQL語言時,一定要明確特定SQL語言的特
2、殊性,而且應(yīng)盡量使用標(biāo)準(zhǔn)化SQL語句,而不要去使用那些特殊性的SQL語句。 7.2 數(shù) 據(jù) 定 義 語 言Transact-SQL語言是一種數(shù)據(jù)定義語言。所謂數(shù)據(jù)定義語言,是指用于定義數(shù)據(jù)格式的語言。這里所說的數(shù)據(jù)格式是存儲數(shù)據(jù)的結(jié)構(gòu)以及所存儲數(shù)據(jù)項(xiàng)之間的關(guān)系。數(shù)據(jù)格式定義包括創(chuàng)建格式、刪除格式、更改格式,而對應(yīng)的語句分別為CEATE語句、DROP語句、ALTER語句。REVOKE語句是處理權(quán)限的主要語句。CEATE語句、DROP語句、ALTER語句和REVOKE等語句并不是一個語句,而是一組語句。 7.2.1 CREATE語 句 : 創(chuàng) 建 數(shù) 據(jù) 庫CREATE語句主要用于數(shù)據(jù)定義,包括定
3、義數(shù)據(jù)的格式,以及其他屬性。其中,數(shù)據(jù)定義的格式和屬性限制了插入數(shù)據(jù)庫中的數(shù)據(jù)的格式。所以,在數(shù)據(jù)庫設(shè)計(jì)時,數(shù)據(jù)定義階段的工作很重要。為了做好數(shù)據(jù)定義工作,在定義數(shù)據(jù)結(jié)構(gòu)前,用戶需要對企業(yè)的常用數(shù)據(jù)的格式進(jìn)行分析。 7.2.2 DROP語 句 : 刪 除 數(shù) 據(jù) 庫在SQL Server里,DROP語句和CREATE語句是對應(yīng)的,二者甚至在形式和數(shù)目上都很相同。如CREATE DATABASE語句對應(yīng)于DROP DATABASE語句。不過,DROP語句一般都是較為簡單的,不像CREATE語句那樣具有復(fù)雜的語法結(jié)構(gòu)。一般情況下,DROP語句的格式如下。DROP 對象 對象名 7.2.3 ALTE
4、R語 句 : 修 改 數(shù) 據(jù) 庫從ALTER語句的含義來看,ALTER語句是很友好的。因?yàn)锳LTER語句能夠在定義對象后,對對象進(jìn)行修改。不過,實(shí)際的情況卻并不如想象中那么好。在對象設(shè)計(jì)階段,可以使用ALTER修改,但是在現(xiàn)實(shí)工作中,用戶最好不要使用ALTER語句。該語句可能造成數(shù)據(jù)的丟失或數(shù)據(jù)精度的降低。 7.2.4 REVOKE語 句 : 安 全 性 語 句上面介紹的語句都是關(guān)于數(shù)據(jù)庫對象的,這里的REVOKE語句則是關(guān)于安全性的。REVOKE語句、GRANT語句以及DENY等語句定義了對象的權(quán)限。關(guān)于權(quán)限,將在后文中敘述。這里只是強(qiáng)調(diào)說明權(quán)限也是數(shù)據(jù)定義的一部分。 7.3 數(shù) 據(jù) 操 縱
5、 語 言在使用數(shù)據(jù)定義語言(DDL)定義了數(shù)據(jù)存儲的格式和位置后,用戶就可以使用數(shù)據(jù)操縱語言(DML)來操作定義的對象。數(shù)據(jù)操縱語言主要包括數(shù)據(jù)查詢與數(shù)據(jù)更新,其中,數(shù)據(jù)查詢主要是SELECT,而數(shù)據(jù)更新則包括插入(INSERT語句)、更新(UPDATE語句)、刪除(DELETE語句)。這四類語句可以簡稱為“查增改刪”。 7.3.1 SELECT語 句 : 查 詢 數(shù) 據(jù)所有基于數(shù)據(jù)庫的應(yīng)用系統(tǒng)都會使用SELECT語句從數(shù)據(jù)庫中提取數(shù)據(jù),并將獲得的數(shù)據(jù)按用戶的要求輸出給用戶。根據(jù)用戶使用具體SELECT語句的不同,數(shù)據(jù)庫從不同角度向用戶展示數(shù)據(jù)庫中的數(shù)據(jù)。SELECT語句執(zhí)行后,將返回一組記錄
6、,而這組記錄就是記錄集(結(jié)果集)。不過,SELECT語句是很復(fù)雜的。 7.3.2 INSERT語 句 : 插 入 數(shù) 據(jù)在SQL Server中,INSERT語句負(fù)責(zé)向數(shù)據(jù)庫中插入記錄。在獲取一條新的記錄后,就需要使用INSERT語句向數(shù)據(jù)庫插入一個新行(記錄)。 7.3.3 UPDATE語 句 : 更 新 數(shù) 據(jù)在使用INSERT語句向數(shù)據(jù)庫中插入數(shù)據(jù)后,數(shù)據(jù)就保存到了數(shù)據(jù)庫中。不過,如果外界數(shù)據(jù)發(fā)生變化,就需要對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行更新。在SQL Server中,主要使用UPDATE語句更新數(shù)據(jù)庫中的數(shù)據(jù),特別是更新部分字段。與INSERT不同,這里并不插入新行(記錄),而是修改原行(記錄)
7、。 7.3.4 Delete語 句 : 刪 除 數(shù) 據(jù)如果表中的數(shù)據(jù)不再使用或已經(jīng)備份完畢,那么為了釋放服務(wù)器的資源,就需要及時刪除表中的數(shù)據(jù)。 7.4 其 他 常 用 語 句上面介紹了SELECT、INSERT、UPDATE、DELETE等語句的基本形式。下面將介紹一些常用的子句,這些子句在與上述4個語句配合使用時,可以實(shí)現(xiàn)更加強(qiáng)大的數(shù)據(jù)操作功能。1帶WHERE子句的SELECT語句2帶WHERE子句的UPDATE語句3帶WHERE子句的DELETE語句 7.4.1 WHERE子句:給出條件語句在SQL Server中,WHERE子句可以用于SELECT語句、DELETE語句、UPDATE語
8、句中。1帶WHERE子句的SELECT語句2帶WHERE子句的UPDATE語句3帶WHERE子句的DELETE語句 7.4.2 帶 AND關(guān) 鍵 字 的 WHERE子 句在介紹AND關(guān)鍵字之前,需要介紹一下布爾表達(dá)式。所謂布爾表達(dá)式是指表達(dá)式的各成分由關(guān)系連接符連接,而且表達(dá)式的值為TRUE或FALSE。其中,用于連接布爾表達(dá)式的連接詞有NOT(非)、AND(積)、OR(和)3個。這里將以AND為例,介紹這3個連接詞。 7.4.3 GROUP BY子 句 : 分 組 語 句GROUP BY子句具有符合ISO的語法和不符合ISO的語法兩種結(jié)構(gòu)。在一條SELECT語句中只能使用一種語法樣式,在這里
9、,用戶使用符合ISO的語法,因?yàn)椴环螴SO語法的目的是為了實(shí)現(xiàn)向后兼容。這里僅介紹符合ISO的語法,如下。 1不帶WHERE子句僅含GROUP BY子句的SELECT語句 2帶WHERE子句和GROUP BY子句的SELECT語句 7.4.4 HAVING子 句 : 分 組 條 件HAVING子句通常在GROUP BY子句中使用。如果不使用GROUP BY子句,那么HAVING的行為與WHERE子句一樣。不過,這種方式不推薦使用,因?yàn)橛泻芏嘞拗?。HAVING子句的所有列都必須出現(xiàn)在SELECT語句的列表中。具體HAVING子句的用法大致分為以下幾種情況。1帶HAVING子句而不帶WHERE子
10、句的SELECT語句2帶HAVING子句和WHERE子句的SELECT語句 7.4.5 ORDER BY子 句 : 排 序 語 句ORDER BY子句用在指定SELECT語句返回的結(jié)果集后,主要用于對結(jié)果集進(jìn)行排序。在默認(rèn)情況下,由SELECT語句返回結(jié)果集中的記錄是按照表中記錄的物理順序排列的。 7.4.6 TOP子 句 : 查 看 前 幾 條 記 錄TOP表達(dá)式可用在SELECT、INSERT、UPDATE和DELETE語句中。不過,TOP表達(dá)式主要用于SELECT語句中,其表達(dá)式語法結(jié)構(gòu)如下。TOP (Expression) PERCENT WITH TIES 7.4.7 DISTINC
11、T子 句 : 去 掉 重 復(fù) 記 錄提到關(guān)鍵字DISTINCT,就不得不提到關(guān)鍵字ALL。ALL是指結(jié)果集中可以包含重復(fù)行,而且它是默認(rèn)值。而關(guān)鍵字DISTINCT可從SELECT語句的結(jié)果集中消除重復(fù)的行。不過,如果沒有指定DISTINCT,將返回所有行(包括重復(fù)的行)。 7.4.8 BETWEEN子 句 : 指 定 范 圍 條 件在SQL Server中,BETWEEN子句是較為重要的字句,用于指定一個范圍條件,其語法結(jié)構(gòu)如下。test_Expression BETWEEN BEGIN_Expression AND END_Expression其實(shí),該子句相當(dāng)于數(shù)學(xué)中的兩個不等式:BEGI
12、N_Expression=test_Expression =END_Expression 7.4.9 模 糊 查 詢 LIKE子 句上面介紹WHERE子句時,說到了字符串比較的問題。不過,那種字符串比較主要是、=等關(guān)系運(yùn)算符連接。在某種程度上,這些運(yùn)算符都可以說是字符串的精確比較。在Transact-SQL中,還提供了LIKE子句用于字符串的模糊比較,即模糊匹配。 7.4.10 IN子 句 : 值 包 含 在 列 表 中在SQL Server中,IN語句主要用于確定指定列的值在子查詢或列表中。IN語句的語法結(jié)構(gòu)如下。test_Expression IN ( subquery | Express
13、ion , n ) 7.4.11 NOT IN子 句 : 值 不 包 含 在 列 表 中當(dāng)然,IN語句與LIKE語句一樣,也可以和NOT語句配合使用。NOT語句將IN語句的值取反,即如果IN語句為TRUE,那么NOT IN子句則為FALSE。這里之所以單獨(dú)列出NOT IN,是因?yàn)橛脩艚?jīng)常用到NOT IN,便于用戶查詢本書。 7.4.12 COMPUTE子 句 : 用 于 生 成 統(tǒng) 計(jì) 信 息COMPUTE子句用于生成統(tǒng)計(jì)信息,并將統(tǒng)計(jì)信息顯示在結(jié)果集的后面。COMPUTE子句的語法結(jié)構(gòu)如下。 COMPUTE AVG | COUNT | MAX | MIN | STDEV | STDEVP |
14、 VAR | VARP | SUM ( Expression ) , n BY Expression , n 7.4.13 COMPUTE BY子 句 : 計(jì) 算 統(tǒng) 計(jì) 信 息COMPUTE BY子句與COMPUTE子句類似,也可能在未來版本中刪除,所以不建議使用。如果使用COMPUTE BY,那么必須使用ORDER BY子句。表達(dá)式的列必須與在ORDER BY中的列相同或是其子集,并且順序相同。例如,如果ORDER BY子句為ORDER BY a,b,c,那么COMPUTE子句的可用形式如下。COMPUTE BY a,b,c。COMPUTE BY a,b。COMPUTE BY a。 7.4
15、.14 列 的 別 名前面的許多示例都用到了列的別名,而且在前面介紹其他類型時,筆者也介紹了列的別名類型。其實(shí),列的別名在SELECT語句中經(jīng)常用到。其中,列的別名類型主要由AS和=來命名。基于前面的介紹,下面將給出一個在查詢中使用列別名的示例。如下SQL語句將查詢數(shù)據(jù)庫database_demo的表,并使用別名顯示查詢到的字段。 7.5 關(guān) 系 連 接在SELECT語句涉及到多個表時,可以用子查詢解決。SQL Server還提供了一組關(guān)鍵字來處理多個表的查詢,這組關(guān)鍵字組成了關(guān)系連接的核心。所謂關(guān)系連接,就是連接查詢這是一種不同于子查詢使用多個表的查詢方式??梢哉f,前面介紹的SQL語句都是基
16、礎(chǔ)語句,在工作中較少用到那樣簡單的語句。連接查詢是最常用、最重要的查詢方式。 7.5.1 連 接 查 詢 介 紹既然兩個表可以用于連接查詢,那么兩個表必須要有聯(lián)系兩個表之間存在相同意義的列。 7.5.2 笛 卡 爾 乘 積上面介紹連接查詢時提到過,SQL Server將參與連接查詢的表的所有記錄進(jìn)行組合并形成笛卡爾積(交叉連接) 。根據(jù)上面介紹的連接查詢的執(zhí)行步驟,用戶不難了解生成和實(shí)現(xiàn)笛卡爾積的方法:在連接查詢中,將WHERE子句、GROUP BY子句、ORDER BY子句以及SELECT語句中的聚合函數(shù)等都省略,直接使用表中的記錄組合形成笛卡爾積。 7.5.3 內(nèi) 部 連 接內(nèi)部連接( I
17、NNER JOIN)是相對于外部鏈接而言的,內(nèi)部連接用來組合兩個或多個表的記錄。通常,內(nèi)部連接按照連接條件,從生成的結(jié)果集中刪除在其他表中沒有被匹配的記錄。根據(jù)內(nèi)部連接使用比較方式的不同,內(nèi)部連接可以分為等值連接、自然連接、不等連接。 7.5.4 使 用 表 別 名表的別名是連接查詢中經(jīng)常用到的處理表的方法。將表名定義為一個簡單的別名,解決了編寫SQL語句時語句過長的問題。其中,表別名的規(guī)則與前面介紹的列的別名相同。這里僅給出一個簡單的SQL示例。USE database_demoGOSELECT tb1.* FROM table_1 AS tb1 7.5.5 外 部 連 接前面介紹的連接查詢
18、都是返回滿足條件的記錄。在工作中,用戶可能遇到這種情況,即顯示某一個表的全部內(nèi)容(包括不符合連接條件的記錄)。這個時候就需要用到外部連接,其可以使不符合條件的記錄也出現(xiàn)在結(jié)果中。 7.5.6 自 連 接這里介紹的自連接是連接查詢的一個特例。所謂自連接,就是表與自身的連接,是內(nèi)部連接的一種。自連接可以使用戶同時操作同一個表的不同行。它使用較少,但是很重要。自連接適用于如下場景:某班級學(xué)生表student中包含了該班學(xué)生今年選修的課程以及課程分?jǐn)?shù)。現(xiàn)在,需要查看同一個學(xué)生的不同學(xué)科的成績。 7.5.7 聯(lián) 合 查 詢 在Transact-SQL中,還有一類查詢,叫聯(lián)合查詢。聯(lián)合查詢是以SELECT語句的結(jié)果集為基礎(chǔ)的。與其說聯(lián)合查詢是一個查詢,不如說聯(lián)合查詢是一個運(yùn)算符。不過,這是一種使用起來不太靈活的查詢方式。除非用戶想將查詢結(jié)果一次性輸出,這時可以使用聯(lián)合查詢。許多聯(lián)合查詢都可以用連接查詢替代,不推薦使用聯(lián)合查詢。 7.6 小 結(jié)本章是本書最為關(guān)鍵的一章,SQL語句是在實(shí)際應(yīng)用中使用最多的部分,每一個DBA都應(yīng)該十分熟練地掌握各種SQL語句。在實(shí)際應(yīng)用中,數(shù)據(jù)操縱語言最為關(guān)鍵,由其是SELECT語句,十分靈活,體現(xiàn)了第四代計(jì)算機(jī)語言的特點(diǎn)。與其配合的各種常見語句,為準(zhǔn)確查詢到可用數(shù)據(jù)提供技術(shù)保障。