版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
關系數(shù)據(jù)庫標準語言SQL
1.1SQL語言的發(fā)展及標準化1.1.1SQL語言發(fā)展史
SQL語言是當前最為成功、應用最為廣泛的關系數(shù)據(jù)庫語言,其發(fā)展主要經(jīng)歷了以下幾個階段:1974年由CHAMBERLIN和BOYEE提出,當時稱為SEQUEL(STUCTUREDENGLISHQUERYLANGUAGE);IBM公司對其進行了修改,并用于其SYSTEMR關系數(shù)據(jù)庫系統(tǒng)中;1981年IBM推出其商用關系關系數(shù)據(jù)庫SQL/DS,并將其名字改為SQL,由于SQL語言功能強大,簡潔易用,因此得到了廣泛的使用;今天廣泛應用于各種大型數(shù)據(jù)庫,如SYBASE、INFORMIX、ORACLE、DB2、INGRES等,也用于各種小型數(shù)據(jù)庫,如FOXPRO、ACCESS。1.1.2SQL語言標準化隨著關系數(shù)據(jù)庫系統(tǒng)和SQL語言應用的日益廣泛,SQL語言的標準化工作也在緊張革進行著,十多年來已制訂了多個SQL標準;1.1982年,美國國家標準化局(AMERICANNATIONALSTANDARDINSTITUTE,簡稱ANSI)開始制定SQL標準;2.1986年,美國國家標準化協(xié)會公布了SQL語言的第一個標準SQL86;3.1987年,國際標準化組織(ISO)通過了SQL86標準;1989年,國際標準化組織(ISO)對SQL86進行了補充,推出了SQL89標準;5.1992年,ISO又推出了SQL92標準,也稱為SQL2;6.目前SQL99(也稱為SQL3)在起草中,增加了面向對象的功能。1.2SQL語言的基本概念首先介紹兩個基本概念:基本表和視圖?;颈恚˙ASETABLE):是獨立存在的表,不是由其它的表導出的表。一個關系對應一個基本表,一個或多個基本表對應一個存儲文件。視圖(VIEW):是一個虛擬的表,是從一個或幾個基本表導出的表。它本身不獨立存在于數(shù)據(jù)庫中,數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對應的數(shù)據(jù),這些數(shù)據(jù)仍存放在導出視圖的基本表中。當基本表中的數(shù)據(jù)發(fā)生變化時,從視圖中查詢出來的數(shù)據(jù)也隨之改變。例如:學生數(shù)據(jù)庫中有學生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對應一個存儲文件??梢栽谄浠A上定義一個男生基本情況表STUDENT_MALE(SNO,SNAME,SAGE,SDEPT),它是從STUDENT中選擇SSEX=’男’的各個行,然后在SNO,SNAME,SAGE,SDEPT上投影得到的。在數(shù)據(jù)庫中只存有STUDENT_MALE的定義,而STUDENT_MALE的記錄不重復存儲。在用戶看來,視圖是通過不同路徑去看一個實際表,就象一個窗口一樣,我們通過窗戶去看外面的高樓,可以看到高樓的不同部分,而透過視圖可以看到數(shù)據(jù)庫中自己感興趣的內容。SQL語言支持數(shù)據(jù)庫的三級模式結構,如圖3.1所示。其中外模式對應于視圖和部分基本表,模式對應于基本表,內模式對應于存儲文件。
SQL視圖1視圖2基本表1基本表2基本表3基本表4存儲文件1存儲文件2外模式模式內模式圖1SQL語言支持的關系數(shù)據(jù)庫的三級邏輯結構
SQL包括了對數(shù)據(jù)庫的所有操作。在功能上可分為4部分:1、數(shù)據(jù)定義(DataDefination):用來定義數(shù)據(jù)庫結構,包括定義表、視圖和索引。數(shù)據(jù)定義只是定義結構,不涉及到具體數(shù)據(jù)。數(shù)據(jù)定義語句的執(zhí)行結果是在數(shù)據(jù)字典中記錄下這些定義。1.3
SQL的組成2、數(shù)據(jù)操縱(DataManipulation):包括數(shù)據(jù)查詢和數(shù)據(jù)更新兩大類操作。數(shù)據(jù)更新包括插入、刪除和修改。3、數(shù)據(jù)控制(DataControl):包括對數(shù)據(jù)的安全性控制、完整性規(guī)則的描述以及對事務的定義、并發(fā)控制和恢復等。4、嵌入式SQL(EmbeedSQL):在C,Fortran,Cobol等宿主語言中使用SQL的接口和規(guī)則。1.綜合統(tǒng)一
2.SQL語言類似于英語的自然語言,簡潔易用。
3.SQL語言是一種非過程語言,即用戶只要提出“干什么”即可,不必管具體操作過程,也不必了解數(shù)據(jù)的存取路徑,只要指明所需的數(shù)據(jù)即可。
SQL語言是一種面向集合的語言,每個命令的操作對象是一個或多個關系,結果也是一個關系。
5.SQL語言既是自含式語言,又是嵌入式語言??瑟毩⑹褂?,也可嵌入到宿主語言中。自含式語言可以獨立使用交互命令,適用于終端用戶、應用程序員和DBA;嵌入式語言使其嵌入在高級語言中使用,供應用程序員開發(fā)應用程序。1.4
SQL的特點2學生-課程數(shù)據(jù)庫以本數(shù)據(jù)庫為模型講解SQL語言3數(shù)據(jù)定義
SQL語言使用數(shù)據(jù)定義語言(DATADEFINITIONLANGUAGE,簡稱DDL)實現(xiàn)其數(shù)據(jù)定義功能,可對數(shù)據(jù)庫用戶、基本表、視圖、索引進行定義和撤消。
一、字段數(shù)據(jù)類型當用SQL語句定義表時,需要為表中的每一個字段設置一個數(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兩種。二者相同,但建議使用DECIMAL。如:123.0、8000.563.近似浮點數(shù)值數(shù)據(jù)類型:當數(shù)值的位數(shù)太多時,可用此數(shù)據(jù)類型來取其近似值,用FLOAT和REAL兩種。如:1.23E+10
日期時間數(shù)據(jù)類型:用來表示日期與時間,依時間范圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-0815:30:005.字符串數(shù)據(jù)類型:用來表示字符串的字段。包括:CHAR,VARCHAR,TEXT三種,如:“數(shù)據(jù)庫”6.UNICODE字符串數(shù)據(jù)類型:UNICODE是雙字節(jié)文字編碼標準,包括NCHAR,NVARCHAR與NTEXT三種。與字符串數(shù)據(jù)類型相類似,但UNICODE的一個字符用2字節(jié)存儲,而一般字符數(shù)據(jù)用一個字節(jié)存儲。7.二進制數(shù)據(jù)類型:用來定義二進制碼的數(shù)據(jù)。有:BINARY,VARBINARY,IMAGE三種,通常用十六進制表示:如:OX5F3C8.貨幣數(shù)據(jù)類型:用來定義與貨幣有關的數(shù)據(jù),分為MONEY與SMALLMONEY兩種,如:123.00009.標記數(shù)據(jù)類型:有UNIQUEIDENTIFIER,TIMESTAMP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時間戳印,而UNIQUEIDENTIFIER用來識別每一筆數(shù)據(jù)的唯一性。3.1模式的定義和刪除一、定義模式定義語句:
CREATESCHEMA<模式名>AUTHORIZATION<用戶名>如果沒有指定<模式名>則隱含為<用戶名>要創(chuàng)建模式,調用該命令的用戶必須具備DBA權限,或者獲得了DBA的授權?!怖?〕定義一個學生-課程模式S-TCREATESCHEMAS-TAUTHORIZATIONWANG;〔例2〕CREATESCHEMAAUTHORIZATIONWANG;定義模式:實際上定義了一個命名空間,在這個空間中可以進一步定義該模式包含的數(shù)據(jù)庫對象。在創(chuàng)建模式的同時用戶可在這個模式定義中進一步創(chuàng)建基本表、視圖、定義授權。
CREATESCHEMA<模式名>AUTHORIZATION<用戶名>[<表定義子句>|<視圖定義子句|<授權定義子句
>]〔例3〕:CREATESCHEMAAUTHORIZATIONWANGCREATETABLETAB1(COL1SMALLINT,COL2INT,COL3CHAR(20),COL4NUMERIC(10,3)COL5DECIMAL(5,2));二、刪除模式語句格式:
DROPSCHEMA<模式名><CASCADE|RESTRICT>CASCADE和RESTRICT兩者必選其一。CASCADE(級聯(lián)):表示在刪除模式的同時把該模式中所有的數(shù)據(jù)庫對象全部一起刪除。RESTRICT(限制):表示如果該模式中已經(jīng)定義了下屬的數(shù)據(jù)庫對象(如table、view),則拒絕該刪除語句的執(zhí)行。[例4]:DROPSCHEMAWANGCASCADE注:在許多RDBMS中把創(chuàng)建模式成為創(chuàng)建數(shù)據(jù)庫,即用CREATEDATABASE代替CREATESCHEMA。刪除亦同。建立數(shù)據(jù)庫CREATEDATABASE<數(shù)據(jù)庫名>3.2基本表的定義、刪除和修改一、定義基本表CREATETABLE<表名>
(<列名><數(shù)據(jù)類型>[DEFAULT]
[<列級完整性約束條件>][,<列名><數(shù)據(jù)類型>[DEFAULT]
[<列級完整性約束條件>]]…[,<表級完整性約束條件>]);<表名>:所要定義的基本表的名字<列名>:組成該表的各個屬性(列)<列級完整性約束條件>:涉及相應屬性列的完整性約束條件<表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件DEFAULT:若是某字段設置有默認值,當該字段未被輸入數(shù)據(jù)時,則以該默認值自動填入該字段。說明:創(chuàng)建一個數(shù)據(jù)表時主要包括以下幾個組成部分:(1)字段名(列名):字段名可長達128個字符。字段名可包含中文、英文字母、下劃線、#號、貨幣符號(¥)及AT符號(@)。同一表中不許有重名列;(2)字段數(shù)據(jù)類型:見表3.2;(3)字段的長度、精度和小數(shù)位數(shù);①字段的長度:指字段所能容納的最大數(shù)據(jù)量,但對不同的數(shù)據(jù)類型來說,長度對字段的意義可能有些不同。對字符串與UNICODE數(shù)據(jù)類型而言,長度代表字段所能容納的字符的數(shù)目,因此它會限制用戶所能輸入的文本長度。對數(shù)值類的數(shù)據(jù)類型而言,長度則代表字段使用多少個字節(jié)來存放數(shù)字。對BINARY、VARBINARY、IMAGE數(shù)據(jù)類型而言,長度代表字段所能容納的字節(jié)數(shù)。②精度和小數(shù)位數(shù)精度是指數(shù)中數(shù)字的位數(shù),包括小數(shù)點左側的整數(shù)部分和小數(shù)點右側的小數(shù)部分;小數(shù)位數(shù)則是指數(shù)字小數(shù)點右側的位數(shù)。例如:數(shù)字12345.678,其精度為8,小數(shù)位數(shù)為3;所以只有數(shù)值類的數(shù)據(jù)類型才有必要指定精度和小數(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ù),如:如果某字段采用INT數(shù)據(jù)類型,其長度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒有小數(shù)點的整數(shù)。存儲大小則是4個字節(jié)。(4)NULL值與DEFAULT值DEFAULT值表示某一字段的默認值,當沒有輸入數(shù)據(jù)時,則使用此默認的值。[例1]建立一個“學生”表Student,它由學號Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個屬性組成。其中學號不能為空,值是唯一的,并且姓名取值也唯一。
CREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,
SnameCHAR(20)UNIQUE,
SsexCHAR(1),
SageINT,
SdeptCHAR(15));例2建立一學生表USESTUDENTCREATETABLES(SNOCHAR(8),SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT'男',DEPTVARCHAR(20));執(zhí)行該語句后,便產(chǎn)生了學生基本表的表框架,此表為一個空表。其中,SEX列的缺省值為“男”。常用完整性約束主碼約束:PRIMARYKEY唯一性約束:UNIQUE非空值約束:NOTNULL參照完整性約束
定義表的時候,通常把完整性約束也定義了,放在數(shù)據(jù)字典里面。在SQLSERVER中,對于基本表的約束分為列約束和表約束。我們只對列約束進行研究。(1)NULL/NOTNULL是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒有數(shù)據(jù)”的意思。當某一字段的值一定要輸入才有意義的時候,則可以設置為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)生一個名字。如下列功能同上,只是省略約束名稱。USESTUDENTCREATETABLES(SNOCHAR(10)NOTNULL,SNVARCHAR(20),AGEINT,SEXCHAR(2)DEFAULT'男',DEPTVARCHAR(20));(2)UNIQUE約束UNIQUE約束用于指明基本表在某一列或多個列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個NULL值。UNIQUE既可用于列約束,也可用于表約束。UNIQUE用于定義列約束時,其語法格式如下:
[CONSTRAINT<約束名>]UNIQUE例建立一個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(<列名>[{,<列名>}])例建立一個S表,定義SN+SEX為唯一鍵。USESTUDENTCREATETABLES(SNOCHAR(5),SNCHAR(8),SEXCHAR(2),CONSTRAINTS_UNIQUNIQUE(SN,SEX));系統(tǒng)為SN+SEX建立唯一索引,確保同一性別的學生沒有重名。(3)PRIMARYKEY約束PRIMARYKEY約束用于定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重復,以此來保證實體的完整性。PRIMARYKEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:①在一個基本表中只能定義一個PRIMARYKEY約束,但可定義多個UNIQUE約束;②對于指定為PRIMARYKEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARYKEY約束。PRIMARYKEY既可用于列約束,也可用于表約束。PRIMARYKEY用于定義列約束時,其語法格式如下:
CONSTRAINT<約束名>PRIMARYKEY例建立一個S表,定義SNO為S的主鍵USESTUDENTCREATETABLES(SNOCHAR(5)NOTNULLCONSTRAINTS_PRIMPRIMARYKEY,SNCHAR(8),AGENUMERIC(2));PRIMARYKEY用于定義表約束時,即將某些列的組合定義為主鍵,其語法格式如下:
[CONSTRAINT<約束名>]SPRIMARYKEY(<列名>[{<列名>}])例建立一個SC表,定義SNO+CNO為SC的主鍵USESTUDENTCREATETABLESC(snochar(5)notnull,cnochar(5)notnull,scorenumeric(3),constraintsc_primprimarykey(sno,cno));或者:primarykey(sno,cno)(4)FOREIGNKEY約束FOREIGNKEY約束指定某一個列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。系統(tǒng)保證從表在外部鍵上的取值要么是主表中某一個主鍵值或唯一鍵值,要么取空值。以此保證兩個表之間的連接,確保了實體的參照完整性。FOREIGNKEY既可用于列約束,也可用于表約束,其語法格式為:
[CONSTRAINT<約束名>]FOREIGNKEY REFERENCES<主表名>(<列名>[{<列名>}])例建立一個sc表,定義sno,cno為sc的外部鍵。usestudentcreatetablesc(snochar(5)notnullconstraints_foreforeignkey
referencess(sno),cnochar(5)notnullconstraintc_foreforeignkey
referencesc(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種方法定義它所屬的模式:1、在表名中明顯地給出模式名。如:CreatetableS-T.student(......);2、在創(chuàng)建模式語句同時創(chuàng)建表。3、設置所屬的模式,這樣在創(chuàng)建表時表名中不必給出模式名。當用戶創(chuàng)建基本表時若沒有指定模式,系統(tǒng)根據(jù)搜索路徑來確定該對象所屬的模式。三、修改基本表由于應用環(huán)境和應用需求的變化,經(jīng)常需要修改基本表的結構,比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。SQL語言使用ALTERTABLE命令來完成這一功能,有如下三種修改方式:1.ADD方式用于增加新列和完整性約束,定義方式同CREATETABLE語句中的定義方式相同,其語法格式為:
ALTERTABLE<表名>ADD<列定義>|<完整性約束定義>例在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]例2把S表中的SNO列加寬到8位字符寬度USESTUDENTALTERTABLESALTERCOLUMNSNOCHAR(8)注意:使用此方式有如下一些限制:①不能改變列名;②不能將含有空值的列的定義修改為NOTNULL約束;③若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型;④只能修改NULL|NOTNULL約束,其它類型的約束在修改之前必須先刪除,然后再重新添加修改過的約束定義。3.DROP方式刪除完整性約束定義,其語法格式為:
ALTERTABLE<表名> DROPCONSTRAINT<約束名>例刪除S表中的AGE_CHK約束USESTUDENTALTERTABLESDROPCONSTRAINTAGE_CHK改變基本表的名字使用RENAME命令,可以改變基本表的名字,其語法格式為:
RENAME<舊表名>TO<新表名>例將S表的名字更改為STUDENTUSESTUDENT RENAMESTOSTUDENT四刪除基本表當某個基本表無用時,可將其刪除。刪除后,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無法使用。如果重新恢復該表,這些視圖可重新使用。刪除表的語法格式:
DROPTABLE<表名>例3.17刪除表STUDENTUSESTUDENT DROPTABLESTUDENT注意:只能刪除自己建立的表,不能刪除其他用戶所建的表。3.3建立與刪除索引建立索引是加快查詢速度的有效手段建立索引DBA或表的屬主(即建立表的人)根據(jù)需要建立有些DBMS自動建立以下列上的索引
PRIMARYKEYUNIQUE維護索引
DBMS自動完成
使用索引
DBMS自動選擇是否使用索引以及使用哪些索引
索引的作用在日常生活中我們會經(jīng)常遇到索引,例如圖書目錄、詞典索引等。借助索引,人們會很快地找到需要的東西。索引是數(shù)據(jù)庫隨機檢索的常用手段,它實際上就是記錄的關鍵字與其相應地址的對應表。例如,當我們要在本書中查找有關“SQL查詢”的內容時,應該先通過目錄找到“SQL查詢”所對應的頁碼,然后從該頁碼中找出所要的信息。這種方法比直接翻閱書的內容要快。如果把數(shù)據(jù)庫表比作一本書,則表的索引就如書的目錄一樣,通過索引可大大提高查詢速度。此外,在SQLSERVER中,行的唯一性也是通過建立唯一索引來維護的。
索引的作用可歸納為:1.加快查詢速度;2.保證行的唯一性。索引的分類1.按照索引記錄的存放位置可分為聚集索引與非聚集索引聚集索引:按照索引的字段排列記錄,并且依照排好的順序將記錄存儲在表中。非聚集索引:按照索引的字段排列記錄,但是排列的結果并不會存儲在表中,而是另外存儲。2.唯一索引的概念唯一索引表示表中每一個索引值只對應唯一的數(shù)據(jù)記錄,這與表的PRIMARYKEY的特性類似,因此唯一性索引常用于PRIMARYKEY的字段上,以區(qū)別每一筆記錄。當表中有被設置為UNIQUE的字段時,SQLSERVER會自動建立一個非聚集的唯一性索引。而當表中有PRIMARYKEY的字段時,SQLSERVER會在PRIMARYKEY字段建立一個聚集索引。3.復合索引的概念復合索引是將兩個字段或多個字段組合起來建立的索引,而單獨的字段允許有重復的值。一、建立索引
語句格式CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…); 用<表名>指定要建索引的基本表名字索引可以建立在該表的一列或多列上,各列名之間用逗號分隔用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE表明此索引的每一個索引值只對應唯一的數(shù)據(jù)記錄CLUSTERED表示要建立的索引是聚簇索引[例6]為學生-課程數(shù)據(jù)庫中的Student,Course,SC三個表建立索引。其中Student表按學號升序建唯一索引,Course表按課程號升序建唯一索引,SC表按學號升序和課程號降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);CREATEUNIQUEINDEXCoucnoONCourse(Cno);CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);
唯一值索引對于已含重復值的屬性列不能建UNIQUE索引對某個列建立UNIQUE索引后,插入新記錄時DBMS會自動檢查新記錄在該列上是否取了重復值。這相當于增加了一個UNIQUE約束聚簇索引建立聚簇索引后,基表中數(shù)據(jù)也需要按指定的聚簇屬性值的升序或降序存放。也即聚簇索引的索引項順序與表中記錄的物理順序一致例:CREATECLUSTEREDINDEXStusnameONStudent(Sname);在Student表的Sname(姓名)列上建立一個聚簇索引,而且Student表中的記錄將按照Sname值的升序存放
在一個基本表上最多只能建立一個聚簇索引聚簇索引的用途:對于某些類型的查詢,可以提高查詢效率聚簇索引的適用范圍很少對基表進行增刪操作很少對其中的變長列進行修改操作注意:1.改變表中的數(shù)據(jù)(如增加或刪除記錄)時,索引將自動更新。索引建立后,在查詢使用該列時,系統(tǒng)將自動使用索引進行查詢。2.索引數(shù)目無限制,但索引越多,更新數(shù)據(jù)的速度越慢。對于僅用于查詢的表可多建索引,對于數(shù)據(jù)更新頻繁的表則應少建索引。二、刪除索引DROPINDEX<索引名>;刪除索引時,系統(tǒng)會從數(shù)據(jù)字典中刪去有關該索引的描述。[例7]刪除Student表的Stusname索引。
DROPINDEXStusname;4查詢1概述2單表查詢3連接查詢4嵌套查詢5集合查詢概述語句格式SELECT[ALL|DISTINCT]<目標列表達式>[,<目標列表達式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達式>][GROUPBY<列名1>[HAVING<條件表達式>]][ORDERBY<列名2>[ASC|DESC]];
語句格式SELECT子句:指定要顯示的屬性列FROM子句:指定查詢對象(基本表或視圖)WHERE子句:指定查詢條件
GROUPBY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組為一個組。通常會在每組中作用集函數(shù)。HAVING短語:篩選出只有滿足指定條件的組ORDERBY子句:對查詢結果表按指定列值的升序或降序排序1單表查詢
查詢僅涉及一個表,是一種最簡單的查詢操作一、選擇表中的若干列二、選擇表中的若干元組三、對查詢結果排序四、使用集函數(shù)五、對查詢結果分組
查詢指定列[例1]查詢全體學生的學號與姓名。SELECTSno,SnameFROMStudent;
[例2]查詢全體學生的姓名、學號、所在系。SELECTSname,Sno,SdeptFROMStudent;查詢全部列[例3]查詢全體學生的詳細記錄。SELECTSno,Sname,Ssex,Sage,Sdept
FROMStudent;或SELECT*FROMStudent;
3.查詢經(jīng)過計算的值
SELECT子句的<目標列表達式>為表達式算術表達式字符串常量函數(shù)列別名等
3.查詢經(jīng)過計算的值[例4]查全體學生的姓名及其出生年份。SELECTSname,2000-SageFROMStudent;
輸出結果:
Sname2000-Sage----------------------
李勇1976
劉晨1977
王名1978
張立19783.查詢經(jīng)過計算的值[例5]查詢全體學生的姓名、出生年份和所有系,要求用小寫字母表示所有系名。SELECTSname,'YearofBirth:',2000-Sage,
ISLOWER(Sdept)FROMStudent;
例題(續(xù))輸出結果:
Sname'YearofBirth:'2000-SageISLOWER(Sdept)----------------------------------------------
李勇YearofBirth:1976cs
劉晨YearofBirth:1977is
王名YearofBirth:1978ma
張立YearofBirth:1977is[例5.1]使用列別名改變查詢結果的列標題SELECTSname
NAME,'YearofBirth:’BIRTH,
2000-SageBIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROM
Student;輸出結果:
NAMEBIRTHBIRTHDAYDEPARTMENT------------------------------------------------------
李勇YearofBirth:1976cs
劉晨YearofBirth:1977is
王名YearofBirth:1978ma
張立YearofBirth:1977is二、選擇表中的若干元組消除取值重復的行查詢滿足條件的元組1.消除取值重復的行在SELECT子句中使用DISTINCT短語假設SC表中有下列數(shù)據(jù)
SnoCnoGrade---------------------9500119295001285950013889500229095002380ALL與
DISTINCT
[例6]查詢選修了課程的學生學號。(1)SELECTSnoFROMSC;
或(默認ALL)SELECTALLSnoFROMSC;
結果:Sno
-------9500195001950019500295002例題(續(xù))(2)SELECTDISTINCTSnoFROMSC;
結果:
Sno
-------9500195002例題(續(xù))注意DISTINCT短語的作用范圍是所有目標列例:查詢選修課程的各種成績錯誤的寫法SELECTDISTINCTCno,DISTINCTGradeFROMSC;正確的寫法
SELECTDISTINCTCno,GradeFROMSC;
2.查詢滿足條件的元組運算符含義=,>,<,>=,<=,!=比較大小多重條件AND,ORBETWEENAND確定范圍IN確定集合LIKE字符匹配ISNULL空值(1)比較大小在WHERE子句的<比較條件>中使用比較運算符=,>,<,>=,<=,!=或<>,!>,!<,邏輯運算符NOT+比較運算符[例8]查詢所有年齡在20歲以下的學生姓名及其年齡。
SELECTSname,Sage
FROMStudentWHERESage<20;或SELECTSname,SageFROMStudentWHERENOTSage>=20;
(2)確定范圍使用謂詞BETWEEN…AND…NOTBETWEEN…AND…[例10]查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。
SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23;
例題(續(xù))[例11]查詢年齡不在20~23歲之間的學生姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23;
(3)確定集合使用謂詞IN<值表>,NOTIN<值表>
<值表>:用逗號分隔的一組取值[例12]查詢信息系(IS)、數(shù)學系(MA)和計算機科學系(CS)學生的姓名和性別。SELECTSname,SsexFROMStudentWHERESdeptIN('IS','MA','CS');(3)確定集合[例13]查詢既不是信息系、數(shù)學系,也不是計算機科學系的學生的姓名和性別。SELECTSname,SsexFROMStudent WHERESdeptNOTIN('IS','MA','CS');(4)字符串匹配[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]<匹配串>:指定匹配模板匹配模板:固定字符串或含通配符的字符串當匹配模板為固定字符串時,可以用=運算符取代LIKE謂詞用!=或<>運算符取代NOTLIKE謂詞通配符%(百分號)代表任意長度(長度可以為0)的字符串例:a%b表示以a開頭,以b結尾的任意長度的字符串。如acb,addgb,ab
等都滿足該匹配串_(下橫線)代表任意單個字符例:a_b表示以a開頭,以b結尾的長度為3的任意字符串。如acb,afb等都滿足該匹配串ESCAPE短語:當用戶要查詢的字符串本身就含有%或_時,要使用ESCAPE'<換碼字符>'短語對通配符進行轉義。例題1)匹配模板為固定字符串[例14]查詢學號為95001的學生的詳細情況。
SELECT*FROMStudentWHERESnoLIKE'95001';等價于:
SELECT*FROMStudentWHERESno='95001';例題(續(xù))2)匹配模板為含通配符的字符串[例15]查詢所有姓劉學生的姓名、學號和性別。
SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE‘劉%’;例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例16]查詢姓"歐陽"且全名為三個漢字的學生的姓名。
SELECTSnameFROMStudentWHERESnameLIKE'歐陽__';例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例17]查詢名字中第2個字為"陽"字的學生的姓名和學號。
SELECTSname,SnoFROMStudentWHERESnameLIKE'__陽%';例題(續(xù))匹配模板為含通配符的字符串(續(xù))[例18]查詢所有不姓劉的學生姓名。
SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE'劉%';例題(續(xù))3)使用換碼字符將通配符轉義為普通字符
[例19]查詢DB_Design課程的課程號和學分。
SELECTCno,CcreditFROMCourseWHERECnameLIKE'DB\_Design'ESCAPE'\'例題(續(xù))使用換碼字符將通配符轉義為普通字符(續(xù))[例20]查詢以"DB_"開頭,且倒數(shù)第3個字符為i的課程的詳細情況。
SELECT*FROMCourseWHERECnameLIKE'DB\_%i__'ESCAPE'\';(5)涉及空值的查詢
使用謂詞ISNULL或ISNOTNULL“ISNULL”不能用“=NULL”代替[例21]某些學生選修課程后沒有參加考試,所以有選課記錄,但沒有考試成績。查詢缺少成績的學生的學號和相應的課程號。
SELECTSno,CnoFROMSCWHEREGradeISNULL;例題(續(xù))[例22]查所有有成績的學生學號和課程號。
SELECTSno,CnoFROMSCWHEREGradeISNOTNULL;(6)多重條件查詢用邏輯運算符AND和OR來聯(lián)結多個查詢條件
AND的優(yōu)先級高于OR
可以用括號改變優(yōu)先級可用來實現(xiàn)多種其他謂詞
[NOT]IN[NOT]BETWEEN…AND…例題[例23]查詢計算機系年齡在20歲以下的學生姓名。
SELECTSnameFROMStudentWHERESdept='CS'ANDSage<20;改寫[例12][例12]查詢信息系(IS)、數(shù)學系(MA)和計算機科學系(CS)學生的姓名和性別。SELECTSname,SsexFROMStudentWHERESdeptIN('IS','MA','CS')可改寫為:SELECTSname,SsexFROMStudentWHERESdept='IS'ORSdept='MA'ORSdept='CS';改寫[例10][例10]查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡。
SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23;可改寫為:
SELECTSname,Sdept,SageFROMStudentWHERESage>=20ANDSage<=23;三、對查詢結果排序
使用ORDERBY子句可以按一個或多個屬性列排序升序:ASC;降序:DESC;缺省值為升序當排序列含空值時ASC:排序列為空值的元組最后顯示DESC:排序列為空值的元組最先顯示對查詢結果排序(續(xù))
[例24]查詢選修了3號課程的學生的學號及其成績,查詢結果按分數(shù)降序排列。
SELECTSno,GradeFROMSCWHERECno='3'ORDERBYGradeDESC;查詢結果
SnoGrade--------------9501095024950079295003829501082950097595014619500255對查詢結果排序(續(xù))
[例25]查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
SELECT*FROMStudentORDERBYSdept,SageDESC;
四、使用集函數(shù)5類主要集函數(shù)計數(shù)COUNT([DISTINCT|ALL]*)COUNT([DISTINCT|ALL]<列名>)計算總和SUM([DISTINCT|ALL]<列名>) 計算平均值AVG([DISTINCT|ALL]<列名>)使用集函數(shù)(續(xù))求最大值MAX([DISTINCT|ALL]<列名>)
求最小值MIN([DISTINCT|ALL]<列名>) DISTINCT短語:在計算時要取消指定列中的重復值ALL短語:不取消重復值ALL為缺省值使用集函數(shù)(續(xù))[例26]查詢學生總人數(shù)。
SELECTCOUNT(*)FROMStudent;
[例27]查詢選修了課程的學生人數(shù)。
SELECTCOUNT(DISTINCTSno)FROMSC;注:用DISTINCT以避免重復計算學生人數(shù)使用集函數(shù)(續(xù))[例28]計算1號課程的學生平均成績。
SELECTAVG(Grade)FROMSCWHERECno='1';
[例29]查詢選修1號課程的學生最高分數(shù)。
SELECTMAX(Grade)FROMSCWHERCno='1';
五、對查詢結果分組使用GROUPBY子句分組 細化集函數(shù)的作用對象未對查詢結果分組,集函數(shù)將作用于整個查詢結果對查詢結果分組后,集函數(shù)將分別作用于每個組使用GROUPBY子句分組[例30]求各個課程號及相應的選課人數(shù)。
SELECTCno,COUNT(Sno)FROMSCGROUPBYCno;
結果
CnoCOUNT(Sno)
122
234 344 433 548對查詢結果分組(續(xù))GROUPBY子句的作用對象是查詢的中間結果表分組方法:按指定的一列或多列值分組,值相等的為一組使用GROUPBY子句后,SELECT子句的列名列表中只能出現(xiàn)分組屬性和集函數(shù)
使用HAVING短語篩選最終輸出結果[例31]查詢選修了3門以上課程的學生學號。
SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)>3;
例題[例32]查詢有3門以上課程是90分以上的學生的學號及(90分以上的)課程數(shù)
SELECTSno,COUNT(*)FROMSCWHEREGrade>=90GROUPBYSnoHAVINGCOUNT(*)>=3;
使用HAVING短語篩選最終輸出結果只有滿足HAVING短語指定條件的組才輸出HAVING短語與WHERE子句的區(qū)別:作用對象不同WHERE子句作用于基表或視圖,從中選擇滿足條件的元組。HAVING短語作用于組,從中選擇滿足條件的組。
3.3.3連接查詢同時涉及多個表的查詢稱為連接查詢用來連接兩個表的條件稱為連接條件或連接謂詞一般格式:[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>
比較運算符:=、>、<、>=、<=、!=[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接查詢(續(xù))連接字段連接謂詞中的列名稱為連接字段連接條件中的各連接字段類型必須是可比的,但不必是相同的一、廣義笛卡爾積不帶連接謂詞的連接很少使用例:
SELECTStudent.*,SC.*FROMStudent,SC二、等值與非等值連接查詢等值連接、自然連接、非等值連接[例32]查詢每個學生及其選修課程的情況。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;等值連接連接運算符為=的連接操作
[<表名1>.]<列名1>=[<表名2>.]<列名2>任何子句中引用表1和表2中同名屬性時,都必須加表名前綴。引用唯一屬性名時可以加也可以省略表名前綴。等值連接假設Student表、SC表分別有下列數(shù)據(jù):
Student表
Sno
SnameSsexSageSdept95001
李勇
男20CS95002
劉晨
女19IS95003
王敏
女18MA95004
張立
男19IS等值連接SC表
Sno
CnoGrade95001
19295001
285950019500295002
323889080等值連接結果表
Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade
95001李勇男20 CS 9500119295001李勇男20 CS 9500128595001李勇男20 CS 9500138895002劉晨女19 IS 9500229095002劉晨女19 IS 95002380
自然連接等值連接的一種特殊情況,把目標列中重復的屬性列去掉。[例33]對[例32]用自然連接完成。
SELECTStudent.Sno,Sname,Ssex,Sage, Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;非等值連接查詢連接運算符不是=的連接操作
[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>比較運算符:>、<、>=、<=、!=[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>
三、自身連接一個表與其自己進行連接,稱為表的自身連接需要給表起別名以示區(qū)別由于所有屬性名都是同名屬性,因此必須使用別名前綴自身連接(續(xù))[例34]查詢每一門課的間接先修課(即先修課的先修課)
SELECTFIRST.Cno,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=SECOND.Cno;自身連接(續(xù))FIRST表(Course表)
Cno
CnameCpnoCcredit1數(shù)據(jù)庫
5
42數(shù)學
23信息系統(tǒng)
1
44操作系統(tǒng)
6
35數(shù)據(jù)結構
7
46數(shù)據(jù)處理
27PASCAL語言
6
4自身連接(續(xù))SECOND表(Course表)
Cno
CnameCpnoCcredit1數(shù)據(jù)庫
5
42數(shù)學
23信息系統(tǒng)
1
44操作系統(tǒng)
6
35數(shù)據(jù)結構
7
46數(shù)據(jù)處理
27PASCAL語言
6
4自身連接(續(xù))查詢結果
173556
cnocpno四、外連接(OuterJoin)外連接與普通連接的區(qū)別普通連接操作只輸出滿足連接條件的元組外連接操作以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出外連接(續(xù))
[例33]查詢每個學生及其選修課程的情況包括沒有選修課程的學生----用外連接操作SELECTStudent.Sno,Sname,Ssex, Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno(*);外連接(續(xù))結果:
Student.Sno SnameSsexSageSdeptCno
Grade
95001李勇男20CS19295001李勇男20CS28595001李勇男20CS38895002劉晨女19IS29095002劉晨女19IS38095003王敏女18MA95004張立男19IS外連接(續(xù))在表名后面加外連接操作符(*)或(+)指定非主體表非主體表有一“萬能”的虛行,該行全部由空值組成虛行可以和主體表中所有不滿足連接條件的元組進行連接由于虛行各列全部是空值,因此與虛行連接的結果中,來自非主體表的屬性值全部是空值外連接(續(xù))
左外連接
外連接符出現(xiàn)在連接條件的左邊 右外連接
外連接符出現(xiàn)在連接條件的右邊
五、復合條件連接WHERE子句中含多個連接條件時,稱為復合條件連接[例35]查詢選修2號課程且成績在90分以上的所有學生的學號、姓名SELECTStudent.Sno,student.SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoAND/*連接謂詞*/SC.Cno='2'AND/*其他限定條件*/SC.Grade>90;
/*其他限定條件*/多表連接[例36]查詢每個學生的學號、姓名、選修的課程名及成績。
SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.Sno
andSC.Cno=Course.Cno;
結果:
Student.SnoSnameCname
Grade 95001李勇數(shù)據(jù)庫9295001李勇數(shù)學8595001李勇信息系統(tǒng)8895002劉晨數(shù)學9095002劉晨信息系統(tǒng)80嵌套查詢概述一個SELECT-FROM-WHERE語句稱為一個查詢塊將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢
SELECTSname
外層查詢/父查詢
FROMStudentWHERESnoIN
(SELECTSno
內層查詢/子查詢
FROMSCWHERECno='2');子查詢的限制不能使用ORDERBY子句層層嵌套方式反映了SQL語言的結構化有些嵌套查詢可以用連接運算替代一、帶有IN謂詞的子查詢[例37]查詢與“劉晨”在同一個系學習的學生。
此查詢要求可以分步來完成①確定“劉晨”所在系名
SELECTSdept
FROMStudentWHERESname='劉晨'; 結果為:
Sdept IS帶有IN謂詞的子查詢(續(xù))②查找所有在IS系學習的學生。
SELECTSno,Sname,Sdept
FROMStudentWHERESdept='IS';結果為:SnoSnameSdept95001劉晨IS95004張立IS
構造嵌套查詢將第一步查詢嵌入到第二步查詢的條件中
SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdept
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024行政單位預算管理風險控制合同
- 2024年耗材長期租賃與購買合同3篇
- 2024年限小學設施升級裝修服務協(xié)議版B版
- 氨制冷知識培訓
- 經(jīng)典特許經(jīng)營合同04年
- 動物園獸醫(yī)知識培訓課件
- 2024年西洋參電商銷售渠道合作協(xié)議3篇
- 中國勞動關系學院《英語公共演講》2023-2024學年第一學期期末試卷
- 浙江中醫(yī)藥大學《國際信貸與結算》2023-2024學年第一學期期末試卷
- 長治醫(yī)學院《自動化學科前沿講座》2023-2024學年第一學期期末試卷
- 目標、計劃與行動課件
- 動態(tài)變形模量Evd試驗記錄
- 2020-2021學年浙江省溫州市八年級(上)期末數(shù)學試卷(附答案詳解)
- 蔬菜籽種采購清單
- 工期定額-民用建筑
- 低壓電能表安裝作業(yè)指導書
- 技術服務及售后服務的承諾及保證措施
- (完整版)PCR試題答案版
- 能見度不良時船舶航行須知
- 軟膠囊的制備
- 回風立井臨時改絞施工措施
評論
0/150
提交評論