版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第三章關系數(shù)據(jù)庫語言SQL3.1SQL概述3.2SQL語言的數(shù)據(jù)類型
3.3數(shù)據(jù)定義3.4數(shù)據(jù)查詢3.5數(shù)據(jù)更新—數(shù)據(jù)庫應用基礎
3.1
SQL概述
3.1.1SQL的特點
3.1.2SQL基本概念
3.1.3SQL語言的組成
3.1.4SQL語句分類
3.1.1SQL的特點
SQL的特點綜合統(tǒng)一高度非過程化面向集合的操作方式以同一種語法結(jié)構(gòu)提供兩種使用方法語言簡潔,易學易用3.1.2SQL基本概念
SQL語言支持數(shù)據(jù)庫的三級模式結(jié)構(gòu)
基本表(BaseTable
)
基本表是獨立存在于數(shù)據(jù)庫中的表,是“實表”。一個關系對應一個基本表,一個或多個基本表對應一個存儲文件。
視圖(View
)
視圖是從一個或幾個基本表(或視圖)導出的表,是“虛表”。它本身不獨立存在于數(shù)據(jù)庫中,數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對應的數(shù)據(jù),這些數(shù)據(jù)仍存放在導出視圖的基本表中。當基本表中的數(shù)據(jù)發(fā)生變化時,從視圖中查詢出來的數(shù)據(jù)也隨之改變。
存儲文件
數(shù)據(jù)庫的所有信息都保存在存儲文件中。數(shù)據(jù)庫是邏輯的,存儲文件是物理的。用戶操作的數(shù)據(jù)庫,實際上最終都是操作存儲文件。一個基本表可以用一個或多個存儲文件存儲,存儲文件的物理結(jié)構(gòu)對用戶是透明的。表中的記錄通常按其輸入的時間順序存放,這種順序稱為記錄的物理順序。為了實現(xiàn)對表記錄的快速查詢,可以對表文件中的記錄按某個和某些屬性進行排序,這種順序稱為邏輯順序。索引即是根據(jù)索引表達式的值進行邏輯排序的一組指針,它可以實現(xiàn)對數(shù)據(jù)的快速訪問。索引是關系數(shù)據(jù)庫的內(nèi)部實現(xiàn)技術,屬于內(nèi)模式,被存放在存儲文件中。索引
3.1.3SQL語言的組成(1)數(shù)據(jù)定義語言DDL(DataDefinitionLanguage)。定義數(shù)據(jù)庫結(jié)構(gòu),包括定義表、視圖和索引等。(2)數(shù)據(jù)操縱語言DML(DataManipulationLanguage)。主要包括查詢、插入、刪除和修改數(shù)據(jù)庫中數(shù)據(jù)的操作。(3)數(shù)據(jù)控制語言DCL(DataControlLanguage)。包括對數(shù)據(jù)庫的安全性控制、完整性控制以及對事務的定義、并發(fā)控制和恢復等。
(1)數(shù)據(jù)定義。其功能是創(chuàng)建、更新和撤銷模式及其對象。包含的語句動詞主要有:CREATE、DROP、ALERT。(2)數(shù)據(jù)查詢。其功能是進行數(shù)據(jù)庫的數(shù)據(jù)查詢。包含的語句動詞主要有:SELECT。(3)數(shù)據(jù)操縱。其功能是完成數(shù)據(jù)庫的數(shù)據(jù)更新。包含的語句動詞主要有:INSERT、UPDATE、DELETE。(4)數(shù)據(jù)控制。其功能是進行數(shù)據(jù)庫的授權(quán)、事務管理和控制。包含的語句動詞主要有:GRANT、REVOKE、COMMIT、ROLLBACK等。3.1.4SQL語句分類3.2
SQL語言的數(shù)據(jù)類型SQL語言在定義表中各屬性時,要求指明其數(shù)據(jù)類型和長度。SQL語言提供了一些基本數(shù)據(jù)類型,而不同RDBMS所支持的數(shù)據(jù)類型不完全相同,在使用時要注意具體的RDBMS規(guī)定。
T-SQL數(shù)據(jù)類型T-SQL常用數(shù)據(jù)類型包括:數(shù)值型字符型
Unicode字符型文本型日期時間類型二進制型貨幣類型數(shù)值型包括整型(bigint、int、smallint、tinyint、bit)、定點實數(shù)(numericdecimal)、浮點數(shù)(float、real),各數(shù)值類型的取值范圍、存儲字節(jié)數(shù)都有差異(詳見教材列表)。要注意,bit類型數(shù)據(jù)相當于其他語言中的邏輯型數(shù)據(jù),它只存儲0和1。當為bit類型數(shù)據(jù)賦值0時,其值為0;而賦非0(如100)值時,其值為1。數(shù)值型字符型字符型數(shù)據(jù)用于存儲字符串。字符串中可包括字母、數(shù)字和其他特殊符號(如#、@、&等),也可包含漢字。字符串型包括兩類:定長字符串char和變長字符串varchar。
Unicode字符型
Unicode是“統(tǒng)一字符編碼標準”,用于支持國際上非英語語種的字符數(shù)據(jù)的存儲和處理。SQLServer的Unicode字符型可以存儲Unicode標準字符集定義的各種字符。
Unicode字符型包括nchar[(n)]和nvarchar[(n)]兩類。nchar是固定長度Unicode數(shù)據(jù)的數(shù)據(jù)類型,nvarchar
是可變長度Unicode數(shù)據(jù)的數(shù)據(jù)類型,二者均使用UNICODEUCS-2字符集。nchar、nvarchar與char、varchar使用非常相似,只是字符集不同(前者使用Unicode字符集,后者使用ASCII字符集)。當需要存儲大量的字符數(shù)據(jù),如較長的備注、日志信息時,字符型數(shù)據(jù)最長8000個字符的限制可能使它們不能滿足這種應用需求,此時可使用文本型數(shù)據(jù)。文本型包括text和ntext兩類,分別對應ASCII字符和Unicode字符。文本型日期時間類型數(shù)據(jù)用于存儲日期和時間信息,包括datetime和smalldatetime兩類。
datetime類型可表示從1753年1月1日到9999年12月31日的日期和時間數(shù)據(jù)。smalldatetime類型可表示從1900年1月1日到2079年6月6日的日期和時間數(shù)據(jù)。用戶以字符串形式輸入日期時間類型數(shù)據(jù),系統(tǒng)也以字符串形式輸出日期時間類型數(shù)據(jù)。用戶給出日期時間類型數(shù)據(jù)值時,日期部分和時間部分分別給出。日期部分常用的幾種格式如下:Oct102009 /*英文數(shù)字格式*/2009-10-10 /*數(shù)字加分隔符*/20091010 /*純數(shù)字格式*/
日期時間類型
二進制型
二進制數(shù)據(jù)類型表示位數(shù)據(jù)流。①binary[(n)]。固定長度的n字節(jié)二進制數(shù)據(jù)。n取值范圍為1~8000,默認為1。binary(n)數(shù)據(jù)的存儲長度為n+4字節(jié)。若輸入的數(shù)據(jù)長度小于n,則不足部分用0填充;若輸入的數(shù)據(jù)長度大于n,則多余部分被截斷。②varbinary[(n)]。n字節(jié)變長二進制數(shù)據(jù)。n取值范圍為1~8000,默認為1。varbinary(n)數(shù)據(jù)的存儲長度為實際輸入數(shù)據(jù)長度+4字節(jié)。③image。用于存儲大容量的、可變長度的二進制數(shù)據(jù),介于0~2311(2147483647)字節(jié)之間。
貨幣類型
money和smallmoney是兩個專用于貨幣的數(shù)據(jù)類型,它們用十進制數(shù)表示貨幣值。
money的數(shù)據(jù)范圍與bigint相同,不同的只是money型有4位小數(shù)。實際上,money型數(shù)據(jù)就是按照整數(shù)進行運算的,只是將小數(shù)點固定在末4位。smallmoney與int的關系就如同money與bigint的關系一樣。當向表中插入money或smallmoney類型值時,必須在數(shù)據(jù)前面加上貨幣符號($),并且數(shù)據(jù)中間不能有逗號(,);若貨幣值為負數(shù),需要在符號$的后面加上負號()。例如,$15000.32,$680,$20000.9088都是正確的貨幣數(shù)據(jù)表示形式。3.3
數(shù)據(jù)定義
3.3.1模式定義
3.3.2基本表定義
3.3.3索引定義
3.3.4視圖定義
模式定義即定義一個存儲空間。一個SQL模式由模式名、用戶名或賬號來確定。在這個空間中可以進一步定義該模式包含的數(shù)據(jù)庫對象,如基本表、視圖、索引等。
SQL3標準的模式定義語句是CREATESCHEMA。但由于“模式”這個名稱較抽象,多數(shù)RDBMS不采用該名詞,而采用“數(shù)據(jù)庫”這一名稱。這個數(shù)據(jù)庫概念將數(shù)據(jù)庫視為許多對象的容器。在SQL標準中沒有CREATEDATABASE語句,但多數(shù)SQL產(chǎn)品都支持CREATEDATABASE創(chuàng)建數(shù)據(jù)庫的語句。3.3.1模式定義(1)定義數(shù)據(jù)庫
T-SQL定義數(shù)據(jù)庫的基本格式為:
CREATEDATABASE<數(shù)據(jù)庫名>
說明:①T-SQL語句通常還包含各種子句,如CREATEDATABASE語句包含ON子句、LOGON子句等。②SQLServer的大多數(shù)數(shù)據(jù)庫操作都有兩種方式:一是命令方式,二是界面方式。例如,定義數(shù)據(jù)庫,既可采用這里介紹的CREATEDATABASE語句,也可通過SQLServerManagementStudio界面操作實現(xiàn)。(2)使用數(shù)據(jù)庫語句格式為:
USE<數(shù)據(jù)庫名>
使用USE語句將<數(shù)據(jù)庫名>選擇為當前操作的數(shù)據(jù)庫。一旦選定,若不對操作的數(shù)據(jù)庫對象加以限定,則其后命令均是針對當前數(shù)據(jù)庫中的表或視圖進行的。(3)修改數(shù)據(jù)庫基本語句格式為:
ALTERDATABASE<數(shù)據(jù)庫名>
該語句可以對指定的數(shù)據(jù)庫的數(shù)據(jù)文件和日志文件等進行修改。(4)刪除數(shù)據(jù)庫基本語句格式為:
DROPDATABASE<數(shù)據(jù)庫名>
刪除數(shù)據(jù)庫后,該數(shù)據(jù)庫的所有對象均被刪除,將不能再對該數(shù)據(jù)庫做任何操作。3.3.2基本表定義定義基本表的實質(zhì)就是定義表結(jié)構(gòu)及約束等。在T-SQL語句定義表之前,先要設計表結(jié)構(gòu),即確定表的名字、所包含的列名、列的數(shù)據(jù)類型、長度、是否可為空值、默認值情況、是否要使用以及何時使用約束、默認設置或規(guī)則以及所需索引的類型、哪里需要索引、哪些列是主碼、哪些列是外碼等。
“商品訂購數(shù)據(jù)庫”結(jié)構(gòu)數(shù)據(jù)庫名:SPDG包括三個基本表:客戶信息表(表名:KHB)商品信息表(表名:SPB)商品訂購表(表名:SPDGB)
客戶信息表(表名:KHB)
列
名數(shù)
據(jù)
類
型是否可取空值含
義說
明客戶編號char(6)否客戶編號主碼客戶姓名char(20)否客戶姓名出生日期datetime可出生日期性別char(2)可客戶性別所在省市varchar(50)可所在地省市聯(lián)系電話varchar(12)可聯(lián)系電話備注Text可有關客戶的說明商品信息表(表名:SPB)
列
名數(shù)
據(jù)
類
型是否可取空值含
義說
明商品編號char(8)否商品編號主碼商品類別char(20)否商品類別商品名稱varchar(50)否商品名稱單價float可該商品的單價生產(chǎn)商varchar(50)可商品生產(chǎn)商的名稱保質(zhì)期datetime可商品的保質(zhì)期默認值為'2000-01-01',表示該商品無保質(zhì)期庫存量int可該商品的庫存量備注text可關于商品的說明商品訂購表(表名:SPDGB)
列
名數(shù)
據(jù)
類
型是否可取空值含
義說
明客戶編號char(6)否客戶編號外碼商品編號char(8)否商品編號外碼訂購時間datetime否客戶訂購商品的時間數(shù)量int可客戶訂購該商品的數(shù)量需要日期datetime可客戶指出的需要獲得該商品的日期付款方式varchar(40)可客戶的支付方式送貨方式varchar(50)可客戶獲取商品的方式(1)定義基本表定義基本表的的基本格式為:CREATETABLE<基本表名>( <列名><數(shù)據(jù)類型>[<列級完整性約束>] {,<列名><數(shù)據(jù)類型>[<列級完整性約束>]} [,<表級完整性約束>])
在定義基本表的同時還可定義該表有關的完整性約束。其中列級完整性約束的作用范圍僅限于該列,而表級完整性約束的作用范圍是整個表。
列級完整性約束①NOTNULL限制列取值不能為空。②DEFAULT指定列的默認值。③UNIQUE限制列的取值不能重復。④CHECK限制列的取值范圍。⑤PRIMARYKEY指定本列為主碼。⑥FOREIGNKEY指定本列為引用其他表的外碼。格式為:[FOREIGNKEY(<外碼列名>)]REFERENCE<外表名>(<外表列名>)
【例】定義SPDGB數(shù)據(jù)庫的三個基本表。
創(chuàng)建KHB的SQL語句:CREATETABLEKHB(
客戶編號char(5)PRIMARYKEY,
客戶名稱char(20)NOTNULL,
出生日期datetime,
性別char(2),
所在省市varchar(50),
聯(lián)系電話varchar(12),
備注text)
創(chuàng)建SPB的SQL語句:CREATETABLESPB(
商品編號char(8)PRIMARYKEY,
商品類別char(20)NOTNULL,
商品名稱varchar(50)NOTNULL,
單價float,
生產(chǎn)商varchar(50),
保質(zhì)期datetimeDEFAULT'2000-1-1',
庫存量int,
備注text)創(chuàng)建SPDGB的SQL語句:CREATETABLESPDGB(
客戶編號char(5)NOTNULL,
商品編號char(8)NOTNULL,
訂購時間datetimeNOTNULL,
數(shù)量int,
需要日期datetime,
付款方式varchar(40),
送貨方式varchar(50),PRIMARYKEY(客戶編號,商品編號,訂購時間),FOREIGNKEY(客戶編號)REFERENCESKHB(客戶編號),FOREIGNKEY(商品編號)REFERENCESSPB(商品編號))(2)修改基本表ALERTTABLE語句用于更改基本表結(jié)構(gòu),包括增加列、刪除列、修改已有列的定義等。該語句的基本格式為:ALTERTABLE<基本表名>ALTERCOLUMN<列名><新數(shù)據(jù)類型>[NULL|NOTNULL] --修改已有列定義
|ADD<列名><數(shù)據(jù)類型>[約束]--增加新列
|DROPCOLUMN<列名>--刪除列
|ADD[CONSTRAINT<約束名>]<約束定義>
--添加約束
|DROPCONSTRAINT<約束名> --刪除約束
示例【例】在表SPB中增加1個新列——商品圖片。ALTERTABLESPBADD商品圖片image【例】將表SPB中“保質(zhì)期”列的數(shù)據(jù)類型改為smalldatetime。ALTERTABLESPBALTERCOLUMN保質(zhì)期smalldatetime【例】刪除表SPB中“商品圖片”列。ALTERTABLESPBDROPCOLUMN商品圖片
(3)刪除基本表
DROPTABLE語句用于刪除基本表,其語法格式:DROPTABLE<基本表名>【例】刪除表SPB的SQL語句為:DROPTABLESPB刪除一個表時,表的定義、表中的所有數(shù)據(jù)以及表的索引、觸發(fā)器、約束等均被刪除。注意:不能刪除系統(tǒng)表和有外碼約束所參照的表。
3.3.3索引定義在數(shù)據(jù)庫中建立索引是為了提高數(shù)據(jù)查詢速度。查詢是數(shù)據(jù)庫使用最頻繁的操作,如何能更快地找到所需數(shù)據(jù),是數(shù)據(jù)庫的一項重要任務。
(1)索引的概念(2)
索引分類聚簇索引(ClusteredIndex)對表的物理數(shù)據(jù)頁中的數(shù)據(jù)按索引關鍵字進行排序,然后重新存儲到磁盤上,即聚簇索引與數(shù)據(jù)是一體的。非聚簇索引(NonclusteredIndex)具有完全獨立于數(shù)據(jù)的索引結(jié)構(gòu),它不將物理數(shù)據(jù)頁中的數(shù)據(jù)按索引關鍵字排序。
(3)建立索引建立索引使用語句CREATEINDEX,其基本格式為:
CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEX<索引名>ON<基本表名>(<列名>[ASC|DESC][{,<列名>[ASC|DESC]}…])其中,<基本表名>是要建立索引的基本表的名稱。當索引建立在多個列上時,該索引稱為復合索引。復合索引各列之間要用逗號(,)分隔,每個列后面還可以用ASC或DESC表示按索引值按升序或降序排列。默認排序方式為ASC(升序)。UNIQUE表示創(chuàng)建的是唯一索引。CLUSTERED用于指定創(chuàng)建聚簇索引,NONCLUSTERED用于指定創(chuàng)建非聚簇索引。默認創(chuàng)建的是非聚簇索引。
示例【例】在KHB表的“客戶編號”列上建立一個非聚簇索引KHBH_ind。CREATEINDEXKHBH_ind
ONKHB(客戶編號)【例】在SPB表的“商品編號”列上建立一個唯一的聚簇索引SPBH_ind。CREATEUNIQUECLUSTEREDINDEXSPBH_ind
ONSPB(商品編號)【例】在SPDGB表上按“客戶編號”升序、“商品編號”升序、“訂購時間”降序建立一個唯一的非聚簇索引SPDG_ind。CREATEUNIQUEINDEXSPBH_ind
ONSPDGB(客戶編號ASC,商品編號ASC,訂購時間DESC)(4)刪除索引索引一經(jīng)建立,就由DBMS自動使用和維護,無須用戶干預。當不需要某個索引時,可使用DROPINDEX語句將其刪除。DROPINDEX語句的格式為:
DROPINDEX<基本表名>.<索引名>【例】刪除KHB表“客戶編號”列的索引KHBH_ind。
DROPINDEXKHB.KHBH_ind3.3.4視圖定義視圖是從一個或多個基本表(或視圖)導出的表。視圖是一個虛表,數(shù)據(jù)庫中只存儲視圖的定義,而不存放視圖對應的數(shù)據(jù),這些數(shù)據(jù)仍然存放在原來的基本表中。視圖是數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫中數(shù)據(jù)的重要機制。(1)視圖的概念視圖的優(yōu)點
①為用戶集中數(shù)據(jù),簡化用戶的數(shù)據(jù)查詢和處理。有時用戶所需要的數(shù)據(jù)分散在多個表中,定義視圖可將它們集中在一起,從而方便用戶的數(shù)據(jù)查詢和處理。②屏蔽數(shù)據(jù)庫的復雜性。用戶不必了解復雜的數(shù)據(jù)庫表結(jié)構(gòu),并且數(shù)據(jù)庫表的更改也不影響用戶對數(shù)據(jù)庫的使用。③簡化用戶權(quán)限管理。只需授予用戶使用視圖的權(quán)限,而不必指定用戶只能使用表的特定列,增加了安全性。④便于數(shù)據(jù)共享。各用戶不必都定義和存儲自己所需的數(shù)據(jù),可共享數(shù)據(jù)庫的數(shù)據(jù),同樣的數(shù)據(jù)只需存儲一次。⑤可以重新組織數(shù)據(jù)以便輸出到其他應用程序中。使用視圖的注意事項
①只有在當前數(shù)據(jù)庫中才能創(chuàng)建視圖。②視圖的命名必須遵循標識符命名規(guī)則,不能與表同名,且對每個用戶視圖名必須是唯一的,即對不同用戶,即使是定義相同的視圖,也必須使用不同的名字。③不能在視圖上建立索引。
(2)定義視圖
CREATEVIEW語句用于創(chuàng)建視圖,其基本格式為:
CREATEVIEW<視圖名> [(<列名>[,<列名>])] AS <SELECT查詢語句>
其中,SELECT是SQL查詢語句,表示從表中選擇指定列構(gòu)成視圖的各個列。當列名省略時,表示SELECT取所有列。
示例
【例】創(chuàng)建視圖KH_NJview,其內(nèi)容為“江蘇南京”的客戶信息。CREATEVIEWKH_NJviewASSELECT*FROMKHBWHERE所在省市='江蘇南京‘【例】創(chuàng)建視圖DG_NJview,其內(nèi)容為“江蘇南京”的“客戶編號”及其訂購的“商品編號”。CREATEVIEWDG_NJviewASSELECTa.*,商品編號FROMKHBa,SPDGBbWHEREa.所在省市='江蘇南京'ANDa.客戶編號=b.客戶編號
示例
【例】創(chuàng)建“江蘇南京”訂購了編號為“10010001”商品的所有客戶的客戶編號、客戶姓名視圖DG_NJview_2。CREATEVIEWDG_NJview_2(客戶編號,客戶姓名)ASSELECT客戶編號,客戶姓名FROMDG_NJviewWHERE商品編號='10010001'使用ALTERVIEW語句可修改視圖的定義,該語句基本格式為:ALTERVIEW<視圖名>[(<列名>[,<列名>])] AS <SELECT查詢語句>(3)修改視圖
示例
【例】修改視圖DG_NJview_2,使其內(nèi)容是選購了編號為“30010001”的所有“江蘇南京”客戶的客戶編號、客戶姓名。ALTERVIEWDG_NJview_2ASSELECT客戶編號,客戶姓名FROMDG_NJviewWHERE商品編號='30010001'刪除視圖的語句是DROPVIEW,其基本格式為:DROPVIEW<視圖名>
刪除視圖不會影響基本表的數(shù)據(jù)。但如果被刪視圖還導出了其他視圖,則對由其導出的視圖執(zhí)行操作將會發(fā)生錯誤。【例】刪除視圖DG_NJview。DROPVIEWDG_NJview當視圖DG_NJview被刪除后,對由其導出的視圖DG_NJview_2進行操作將會發(fā)生錯誤。
(4)刪除視圖
3.4數(shù)據(jù)查詢
3.4.1SELECT語句結(jié)構(gòu)
3.4.2單表查詢
3.4.3連接查詢
3.4.4嵌套查詢
3.4.5集合查詢3.4.6視圖查詢
3.4.1SELECT語句結(jié)構(gòu)
SELECT語句的基本格式如下:SELECT[ALL|DISTINCT]<目標列表達式>[,<目標列表達式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達式>] --WHERE子句,指定查詢條件[GROUPBY<列名1>] --GROUPBY子句,指定分組表達式[HAVING<條件表達式>] --HAVING子句,指定分組過濾條件[ORDERBY<列名2>[ASC|DESC]] --ORDER子句,指定排序表達式和順序*--選擇當前表或視圖的所有列
|<表名>.*|<視圖名>.*|<表的別名>.*
--選擇指定的表或視圖的所有列
|列名[AS<列別名>]--選擇指定的列
|<表達式> --選擇表達式
例如,以下是對KHB表的查詢語句:SELECT客戶編號,客戶姓名,聯(lián)系電話
FROMKHBWHERE所在省市='江蘇南京'<目標列表達式>的定義
3.4.2單表查詢
1.選擇列
2.選擇行
3.對查詢結(jié)果排序4.聚合函數(shù)5.對查詢結(jié)果分組6.使用HAVING子句進行篩選
1.選擇列選擇表中的部分或全部列形成結(jié)果表相當于:關系代數(shù)的投影運算
【例】查詢SPB中的商品編號、商品名稱和庫存量。SELECT商品編號,商品名稱,庫存量
FROMSPB(1)選擇表中指定的列選擇表中全部列,可在SELECT語句中指出各列的名稱,更簡便的方法是在指定列的位置上使用“*”。【例】查詢SPB中的所有列。SELECT商品編號,商品類別,商品名稱,生產(chǎn)商,單價,保質(zhì)期,庫存量,備注
FROMSPB或者SELECT*FROMSPB
(2)選擇表中全部列
(3)查詢經(jīng)過計算的值使用SELECT對列進行查詢時,不僅可以直接以列的原始值作為結(jié)果,而且還可以將對列值進行計算后所得的值作為查詢結(jié)果,即SELECT子句可使用表達式作為結(jié)果?!纠繉PB中各商品的編號及其打8折后的單價輸出。SELECT商品編號,單價*0.8FROMSPB
(4)更改結(jié)果列標題當希望查詢結(jié)果中的某些列或所有列顯示時使用自己選擇的列標題時,可以在列名之后使用AS子句來更改查詢結(jié)果的列標題名?!纠坎樵僈HB表中的客戶編號、客戶姓名和聯(lián)系電話,結(jié)果中各列的標題分別指定為CNO、CNAME和TEL。SELECT客戶編號ASCNO,客戶姓名ASCNAME,聯(lián)系電話ASTELFROMKHB
(5)替換查詢結(jié)果中的數(shù)據(jù)在對表進行查詢時,有時對所查詢的某些列希望得到一種概念而不是具體數(shù)據(jù)。要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達式,格式如下:CASEWHEN條件1THEN表達式1WHEN條件2THEN表達式2……ELSE表達式END示例SELECT商品編號,商品名稱,價格等級=CASEWHEN單價ISNULLTHEN'尚未定價'WHEN單價<20THEN'低'WHEN單價>=20AND單價<=50THEN'中'WHEN單價>50AND單價<=100THEN'較高'ELSE'高'ENDFROMSPB(6)去除重復行
一個表中本來并不完全相同的元組,當投影到指定的某些列上時,就可能變成相同的行了。可以用DISTINCT語句取消它們?!纠吭赟PDGB表中查詢訂購了商品的客戶編號。SELECT客戶編號
FROMSPDGB2.選擇行選擇表中的部分或全部元組形成結(jié)果表相當于:關系代數(shù)的投影運算
查詢滿足條件的行通過WHERE子句實現(xiàn)。WHERE子句必須緊跟FROM子句之后。構(gòu)成WHERE子句的條件表達式的運算符也稱謂詞。謂詞包括:比較運算、指定范圍、確定集合、字符匹配、空值比較和邏輯運算等幾類。可以將多個判定運算的結(jié)果通過邏輯運算符再組成更為復雜的查詢條件。
查詢滿足條件的元組常用查詢條件查
詢
條
件謂
詞比較運算<=,<,=,>=,>,<>,!=(不等于)、!<(不小于)、!>(不大于)指定范圍BETWEENAND,NOTBETWEENAND確定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值比較ISNULL,ISNOTNULL邏輯運算AND,OR,NOTSELECT語句的ORDERBY子句可用于對查詢結(jié)果按照一個或多個列、表達式或序號進行升序(ASC)或降序(DESC)排列,默認值為升序(ASC)。ORDERBY子句的格式如下:ORDERBY<列名1>[ASC|DESC][,<列名2>[ASC|DESC]…]當按多個列排序時,前面列的優(yōu)先級高于后面的列。3.對查詢結(jié)果排序【例】將KHB表中的所有客戶按所在省市的漢語拼音順序排序。SELECT*FROMKHBORDERBY所在省市
【例】將KHB表中的所有客戶按姓名的漢語拼音升序、再按年齡由小到大排序。SELECT*FROMKHBORDERBY客戶姓名ASC,出生日期DESC示例SELECT子句表達式可以包含聚合函數(shù)(AggregateFunction,也稱統(tǒng)計、組、集合或列函數(shù)),用來增強查詢功能。聚合函數(shù)是指對集合操作但只返回單個值的函數(shù)。使用聚合函數(shù)須遵循以下規(guī)則:①帶有一個聚合函數(shù)的SELECT語句僅產(chǎn)生一行作為結(jié)果。②不允許嵌套使用聚合函數(shù)。幾種表達式形式可用作聚合函數(shù)的參數(shù),但不能作為聚合函數(shù)本身。③如果SELECT子句包含一個或多個聚合函數(shù),則SELECT子句中的列規(guī)范僅發(fā)生在聚合函數(shù)內(nèi)。
4.聚合函數(shù)常用聚合函數(shù)函
數(shù)
名說
明AVG求組中值的平均值COUNT求組中項數(shù),返回int類型整數(shù)MAX求最大值MIN求最小值SUM返回表達式中所有值的和SUM和AVG分別用于求表達式中所有值項的總和與平均值,語法格式如下:SUM|AVG([ALL|DISTINCT]<表達式>)
【例】查詢SPB表中所有商品的平均單價。SELECTAVG(單價)AS'平均單價'FROMSPB
SUM和AVGMAX和MIN分別用于求表達式中所有項的最大值與最小值,語法格式如下:MAX|MIN([ALL|DISTINCT]<表達式>)【例】查詢SPB表中最高和最低單價。SELECTMAX(單價)AS'最高單價',MIN(單價)AS'最低單價'FROMSPBMAX和MIN
COUNT用于統(tǒng)計組中滿足條件的行數(shù)或總行數(shù),格式如下:COUNT({[ALL|DISTINCT]<表達式>}|*)
【例】查詢客戶總數(shù)。SELECTCOUNT(*)AS'客戶總數(shù)'FROMKHB
【例】查詢訂購了編號為“10010001”的商品的客戶數(shù)。SELECTCOUNT(*)AS'客戶數(shù)'FROMSPDGBWHERE商品編號='10010001'
COUNT
SELECT語句的GROUPBY子句用于將查詢結(jié)果表按某一列或多列值進行分組,值相等的為一組。對查詢結(jié)果分組的主要目的是為了細化聚合函數(shù)的作用對象。GROUPBY子句的基本格式如下:GROUPBY<表達式>
注意:使用GROUPBY子句后,SELECT子句列表中只能包含GROUPBY中指出的列或在聚合函數(shù)中指定的列。
5.對查詢結(jié)果分組【例】查詢各種商品的訂購客戶數(shù)。SELECT商品編號,COUNT(*)AS'訂購客戶數(shù)'FROMSPDGBGROUPBY商品編號
示例如果查詢結(jié)果集在使用GROUPBY子句分組后,還需要按條件進一步對這些組進行篩選,最終只輸出滿足指定條件的組,那么可以使用HAVING子句來指定篩選條件。HAVING子句須與GROUPBY子句結(jié)合使用。HAVING子句的格式如下:[HAVING<查詢條件>]
6.使用HAVING子句進行篩選【例】查找訂購客戶數(shù)超過1的商品。SELECT商品編號,COUNT(*)AS'訂購客戶數(shù)'FROMSPDGBGROUPBY商品編號HAVING訂購客戶數(shù)>1
【例】查找同一省市且在1975年以后出生、客戶數(shù)不少于2的省市。SELECT所在省市FROMKHBWHERE出生日期>'1975-1-1'GROUPBY所在省市HAVINGCOUNT(*)>=2
示例3.4.3連接查詢
若一個查詢同時涉及兩個或兩個以上的表,則稱為連接查詢。連接是二元運算,類似于關系代數(shù)中的連接操作??梢詫蓚€或多個表進行查詢,結(jié)果通常是含有參加連接運算的兩個表(或多個表)的指定列的表。
連接查詢有兩種形式:
1.連接謂詞
2.以JOIN關鍵字指定的連接
連接謂詞又稱連接條件,其一般格式如下:[<表名1.>]<列名1><比較運算符>[<表名2.>]<列名2>[<表名1.>]<列名1>BETWEEN[<表名2.>]<列名2>AND[<表名2.>]<列名3>其中,謂詞主要有<、<=、=、>、>=、!=、<>、!<和!>。當謂詞為“=”時,就是等值連接。若在目標列中去除相同的字段名,則為自然連接??捎眠壿嬤\算符AND和OR來連接多個連接謂詞,實現(xiàn)復雜條件的連接查詢。
1.連接謂詞【例】查找SPDG數(shù)據(jù)庫每個訂購了商品的客戶及其訂單情況。SELECTKHB.*,SPDGB.*FROMKHB,SPDGBWHEREKHB.客戶編號=SPDGB.客戶編號
【例】查找SPDG數(shù)據(jù)庫每個訂購了商品的客戶及其訂單情況,去除重復的列。SELECTa.*,b.商品編號,b.訂購時間,b.數(shù)量,b.需要日期,b.付款方式,b.送貨方式
FROMKHBa,SPDGBbWHEREa.客戶編號=b.客戶編號
示例【例】查找SPDG數(shù)據(jù)庫訂購了編號為“10010001”商品的客戶編號、姓名、所在省市及其聯(lián)系電話。SELECTDISTINCTa.客戶編號,客戶姓名,所在省市,聯(lián)系電話FROMKHBa,SPDGBbWHEREa.客戶編號=b.客戶編號AND商品編號='10010001'
【例】查找訂購了“體育用品”類別商品的客戶的客戶編號、客戶姓名、聯(lián)系電話和所訂購商品的需要日期,并按需要日期排序。SELECTDISTINCTa.客戶編號,客戶姓名,聯(lián)系電話,需要日期FROMKHBa,SPBb,SPDGBcWHEREa.客戶編號=c.客戶編號ANDb.商品編號=c.商品編號AND商品類別='體育用品'ORDERBY需要日期
示例【例】在KHB表中查詢具有相同姓名的客戶信息。SELECTKH1.*FROMKHBKH1,KHBKH2WHEREKH1.客戶姓名=KH2.客戶姓名ANDKH1.客戶編號<>KH2.客戶編號
示例在FROM子句的擴展定義中:--INNERJOIN表示內(nèi)連接--OUTERJOIN表示外連接2.以JOIN關鍵字指定的連接內(nèi)連接按照ON所指定的連接條件合并兩個表,返回滿足條件的行。其語法格式如下:FROM<表名1>JOIN<表名2>ON<表名1.列名>=<表名2.列名>【例】查找SPDG數(shù)據(jù)庫每個訂購了商品的客戶及其訂單情況。SELECT*FROMKHBINNERJOINSPDGBONKHB.客戶編號=SPDGB.客戶編號(1)內(nèi)連接【例】用FROM的JOIN關鍵字表達下列查詢:查詢訂購了商品編號為“10010001”的客戶姓名及聯(lián)系電話。SELECTDISTINCT客戶姓名,聯(lián)系電話FROMKHBINNERJOINSPDGBONKHB.客戶編號=SPDGB.客戶編號WHERE商品編號='10010001'
【例】用FROM的JOIN關鍵字表達下列查詢:在SPDG數(shù)據(jù)庫中查詢訂購了類別為“體育用品”的客戶的客戶編號、客戶姓名、聯(lián)系電話以及商品的需要日期。SELECTDISTINCTKHB.客戶編號,客戶姓名,聯(lián)系電話,需要日期FROMKHBJOINSPBJOINSPDGBONSPB.商品編號=SPDGB.商品編號ONKHB.客戶編號=SPDGB.客戶編號WHERE商品類別='體育用品'示例外連接的結(jié)果表不但包含滿足連接條件的行,還包括相應表中的所有行。外連接包括三種:①左外連接(LEFTOUTERJOIN),結(jié)果表中除了包括滿足連接條件的行外,還包括左表的所有行;②右外連接(RIGHTOUTERJOIN),結(jié)果表中除了包括滿足連接條件的行外,還包括右表的所有行;③完全外連接(FULLOUTERJOIN),結(jié)果表中除了包括滿足連接條件的行外,還包括兩個表的所有行。其中OUTER關鍵字均可省略。
(2)外連接【例】查找所有客戶情況,及他們訂購商品的編號。若客戶沒有任何訂購商品記錄,也要包括其基本信息。SELECTKHB.*,商品編號FROMKHBLEFTJOINSPDGBONKHB.客戶編號=SPDGB.客戶編號【例】用右外連接實現(xiàn)上例的查詢。SELECTKHB.*,商品編號FROMSPDGBRIGHTJOINKHBONKHB.客戶編號=SPDGB.客戶編號示例3.4.4嵌套查詢
在SQL語言中,一個SELECT-FROM-WHERE語句稱為一個查詢塊。在WHERE子句或HAVING子句所表示的條件中,可以使用另一個查詢的結(jié)果(即一個查詢塊)作為條件的一部分。這種將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING子句的條件查詢稱為嵌套查詢。
在嵌套查詢中,子查詢的結(jié)果往往是一個集合,所以IN是嵌套查詢中最常使用的謂詞。IN子查詢用于進行一個給定值是否在子查詢結(jié)果集中的判斷,格式如下:<表達式>[NOT]IN(子查詢)當<表達式>與<子查詢>的結(jié)果表中的某個值相等時,IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。
注意:IN和NOTIN子查詢只能返回一列數(shù)據(jù)。
1.帶IN謂詞的子查詢
【例】查找與“張小林”在同一個省市的客戶情況。SELECT*FROMKHBWHERE所在省市IN(SELECT所在省市
FROMKHB WHERE客戶姓名='張小林')
執(zhí)行:先執(zhí)行子查詢,產(chǎn)生一個結(jié)果表,再執(zhí)行父查詢。
示例【例】查找未訂購“食品”類商品的客戶情況。SELECT*FROMKHBWHERE客戶編號NOTIN (SELECT客戶編號
FROMSPDGB WHERE商品編號IN (SELECT商品編號
FROMSPB WHERE商品類別='食品' ))示例
比較子查詢是指父查詢與子查詢之間用比較運算符進行關聯(lián)。如果能夠確切地知道子查詢返回的是單個值,就可以使用比較子查詢。這種子查詢可認為是IN子查詢的擴展,它使表達式的值與子查詢的結(jié)果進行比較運算,基本格式如下:<表達式>{<|<=|=|>|>=|!=|<>|!<|!>}(子查詢)2.帶比較運算符的子查詢
【例】在SPDGB表中查找訂購了商品編號為“10010001”的商品、且訂購數(shù)量超過全表中該商品平均訂購數(shù)的記錄。SELECT*FROMSPDGBWHERE商品編號='10010001'AND數(shù)量>(SELECTAVG(數(shù)量)FROMSPDGBWHERE商品編號='10010001')
示例【例】找出每個客戶超過他訂購商品平均數(shù)量的商品編號。SELECT客戶編號,商品編號
FROMSPDGBaWHERE數(shù)量>(SELECTAVG(數(shù)量)FROMSPDGBbWHEREb.客戶編號=a.客戶編號)
說明:這是一個相關子查詢,內(nèi)層查詢的條件:a.客戶編號=b.客戶編號,與外層查詢有關。內(nèi)層查詢是求一個客戶訂購商品數(shù)量的平均值,至于要求的是哪個客戶的平均值,是由外層查詢當前正處理的元組來決定的。示例當子查詢返回多個值時,若父查詢需與子查詢的返回結(jié)果進行比較,則須在比較運算符之后加上ALL(SOME)或ANY進行限制。格式如下:<表達式>{<|<=|=|>|>=|!=|<>|!<|!>}{ALL|SOME|ANY}(子查詢)ALL指定表達式要與子查詢結(jié)果集中的每個值都進行比較,當表達式與每個值都滿足比較關系時,才返回TRUE,否則返回FALSE。ANY與SOME的限制含義相同,通常采用ANY,表示表達式只要與子查詢結(jié)果集中的某個值滿足比較關系時,就返回TRUE,否則返回FALSE。
3.帶ALL(SOME)或ANY謂詞的子查詢
【例】查找比所有食品類的商品單價都低的商品信息。SELECT*FROMSPBWHERE商品類別<>'食品'AND單價<ALL(SELECT單價
FROMSPBWHERE商品類別='食品')
示例【例】查找比某個食品類的商品單價低的商品信息。SELECT*FROMSPBWHERE商品類別<>'食品'AND單價<ANY(SELECT單價
FROMSPBWHERE商品類別='食品')示例
EXISTS謂詞用于測試子查詢的結(jié)果是否為空表。若子查詢的結(jié)果集不空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOTEXISTS,其返回值與EXIST剛好相反。格式如下:[NOT]EXISTS(子查詢)4.帶EXISTS謂詞的子查詢
【例】查找訂購了編號為“10010001”商品的客戶姓名。
SELECT客戶姓名
FROMKHBaWHEREEXISTS(SELECT*FROMSPDGBbWHEREb.客戶編號=a.客戶編號ANDb.商品編號='10010001')
示例【例】查詢至少訂購了編號為“100006”的客戶所訂購的全部商品的客戶編號。
SELECTDISTINCT客戶編號
FROMSPDGBaWHERENOTEXISTS(SELECT* FROMSPDGBb WHEREb.客戶編號='100006'ANDNOTEXISTS(SELECT* FROMSPDGBc WHEREc.客戶編號=a.客戶編號AND c.商品編號=b.商品編號
))示例3.4.5集合查詢
SELECT語句執(zhí)行的結(jié)果是元組的集合,因此多個SELECT語句的結(jié)果集可以進行集合操作。集合操作主要包括:并(UNION)交(INTERSECT)差(EXCEPT)注意:這里的集合操作要求各SELECT的查詢結(jié)果集列數(shù)必須相同,并且對應列的數(shù)據(jù)類型必須相同?!纠坎樵冇嗁徚司幪枮椤?0010001”或“10020001”商品的客戶的編號。SELECT客戶編號
FROMSPDGBWHERE商品編號='10010001'UNIONSELECT客戶編號
FROMSPDGBWHERE商品編號='10020001'
示例【例】查詢單價小于50的商品與庫存量大于20的商品的交集。SELECT商品編號,商品類別,商品名稱,單價,生產(chǎn)商,保質(zhì)期,庫存量
FROMSPBWHERE單價<50INTERSECTSELECT商品編號,商品類別,商品名稱,單價,生產(chǎn)商,保質(zhì)期,庫存量
FROMSPBWHERE庫存量>20
示例【例】查詢單價小于50的商品與庫存量大于20的商品的差集。SELECT商品編號,商品類別,商品名稱,單價,生產(chǎn)商,保質(zhì)期,庫存量
FROMSPBWHERE單價<50EXCEPTSELECT商品編號,商品類別,商品名稱,單價,生產(chǎn)商,保質(zhì)期,庫存量
FROMSPBWHERE庫存量>20
示例3.4.6視圖查詢
對視圖查詢時,首先進行有效性檢查,檢查查詢的表、視圖是否存在。如果存在,那么從系統(tǒng)表中取出視圖的定義,把定義中的子查詢和用戶的查詢結(jié)合起來,轉(zhuǎn)換成等價的對基本表的查詢,然后再執(zhí)行轉(zhuǎn)換以后的查詢。視圖KH_JS定義
視圖KH_JS:所在省為“江蘇”的客戶信息。CREATEVIEWKH_JSASSELECT*FROMKHBWHERE所在省市LIKE'江蘇%'視圖LEFT_NUM定義
視圖TOTAL_COST:客戶所訂購商品的總價值
。CREATEVIEWTOTAL_COST(客戶編號,COST)ASSELECT客戶編號,SUM(單價*數(shù)量)FROMSPDGBa,SPBbWHEREa.商品編號=b.商品編號
GROUPBY客戶編號
視圖TOTAL_COST定義
視圖LEFT_NUM:客戶訂購之后商品的剩余量
。CREATEVIEWLEFT_NUM(商品編號,剩余量)ASSELECTa.商品編號,a.庫存量-x.訂購總量
FROMSPBa,(SELECT商品編號,SUM(數(shù)量)AS訂購總量
FROMSPDGBGROUPBY商品編號)xWHEREa.商品編號=x.商品編號【例】查找視圖KH_JS的全部信息。SELECT*FROMKH_JS【例】查找訂購后剩余量在50件以上的商品編號及其剩余量。SELECT*FROMLEFT_NUMWHERE剩余量>=50
示例【例】查找所訂購商品總價值在100及以上的客戶編號及所訂購商品總值
。SELECT*FROMTOTAL_COSTWHERECOST>=100示例3.5數(shù)據(jù)更新
3.5.1數(shù)據(jù)插入
3.5.2數(shù)據(jù)修改
3.5.3數(shù)據(jù)刪除
3.5.4視圖更新
3.5.5更新操作與數(shù)據(jù)完整性3.5.1數(shù)據(jù)插入
數(shù)據(jù)插入語句是INSERT
。INSERT語句的功能是向指定的表中插入由VALUES指定的行或子查詢的結(jié)果。
(1)插入元組
插入元組的INSERT語句基本格式如下:INSERTINTO<表名>[(<列1>[,<列2>…])]VALUES(<常量1>[,<常量2>…])語句功能:將VALUES子句中各常量組成的元組添加到<表名>所指定的表中。
其中新元組的列1值為常量1,列2值為常量2,依次類推。注意:如果某些列在INTO子句中沒有出現(xiàn),則新元組在這些列上的值將取空值NULL。如果INTO子句后沒有指明任何列,則新插入的元組必須為表的每個列賦值,列賦值的順序與創(chuàng)建表時列的默認順序相同。
【例】向SPDG數(shù)據(jù)庫的KHB表中插入如下的新元組:(客戶編號:100007;客戶姓名:周遠;出生日期:1979-8-20;客戶性別:男;所在省市:安徽合肥;聯(lián)系電話備注:NULL)
。INSERTINTOKHBVALUES('100007','周遠','1979-8-20','男','安徽合肥',,NULL)
示例(2)插入子查詢結(jié)果
子查詢可用在INSERT語句中,將生成的結(jié)果集插入到指定的表中。插入子查詢結(jié)果的INSERT語句格式如下:INSERTINTO<表名>[(<列1>[,<列2>…])]<子查詢>注意:INTO子句中的列數(shù)要和SELECT子句中的表達式個數(shù)一致,數(shù)據(jù)類型也要一致。
【例】設在SPDG數(shù)據(jù)庫中用如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商企業(yè)運營專員聘用合同樣本
- 住宅區(qū)雞舍建設合同
- 建筑工程拆遷施工合同范本
- 水上運輸水車租賃合同
- 箱包加工合同書
- 全面質(zhì)量管理質(zhì)量管理辦法
- 智能交通系統(tǒng)招投標申請表
- 租賃設備合同修改
- 保健用品行業(yè)售后服務管理規(guī)范
- 商業(yè)建筑電氣安裝合同
- 化學崗位應急處置卡
- 欠款民事起訴狀范文
- 內(nèi)蒙古蒙特威生物科技有限公司3000噸酪蛋白及衍生產(chǎn)品項目環(huán)評報告表
- 燃料電池講解:PPT課件(課堂運用)
- LTE干擾現(xiàn)狀、原因分析及解決方案介紹
- 茶室室內(nèi)陳設設計計劃書
- [中建]鄭州機場航站樓擴建工程施工組織設計(圖文158頁)
- 裝配式建筑PPT培訓講義(圖文并茂)
- 荔枝種植項目可行性研究報告
- 新版學校、幼兒園消毒ppt
- (完整版)中職英語基礎模塊下冊Unit-2--Shopping.ppt.課件
評論
0/150
提交評論