數(shù)據(jù)庫(kù)原理課件_第1頁(yè)
數(shù)據(jù)庫(kù)原理課件_第2頁(yè)
數(shù)據(jù)庫(kù)原理課件_第3頁(yè)
數(shù)據(jù)庫(kù)原理課件_第4頁(yè)
數(shù)據(jù)庫(kù)原理課件_第5頁(yè)
已閱讀5頁(yè),還剩943頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SQL語(yǔ)言本章概要SQL是結(jié)構(gòu)化查詢(xún)語(yǔ)言(StructuredQueryLanguage)的縮寫(xiě),其功能包括數(shù)據(jù)查詢(xún)、數(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í)稱(chēng)為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è)查詢(xún)語(yǔ)言,而實(shí)際上SQL作為一種標(biāo)準(zhǔn)資料庫(kù)語(yǔ)言,從對(duì)數(shù)據(jù)庫(kù)的隨機(jī)查詢(xún)到資料庫(kù)的管理和程式設(shè)計(jì),SQL幾乎無(wú)所不能,功能十分豐富.SQL語(yǔ)言是一種關(guān)係資料庫(kù)語(yǔ)言,提供數(shù)據(jù)的定義、查詢(xún)、更新和控制等功能。

SQL語(yǔ)言不是一個(gè)應(yīng)用程式開(kāi)發(fā)語(yǔ)言,只提供對(duì)數(shù)據(jù)庫(kù)的操作能力,不能完成螢?zāi)豢刂?、菜單管理、?bào)表生成等功能,可成為應(yīng)用開(kāi)發(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ī)交互工具,用戶(hù)可直接鍵入SQL命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作由DBMS來(lái)進(jìn)行解釋嵌入式SQL:能將SQL語(yǔ)句嵌入到高級(jí)語(yǔ)言(宿主語(yǔ)言),使應(yīng)用程式充分利用SQL訪問(wèn)資料庫(kù)的能力、宿主語(yǔ)言的過(guò)程處理能力,一般需要預(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)模式用戶(hù)所見(jiàn)的數(shù)據(jù)結(jié)構(gòu)是視圖(View),用戶(hù)可直接操作的表,可為視圖或部分基本表。對(duì)應(yīng)外模式注:支持sql語(yǔ)言的資料庫(kù)稱(chēng)為sql資料庫(kù)例如:學(xué)生資料庫(kù)中有學(xué)生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對(duì)應(yīng)一個(gè)存儲(chǔ)檔。可以在其基礎(chǔ)上定義一個(gè)男生基本情況表STUDENT_MALE(SNO,SNAME,SAGE,SDEPT),它是從STUDENT中選擇SSEX=’男’的各個(gè)行,然後在SNO,SNAME,SAGE,SDEPT上投影得到的。在資料庫(kù)中只存有STUDENT_MALE的定義,而STUDENT_MALE的記錄不重複存儲(chǔ)。在用戶(hù)看來(lái),視圖是通過(guò)不同路徑去看一個(gè)實(shí)際表,就象一個(gè)窗口一樣,透過(guò)視圖可以看到資料庫(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í),從視圖中查詢(xún)出來(lái)的數(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ù)查詢(xún)(QUERY)數(shù)據(jù)操縱(MANIPULATION)數(shù)據(jù)控制(CONTROL)下麵以SQLSERVER為例分別介紹其各個(gè)功能。各例題中所用的基本表如圖1.12所示。3.2SQL數(shù)據(jù)定義SQL語(yǔ)言使用數(shù)據(jù)定義語(yǔ)言(DATADEFINITIONLANGUAGE,簡(jiǎn)稱(chēng)DDL)實(shí)現(xiàn)其數(shù)據(jù)定義功能。操作對(duì)象操作對(duì)象創(chuàng)建刪除修改表CreatetableDroptableAltertable視圖CreateviewDropview索引CreateindexDropindex資料庫(kù)CreatedatabaseDropdatabaseAlterdatabaseSQL語(yǔ)句格式的約定符號(hào)語(yǔ)句格式中,<>中的內(nèi)容是必須的,是用戶(hù)自定義語(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ù)類(lèi)型>[列級(jí)完整性約束條件]

[,<列名><數(shù)據(jù)類(lèi)型>[列級(jí)完整性約束條件]] [,…n] [,<表級(jí)完整性約束條件>][,…n]

)(1)<表名>是合法識(shí)別字,最多可有128個(gè)字元,如S,SC,C,不允許重名。(2)列名(字母開(kāi)頭,可含字母、數(shù)字、#、$、_<=128字元)

。同一表中不許有重名列;(2)數(shù)據(jù)類(lèi)型:見(jiàn)表3.2;(3)字段的長(zhǎng)度、精度和小數(shù)位數(shù);3.2.1字段數(shù)據(jù)類(lèi)型當(dāng)用SQL語(yǔ)句定義表時(shí),需要為表中的每一個(gè)字段設(shè)置一個(gè)數(shù)據(jù)類(lèi)型,用來(lái)指定字段所存放的數(shù)據(jù)是整數(shù)、字串、貨幣或是其他類(lèi)型的數(shù)據(jù)。SQLSERVER的數(shù)據(jù)類(lèi)型有很多種,分為以下9類(lèi):1.整數(shù)數(shù)據(jù)類(lèi)型:依整數(shù)數(shù)值的範(fàn)圍大小,有BIT,INT,SMALLINT,TINYINT四種。2.精確數(shù)值類(lèi)型:用來(lái)定義可帶小數(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ù)類(lèi)型:當(dāng)數(shù)值的位數(shù)太多時(shí),可用此數(shù)據(jù)類(lèi)型來(lái)取其近似值,用FLOAT和REAL兩種。如:1.23E+104.日期時(shí)間數(shù)據(jù)類(lèi)型:用來(lái)表示日期與時(shí)間,依時(shí)間範(fàn)圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-0815:30:005.字串?dāng)?shù)據(jù)類(lèi)型:用來(lái)表示字串的字段。包括:CHAR,VARCHAR,TEXT三種,如:“資料庫(kù)”6.標(biāo)記數(shù)據(jù)類(lèi)型:有UNIQUEIDENTIFIER

