![數(shù)據(jù)庫原理課件_第1頁](http://file4.renrendoc.com/view10/M01/3D/3B/wKhkGWXN6O-AWdpNAAA_Vut8Yc0648.jpg)
![數(shù)據(jù)庫原理課件_第2頁](http://file4.renrendoc.com/view10/M01/3D/3B/wKhkGWXN6O-AWdpNAAA_Vut8Yc06482.jpg)
![數(shù)據(jù)庫原理課件_第3頁](http://file4.renrendoc.com/view10/M01/3D/3B/wKhkGWXN6O-AWdpNAAA_Vut8Yc06483.jpg)
![數(shù)據(jù)庫原理課件_第4頁](http://file4.renrendoc.com/view10/M01/3D/3B/wKhkGWXN6O-AWdpNAAA_Vut8Yc06484.jpg)
![數(shù)據(jù)庫原理課件_第5頁](http://file4.renrendoc.com/view10/M01/3D/3B/wKhkGWXN6O-AWdpNAAA_Vut8Yc06485.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
SQL語言本章概要SQL是結(jié)構(gòu)化查詢語言(StructuredQueryLanguage)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個部分。SQL語言簡潔、方便實用、功能齊全,已成為目前應(yīng)用最廣的關(guān)係資料庫語言。3.1SQL語言的基本概念與特點3.1.1SQL語言的發(fā)展SQL語言發(fā)展史
SQL語言是當前最為成功、應(yīng)用最為廣泛的關(guān)係資料庫語言,其發(fā)展主要經(jīng)歷了以下幾個階段:1974年由CHAMBERLIN和BOYEE提出,當時稱為SEQUEL(STUCTUREDENGLISHQUERYLANGUAGE);IBM公司對其進行了修改,並用於其SYSTEMR關(guān)係資料庫系統(tǒng)中;1981年IBM推出其商用關(guān)係關(guān)係資料庫SQL/DS,並將其名字改為SQL,由於SQL語言功能強大,簡潔易用,因此得到了廣泛的使用;今天廣泛應(yīng)用於各種大型資料庫,如SYBASE、INFORMIX、ORACLE、DB2、INGRES等,也用於各種小型資料庫,如FOXPRO、ACCESS。SQL概述及特點
字面看SQL只是一個查詢語言,而實際上SQL作為一種標準資料庫語言,從對數(shù)據(jù)庫的隨機查詢到資料庫的管理和程式設(shè)計,SQL幾乎無所不能,功能十分豐富.SQL語言是一種關(guān)係資料庫語言,提供數(shù)據(jù)的定義、查詢、更新和控制等功能。
SQL語言不是一個應(yīng)用程式開發(fā)語言,只提供對數(shù)據(jù)庫的操作能力,不能完成螢?zāi)豢刂啤⒉藛喂芾?、報表生成等功能,可成為?yīng)用開發(fā)語言的一部分。
SQL語言不是一個DBMS,它屬於DBMS語言處理程式。大部分DBMS產(chǎn)品都支持SQL,成為運算元據(jù)庫的標準語言SQL的特點SQL具有自含式與嵌入式兩種形式互動式SQL:一般DBMS都提供聯(lián)機交互工具,用戶可直接鍵入SQL命令對數(shù)據(jù)庫進行操作由DBMS來進行解釋嵌入式SQL:能將SQL語句嵌入到高級語言(宿主語言),使應(yīng)用程式充分利用SQL訪問資料庫的能力、宿主語言的過程處理能力,一般需要預(yù)編譯,將嵌入的SQL語句轉(zhuǎn)化為宿主語言編譯器能處理的語句
SQL的語法結(jié)構(gòu)基本一致SQL具有語言簡潔、易學(xué)易用的特點
SQL的特點SQL的特點3、SQL支持三級模式結(jié)構(gòu)一個SQL資料庫的總體邏輯結(jié)構(gòu)是基本表(Table)的集合,對應(yīng)於概念模式SQL資料庫的底層存儲結(jié)構(gòu)採用檔,一個或幾個表對應(yīng)一個存儲檔,以及索引檔。對應(yīng)內(nèi)模式用戶所見的數(shù)據(jù)結(jié)構(gòu)是視圖(View),用戶可直接操作的表,可為視圖或部分基本表。對應(yīng)外模式注:支持sql語言的資料庫稱為sql資料庫例如:學(xué)生資料庫中有學(xué)生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對應(yīng)一個存儲檔??梢栽谄浠A(chǔ)上定義一個男生基本情況表STUDENT_MALE(SNO,SNAME,SAGE,SDEPT),它是從STUDENT中選擇SSEX=’男’的各個行,然後在SNO,SNAME,SAGE,SDEPT上投影得到的。在資料庫中只存有STUDENT_MALE的定義,而STUDENT_MALE的記錄不重複存儲。在用戶看來,視圖是通過不同路徑去看一個實際表,就象一個窗口一樣,透過視圖可以看到資料庫中自己感興趣的內(nèi)容。3.1.2SQL語言的基本概念首先介紹兩個基本概念:基本表和視圖?;颈恚˙ASETABLE):是獨立存在的表,不是由其他的表導(dǎo)出的表。一個關(guān)係對應(yīng)一個基本表,一個或多個基本表對應(yīng)一個存儲檔。視圖(VIEW):是一個虛擬的表,是從一個或幾個基本表導(dǎo)出的表。它本身不獨立存在於資料庫中,資料庫中只存放視圖的定義而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中。當基本表中的數(shù)據(jù)發(fā)生變化時,從視圖中查詢出來的數(shù)據(jù)也隨之改變。SQL視圖1視圖2基本表1基本表2基本表3基本表4存儲檔1存儲檔2外模式模式內(nèi)模式圖3.1SQL語言支持的關(guān)係資料庫的三級邏輯結(jié)構(gòu)
SQL語言支持資料庫的三級模式結(jié)構(gòu),如圖3.1所示。其中外模式對應(yīng)於視圖和部分基本表,模式對應(yīng)於基本表,內(nèi)模式對應(yīng)於存儲檔。
SQL的特點SQL語言具有:數(shù)據(jù)定義(DEFINITION)數(shù)據(jù)查詢(QUERY)數(shù)據(jù)操縱(MANIPULATION)數(shù)據(jù)控制(CONTROL)下麵以SQLSERVER為例分別介紹其各個功能。各例題中所用的基本表如圖1.12所示。3.2SQL數(shù)據(jù)定義SQL語言使用數(shù)據(jù)定義語言(DATADEFINITIONLANGUAGE,簡稱DDL)實現(xiàn)其數(shù)據(jù)定義功能。操作對象操作對象創(chuàng)建刪除修改表CreatetableDroptableAltertable視圖CreateviewDropview索引CreateindexDropindex資料庫CreatedatabaseDropdatabaseAlterdatabaseSQL語句格式的約定符號語句格式中,<>中的內(nèi)容是必須的,是用戶自定義語義;[]為任選項{}或分隔符號|表示必選項,即必選其中之一項[,…N]表示前面得項可以重複多次3.2.2創(chuàng)建、修改和刪除數(shù)據(jù)表
創(chuàng)建數(shù)據(jù)表數(shù)據(jù)表是關(guān)係資料庫的基本組成單位,它物理地存儲於資料庫的存儲檔中。CREATETABLE[<庫名.>]<表名>
(<列名><數(shù)據(jù)類型>[列級完整性約束條件]
[,<列名><數(shù)據(jù)類型>[列級完整性約束條件]] [,…n] [,<表級完整性約束條件>][,…n]
)(1)<表名>是合法識別字,最多可有128個字元,如S,SC,C,不允許重名。(2)列名(字母開頭,可含字母、數(shù)字、#、$、_<=128字元)
。同一表中不許有重名列;(2)數(shù)據(jù)類型:見表3.2;(3)字段的長度、精度和小數(shù)位數(shù);3.2.1字段數(shù)據(jù)類型當用SQL語句定義表時,需要為表中的每一個字段設(shè)置一個數(shù)據(jù)類型,用來指定字段所存放的數(shù)據(jù)是整數(shù)、字串、貨幣或是其他類型的數(shù)據(jù)。SQLSERVER的數(shù)據(jù)類型有很多種,分為以下9類:1.整數(shù)數(shù)據(jù)類型:依整數(shù)數(shù)值的範圍大小,有BIT,INT,SMALLINT,TINYINT四種。2.精確數(shù)值類型:用來定義可帶小數(shù)部分的數(shù)字,有NUMERIC和DECIMAL兩種。十進位數(shù),共P位,其中小數(shù)點後S位。0<=S<=P,S=0時可省略。如:123.0、8000.563.近似浮點數(shù)值數(shù)據(jù)類型:當數(shù)值的位數(shù)太多時,可用此數(shù)據(jù)類型來取其近似值,用FLOAT和REAL兩種。如:1.23E+104.日期時間數(shù)據(jù)類型:用來表示日期與時間,依時間範圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-0815:30:005.字串數(shù)據(jù)類型:用來表示字串的字段。包括:CHAR,VARCHAR,TEXT三種,如:“資料庫”6.標記數(shù)據(jù)類型:有UNIQUEIDENTIFIER
,TIMESTAMP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時間戳印,而UNIQUEIDENTIFIER用來識別每一筆數(shù)據(jù)的唯一性。各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:
數(shù)據(jù)類型數(shù)據(jù)內(nèi)容與範圍佔用的位元組BIT0,1,NULL實際使用1BIT,但會佔用1BYTE,若一個數(shù)據(jù)中有數(shù)個BIT字段,則可共占1個BYTEINT-2^31到2^31-14BYTESSMALLINT-2^15至2^15-12BYTESTINYINT0至2551BYTESNUMERIC-10^38-1至10^38-11-9位數(shù)使用5BYTES10-19位數(shù)使用9BYTES20-28位數(shù)使用13BYTES29-38位數(shù)使用17BYTESDECIMAL-10^38-1至10^38-15-17BYTES因長度而異,與NUMERIC相同F(xiàn)LOAT-1.79E+306至1.79E+308,最多可表示53位數(shù)8BYTESREAL-3.40E+38到3.40E+38,最多可表示24位數(shù)4BYTESDATETIME1753/1/1至9999/12/318BYTESSMALLDATETIME1900/1/1至2079/6/64BYTESCHAR1-8000個字元1個字元占1B,尾端空白字元保留VARCHAR1-8000個字元1個字元占1B,尾端空白字元刪除。TEXT2^31-1個字元1個字元占2B,最大可存儲2GB①字段的長度:指字段所能容納的最大數(shù)據(jù)量,但對不同的數(shù)據(jù)類型來說,長度對字段的意義可能有些不同。對字串數(shù)據(jù)類型而言,長度代表字段所能容納的字元的數(shù)目,因此它會限制用戶所能輸入的文本長度。對數(shù)值類的數(shù)據(jù)類型而言,長度則代表字段使用多少個位元組來存放數(shù)字。。②精度和小數(shù)位數(shù)精度是指數(shù)中數(shù)字的位數(shù),包括小數(shù)點左側(cè)的整數(shù)部分和小數(shù)點右側(cè)的小數(shù)部分;小數(shù)位數(shù)則是指數(shù)字小數(shù)點右側(cè)的位數(shù)。例如:數(shù)字12345.678,其精度為8,小數(shù)位數(shù)為3;所以只有數(shù)值類的數(shù)據(jù)類型才有必要指定精度和小數(shù)位數(shù)。字段的長度、精度和小數(shù)位數(shù)經(jīng)常以如下所示的格式來表示數(shù)據(jù)類型以及它所採用的長度、精度和小數(shù)位數(shù),其中的N代表長度,P代表精度,S表示小數(shù)位數(shù)。BINARY(N)--------BINARY(10)CHAR(N)--------CHAR(20)NUMERIC(P,[S])-------NUMERIC(8,3)但有的數(shù)據(jù)類型的精度與小數(shù)位數(shù)是固定的,對採用此類數(shù)據(jù)類型的字段而言,不需設(shè)置精度與小數(shù)位數(shù),如:如果某字段採用INT數(shù)據(jù)類型,其長度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒有小數(shù)點的整數(shù)。存儲大小則是4個位元組。例3.4建立一學(xué)生表USESTUDENTCREATETABLES(SNOCHAR(8),SNVARCHAR(20),AGEINT,SEXCHAR(2),DEPTVARCHAR(20));執(zhí)行該語句後,便產(chǎn)生了學(xué)生基本表的表框架,此表為一個空表。3.定義完整性約束上列為創(chuàng)建基本表的最簡單形式,還可以對表進一步定義,如主鍵、空值的設(shè)定,使資料庫用戶能夠根據(jù)應(yīng)用的需要對基本表的定義做出更為精確和詳盡的規(guī)定。在SQLSERVER中,對於基本表的約束分為列約束和表約束。列約束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,不必指定列名;表約束與列定義相互獨立,不包括在列定義中,通常用於對多個列一起進行約束,定義表約束時必須指出要約束的那些列的名稱。完整性約束的基本語法格式為:
[CONSTRAINT<約束名>]<約束類型>約束名:約束不指定名稱時,系統(tǒng)會給定一個名稱。例建立一個S表,定義SN+SEX為唯一。USESTUDENTCREATETABLES(SNOCHAR(5),SNCHAR(8),SEXCHAR(2),CONSTRAINTS_UNIQUNIQUE(SN,SEX));USESTUDENTCREATETABLES(SNOCHAR(10)NOTNULL,SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT'男',DEPTVARCHAR(20));約束類型:在定義完整性約束時必須指定完整性約束的類型。在SQLSERVER中可以定義五種類型的完整性約束,下麵分別加以介紹:(1)NULL/NOTNULL是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字串“NULL”,而是表示“不知道”、“不確定”或“沒有數(shù)據(jù)”的意思。當某一字段的值一定要輸入才有意義的時候,則可以設(shè)置為NOTNULL。如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標識一條記錄的作用只能用於定義列約束,其語法格式如下:
[CONSTRAINT<約束名>][NULL|NOTNULL]例3.5建立一個S表,對SNO字段進行NOTNULL約束。USESTUDENTCREATETABLES(SNOCHAR(10)CONSTRAINTS_CONSNOTNULL,SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT’男’,DEPTVARCHAR(20));當SNO為空上時,系統(tǒng)給出錯誤資訊,無NOTNULL約束時,系統(tǒng)缺省為NULL。其中S_CONS為指定的約束名稱,當約束名稱省略時,系統(tǒng)自動產(chǎn)生一個名字。如下列功能同上,只是省略約束名稱。(2)UNIQUE約束UNIQUE約束用於指明基本表在某一列或多個列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個NULL值。UNIQUE既可用於列約束,也可用於表約束。UNIQUE用於定義列約束時,其語法格式如下:
[CONSTRAINT<約束名>]UNIQUE例3.6建立一個S表,定義SN為唯一鍵。USESTUDENTCREATETABLES(SNOCHAR(6),SNCHAR(8)CONSTRAINTSN_UNIQUNIQUE,SEXCHAR(2),AGENUMERIC(2));其中SN_UNIQ為指定的約束名稱,約束名稱可以省略,如下例:USESTUDENTCREATETABLES(SNOCHAR(6),SNCHAR(8)UNIQUE,SEXCHAR(2),AGENUMERIC(2));UNIQUE用於定義表約束時,其語法格式如下:
[CONSTRAINT<約束名>]UNIQUE(<列名>[{,<列名>}])例3.7建立一個S表,定義SN+SEX為唯一鍵。USESTUDENTCREATETABLES(SNOCHAR(5),SNCHAR(8),SEXCHAR(2),CONSTRAINTS_UNIQUNIQUE(SN,SEX));系統(tǒng)為SN+SEX建立唯一索引,確保同一性別的學(xué)生沒有重名。(3)PRIMARYKEY約束PRIMARYKEY約束用於定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重複,以此來保證實體的完整性。PRIMARYKEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:①在一個基本表中只能定義一個PRIMARYKEY約束,但可定義多個UNIQUE約束;②對於指定為PRIMARYKEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對於UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用於列約束,也可用於表約束。PRIMARYKEY用於定義列約束時,其語法格式如下:
CONSTRAINT<約束名>PRIMARYKEY例3.8建立一個S表,定義SNO為S的主鍵USESTUDENTCREATETABLES(SNOCHAR(5)NOTNULLCONSTRAINTS_PRIMPRIMARYKEY,SNCHAR(8),AGENUMERIC(2));PRIMARYKEY用於定義表約束時,即將某些列的組合定義為主鍵,其語法格式如下:
[CONSTRAINT<約束名>]PRIMARYKEY(<列名>[{<列名>}])例3.9建立一個SC表,定義SNO+CNO為SC的主鍵USESTUDENTCREATETABLESC(SNOCHAR(5)NOTNULL,CNOCHAR(5)NOTNULL,SCORENUMERIC(3),CONSTRAINTSC_PRIMPRIMARYKEY(SNO,CNO));(4)FOREIGNKEY約束FOREIGNKEY約束指定某一個列或一組列作為外碼,其中,包含外碼的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。系統(tǒng)保證從表在外碼上的取值要麼是主表中某一個主碼值,要麼取空值。以此保證兩個表之間的連接,確保了實體的參照完整性。FOREIGNKEY既可用於列約束,也可用於表約束,其語法格式為:
[CONSTRAINT<約束名>]FOREIGNKEY REFERENCES<主表名>(<列名>[{<列名>}])例3.10建立一個SC表,定義SNO,CNO為SC的外碼。USESTUDENTCREATETABLESC(SNOCHAR(5)NOTNULLCONSTRAINTS_FOREFOREIGNKEYREFERENCESS(SNO),CNOCHAR(5)NOTNULLCONSTRAINTC_FOREFOREIGNKEYREFERENCESC(CNO),SCORENUMERIC(3),CONSTRAINTS_C_PRIMPRIMARYKEY(SNO,CNO));(5)CHECK約束CHECK約束用來檢查字段值所允許的範圍,如,一個字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來保證域的完整性。CHECK既可用於列約束,也可用於表約束,其語法格式為:
[CONSTRAINT<約束名>]CHECK(<條件>)例3.10建立一個SC表,定義SCORE的取值範圍為0到100之間。USESTUDENTCREATETABLESC(SNOCHAR(5),CNOCHAR(5),SCORENUMERIC(5,1)CONSTRAINTSCORE_CHKCHECK(SCORE>=0ANDSCORE<=100));例3.11建立包含完整性定義的學(xué)生表USESTUDENTCREATETABLES(SNOCHAR(6)CONSTRAINTS_PRIMPRIMARYKEY,SNCHAR(8)CONSTRAINTSN_CONSNOTNULL,AGENUMERIC(2)CONSTRAINTAGE_CONSNOTNULLCONSTRAINTAGE_CHKCHECK(AGEBETWEEN15AND50),SEXCHAR(2)DEFAULT'男',DEPTCHAR(10)CONSTRAINTDEPT_CONSNOTNULL);
修改基本表由於應(yīng)用環(huán)境和應(yīng)用需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。SQL語言使用ALTERTABLE命令來完成這一功能,有如下三種修改方式:1.ADD方式用於增加新列和完整性約束,定義方式同CREATETABLE語句中的定義方式相同,其語法格式為:
ALTERTABLE<表名>ADD<列定義>|<完整性約束定義>例3.12在S表中增加一個班號列和住址列。USESTUDENTALTERTABLESADDCLASS_NOCHAR(6),ADDRESSCHAR(40)注意:使用此方式增加的新列自動填充NULL值,所以不能為增加的新列指定NOTNULL約束。例3.13在SC表中增加完整性約束定義,使SCORE在0-100之間。USESTUDENTALTERTABLESCADDCONSTRAINTSCORE_CHKCHECK(SCOREBETWEEN0AND100)2.ALTER方式用於修改某些列,其語法格式為:
ALTERTABLE<表名>
ALTERCOLUMN<列名><數(shù)據(jù)類型>[NULL|NOTNULL]例3.14把S表中的SNO列加寬到8位字元寬度USESTUDENTALTERTABLESALTERCOLUMNSNOCHAR(8)注意:使用此方式有如下一些限制:①不能改變列名;②不能將含有空值的列的定義修改為NOTNULL約束;③若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型;④只能修改NULL|NOTNULL約束,其他類型的約束在修改之前必須先刪除,然後再重新添加修改過的約束定義。3.DROP方式刪除完整性約束定義,其語法格式為:
ALTERTABLE<表名> DROPCONSTRAINT<約束名>例3.15刪除S表中的AGE_CHK約束USESTUDENTALTERTABLESDROPCONSTRAINTAGE_CHK
改變基本表的名字使用RENAME命令,可以改變基本表的名字,其語法格式為:
RENAME<舊表名>TO<新表名>例3.16將S表的名字更改為STUDENTUSESTUDENT RENAMESTOSTUDENT
刪除基本表當某個基本表無用時,可將其刪除。刪除後,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無法使用。如果重新恢復(fù)該表,這些視圖可重新使用。刪除表的語法格式:
DROPTABLE<表名>例3.17刪除表STUDENTUSESTUDENT DROPTABLESTUDENT注意:只能刪除自己建立的表,不能刪除其他用戶所建的表。3.2.5設(shè)計、創(chuàng)建和維護索引
索引的作用在日常生活中我們會經(jīng)常遇到索引,例如圖書目錄、詞典索引等。借助索引,人們會很快地找到需要的東西。索引是資料庫隨機檢索的常用手段,它實際上就是記錄的關(guān)鍵字與其相應(yīng)地址的對應(yīng)表。例如,當我們要在本書中查找有關(guān)“SQL查詢”的內(nèi)容時,應(yīng)該先通過目錄找到“SQL查詢”所對應(yīng)的頁碼,然後從該頁碼中找出所要的資訊。這種方法比直接翻閱書的內(nèi)容要快。如果把資料庫表比作一本書,則表的索引就如書的目錄一樣,通過索引可大大提高查詢速度。此外,在SQLSERVER中,行的唯一性也是通過建立唯一索引來維護的。
索引的作用可歸納為:1.加快查詢速度;2.保證行的唯一性。
索引的分類1.按照索引記錄的存放位置可分為聚集索引與非聚集索引聚集索引:按照索引的字段排列記錄,並且依照排好的順序?qū)⒂涗洿鎯υ诒碇?。非聚集索引:按照索引的字段排列記錄,但是排列的結(jié)果並不會存儲在表中,而是另外存儲。2.唯一索引的概念唯一索引表示表中每一個索引值只對應(yīng)唯一的數(shù)據(jù)記錄,這與表的PRIMARYKEY的特性類似,因此唯一性索引常用於PRIMARYKEY的字段上,以區(qū)別每一筆記錄。當表中有被設(shè)置為UNIQUE的字段時,SQLSERVER會自動建立一個非聚集的唯一性索引。而當表中有PRIMARYKEY的字段時,SQLSERVER會在PRIMARYKEY字段建立一個聚集索引。3.複合索引的概念複合索引是將兩個字段或多個字段組合起來建立的索引,而單獨的字段允許有重複的值。
建立索引建立索引的語句是CREATEINDEX,其語法格式為:
CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[次序][{,<列名>}][次序]…)UNIQUE表明建立唯一索引。CLUSTER表示建立聚集索引。次序用來指定索引值的排列順序,可為ASC(昇冪)或DESC(降序),缺省值為ASC。例3.18為表SC在SNO和CNO上建立唯一索引。USESTUDENTCREATEUNIQUEINDEXSCIONSC(SNO,CNO)執(zhí)行此命令後,為SC表建立一個索引名為SCI的唯一索引,此索引為SNO和CNO兩列的複合索引,即對SC表中的行先按SNO的遞增順序索引,對於相同的SNO,又按CNO的遞增順序索引。由於有UNIQUE的限制,所以該索引在(SNO,CNO)組合列的排序上具有唯一性,不存在重複值。例3.19為教師表T在TN上建立聚集索引。
CREATECLUSTERINDEXTIONT(TN)執(zhí)行此命令後,為T表建立一個索引名為TI的聚集索引,T表中的記錄將按照TN值的昇冪存放。注意:1.改變表中的數(shù)據(jù)(如增加或刪除記錄)時,索引將自動更新。索引建立後,在查詢使用該列時,系統(tǒng)將自動使用索引進行查詢。2.索引數(shù)目無限制,但索引越多,更新數(shù)據(jù)的速度越慢。對於僅用於查詢的表可多建索引,對於數(shù)據(jù)更新頻繁的表則應(yīng)少建索引。
刪除索引建立索引是為了提高查詢速度,但隨著索引的增多,數(shù)據(jù)更新時,系統(tǒng)會花費許多時間來維護索引。這時,應(yīng)刪除不必要的索引。刪除索引的語句是DROPINDEX,其語法格式為:
DROPINDEX數(shù)據(jù)表名.索引名例3.20刪除表SC的索引SCI。 DROPINDEXSC.SCI3.3SQL數(shù)據(jù)查詢3.3.1SELECT命令的格式與基本使用數(shù)據(jù)查詢是資料庫中最常見的操作。SQL語言提供SELECT語句,通過查詢操作可得到所需的資訊。SELECT語句的一般格式為:SELECT〈列名〉[{,〈列名〉}]FROM〈表名或視圖名〉[{,〈表名或視圖名〉}][WHERE〈檢索條件〉][GROUPBY<列名1>[HAVING<條件運算式>]][ORDERBY<列名2>[ASC|DESC]];SELECT語句的格式:SELECT [ALL|DISTINCT][TOPN[PERCENT][WITHTIES]]列名1[AS別名1][,列名2[AS別名2]…][INTO新表名]FROM表名1[[AS]表1別名][INNER|RIGHT|FULL|OUTER][OUTER]JOIN
表名2[[AS]表2別名]ON條件查詢的結(jié)果是仍是一個表。SELECT語句的執(zhí)行過程是:根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。如果有GROUP子句,則將查詢結(jié)果按照<列名1>相同的值進行分組。如果GROUP子句後有HAVING短語,則只輸出滿足HAVING條件的元組。如果有ORDER子句,查詢結(jié)果還要按照<列名2>的值進行排序。例3.21
查詢?nèi)w學(xué)生的學(xué)號、姓名和年齡。
SELECTSNO,SN,AGEFROMS例3.22
查詢學(xué)生的全部資訊。
SELECT*FROMS用‘*’表示S表的全部列名,而不必逐一列出。例3.23
查詢選修了課程的學(xué)生號。
SELECT
DISTINCTSNOFROMSC查詢結(jié)果中的重複行被去掉上述查詢均為不使用WHERE子句的無條件查詢,也稱作投影查詢。另外,利用投影查詢可控制列名的順序,並可通過指定別名改變查詢結(jié)果的列標題的名字。例3.24
查詢?nèi)w學(xué)生的姓名、學(xué)號和年齡。
SELECTSNAMENAME,SNO,AGEFROMS其中,NAME為SNAME的別名3.3.2條件查詢當要在表中找出滿足某些條件的行時,則需使用WHERE子句指定查詢條件。WHERE子句中,條件通常通過三部分來描述:1.
列名;2.
比較運算符;3.
列名、常數(shù)。運算符含義=,>,<,>=,<=,!=比較大小多重條件AND,ORBETWEENAND確定範圍IN確定集合LIKE字元匹配ISNULL空值表3.8常用的比較運算符
比較大小例3.25
查詢選修課程號為‘C1’的學(xué)生的學(xué)號和成績。SELECTSNO,SCOREFROMSCWHERECNO=’C1’例3.26查詢成績高於85分的學(xué)生的學(xué)號、課程號和成績。SELECTSNO,CNO,SCOREFROMSCWHERESCORE>85
多重條件查詢當WHERE子句需要指定一個以上的查詢條件時,則需要使用邏輯運算符AND、OR和NOT將其連結(jié)成複合的邏輯運算式。其優(yōu)先順序由高到低為:NOT、AND、OR,用戶可以使用括弧改變優(yōu)先順序。例3.27查詢選修C1或C2且分數(shù)大於等於85分學(xué)生的的學(xué)號、課程號和成績。SELECTSNO,CNO,SCOREFROMSCWHERE(CNO=’C1’ORCNO=’C2’)ANDSCORE>=85
確定範圍例3.28
查詢工資在1000至1500之間的教師的教師號、姓名及職稱。SELECTTNO,TN,PROFFROMTWHERESALBETWEEN1000AND1500等價於SELECTTNO,TN,PROFFROMTWHERESAL>=1000ANDSAL<=1500例3.29
查詢工資不在1000至1500之間的教師的教師號、姓名及職稱。SELECTTNO,TN,PROFFROMTWHERESALNOTBETWEEN1000AND1500
確定集合利用“IN”操作可以查詢屬性值屬於指定集合的元組。例3.30
查詢選修C1或C2的學(xué)生的學(xué)號、課程號和成績。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN(‘C1’,‘C2’)此語句也可以使用邏輯運算符“OR”實現(xiàn)。SELECTSNO,CNO,SCOREFROMSCWHERECNO=‘C1’ORCNO=‘C2’利用“NOTIN”可以查詢指定集合外的元組。例3.31查詢沒有選修C1,也沒有選修C2的學(xué)生的學(xué)號、課程號和成績。SELECTSNO,CNO,SCOREFROMSCWHERECNONOTIN(‘C1’,‘C2’)等價於:SELECTSNO,CNO,SCOREFROMSCWHERECNO!=‘C1’ANDCNO!=‘C2’
部分匹配查詢上例均屬於完全匹配查詢,當不知道完全精確的値時,用戶還可以使用LIKE或NOTLIKE進行部分匹配查詢(也稱模糊查詢)。LIKE定義的一般格式為:
<屬性名>LIKE<字串常量>屬性名必須為字元型,字串常量的字元可以包含如下兩個特殊符號:%:表示任意知長度的字串;_:表示任意單個字元。例3.32查詢所有姓張的教師的教師號和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘張%’例3.33查詢姓名中第二個漢字是“力”的教師號和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘__力%’注:一個漢字占兩個字元。
空值查詢某個字段沒有值稱之為具有空值(NULL)。通常沒有為一個列輸入值時,該列的值就是空值??罩挡煌读愫涂崭?,它不占任何存儲空間。例如,某些學(xué)生選課後沒有參加考試,有選課記錄,但沒有考試成績,考試成績?yōu)榭罩?,這與參加考試,成績?yōu)榱惴值牟煌@?.34查詢沒有考試成績的學(xué)生的學(xué)號和相應(yīng)的課程號。SELECTSNO,CNOFROMSCWHERESCOREISNULL注意:這裏的空值條件為ISNULL,不能寫成SCORE=NULL。3.2.2
常用庫函數(shù)及統(tǒng)計匯總查詢SQL提供了許多庫函數(shù),增強了基本檢索能力。常用的庫函數(shù),如表3.2所示函數(shù)名稱功能AVG按列計算平均值SUM按列計算值的總和MAX求一列中的最大值MIN求一列中的最小值COUNT按列值計個數(shù)例3.35求學(xué)號為S1學(xué)生的總分和平均分。SELECTSUM(SCORE)ASTotalScore,AVG(SCORE)ASAveScoreFROMSCWHERE(SNO='S1')注意:函數(shù)SUM和AVG只能對數(shù)值型字段進行計算。
例3.36求選修C1號課程的最高分、最低分及之間相差的分數(shù)SELECTMAX(SCORE)ASMaxScore,MIN(SCORE)ASMinScore,MAX(SCORE)-MIN(SCORE)ASDiffFROMSCWHERE(CNO='C1')例3.37求電腦系學(xué)生的總數(shù)SELECTCOUNT(SNO)FROMSWHEREDEPT='電腦'例3.38求學(xué)校中共有多少個系SELECTCOUNT(DISTINCTDEPT)ASDeptNumFROMS注意:加入關(guān)鍵字DISTINCT後表示消去重複行,可計算字段“DEPT“不同值的數(shù)目。COUNT函數(shù)對空值不計算,但對零進行計算。例3.39統(tǒng)計有成績同學(xué)的人數(shù)SELECTCOUNT(SCORE)FROMSC上例中成績?yōu)榱愕耐瑢W(xué)計算在內(nèi),沒有成績(即為空值)的不計算。例3.40利用特殊函數(shù)COUNT(*)求電腦系學(xué)生的總數(shù)SELECTCOUNT(*)FROMSWHEREDEPT=‘電腦’COUNT(*)用來統(tǒng)計元組的個數(shù)不消除重複行,不允許使用DISTINCT關(guān)鍵字。3.3.3
分組查詢GROUPBY子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進行分組,每組在屬性列或?qū)傩粤薪M合上具有相同的值。例3.42查詢各位教師的教師號及其任課的門數(shù)。SELECTTNO,COUNT(*)ASC_NUMFROMTCGROUPBYTNOGROUPBY子句按TNO的值分組,所有具有相同TNO的元組為一組,對每一組使用函數(shù)COUNT進行計算,統(tǒng)計出各位教師任課的門數(shù)。若在分組後還要按照一定的條件進行篩選,則需使用HAVING子句。例3.43
查詢選修兩門以上課程的學(xué)生學(xué)號和選課門數(shù)SELECTSNO,COUNT(*)ASSC_NUMFROMSCGROUPBYSNOHAVINGCOUNT(*)>=2GROUPBY子句按SNO的值分組,所有具有相同SNO的元組為一組,對每一組使用函數(shù)COUNT進行計算,統(tǒng)計出每位學(xué)生選課的門數(shù)。HAVING子句去掉不滿足COUNT(*)>=2的組。當在一個SQL查詢中同時使用WHERE子句,GROUPBY
子句和HAVING子句時,其順序是WHERE-GROUPBY-HAVING。WHERE與HAVING子句的根本區(qū)別在於作用對象不同。WHERE子句作用於基本表或視圖,從中選擇滿足條件的元組;HAVING子句作用於組,選擇滿足條件的組,必須用於GROUPBY子句之後,但GROUPBY子句可沒有HAVING子句。3.3.5查詢的排序當需要對查詢結(jié)果排序時,應(yīng)該使用ORDERBY子句ORDERBY子句必須出現(xiàn)在其他子句之後排序方式可以指定,DESC為降序,ASC為昇冪,缺省時為昇冪例3.44查詢選修C1的學(xué)生學(xué)號和成績,並按成績降序排列。SELECTSNO,SCOREFROMSCWHERECNO='C1'ORDERBYSCOREDESC例3.45
查詢選修C2、C3、C4或C5課程的學(xué)號、課程號和成績,查詢結(jié)果按學(xué)號昇冪排列,學(xué)號相同再按成績降序排列。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN('C2','C3','C4','C5')ORDERBYSNO,SCOREDESC例3.46
求選課在三門以上且各門課程均及格的學(xué)生的學(xué)號及其總成績,查詢結(jié)果按總成績降序列出。SELECTSNO,SUM(SCORE)ASTotalScoreFROMSCWHERESCORE>=60GROUPBYSNOHAVINGCOUNT(*)>=3ORDERBYSUM(SCORE)DESC此語句為分組排序,執(zhí)行過程如下:1.(FROM)取出整個SC2.(WHERE)篩選SCORE>=60的元組3.(GROUPBY)將選出的元組按SNO分組4.(HAVING)篩選選課三門以上的分組5.(SELECT)以剩下的組中提取學(xué)號和總成績6.(ORDERBY)將選取結(jié)果排序ORDERBYSUM(SCORE)DESC可以改寫成
ORDERBY2DESC
2代表查詢結(jié)果的第二列。3.3.6數(shù)據(jù)表連接及連接查詢數(shù)據(jù)表之間的聯(lián)繫是通過表的字段值來體現(xiàn)的,這種字段稱為連接字段。連接操作的目的就是通過加在連接字段的條件將多個表連接起來,以便從多個表中查詢數(shù)據(jù)。前面的查詢都是針對一個表進行的,當查詢同時涉及兩個以上的表時,稱為連接查詢。表的連接方法有兩種:方法1:表之間滿足一定的條件的行進行連接,此時FROM子句中指明進行連接的表名,WHERE子句指明連接的列名及其連接條件。方法2:利用關(guān)鍵字JOIN進行連接。具體分為以下幾種:INNERJOIN
:顯示符合條件的記錄,此為默認值;LEFT(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表中不符合條件的數(shù)據(jù)行,此時右邊數(shù)據(jù)行會以NULL來顯示,此稱為左連接;RIGHT(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及右邊表中不符合條件的數(shù)據(jù)行,此時左邊數(shù)據(jù)行會以NULL來顯示,此稱為右連接;FULL(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表和右邊表中不符合條件的數(shù)據(jù)行,此時缺乏數(shù)據(jù)的數(shù)據(jù)行會以NULL來顯示;CROSSJOIN:會將一個表的每一筆數(shù)據(jù)和另一表的每筆數(shù)據(jù)匹配成新的數(shù)據(jù)行。當將JOIN關(guān)鍵字放於FROM子句中時,應(yīng)有關(guān)鍵字ON與之相對應(yīng),以表明連接的條件。
等值連接與非等值連接例3.47
查詢劉偉老師所講授的課程。方法1:SELECTT.TNO,TN,CNOFROMT,TCWHERE(T.TNO=TC.TNO)AND(TN=‘劉偉’)這裏,TN=‘劉偉’為查詢條件,而T.TNO=TC.TNO為連接條件,TNO為連接字段。連接條件的一般格式為:
[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>
其中,比較運算符主要有:=、>、<、>=、<=、?。?。當比較運算符為“=“時,稱為等值連接,其他情況為非等值連接。引用列名TNO時要加上表名首碼,是因為兩個表中的列名相同,必須用表名首碼來確切說明所指列屬於哪個表,以避免二義性。如果列名是唯一的,比如TN,就不必須加首碼。上面的操作是將T表中的TNO和TC表中的TNO相等的行連接,同時選取TN為“劉偉“的行,然後再在TN,CNO列上投影,這是連接、選取和投影的操作組合。方法2:SELECTT.TNO,TN,CNOFROMTINNERJOINTCONT.TNO=TC.TNOANDT.TN='劉偉'方法3:SELECTR2.TNO,R2.TN,R1.CNOFROM(SELECTTNO,CNOFROMTC)ASR1INNERJOIN
(SELECTTNO,TNFROMTWHERETN='劉偉')ASR2ONR1.TNO=R2.TNO例3.48
查詢所有選課學(xué)生的學(xué)號、姓名、選課名稱及成績。SELECTS.SNO,SN,CN,SCOREFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO本例涉及三個表,WHERE子句中有兩個連接條件。當有兩個以上的表進行連接時,稱為多表連接。
自身連接當一個表與其自已進行連接操作時,稱為表的自身連接。例3.49
查詢所有比劉偉工資高的教師姓名、性別、工資和劉偉的工資。要查詢的內(nèi)容均在同一表T中,可以將表T分別取兩個別名,一個是X,一個是Y。將X,Y中滿足比劉偉工資高的行連接起來。這實際上是同一表T的自身連接。方法1:SELECTX.TN,X.SALASSAL_a,Y.SALASSAL_bFROMTASX,TASYWHEREX.SAL>Y.SALANDY.TN='劉偉'方法2:SELECTX.TN,X.SAL,Y.SALFROMTASXINNERJOINTASYONX.SAL>Y.SALANDY.TN='劉偉'方法3:SELECTR1.TN,R1.SAL,R2.SALFROM(SELECTTN,SALFROMT)ASR1INNERJOIN(SELECTSALFROMTWHERETN='劉偉')ASR2ONR1.SAL>R2.SAL例3.50檢索所有學(xué)生姓名,年齡和選課名稱。方法1:SELECTSN,AGE,CNFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO方法2:SELECTR3.SNO,R3.SN,R3.AGE,R4.CNFROM(SELECTSNO,SN,AGEFROMS)ASR3INNERJOIN(SELECTR2.SNO,R1.CNFROM(SELECTCNO,CNFROMC)ASR1INNERJOIN(SELECTSNO,CNOFROMSC)ASR2ONR1.CNO=R2.CNO)ASR4ONR3.SNO=R4.SNO
外連接在上面的連接操作中,不滿足連接條件的元組不能作為查詢結(jié)果輸出。如例3.48的查詢結(jié)果只包括有選課記錄的學(xué)生,而不會有吳麗同學(xué)的資訊。若將例3.48改成:例3.51
查詢所有學(xué)生的學(xué)號、姓名、選課名稱及成績。(沒有選課的同學(xué)的選課資訊顯示為空)則應(yīng)寫成如下的SQL語句。
SELECTS.SNO,SN,CN,SCOREFROMSLEFTOUTERJOINSCONS.SNO=SC.SNOLEFTOUTERJOINCONC.CNO=SC.CNO則查詢結(jié)果只包括所有的學(xué)生,沒有選課的吳麗同學(xué)的選課資訊顯示為空。3.3.7子查詢在WHERE子句中包含一個形如SELECT-FROM-WHERE的查詢塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語句稱為父查詢或外部查詢。嵌套查詢可以將一系列簡單查詢構(gòu)成複雜查詢,增強查詢能力。子查詢的嵌套層次最多可達到255層,以層層嵌套的方式構(gòu)造查詢充分體現(xiàn)了SQL“結(jié)構(gòu)化”的特點。嵌套查詢在執(zhí)行時由裏向外處理,每個子查詢是在上一級外部查詢處理之前完成,父查詢要用到子查詢的結(jié)果。
返回一個值的子查詢當子查詢的返回值只有一個時,可以使用比較運算符(=,>,<,>=,<=,!=)將父查詢和子查詢連接起來。例3.52
查詢與劉偉教師職稱相同的教師號、姓名。SELECTTNO,TNFROMTWHEREPROF=(SELECTPROFFROMTWHERETN='劉偉')此查詢相當於分成兩個查詢塊來執(zhí)行。先執(zhí)行子查詢:SELECTPROFFROMTWHERETN=’劉偉’子查詢向主查詢只返回一個值,即劉偉教師的職稱“講師”,然後以此作為父查詢的條件,相當於再執(zhí)行父查詢,查詢所有職稱為“講師”的教師號、姓名。SELECTTNO,TNFROMTWHEREPROF=’講師’
返回一組值的子查詢?nèi)绻硬樵兊姆祷刂挡恢挂粋€,而是一個集合時,則不能直接使用比較運算符,可以在比較運算符和子查詢之間插入ANY或ALL。其具體含義詳見以下各例。1.使用ANY例3.53
查詢講授課程號為C5的教師姓名。SELECTTNFROMTWHERETNO=ANY(SELECTTNOFROMTCWHERECNO='C5')先執(zhí)行子查詢,找到講授課程號為C5的教師號,為一組值構(gòu)成的集合(T2,T3,T5);再執(zhí)行父查詢,其中ANY的含義為任意一個,查詢教師號為T2、T3、T5的教師的姓名。
該例也可以使用前面所講的連接操作來實現(xiàn):SELECTTNFROMT,TCWHERET.TNO=TC.TNOANDTC.CNO='C5‘可見,對於同一查詢可使用子查詢和連接兩種方法來解決,可根據(jù)習慣任意選用。
例3.54
查詢其他系中比電腦系某一教師工資高的教師的姓名和工資。SELECTTN,SALFROMTWHERESAL>ANY(SELECTSALFROMTWHEREDEPT='電腦')ANDDEPT!='電腦' /*注意:此行是父查詢中的條件*/先執(zhí)行子查詢,找到電腦系中所有教師的工資集合(1500,900);再執(zhí)行父查詢,查詢所有不是電腦系且工資高於1500或900的教師姓名和工資。
此查詢也可以寫成:SELECTTN,SALFROMTWHERESAL>(SELECTMIN(SAL)FROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’先執(zhí)行子查詢,利用庫函數(shù)MIN找到電腦系中所有教師的最低工資——900;再執(zhí)行父查詢,查詢所有不是電腦系且工資高於900的教師。2.使用IN可以使用IN代替“=ANY”。例3.55(題目同3.53)SELECTTNFROMTWHERETNOIN(SELECTTNOFROMTCWHERECNO='C5')3.使用ALLALL的含義為全部。例3.56
查詢其他系中比電腦系所有教師工資都高的教師的姓名和工資。SELECTTN,SALFROMTWHERESAL>ALL(SELECTSALFROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’子查詢找到電腦系中所有教師的工資集合(1500,900);父查詢找到所有不是電腦系且工資高於1500的教師姓名和工資。此查詢也可以寫成:SELECTTN,SALFROMTWHERESAL>(SELECTMAX(SAL)FROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’庫函數(shù)MAX的作用是找到電腦系中所有教師的最高工資1500。例3.57
查詢不講授課程號為C5的教師姓名。SELECTDISTINCTTNFROMTWHERE'C5'!=ALL(SELECTCNOFROMTCWHERETNO=T.TNO)!=ALL的含義為不等於子查詢結(jié)果中的任何一個值,也可使用NOTIN代替!=ALL。子查詢包含普通子查詢和相關(guān)子查詢。前面所講的子查詢均為普通子查詢,而本例中子查詢的查詢條件引用了父查詢表中的屬性值(T表的TNO值),我們把這類查詢稱為相關(guān)子查詢。二者的執(zhí)行方式不同:普通子查詢的執(zhí)行順序是:首先執(zhí)行子查詢,然後把子查詢的結(jié)果作為父查詢的查詢條件的值。普通子查詢只執(zhí)行一次,而父查詢所涉及的所有記錄行都與其查詢結(jié)果進行比較以確定查詢結(jié)果集合。相關(guān)子查詢的執(zhí)行順序是:首先選取父查詢表中的第一行記錄,內(nèi)部的子查詢利用此行中相關(guān)的屬性值進行查詢,然後父查詢根據(jù)子查詢返回的結(jié)果判斷此行是否滿足查詢條件。如果滿足條件,則把該行放入父查詢的查詢結(jié)果集合中。重複執(zhí)行這一過程,直到處理完父查詢表中的每一行數(shù)據(jù)。由此可以看出,相關(guān)子查詢的執(zhí)行次數(shù)是由父查詢表的行數(shù)決定的。如上例表T中每的一行即每個教師記錄都要執(zhí)行一次子查詢以確定該教師是否講授C5這門課,當C5不是教師的任一門課時,則該教師被選取。
以下幾例均為相關(guān)子查詢。4.使用EXISTSEXISTS表示存在量詞,帶有EXISTS的子查詢不返回任何實際數(shù)據(jù),它只得到邏輯值“真”或“假”。當子查詢的的查詢結(jié)果集合為非空時,外層的WHERE子句返回真值,否則返回假值。NOTEXISTS與此相反。含有IN的查詢通??捎肊XISTS表示,但反過來不一定。
例3.58(題目同3.53)略SELECTTNFROMTWHEREEXISTS(SELECT*FROMTCWHERETNO=T.TNOANDCNO='C5')當子查詢TC表存在一行記錄滿足其WHERE子句中的條件時,則父查詢便得到一個TN值,重複執(zhí)行以上過程,直到得出最後結(jié)果。例3.59
查詢選修所有課程的學(xué)生姓名SELECTSNFROMSWHERENOTEXISTS(SELECT*FROMCWHERENOTEXISTS(SELECT*FROMSCWHERESNO=S.SNOANDCNO=C.CNO))選出這樣一些學(xué)生名單,在SC表中不存在他們沒有選修課程的記錄。
3.4SQL數(shù)據(jù)更新
SQL語言的數(shù)據(jù)更新語句DML主要包括插入數(shù)據(jù)、修改數(shù)據(jù)和刪除數(shù)據(jù)三種語句。3.4.1插入數(shù)據(jù)記錄插入數(shù)據(jù)是把新的記錄插入到一個存在的表中。插入數(shù)據(jù)使用語句INSERTINTO,可分為以下幾種情況。
插入一行新記錄語法格式為:
INSERTINTO<表名>[(<列名1>[,<列名2>…])]VALUES(<值>)其中,<表名>是指要插入新記錄的表
<列名>是可選項,指定待添加數(shù)據(jù)的列
VALUES子句指定待添加數(shù)據(jù)的具體值。列名的排列順序不一定要和表定義時的順序一致。但當指定列名表時VALUES子句值的排列順序必須和列名表中的列名排列順序一致,個數(shù)相等,數(shù)據(jù)類型一一對應(yīng)。
例3.60
在S表中插入一條學(xué)生記錄(學(xué)號:S7;姓名:鄭冬;性別:女;年齡:21;系別:電腦)。INSERTINTOSVALUES('s7','鄭冬','女',21,'電腦')注意:必須用逗號將各個數(shù)據(jù)分開,字元型數(shù)據(jù)要用單引號括起來。INTO子句中沒有指定列名,則新插入的記錄必須在每個屬性列上均有值,且VALUES子句中值的排列順序要和表中各屬性列的排列順序一致。
插入一行的部分數(shù)據(jù)值例3.61在SC表中插入一條選課記錄(’S7’,’C1’)。INSERTINTOSC(SNO,CNO)VALUES('s7',‘c1')將VALUES子句中的值按照INTO子句中指定列名的順序插入到表中對於INTO子句中沒有出現(xiàn)的列,則新插入的記錄在這些列上將取空值,如上例的SCORE即賦空值。但在表定義時有NOTNULL約束的屬性列不能取空值。
插入多行記錄用於表間的拷貝,將一個表中的數(shù)據(jù)抽取數(shù)行插入另一表中,可以通過子查詢來實現(xiàn)。插入數(shù)據(jù)的命令語法格式為:INSERTINTO<表名>[(<列名1>[,<列名2>…])]子查詢例3.62
求出各系教師的平均工資,把結(jié)果存放在新表AVGSAL中。首先建立新表AVGSAL,用來存放系名和各系的平均工資CREATETABLEAVGSAL(DEPARTMENTVARCHAR(20),AVGSALSMALLINT)然後利用子查詢求出T表中各系的平均工資,把結(jié)果存放在新表AVGSAL中。INSERTINTOAVGSALSELECTDEPT,AVG(SAL)FROMTGROUPBYDEPT2.4.2
修改數(shù)據(jù)記錄SQL語言可以使用UPDATE語句對表中的一行或多行記錄的某些列值進行修改,其語法格式為:UPDATE<表名>SET<列名>=<運算式>[,<列名>=<運算式>]…[WHERE<條件>]其中:<表名>是指要修改的表SET子句給出要修改的列及其修改後的值WHERE子句指定待修改的記錄應(yīng)當滿足的條件,WHERE子句省略時,則修改表中的所有記錄。
修改一行例3.63
把劉偉教師轉(zhuǎn)到資訊系。UPDATETSETDEPT='資訊'WHERETN='劉偉'
修改多行例3.64
將所有學(xué)生年齡增加1歲UPDATESSETAGE=AGE+1例3.65
把教師表中工資小於等於1000元的講師的工資提高20%。UPDATETSETSAL=1.2*SALWHEREPROF='講師'ANDSAL<=1000用子查詢選擇要修改的行例3.66
把講授C5課程的教師的崗位津貼增加100元。UPDATETSETCOMN=COMN+100WHERETNOIN(SELECTT.TNOFROMT,TCWHERET.TNO=TC.TNOANDTC.CNO='C5')子查詢的作用是得到講授C5課程的教師號。
用子查詢提供要修改的值例3.67
把所有教師的工資提高到平均工資的1.2倍UPDATETSETSAL=(SELECT1.2*AVG(SAL)FROMT)子查詢的作用是得到所有教師的平均工資。3.4.3刪除數(shù)據(jù)記錄使用DELETE語句可以刪除表中的一行或多行記錄,其語法格式為:DELETEFROM<表名>[WHERE<條件>]其中,<表名>是指要刪除數(shù)據(jù)的表。WHERE子句指定待刪除的記錄應(yīng)當滿足的條件,WHERE子句省略時,則刪除表中的所有記錄。
刪除一行記錄例3.68
刪除劉偉教師的記錄。DELETEFROMTWHERETN=’劉偉’
刪除多行記錄例3.69
刪除所有教師的授課記錄DELETEFROMTC執(zhí)行此語句後,TC表即為一個空表,但其定義仍存在數(shù)據(jù)字典中。
利用子查詢選擇要刪除的行例3.70刪除劉偉教師授課的記錄。DELETEFROMTCWHERETNO=(SELECTTNOFROMTWHERETN=’劉偉’)3.5視圖視圖是虛表,其數(shù)據(jù)不存儲,其記錄來自基本表,只在資料庫中存儲其定義。視圖在概念上與基本表等同,用戶可以在視圖上再定義視圖,可以對視圖進行查詢.刪除.更新等操作。3.5.1定義和刪除視圖
定義視圖定義視圖使用語句CREATEVIEW,其語法格式為:CREATEVIEW<視圖名>[(<視圖列表>)]AS<子查詢>其中,<視圖列表>為可選項,省略時,視圖的列名由子查詢的結(jié)果決定。
以下兩種情況下,視圖列名不可省略:1.視圖由多個表連接得到,在不同的表中存在同名列,則需指定列名;2.當視圖的列名為運算式或庫函數(shù)的計算結(jié)果時,而不是單純的屬性名時,則需指明列名。在子查詢中不許使用ORDERBY子句和DISTINCT短語,如果需要排序,則可在視圖定義後,對視圖查詢時再進行排序。例3.71創(chuàng)建一個電腦系教師情況的視圖SUB_T。CREATEVIEWSUB_TASSELECTTNO,TN,PROFFROMTWHEREDEPT='電腦'其中:視圖名字為SUB_T,省略了視圖列表。視圖由子查詢中的三列TNO,TN,PROF組成。視圖創(chuàng)建後,對視圖SUB_T的數(shù)據(jù)的訪問只限制在電腦系內(nèi),且只能訪問TNO,TN,PROF三列的內(nèi)容,從而達到了數(shù)據(jù)保密的目的。視圖創(chuàng)建後,只在數(shù)據(jù)字典中存放視圖的定義,而其中的子查詢SELECT語句並不執(zhí)行。只有當用戶對視圖進行操作時,才按照視圖的定義將數(shù)據(jù)從基本表中取出。例3.72
創(chuàng)建一學(xué)生情況視圖S_SC_C(包括學(xué)號、姓名、課程名及成績)。CREATEVIEWS_SC_C(SNO,SN,CN,SCORE)ASSELECTS.SNO,SN,CN,SCOREFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO此視圖由三個表連接得到,在S表和SC表中均存在SNO列,則需指定視圖列名。
例3.73
創(chuàng)建一學(xué)生平均成績視圖S_AVGCREATEVIEWS_AVG(SNO,AVG)ASSELECTSNO,AVG(SCORE)FROMSCGROUPBYSNO此視圖的列名之一AVG為庫函數(shù)的計算結(jié)果,則在定義時需指明列名。
刪除視圖視圖定義後可隨時刪除,刪除視圖的語法格式為:DROPVIEW<視圖名>例3.74
刪除電腦系教師情況的視圖SUB_T。DROPVIEWSUB_T視圖刪除後,只會刪除該視圖在數(shù)據(jù)字典中的定義,而與該視圖有關(guān)的基本表中的數(shù)據(jù)不會受任何影響,由此視圖導(dǎo)出的其他視圖的定義不會刪除,但已無任何意義。用戶應(yīng)該把這些視圖刪除。3.5.2查詢視圖視圖定義後,對視圖的查詢操作如同對基本表的查詢操作一樣。例3.75查找視圖SUB_T中職稱為教授的教師號和姓名。SELECTTNO,TNFROMSUB_TWHEREPROF='教授'此查詢的執(zhí)行過程是系統(tǒng)首先從數(shù)據(jù)字典中找到SUB_T的定義,然後把此定義和用戶的查詢結(jié)合起來,轉(zhuǎn)換成等價的對基本表T的查詢,這一轉(zhuǎn)換過程稱為視圖消解(ViewResolution),相當於執(zhí)行以下查詢:SELECTTNO,TNFROMTWHEREDEPT=’電腦’ANDPROF=’教授’由上例可以看出,當對一個基本表進行複雜的查詢時,可以先對基本表建立一個視圖,然後只需對此視圖進行查詢,這樣就不必再鍵入複雜的查詢語句,而將一個複雜的查詢轉(zhuǎn)換成一個簡單的查詢,從而簡化了查詢操作。3.5.3更新視圖由於視圖是一張?zhí)摫?,所以對視圖的更新,最終實際上是轉(zhuǎn)換成對基本表的更新。其更新操作包括插入、修改和刪除數(shù)據(jù),其語法格式如同對基本表的更新操作一樣。有些更新在理論上是不可能的,有些實現(xiàn)起來比較困難,以下僅考慮可以更新的視圖。
插入(INSERT)例3.76
向電腦系教師視圖SUB_T中插入一條記錄(教師號:T6;姓名:李丹;職稱:副教授)。INSERTINTOSUB_TVALUES('T6','李丹','副教授')系統(tǒng)在執(zhí)行此語句時,首先從數(shù)據(jù)字典中找到SUB_T的定義,然後把此定義和插入操作結(jié)合起來,轉(zhuǎn)換成等價的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保溫分包合同范例
- 關(guān)于水泥包工合同范本
- 初中教程購銷合同范本
- 中石化采購合同范例
- 井蓋更換合同范例
- 2024年01月四川2024年中國民生銀行成都分行誠聘英才筆試歷年參考題庫附帶答案詳解
- 農(nóng)村轉(zhuǎn)讓合同范本
- 供貨帶安裝合同范本
- 關(guān)于托管轉(zhuǎn)讓合同范例
- led投標合同范例
- 河南2025年河南職業(yè)技術(shù)學(xué)院招聘30人筆試歷年參考題庫附帶答案詳解
- 2025年長沙穗城軌道交通有限公司招聘筆試參考題庫含答案解析
- 2024年湖南有色金屬職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2025年山東華魯海運有限公司招聘筆試參考題庫含答案解析
- 銀川經(jīng)濟技術(shù)開發(fā)區(qū)2024年綜合考核評價指標表及評分細則
- 品管圈PDCA改善案例-降低住院患者跌倒發(fā)生率
- 讀書分享《給教師的建議》課件
- 《中小學(xué)校園食品安全和膳食經(jīng)費管理工作指引》專題講座
- 廣東省茂名市2023-2024學(xué)年高一上學(xué)期物理期末試卷(含答案)
- 沙發(fā)市場需求與消費特點分析
- 2024統(tǒng)編版新教材道德與法治七年級全冊內(nèi)容解讀課件(深度)
評論
0/150
提交評論