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