,TIMESTAMP兩種,此數(shù)據(jù)類(lèi)型通常系統(tǒng)自動(dòng)產(chǎn)生,而不是用戶(hù)輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時(shí)間戳印,而UNIQUEIDENTIFIER用來(lái)識(shí)別每一筆數(shù)據(jù)的唯一性。各種數(shù)據(jù)類(lèi)型的有關(guān)規(guī)定如下表:

數(shù)據(jù)類(lèi)型數(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ù)類(lèi)型來(lái)說(shuō),長(zhǎng)度對(duì)字段的意義可能有些不同。對(duì)字串?dāng)?shù)據(jù)類(lèi)型而言,長(zhǎng)度代表字段所能容納的字元的數(shù)目,因此它會(huì)限制用戶(hù)所能輸入的文本長(zhǎng)度。對(duì)數(shù)值類(lèi)的數(shù)據(jù)類(lèi)型而言,長(zhǎng)度則代表字段使用多少個(gè)位元組來(lái)存放數(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ù)值類(lèi)的數(shù)據(jù)類(lèi)型才有必要指定精度和小數(shù)位數(shù)。字段的長(zhǎng)度、精度和小數(shù)位數(shù)經(jīng)常以如下所示的格式來(lái)表示數(shù)據(jù)類(lèi)型以及它所採(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ù)類(lèi)型的精度與小數(shù)位數(shù)是固定的,對(duì)採(cǎi)用此類(lèi)數(shù)據(jù)類(lèi)型的字段而言,不需設(shè)置精度與小數(shù)位數(shù),如:如果某字段採(cǎi)用INT數(shù)據(jù)類(lèi)型,其長(zhǎng)度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒(méi)有小數(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ù)用戶(hù)能夠根據(jù)應(yīng)用的需要對(duì)基本表的定義做出更為精確和詳盡的規(guī)定。在SQLSERVER中,對(duì)於基本表的約束分為列約束和表約束。列約束是對(duì)某一個(gè)特定列的約束,包含在列定義中,直接跟在該列的其他定義之後,用空格分隔,不必指定列名;表約束與列定義相互獨(dú)立,不包括在列定義中,通常用於對(duì)多個(gè)列一起進(jìn)行約束,定義表約束時(shí)必須指出要約束的那些列的名稱(chēng)。完整性約束的基本語(yǔ)法格式為:

[CONSTRAINT<約束名>]<約束類(lèi)型>約束名:約束不指定名稱(chēng)時(shí),系統(tǒng)會(huì)給定一個(gè)名稱(chēng)。例建立一個(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));約束類(lèi)型:在定義完整性約束時(shí)必須指定完整性約束的類(lèi)型。在SQLSERVER中可以定義五種類(lèi)型的完整性約束,下麵分別加以介紹:(1)NULL/NOTNULL是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字串“NULL”,而是表示“不知道”、“不確定”或“沒(méi)有數(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ò)誤資訊,無(wú)NOTNULL約束時(shí),系統(tǒng)缺省為NULL。其中S_CONS為指定的約束名稱(chēng),當(dāng)約束名稱(chēng)省略時(shí),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)名字。如下列功能同上,只是省略約束名稱(chēng)。(2)UNIQUE約束UNIQUE約束用於指明基本表在某一列或多個(gè)列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱(chēng)為唯一鍵,系統(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為指定的約束名稱(chēng),約束名稱(chēng)可以省略,如下例: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é)生沒(méi)有重名。(3)PRIMARYKEY約束PRIMARYKEY約束用於定義基本表的主鍵,起唯一標(biāo)識(shí)作用,其值不能為NULL,也不能重複,以此來(lái)保證實(shí)體的完整性。PRIMARYKEY與UNIQUE約束類(lèi)似,通過(guò)建立唯一索引來(lái)保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(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è)列或一組列作為外碼,其中,包含外碼的表稱(chēng)為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱(chēng)主表。系統(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約束用來(lái)檢查字段值所允許的範(fàn)圍,如,一個(gè)字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來(lái)保證域的完整性。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命令來(lái)完成這一功能,有如下三種修改方式:1.ADD方式用於增加新列和完整性約束,定義方式同CREATETABLE語(yǔ)句中的定義方式相同,其語(yǔ)法格式為:

ALTERTABLE<表名>ADD<列定義>|<完整性約束定義>例3.12在S表中增加一個(gè)班號(hào)列和住址列。USESTUDENTALTERTABLESADDCLASS_NOCHAR(6),ADDRESSCHAR(40)注意:使用此方式增加的新列自動(dòng)填充N(xiāo)ULL值,所以不能為增加的新列指定NOTNULL約束。例3.13在SC表中增加完整性約束定義,使SCORE在0-100之間。USESTUDENTALTERTABLESCADDCONSTRAINTSCORE_CHKCHECK(SCOREBETWEEN0AND100)2.ALTER方式用於修改某些列,其語(yǔ)法格式為:

ALTERTABLE<表名>

ALTERCOLUMN<列名><數(shù)據(jù)類(lèi)型>[NULL|NOTNULL]例3.14把S表中的SNO列加寬到8位字元寬度USESTUDENTALTERTABLESALTERCOLUMNSNOCHAR(8)注意:使用此方式有如下一些限制:①不能改變列名;②不能將含有空值的列的定義修改為NOTNULL約束;③若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類(lèi)型;④只能修改NULL|NOTNULL約束,其他類(lèi)型的約束在修改之前必須先刪除,然後再重新添加修改過(guò)的約束定義。3.DROP方式刪除完整性約束定義,其語(yǔ)法格式為:

ALTERTABLE<表名> DROPCONSTRAINT<約束名>例3.15刪除S表中的AGE_CHK約束USESTUDENTALTERTABLESDROPCONSTRAINTAGE_CHK

改變基本表的名字使用RENAME命令,可以改變基本表的名字,其語(yǔ)法格式為:

RENAME<舊表名>TO<新表名>例3.16將S表的名字更改為STUDENTUSESTUDENT RENAMESTOSTUDENT

刪除基本表當(dāng)某個(gè)基本表無(wú)用時(shí),可將其刪除。刪除後,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會(huì)隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無(wú)法使用。如果重新恢復(fù)該表,這些視圖可重新使用。刪除表的語(yǔ)法格式:

DROPTABLE<表名>例3.17刪除表STUDENTUSESTUDENT DROPTABLESTUDENT注意:只能刪除自己建立的表,不能刪除其他用戶(hù)所建的表。3.2.5設(shè)計(jì)、創(chuàng)建和維護(hù)索引

索引的作用在日常生活中我們會(huì)經(jīng)常遇到索引,例如圖書(shū)目錄、詞典索引等。借助索引,人們會(huì)很快地找到需要的東西。索引是資料庫(kù)隨機(jī)檢索的常用手段,它實(shí)際上就是記錄的關(guān)鍵字與其相應(yīng)地址的對(duì)應(yīng)表。例如,當(dāng)我們要在本書(shū)中查找有關(guān)“SQL查詢(xún)”的內(nèi)容時(shí),應(yīng)該先通過(guò)目錄找到“SQL查詢(xún)”所對(duì)應(yīng)的頁(yè)碼,然後從該頁(yè)碼中找出所要的資訊。這種方法比直接翻閱書(shū)的內(nèi)容要快。如果把資料庫(kù)表比作一本書(shū),則表的索引就如書(shū)的目錄一樣,通過(guò)索引可大大提高查詢(xún)速度。此外,在SQLSERVER中,行的唯一性也是通過(guò)建立唯一索引來(lái)維護(hù)的。

索引的作用可歸納為:1.加快查詢(xún)速度;2.保證行的唯一性。

索引的分類(lèi)1.按照索引記錄的存放位置可分為聚集索引與非聚集索引聚集索引:按照索引的字段排列記錄,並且依照排好的順序?qū)⒂涗洿鎯?chǔ)在表中。非聚集索引:按照索引的字段排列記錄,但是排列的結(jié)果並不會(huì)存儲(chǔ)在表中,而是另外存儲(chǔ)。2.唯一索引的概念唯一索引表示表中每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄,這與表的PRIMARYKEY的特性類(lèi)似,因此唯一性索引常用於PRIMARYKEY的字段上,以區(qū)別每一筆記錄。當(dāng)表中有被設(shè)置為UNIQUE的字段時(shí),SQLSERVER會(huì)自動(dòng)建立一個(gè)非聚集的唯一性索引。而當(dāng)表中有PRIMARYKEY的字段時(shí),SQLSERVER會(huì)在PRIMARYKEY字段建立一個(gè)聚集索引。3.複合索引的概念複合索引是將兩個(gè)字段或多個(gè)字段組合起來(lái)建立的索引,而單獨(dú)的字段允許有重複的值。

建立索引建立索引的語(yǔ)句是CREATEINDEX,其語(yǔ)法格式為:

CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[次序][{,<列名>}][次序]…)UNIQUE表明建立唯一索引。CLUSTER表示建立聚集索引。次序用來(lái)指定索引值的排列順序,可為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(mén)表建立一個(gè)索引名為T(mén)I的聚集索引,T表中的記錄將按照TN值的昇冪存放。注意:1.改變表中的數(shù)據(jù)(如增加或刪除記錄)時(shí),索引將自動(dòng)更新。索引建立後,在查詢(xún)使用該列時(shí),系統(tǒng)將自動(dòng)使用索引進(jìn)行查詢(xún)。2.索引數(shù)目無(wú)限制,但索引越多,更新數(shù)據(jù)的速度越慢。對(duì)於僅用於查詢(xún)的表可多建索引,對(duì)於數(shù)據(jù)更新頻繁的表則應(yīng)少建索引。

刪除索引建立索引是為了提高查詢(xún)速度,但隨著索引的增多,數(shù)據(jù)更新時(shí),系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引。這時(shí),應(yīng)刪除不必要的索引。刪除索引的語(yǔ)句是DROPINDEX,其語(yǔ)法格式為:

DROPINDEX數(shù)據(jù)表名.索引名例3.20刪除表SC的索引SCI。 DROPINDEXSC.SCI3.3SQL數(shù)據(jù)查詢(xún)3.3.1SELECT命令的格式與基本使用數(shù)據(jù)查詢(xún)是資料庫(kù)中最常見(jiàn)的操作。SQL語(yǔ)言提供SELECT語(yǔ)句,通過(guò)查詢(xún)操作可得到所需的資訊。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條件查詢(xún)的結(jié)果是仍是一個(gè)表。SELECT語(yǔ)句的執(zhí)行過(guò)程是:根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿(mǎn)足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。如果有GROUP子句,則將查詢(xún)結(jié)果按照<列名1>相同的值進(jìn)行分組。如果GROUP子句後有HAVING短語(yǔ),則只輸出滿(mǎn)足HAVING條件的元組。如果有ORDER子句,查詢(xún)結(jié)果還要按照<列名2>的值進(jìn)行排序。例3.21

查詢(xún)?nèi)w學(xué)生的學(xué)號(hào)、姓名和年齡。

SELECTSNO,SN,AGEFROMS例3.22

查詢(xún)學(xué)生的全部資訊。

SELECT*FROMS用‘*’表示S表的全部列名,而不必逐一列出。例3.23

查詢(xún)選修了課程的學(xué)生號(hào)。

SELECT

DISTINCTSNOFROMSC查詢(xún)結(jié)果中的重複行被去掉上述查詢(xún)均為不使用WHERE子句的無(wú)條件查詢(xún),也稱(chēng)作投影查詢(xún)。另外,利用投影查詢(xún)可控制列名的順序,並可通過(guò)指定別名改變查詢(xún)結(jié)果的列標(biāo)題的名字。例3.24

查詢(xún)?nèi)w學(xué)生的姓名、學(xué)號(hào)和年齡。

SELECTSNAMENAME,SNO,AGEFROMS其中,NAME為SNAME的別名3.3.2條件查詢(xún)當(dāng)要在表中找出滿(mǎn)足某些條件的行時(shí),則需使用WHERE子句指定查詢(xún)條件。WHERE子句中,條件通常通過(guò)三部分來(lái)描述:1.

列名;2.

比較運(yùn)算符;3.

列名、常數(shù)。運(yùn)算符含義=,>,<,>=,<=,!=比較大小多重條件AND,ORBETWEENAND確定範(fàn)圍IN確定集合LIKE字元匹配ISNULL空值表3.8常用的比較運(yùn)算符

比較大小例3.25

查詢(xún)選修課程號(hào)為‘C1’的學(xué)生的學(xué)號(hào)和成績(jī)。SELECTSNO,SCOREFROMSCWHERECNO=’C1’例3.26查詢(xún)成績(jī)高於85分的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSNO,CNO,SCOREFROMSCWHERESCORE>85

多重條件查詢(xún)當(dāng)WHERE子句需要指定一個(gè)以上的查詢(xún)條件時(shí),則需要使用邏輯運(yùn)算符AND、OR和NOT將其連結(jié)成複合的邏輯運(yùn)算式。其優(yōu)先順序由高到低為:NOT、AND、OR,用戶(hù)可以使用括弧改變優(yōu)先順序。例3.27查詢(xún)選修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

查詢(xún)工資在1000至1500之間的教師的教師號(hào)、姓名及職稱(chēng)。SELECTTNO,TN,PROFFROMTWHERESALBETWEEN1000AND1500等價(jià)於SELECTTNO,TN,PROFFROMTWHERESAL>=1000ANDSAL<=1500例3.29

查詢(xún)工資不在1000至1500之間的教師的教師號(hào)、姓名及職稱(chēng)。SELECTTNO,TN,PROFFROMTWHERESALNOTBETWEEN1000AND1500

確定集合利用“IN”操作可以查詢(xún)屬性值屬於指定集合的元組。例3.30

查詢(xún)選修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”可以查詢(xún)指定集合外的元組。例3.31查詢(xún)沒(méi)有選修C1,也沒(méi)有選修C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTSNO,CNO,SCOREFROMSCWHERECNONOTIN(‘C1’,‘C2’)等價(jià)於:SELECTSNO,CNO,SCOREFROMSCWHERECNO!=‘C1’ANDCNO!=‘C2’

部分匹配查詢(xún)上例均屬於完全匹配查詢(xún),當(dāng)不知道完全精確的値時(shí),用戶(hù)還可以使用LIKE或NOTLIKE進(jìn)行部分匹配查詢(xún)(也稱(chēng)模糊查詢(xún))。LIKE定義的一般格式為:

<屬性名>LIKE<字串常量>屬性名必須為字元型,字串常量的字元可以包含如下兩個(gè)特殊符號(hào):%:表示任意知長(zhǎng)度的字串;_:表示任意單個(gè)字元。例3.32查詢(xún)所有姓張的教師的教師號(hào)和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘張%’例3.33查詢(xún)姓名中第二個(gè)漢字是“力”的教師號(hào)和姓名。SELECTTNO,TNFROMTWHERETNLIKE‘__力%’注:一個(gè)漢字占兩個(gè)字元。

空值查詢(xún)某個(gè)字段沒(méi)有值稱(chēng)之為具有空值(NULL)。通常沒(méi)有為一個(gè)列輸入值時(shí),該列的值就是空值。空值不同於零和空格,它不占任何存儲(chǔ)空間。例如,某些學(xué)生選課後沒(méi)有參加考試,有選課記錄,但沒(méi)有考試成績(jī),考試成績(jī)?yōu)榭罩?,這與參加考試,成績(jī)?yōu)榱惴值牟煌?。?.34查詢(xún)沒(méi)有考試成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTSNO,CNOFROMSCWHERESCOREISNULL注意:這裏的空值條件為ISNULL,不能寫(xiě)成SCORE=NULL。3.2.2

常用庫(kù)函數(shù)及統(tǒng)計(jì)匯總查詢(xún)SQL提供了許多庫(kù)函數(shù),增強(qiáng)了基本檢索能力。常用的庫(kù)函數(shù),如表3.2所示函數(shù)名稱(chēng)功能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),沒(méi)有成績(jī)(即為空值)的不計(jì)算。例3.40利用特殊函數(shù)COUNT(*)求電腦系學(xué)生的總數(shù)SELECTCOUNT(*)FROMSWHEREDEPT=‘電腦’COUNT(*)用來(lái)統(tǒng)計(jì)元組的個(gè)數(shù)不消除重複行,不允許使用DISTINCT關(guān)鍵字。3.3.3

分組查詢(xún)GROUPBY子句可以將查詢(xún)結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進(jìn)行分組,每組在屬性列或?qū)傩粤薪M合上具有相同的值。例3.42查詢(xún)各位教師的教師號(hào)及其任課的門(mén)數(shù)。SELECTTNO,COUNT(*)ASC_NUMFROMTCGROUPBYTNOGROUPBY子句按TNO的值分組,所有具有相同TNO的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出各位教師任課的門(mén)數(shù)。若在分組後還要按照一定的條件進(jìn)行篩選,則需使用HAVING子句。例3.43

查詢(xún)選修兩門(mén)以上課程的學(xué)生學(xué)號(hào)和選課門(mén)數(shù)SELECTSNO,COUNT(*)ASSC_NUMFROMSCGROUPBYSNOHAVINGCOUNT(*)>=2GROUPBY子句按SNO的值分組,所有具有相同SNO的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出每位學(xué)生選課的門(mén)數(shù)。HAVING子句去掉不滿(mǎn)足COUNT(*)>=2的組。當(dāng)在一個(gè)SQL查詢(xún)中同時(shí)使用WHERE子句,GROUPBY

子句和HAVING子句時(shí),其順序是WHERE-GROUPBY-HAVING。WHERE與HAVING子句的根本區(qū)別在於作用對(duì)象不同。WHERE子句作用於基本表或視圖,從中選擇滿(mǎn)足條件的元組;HAVING子句作用於組,選擇滿(mǎn)足條件的組,必須用於GROUPBY子句之後,但GROUPBY子句可沒(méi)有HAVING子句。3.3.5查詢(xún)的排序當(dāng)需要對(duì)查詢(xún)結(jié)果排序時(shí),應(yīng)該使用ORDERBY子句ORDERBY子句必須出現(xiàn)在其他子句之後排序方式可以指定,DESC為降序,ASC為昇冪,缺省時(shí)為昇冪例3.44查詢(xún)選修C1的學(xué)生學(xué)號(hào)和成績(jī),並按成績(jī)降序排列。SELECTSNO,SCOREFROMSCWHERECNO='C1'ORDERBYSCOREDESC例3.45

查詢(xún)選修C2、C3、C4或C5課程的學(xué)號(hào)、課程號(hào)和成績(jī),查詢(xún)結(jié)果按學(xué)號(hào)昇冪排列,學(xué)號(hào)相同再按成績(jī)降序排列。SELECTSNO,CNO,SCOREFROMSCWHERECNOIN('C2','C3','C4','C5')ORDERBYSNO,SCOREDESC例3.46

求選課在三門(mén)以上且各門(mén)課程均及格的學(xué)生的學(xué)號(hào)及其總成績(jī),查詢(xún)結(jié)果按總成績(jī)降序列出。SELECTSNO,SUM(SCORE)ASTotalScoreFROMSCWHERESCORE>=60GROUPBYSNOHAVINGCOUNT(*)>=3ORDERBYSUM(SCORE)DESC此語(yǔ)句為分組排序,執(zhí)行過(guò)程如下:1.(FROM)取出整個(gè)SC2.(WHERE)篩選SCORE>=60的元組3.(GROUPBY)將選出的元組按SNO分組4.(HAVING)篩選選課三門(mén)以上的分組5.(SELECT)以剩下的組中提取學(xué)號(hào)和總成績(jī)6.(ORDERBY)將選取結(jié)果排序ORDERBYSUM(SCORE)DESC可以改寫(xiě)成

ORDERBY2DESC

2代表查詢(xún)結(jié)果的第二列。3.3.6數(shù)據(jù)表連接及連接查詢(xún)數(shù)據(jù)表之間的聯(lián)繫是通過(guò)表的字段值來(lái)體現(xiàn)的,這種字段稱(chēng)為連接字段。連接操作的目的就是通過(guò)加在連接字段的條件將多個(gè)表連接起來(lái),以便從多個(gè)表中查詢(xún)數(shù)據(jù)。前面的查詢(xún)都是針對(duì)一個(gè)表進(jìn)行的,當(dāng)查詢(xún)同時(shí)涉及兩個(gè)以上的表時(shí),稱(chēng)為連接查詢(xún)。表的連接方法有兩種:方法1:表之間滿(mǎn)足一定的條件的行進(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來(lái)顯示,此稱(chēng)為左連接;RIGHT(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及右邊表中不符合條件的數(shù)據(jù)行,此時(shí)左邊數(shù)據(jù)行會(huì)以NULL來(lái)顯示,此稱(chēng)為右連接;FULL(OUTER)JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表和右邊表中不符合條件的數(shù)據(jù)行,此時(shí)缺乏數(shù)據(jù)的數(shù)據(jù)行會(huì)以NULL來(lái)顯示;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

查詢(xún)劉偉老師所講授的課程。方法1:SELECTT.TNO,TN,CNOFROMT,TCWHERE(T.TNO=TC.TNO)AND(TN=‘劉偉’)這裏,TN=‘劉偉’為查詢(xún)條件,而T.TNO=TC.TNO為連接條件,TNO為連接字段。連接條件的一般格式為:

[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>

其中,比較運(yùn)算符主要有:=、>、<、>=、<=、?。健.?dāng)比較運(yùn)算符為“=“時(shí),稱(chēng)為等值連接,其他情況為非等值連接。引用列名TNO時(shí)要加上表名首碼,是因?yàn)閮蓚€(gè)表中的列名相同,必須用表名首碼來(lái)確切說(shuō)明所指列屬於哪個(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

查詢(xún)所有選課學(xué)生的學(xué)號(hào)、姓名、選課名稱(chēng)及成績(jī)。SELECTS.SNO,SN,CN,SCOREFROMS,C,SCWHERES.SNO=SC.SNOANDSC.CNO=C.CNO本例涉及三個(gè)表,WHERE子句中有兩個(gè)連接條件。當(dāng)有兩個(gè)以上的表進(jìn)行連接時(shí),稱(chēng)為多表連接。

自身連接當(dāng)一個(gè)表與其自已進(jìn)行連接操作時(shí),稱(chēng)為表的自身連接。例3.49

查詢(xún)所有比劉偉工資高的教師姓名、性別、工資和劉偉的工資。要查詢(xún)的內(nèi)容均在同一表T中,可以將表T分別取兩個(gè)別名,一個(gè)是X,一個(gè)是Y。將X,Y中滿(mǎn)足比劉偉工資高的行連接起來(lái)。這實(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é)生姓名,年齡和選課名稱(chēng)。方法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

外連接在上面的連接操作中,不滿(mǎn)足連接條件的元組不能作為查詢(xún)結(jié)果輸出。如例3.48的查詢(xún)結(jié)果只包括有選課記錄的學(xué)生,而不會(huì)有吳麗同學(xué)的資訊。若將例3.48改成:例3.51

查詢(xún)所有學(xué)生的學(xué)號(hào)、姓名、選課名稱(chēng)及成績(jī)。(沒(méi)有選課的同學(xué)的選課資訊顯示為空)則應(yīng)寫(xiě)成如下的SQL語(yǔ)句。

SELECTS.SNO,SN,CN,SCOREFROMSLEFTOUTERJOINSCONS.SNO=SC.SNOLEFTOUTERJOINCONC.CNO=SC.CNO則查詢(xún)結(jié)果只包括所有的學(xué)生,沒(méi)有選課的吳麗同學(xué)的選課資訊顯示為空。3.3.7子查詢(xún)?cè)赪HERE子句中包含一個(gè)形如SELECT-FROM-WHERE的查詢(xún)塊,此查詢(xún)塊稱(chēng)為子查詢(xún)或嵌套查詢(xún),包含子查詢(xún)的語(yǔ)句稱(chēng)為父查詢(xún)或外部查詢(xún)。嵌套查詢(xún)可以將一系列簡(jiǎn)單查詢(xún)構(gòu)成複雜查詢(xún),增強(qiáng)查詢(xún)能力。子查詢(xún)的嵌套層次最多可達(dá)到255層,以層層嵌套的方式構(gòu)造查詢(xún)充分體現(xiàn)了SQL“結(jié)構(gòu)化”的特點(diǎn)。嵌套查詢(xún)?cè)趫?zhí)行時(shí)由裏向外處理,每個(gè)子查詢(xún)是在上一級(jí)外部查詢(xún)處理之前完成,父查詢(xún)要用到子查詢(xún)的結(jié)果。

返回一個(gè)值的子查詢(xún)當(dāng)子查詢(xún)的返回值只有一個(gè)時(shí),可以使用比較運(yùn)算符(=,>,<,>=,<=,!=)將父查詢(xún)和子查詢(xún)連接起來(lái)。例3.52

查詢(xún)與劉偉教師職稱(chēng)相同的教師號(hào)、姓名。SELECTTNO,TNFROMTWHEREPROF=(SELECTPROFFROMTWHERETN='劉偉')此查詢(xún)相當(dāng)於分成兩個(gè)查詢(xún)塊來(lái)執(zhí)行。先執(zhí)行子查詢(xún):SELECTPROFFROMTWHERETN=’劉偉’子查詢(xún)向主查詢(xún)只返回一個(gè)值,即劉偉教師的職稱(chēng)“講師”,然後以此作為父查詢(xún)的條件,相當(dāng)於再執(zhí)行父查詢(xún),查詢(xún)所有職稱(chēng)為“講師”的教師號(hào)、姓名。SELECTTNO,TNFROMTWHEREPROF=’講師’

返回一組值的子查詢(xún)?nèi)绻硬樵?xún)的返回值不止一個(gè),而是一個(gè)集合時(shí),則不能直接使用比較運(yùn)算符,可以在比較運(yùn)算符和子查詢(xún)之間插入ANY或ALL。其具體含義詳見(jiàn)以下各例。1.使用ANY例3.53

查詢(xún)講授課程號(hào)為C5的教師姓名。SELECTTNFROMTWHERETNO=ANY(SELECTTNOFROMTCWHERECNO='C5')先執(zhí)行子查詢(xún),找到講授課程號(hào)為C5的教師號(hào),為一組值構(gòu)成的集合(T2,T3,T5);再執(zhí)行父查詢(xún),其中ANY的含義為任意一個(gè),查詢(xún)教師號(hào)為T(mén)2、T3、T5的教師的姓名。

該例也可以使用前面所講的連接操作來(lái)實(shí)現(xiàn):SELECTTNFROMT,TCWHERET.TNO=TC.TNOANDTC.CNO='C5‘可見(jiàn),對(duì)於同一查詢(xún)可使用子查詢(xún)和連接兩種方法來(lái)解決,可根據(jù)習(xí)慣任意選用。

例3.54

查詢(xún)其他系中比電腦系某一教師工資高的教師的姓名和工資。SELECTTN,SALFROMTWHERESAL>ANY(SELECTSALFROMTWHEREDEPT='電腦')ANDDEPT!='電腦' /*注意:此行是父查詢(xún)中的條件*/先執(zhí)行子查詢(xún),找到電腦系中所有教師的工資集合(1500,900);再執(zhí)行父查詢(xún),查詢(xún)所有不是電腦系且工資高於1500或900的教師姓名和工資。

此查詢(xún)也可以寫(xiě)成:SELECTTN,SALFROMTWHERESAL>(SELECTMIN(SAL)FROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’先執(zhí)行子查詢(xún),利用庫(kù)函數(shù)MIN找到電腦系中所有教師的最低工資——900;再執(zhí)行父查詢(xún),查詢(xún)所有不是電腦系且工資高於900的教師。2.使用IN可以使用IN代替“=ANY”。例3.55(題目同3.53)SELECTTNFROMTWHERETNOIN(SELECTTNOFROMTCWHERECNO='C5')3.使用ALLALL的含義為全部。例3.56

查詢(xún)其他系中比電腦系所有教師工資都高的教師的姓名和工資。SELECTTN,SALFROMTWHERESAL>ALL(SELECTSALFROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’子查詢(xún)找到電腦系中所有教師的工資集合(1500,900);父查詢(xún)找到所有不是電腦系且工資高於1500的教師姓名和工資。此查詢(xún)也可以寫(xiě)成:SELECTTN,SALFROMTWHERESAL>(SELECTMAX(SAL)FROMTWHEREDEPT='電腦')ANDDEPT!=‘電腦’庫(kù)函數(shù)MAX的作用是找到電腦系中所有教師的最高工資1500。例3.57

查詢(xún)不講授課程號(hào)為C5的教師姓名。SELECTDISTINCTTNFROMTWHERE'C5'!=ALL(SELECTCNOFROMTCWHERETNO=T.TNO)!=ALL的含義為不等於子查詢(xún)結(jié)果中的任何一個(gè)值,也可使用NOTIN代替!=ALL。子查詢(xún)包含普通子查詢(xún)和相關(guān)子查詢(xún)。前面所講的子查詢(xún)均為普通子查詢(xún),而本例中子查詢(xún)的查詢(xún)條件引用了父查詢(xún)表中的屬性值(T表的TNO值),我們把這類(lèi)查詢(xún)稱(chēng)為相關(guān)子查詢(xún)。二者的執(zhí)行方式不同:普通子查詢(xún)的執(zhí)行順序是:首先執(zhí)行子查詢(xún),然後把子查詢(xún)的結(jié)果作為父查詢(xún)的查詢(xún)條件的值。普通子查詢(xún)只執(zhí)行一次,而父查詢(xún)所涉及的所有記錄行都與其查詢(xún)結(jié)果進(jìn)行比較以確定查詢(xún)結(jié)果集合。相關(guān)子查詢(xún)的執(zhí)行順序是:首先選取父查詢(xún)表中的第一行記錄,內(nèi)部的子查詢(xún)利用此行中相關(guān)的屬性值進(jìn)行查詢(xún),然後父查詢(xún)根據(jù)子查詢(xún)返回的結(jié)果判斷此行是否滿(mǎn)足查詢(xún)條件。如果滿(mǎn)足條件,則把該行放入父查詢(xún)的查詢(xún)結(jié)果集合中。重複執(zhí)行這一過(guò)程,直到處理完父查詢(xún)表中的每一行數(shù)據(jù)。由此可以看出,相關(guān)子查詢(xún)的執(zhí)行次數(shù)是由父查詢(xún)表的行數(shù)決定的。如上例表T中每的一行即每個(gè)教師記錄都要執(zhí)行一次子查詢(xún)以確定該教師是否講授C5這門(mén)課,當(dāng)C5不是教師的任一門(mén)課時(shí),則該教師被選取。

以下幾例均為相關(guān)子查詢(xún)。4.使用EXISTSEXISTS表示存在量詞,帶有EXISTS的子查詢(xún)不返回任何實(shí)際數(shù)據(jù),它只得到邏輯值“真”或“假”。當(dāng)子查詢(xún)的的查詢(xún)結(jié)果集合為非空時(shí),外層的WHERE子句返回真值,否則返回假值。NOTEXISTS與此相反。含有IN的查詢(xún)通??捎肊XISTS表示,但反過(guò)來(lái)不一定。

例3.58(題目同3.53)略SELECTTNFROMTWHEREEXISTS(SELECT*FROMTCWHERETNO=T.TNOANDCNO='C5')當(dāng)子查詢(xún)TC表存在一行記錄滿(mǎn)足其WHERE子句中的條件時(shí),則父查詢(xún)便得到一個(gè)TN值,重複執(zhí)行以上過(guò)程,直到得出最後結(jié)果。例3.59

查詢(xún)選修所有課程的學(xué)生姓名SELECTSNFROMSWHERENOTEXISTS(SELECT*FROMCWHERENOTEXISTS(SELECT*FROMSCWHERESNO=S.SNOANDCNO=C.CNO))選出這樣一些學(xué)生名單,在SC表中不存在他們沒(méi)有選修課程的記錄。

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ù)類(lèi)型一一對(duì)應(yīng)。

例3.60

在S表中插入一條學(xué)生記錄(學(xué)號(hào):S7;姓名:鄭冬;性別:女;年齡:21;系別:電腦)。INSERTINTOSVALUES('s7','鄭冬','女',21,'電腦')注意:必須用逗號(hào)將各個(gè)數(shù)據(jù)分開(kāi),字元型數(shù)據(jù)要用單引號(hào)括起來(lái)。INTO子句中沒(méi)有指定列名,則新插入的記錄必須在每個(gè)屬性列上均有值,且VALUES子句中值的排列順序要和表中各屬性列的排列順序一致。

插入一行的部分?jǐn)?shù)據(jù)值例3.61在SC表中插入一條選課記錄(’S7’,’C1’)。INSERTINTOSC(SNO,CNO)VALUES('s7',‘c1')將VALUES子句中的值按照INTO子句中指定列名的順序插入到表中對(duì)於INTO子句中沒(méi)有出現(xiàn)的列,則新插入的記錄在這些列上將取空值,如上例的SCORE即賦空值。但在表定義時(shí)有NOTNULL約束的屬性列不能取空值。

插入多行記錄用於表間的拷貝,將一個(gè)表中的數(shù)據(jù)抽取數(shù)行插入另一表中,可以通過(guò)子查詢(xún)來(lái)實(shí)現(xiàn)。插入數(shù)據(jù)的命令語(yǔ)法格式為:INSERTINTO<表名>[(<列名1>[,<列名2>…])]子查詢(xún)例3.62

求出各系教師的平均工資,把結(jié)果存放在新表AVGSAL中。首先建立新表AVGSAL,用來(lái)存放系名和各系的平均工資CREATETABLEAVGSAL(DEPARTMENTVARCHAR(20),AVGSALSMALLINT)然後利用子查詢(xún)求出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)滿(mǎn)足的條件,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用子查詢(xún)選擇要修改的行例3.66

把講授C5課程的教師的崗位津貼增加100元。UPDATETSETCOMN=COMN+100WHERETNOIN(SELECTT.TNOFROMT,TCWHERET.TNO=TC.TNOANDTC.CNO='C5')子查詢(xún)的作用是得到講授C5課程的教師號(hào)。

用子查詢(xún)提供要修改的值例3.67

把所有教師的工資提高到平均工資的1.2倍UPDATETSETSAL=(SELECT1.2*AVG(SAL)FROMT)子查詢(xún)的作用是得到所有教師的平均工資。3.4.3刪除數(shù)據(jù)記錄使用DELETE語(yǔ)句可以刪除表中的一行或多行記錄,其語(yǔ)法格式為:DELETEFROM<表名>[WHERE<條件>]其中,<表名>是指要?jiǎng)h除數(shù)據(jù)的表。WHERE子句指定待刪除的記錄應(yīng)當(dāng)滿(mǎn)足的條件,WHERE子句省略時(shí),則刪除表中的所有記錄。

刪除一行記錄例3.68

刪除劉偉教師的記錄。DELETEFROMTWHERETN=’劉偉’

刪除多行記錄例3.69

刪除所有教師的授課記錄DELETEFROMTC執(zhí)行此語(yǔ)句後,TC表即為一個(gè)空表,但其定義仍存在數(shù)據(jù)字典中。

利用子查詢(xún)選擇要?jiǎng)h除的行例3.70刪除劉偉教師授課的記錄。DELETEFROMTCWHERETNO=(SELECTTNOFROMTWHERETN=’劉偉’)3.5視圖視圖是虛表,其數(shù)據(jù)不存儲(chǔ),其記錄來(lái)自基本表,只在資料庫(kù)中存儲(chǔ)其定義。視圖在概念上與基本表等同,用戶(hù)可以在視圖上再定義視圖,可以對(duì)視圖進(jìn)行查詢(xún).刪除.更新等操作。3.5.1定義和刪除視圖

定義視圖定義視圖使用語(yǔ)句CREATEVIEW,其語(yǔ)法格式為:CREATEVIEW<視圖名>[(<視圖列表>)]AS<子查詢(xún)>其中,<視圖列表>為可選項(xiàng),省略時(shí),視圖的列名由子查詢(xún)的結(jié)果決定。

以下兩種情況下,視圖列名不可省略:1.視圖由多個(gè)表連接得到,在不同的表中存在同名列,則需指定列名;2.當(dāng)視圖的列名為運(yùn)算式或庫(kù)函數(shù)的計(jì)算結(jié)果時(shí),而不是單純的屬性名時(shí),則需指明列名。在子查詢(xún)中不許使用ORDERBY子句和DISTINCT短語(yǔ),如果需要排序,則可在視圖定義後,對(duì)視圖查詢(xún)時(shí)再進(jìn)行排序。例3.71創(chuàng)建一個(gè)電腦系教師情況的視圖SUB_T。CREATEVIEWSUB_TASSELECTTNO,TN,PROFFROMTWHEREDEPT='電腦'其中:視圖名字為SUB_T,省略了視圖列表。視圖由子查詢(xún)中的三列TNO,TN,PROF組成。視圖創(chuàng)建後,對(duì)視圖SUB_T的數(shù)據(jù)的訪問(wèn)只限制在電腦系內(nèi),且只能訪問(wèn)TNO,TN,PROF三列的內(nèi)容,從而達(dá)到了數(shù)據(jù)保密的目的。視圖創(chuàng)建後,只在數(shù)據(jù)字典中存放視圖的定義,而其中的子查詢(xún)SELECT語(yǔ)句並不執(zhí)行。只有當(dāng)用戶(hù)對(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ì)刪除,但已無(wú)任何意義。用戶(hù)應(yīng)該把這些視圖刪除。3.5.2查詢(xún)視圖視圖定義後,對(duì)視圖的查詢(xún)操作如同對(duì)基本表的查詢(xún)操作一樣。例3.75查找視圖SUB_T中職稱(chēng)為教授的教師號(hào)和姓名。SELECTTNO,TNFROMSUB_TWHEREPROF='教授'此查詢(xún)的執(zhí)行過(guò)程是系統(tǒng)首先從數(shù)據(jù)字典中找到SUB_T的定義,然後把此定義和用戶(hù)的查詢(xún)結(jié)合起來(lái),轉(zhuǎn)換成等價(jià)的對(duì)基本表T的查詢(xún),這一轉(zhuǎn)換過(guò)程稱(chēng)為視圖消解(ViewResolution),相當(dāng)於執(zhí)行以下查詢(xún):SELECTTNO,TNFROMTWHEREDEPT=’電腦’ANDPROF=’教授’由上例可以看出,當(dāng)對(duì)一個(gè)基本表進(jìn)行複雜的查詢(xún)時(shí),可以先對(duì)基本表建立一個(gè)視圖,然後只需對(duì)此視圖進(jìn)行查詢(xún),這樣就不必再鍵入複雜的查詢(xún)語(yǔ)句,而將一個(gè)複雜的查詢(xún)轉(zhuǎn)換成一個(gè)簡(jiǎn)單的查詢(xún),從而簡(jiǎn)化了查詢(xún)操作。3.5.3更新視圖由於視圖是一張?zhí)摫恚詫?duì)視圖的更新,最終實(shí)際上是轉(zhuǎn)換成對(duì)基本表的更新。其更新操作包括插入、修改和刪除數(shù)據(jù),其語(yǔ)法格式如同對(duì)基本表的更新操作一樣。有些更新在理論上是不可能的,有些實(shí)現(xiàn)起來(lái)比較困難,以下僅考慮可以更新的視圖。

插入(INSERT)例3.76

向電腦系教師視圖SUB_T中插入一條記錄(教師號(hào):T6;姓名:李丹;職稱(chēng):副教授)。INSERTINTOSUB_TVALUES('T6','李丹','副教授')系統(tǒng)在執(zhí)行此語(yǔ)句時(shí),首先從數(shù)據(jù)字典中找到SUB_T的定義,然後把此定義和插入操作結(jié)合起來(lái),轉(zhuǎn)換成等價(jià)的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論