數據庫原理與應用第5章_第1頁
數據庫原理與應用第5章_第2頁
數據庫原理與應用第5章_第3頁
數據庫原理與應用第5章_第4頁
數據庫原理與應用第5章_第5頁
已閱讀5頁,還剩112頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SQLServer20005.1SQL概述5.2數據定義5.3數據查詢5.4數據更新5.5視圖5.6數據控制機制和語句第五章關系數據庫標準語言-SQLSQLServer2000一、SQL的發展

SQL(StructuredQueryLanguage,結構化查詢語言)是關系數據庫的標準語言

1974年由Boyce和Chamberlin提出

1975年至1979年IBM公司的關系數據庫管理系統System-R實現了這種語言

1986年美國國家標準局(ANSI)頒布了SQL的美國標準,1987年國際標準化組織(ISO)通過了這一標準,現這兩個標準稱為SQL-861989年ANSI公布SQL-89標準

1992年ANSI公布SQL2標準(即SQL-92標準)

1999年ANSI公布SQL3標準5.1SQL概述SQLServer2000二、SQL優點

(1)集多種數據語言功能于一體,是一種綜合統一的語言(2)高度非過程化

(3)面向集合的操作方式

(4)以同一種語法結構提供兩種使用方式

(5)語言簡潔、易學易用

(6)支持三級模式結構5.1SQL概述SQLServer2000注意:

(1)SQL語言是一種關系數據庫語言,

提供數據的定義、查詢、更新和控制等功能。

(2)SQL語言不是一個應用程序開發語言,只提供對數據庫的操作能力,

不能完成屏幕控制、菜單管理、報表生成等功能,可成為應用開發語言的一部分;

(3)SQL語言不是一個DBMS,它屬于DBMS語言處理程序。5.1SQL概述SQLServer2000

1、數據定義語言(DDL)

創建、修改或刪除數據庫中各種對象,包括表、視圖、索引等。

命令:create、alter、drop

2、查詢語言(QL)

按照指定的組合、條件表達式或排序檢索已存在的數據庫中數據,不改變數據庫中數據。

命令:select

3、數據更新語言

對已經存在的數據庫進行元組的插入、刪除、修改等操作

命令:insert、update、delete

4、數據控制語言(DCL)

用來授予或收回訪問數據庫的某種特權

命令:grant、revoke三、SQL語句分類5.1SQL概述SQLServer2000操作對象創建語句刪除語句修改語句基本表CREATETABLEDROPTABLEALTERTABLE索引CREATEINDEXDROPINDEX視圖CREATEVIEWDROPVIEW數據庫CREATEDATABASEDROPDATABASEALTERDATABASE5.2數據定義SQLServer2000一、基本表的定義和維護1.定義基本表語句基本格式:createtable[<庫名>.]<表名>

(<列名><數據類型>[<列級完整性約束條件>][,<列名><數據類型>[<列級完整性約束條件>][,…n][,<表級完整性約束條件>][,…n]);

5.2數據定義類型表示類型說明數值型數據SMALLINT半字長二進制整數。15bits數據INTEGER或INT全字長(四字長)整數。31bits數據DECIMAL(p[,q])十進制數,共p位,其中小數點后q位。0≤q≤p,q=0時可省略不寫FLOAT雙字長浮點數字符型數據CHARTER(n)或CHAR(n)長度為n的定長字符串VARCHAR(n)最大長度為n的變長字符串特殊數據類型GRAPHIC(n)長度為n的定長圖形字符串VARGRAPHIC(n)最大長度為n的變長圖形字符串日期時間型DATE日期型,格式為YYYY-MM-DDTIME時間型,格式為HH.MM.SSTIMESTAMP日期加時間

SQL支持的數據類型5.2數據定義SQLServer2000

列級完整性約束條件——針對屬性值的設置的限制條件,只涉及到一個列的數據,有以下5種:notnull約束不允許為空。unique約束不允許該列出現重復的屬性值。default約束定義該列的缺省值。default約束的格式為:default<約束名><默認值>for<列名>

如:defaults1男for性別primarykey約束定義該列為主碼check約束定義屬性值的檢查條件。不能直接跟在列后定義,而通過約束條件表達式來設置,check約束的格式為:

constraint<約束名>check(<約束條件>)如:constraintn1check(年齡between19and30)5.2數據定義SQLServer2000表級完整性約束條件——涉及到一個關系中多個列的限制條件,有以下3種:unique約束當要求列組的值不能有重復值時,就需要使用表級唯一性約束。unique約束約束的格式為:

constraint<約束名>unique(屬性組)如:constraintu1unique(學號,姓名)primarykey約束

如果一個表的主鍵內有兩個或兩個以上的列,則必須使用表約束將這兩列加入主鍵內。不能直接跟在列后定義,而通過約束條件表達式來設置。primarykey約束的格式為:

constraint<約束名>primarykey[clustered](<屬性組>)foreignkey

約束

用于定義外碼和被參照表。外鍵的數據類型必須和被參照表中的主碼嚴格匹配。foreignkey約束的格式為:

constraint<約束名>foreignkey(<外碼>)references<被參照表名>(<與外碼對應的主碼名>)5.2數據定義SQLServer2000例1:用SQL在學生數據庫中建立如下基本表:學生(學號,姓名,年齡,性別,所在系)要求:學生表中以學號為主碼,姓名不能為空,性別只能輸“男”或“女”,年齡的缺省值為205.2數據定義createtable學生(學號char(5)primarykey,

姓名char(8)notnull,

年齡smallintdefault20,

性別char(2),

所在系char(20),constraintC1check(性別in(‘男’,‘女’)));SQLServer2000例2:用SQL在學生數據庫中建立如下基本表:課程(課程號,課程名,先行課)要求:課程表中以課程號為主碼createtable課程(課程號char(5)primarykey,

課程名char(20),

先行課char(5));5.2數據定義SQLServer2000例3:用SQL在學生數據庫中建立如下基本表:選課(學號,課程號,成績)要求:選課表中以學號和課程號為主碼,成績限定在0—100,并且還要求學號與學生表中的學號建立參照關系,課程號與課程表中的課程號建立參照關系。createtable選課(學號char(5),

課程號char(5),

成績int,constraintC2check(成績between0and100),constraintC3primarykey(學號,課程號),constraintC4foreignkey(學號)references學生(學號),constraintC5foreignkey(課程號)references課程(課程號));5.2數據定義SQLServer2000二、修改基本表

1、增加屬性語句基本格式:

altertable<表名>add(<新列名><數據類型>[<列級完整性約束條件>][,…n])例4:向學生表中增加“家庭地址”和“電話”altertable學生add(家庭地址char(30),電話char(12))5.2數據定義SQLServer20002、刪除屬性語句基本格式:altertable<表名>dropcolumn<列名>例5:在學生表中刪除“家庭地址”和“電話”altertable學生dropcolumn家庭地址,電話5.2數據定義SQLServer2000例6不能執行,因為在“性別”屬性上已定義了check約束條件例7可以執行,因為在“姓名”屬性上只定義了notnull約束例6:altertable學生dropcolumn性別例7:altertable學生dropcolumn姓名5.2數據定義注:不允許刪除已定義列級完整性約束或表級完整性約束的屬性,NOTNULL約束除外,要刪除這些屬性必須先刪除該屬性上的約束條件SQLServer20003、修改屬性語句基本格式:

altertable<表名>modify(<列名><數據類型>[,…,n])注:只能改變寬度,增加notnull約束對于已有數據的表,只能將屬性的寬度改為已有數據的寬度

例8:改變學生表中“所在系”的寬度altertable學生modify(所在系char(30))5.2數據定義SQLServer20004、刪除完整性約束條件語句基本格式:

altertable<表名>drop<約束名>

例9:向學生表中刪除“性別”屬性上的約束C1,然后刪除“性別”屬性altertable學生dropC1altertable學生dropcolumn性別5.2數據定義5.2數據定義5、增加完整性約束條件語句基本格式:

ALTERTABLE<表名>ADDCONSTRAINT<新完整性約束名><完整性約束條件>例10:向課程表中增加完整性約束條件:每門課的學時小于8學時ALTERTABLE課程ADDCONSTRAINTX1CHECK(學時<8)

SQLServer2000三、刪除基本表語句基本格式:

droptable

<表名>注:基本表一旦被刪除,表中的數據及在此表基礎上建立的索引,視圖將自動地全部被刪除,所以要特別小心

例11:droptable學生

不能執行,因為學生表已被選課表定義為它的參照表不能刪除已被定義為其它表的參照表的表5.2數據定義SQLServer2000四、索引

1、索引的作用5.2數據定義通過創建唯一索引,可以保證數據記錄的唯一性。可以大大加快數據檢索速度。可以加速表與表之間的連接,這一點在實現數據的參照完整性方面有特別的意義。在使用ORDERBY和GROUPBY子句中進行檢索數據時,可以顯著減少查詢中分組和排序的時間。使用索引可以在檢索數據的過程中使用優化隱藏器,提高系統性能。SQLServer20002.建立索引的原則

1)索引的建立和維護由DBA和DBMS完成。

2)大表應當建索引,小表則不必建索引。

3)對于一個基本表,不要建立過多的索引。

4)根據查詢要求建索引。5.2數據定義SQLServer20003、建立索引語句基本格式:

create[unique][cluster]index<索引名>

on<表名>(<列名1>[asc|desc][,…,n])

unique:用于指定為表創建唯一索引,即不允許存在索引值相同的兩行。

cluster:用于指定創建的索引為聚簇索引。

asc升序,desc降序,默認為asc例12:為學生表建立按學號升序索引createindex學生_學號on學生(學號)例13:為選課表按學號升序和課程號降序建唯一索引createuniqueindex選課_學號on選課(學號asc,課程號desc)5.2數據定義SQLServer20004、刪除索引語句基本格式:

dropindex<索引名>

例14:dropindex學生_學號5.2數據定義SQLServer2000語句格式:

select[ALL|DISTINCT]<目標列組>

from<數據源>[where<元組選擇條件>][groupby<分組列名>[having<組選擇條件>]][orderby<排序列1>asc|desc[,…]]5.3數據查詢SQLServer2000select子句:用于指明查詢結果集的目標列。目標列可以是直接從數據源中投影得到的屬性以及與屬性相關的表達式或數據統計的函數表達式,目標列甚至還可以是常數。from子句:用于指明查詢的數據源,數據源可以是基本表或視圖。where子句:描述選擇條件。groupby子句:將查詢結果的各行按一列取值相等的原則進行分組,如果有having短語,則查詢結果只是滿足指定條件的組orderby子句:查詢結果按一定順序排序。5.3數據查詢SQLServer2000SQL的查詢實例:1、單表查詢(簡單查詢)(1)選擇表中的若干列①選擇表中的指定列語法格式:select<目標列表達式>[,….n]

from<數據源>

其中列的先后順序可與表中不一致,可以根據需要改變列的顯示順序。5.3數據查詢例1查詢全體學生的學號與姓名SELECT學號,姓名FROM學生例2查詢全體學生的姓名,學號,所在系SELECT姓名,學號,所在系FROM學生5.3數據查詢5.3數據查詢②查詢全部列有兩種方式:在SELECT后列出所有列名,可以改變列的排列順序將目標列表達式指定為*例3查詢全體學生的詳細記錄SELECT*FROM學生5.3數據查詢

③查詢經過計算的值<目標列表達式>是與屬性列有關的表達式例4查詢全體學生的姓名及其出生年份SELECT姓名,2011-年齡FROM學生④<目標列表達式>為常量或函數例5查詢全體學生的姓名、出生年份和所在系,出生年份前增加屬性列“YearofBirth”,并用小寫字母表示所在系名。SELECT姓名,‘YearofBirth’,2011-年齡,ISLOWER(所在系)FROM學生ASNAMEBIRTH出生年份5.3數據查詢(2)選擇表中的若干元組①消除取值重復的行例6查詢選修了課程的學生學號SELECT學號FROM選修DISTINCT5.3數據查詢②查詢滿足條件的元組ⅰ)比較大小用于比較大小的運算符一般包括:=,>,<,>=,<=,!=或<>邏輯運算符NOT可以與比較運算符同用,表示對條件求非。例7查詢CS系全體學生的名單SELECT姓名FROM學生WHERE所在系=‘CS’;5.3數據查詢例8查詢所有年齡在20歲以下的學生姓名及其年齡SELECT姓名,年齡FROM學生WHERE年齡<20(或WHERENOT年齡>=20);例9查詢考試成績有不及格的學生的學號SELECTDISTINCT學號FROM選修WHERE成績<60;5.3數據查詢ⅱ)確定范圍BETWEEN…AND…

和NOTBETWEEN…AND…例10查詢年齡在20到23歲之間的學生的姓名、系別和年齡SELECT姓名,所在系,年齡FROM學生WHERE年齡BETWEEN20AND23;5.3數據查詢ⅲ)確定集合謂詞IN可以用來查找屬性值屬于指定集合的元組。在SQL中,集合的表示法使用圓括號括起來的一組元素值,元素值之間用逗號隔開。例11查詢信息系(IS)、數學系(MA)和計算機系(CS)學生的姓名和性別。SELECT姓名,性別FROM學生WHERE所在系IN(‘IS’,‘MA’,‘CS’);5.3數據查詢ⅳ)字符匹配謂詞LIKE可以用來進行字符串的匹配。語法格式:[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]

其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個完整的字符串,也可以含有通配符“%”和“_”。其中:%:代表任意長度的字符串。例如:a%b表示以a開頭,以b結尾的任意長度的字符串,如:acb,addgb,ab都滿足該匹配串。

_:代表任意單個字符。例如:a_b表示以a開頭,以b結尾的長度為3的任意字符串。如:acb,afb等。5.3數據查詢例12查詢學號為95001的學生的詳細情況。SELECT*FROM學生WHERE學號LIKE‘95001’;例13查詢所有姓“劉”的學生的姓名、學號和性別。SELECT姓名,學號,性別FROM學生WHERE姓名LIKE‘劉%’;5.3數據查詢例14

查詢姓“歐陽”且全名為三個漢字的學生的姓名。SELECT姓名FROM學生WHERE姓名LIKE‘歐陽__’;例15查詢名字中第二個字為“陽”字的學生的姓名和學號SELECT姓名,學號FROM學生WHERE姓名LIKE‘__陽%’;5.3數據查詢例16查詢所有不姓劉的學生姓名。SELECT姓名FROM學生WHERE姓名NOTLIKE‘劉%’;

如果用戶要查詢的字符串本身就含有“%”或

“_”,這時就要使用ESCAPE‘<換碼字符>’短語對通配符進行轉義了。例17查詢DB_Design課程的課程號和學分。SELECT課程號,學分FROM課程WHERE課程名LIKE‘DB\_Design’ESCAPE‘\’;SQLServer20005.3數據查詢例18查詢以‘DB_’開頭且倒數第3個字符為i的課程的詳細情況。SELECT*FROM課程WHERE課程名LIKE‘DB\_%i__’ESCAPE‘\’SQLServer2000SQLServer20005.3數據查詢ⅴ)涉及空值的查詢

ISNULL或ISNOTNULL例19查詢缺少成績的學生的學號和相應的課程號。SELECT學號,課程號FROM選課WHERE成績ISNULL;注:這里的IS不能用=代替。SQLServer20005.3數據查詢ⅵ)多重條件查詢

邏輯運算符AND

和OR可用來聯結多個查詢條件,AND的優先級高于OR,但用戶可以用括號改變優先級。例20查詢計算機系年齡在20歲以下的學生的姓名。SELECT姓名FROM學生WHERE所在系=‘CS’AND年齡<20;SQLServer20005.3數據查詢對查詢結果排序

使用ORDERBY子句來指定按照一個或多個屬性列的升序(ASC)或降序(DESC)重新排列查詢結果中的行,其中升序(ASC)為默認值。例21查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列。SELECT學號,成績FROM選課WHERE課程號=‘3’ORDERBY成績DESC;SQLServer2000注:對于空值,若按升序排,含空值的元組將最后顯示;若按降序排,空值的元組將最先顯示。例22查詢全體學生的情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。SELECT*FROM學生ORDERBY所在系,年齡DESC;5.3數據查詢SQLServer20005.3數據查詢使用集函數

SQL提供的集函數主要有:COUNT([DISTINCT|ALL]*)統計元組個數COUNT([DISTINCT|ALL]<列名>)統計一列中值的個數SUM([DISTINCT|ALL]<列名>)計算一列值的總和(此列必須是數值型的)

AVG([DISTINCT|ALL]<列名>)計算一列值的平均值(此列必須是數值型的)MAX([DISTINCT|ALL]<列名>)求

一列值中的最大值MIN([DISTINCT|ALL]<列名>)求

一列值中的最小值SQLServer20005.3數據查詢例23查詢學生總人數。SELECTCOUNT(*)FROM學生;例24查詢選修了課程的學生人數SELECTCOUNT(DISTINCT學號)FROM選課;學生人數SQLServer2000例25計算選修了1號課程的學生平均成績。SELECTAVG(成績)FROM選課WHERE課程號=‘1’;例26查詢選修1號課程的學生最高分數。SELECTMAX(成績)FROM選課WHERE課程號=‘1’;注:除count(*)外,列中的空值先去掉再計算5.3數據查詢SQLServer2000例27:求選修了課程號為“c1”且成績在80-90之間的學生學號和成績,并將成績乘以系數0.8輸出SELECT學號,成績*0.8FROM選課WHERE課程號=‘c1’AND成績BETWEEN80AND90例28:檢索數學系或計算機系姓“陳”的學生的信息

SELECT*FROM學生WHERE所在系IN(‘數學’,‘計算機’)AND姓

名LIKE‘陳%’SQLServer20005.3數據查詢(5)對查詢結果分組GROUPBY

子句和HAVING子句來實現分組統計。例29求各個課程號及相應的選課人數。SELECT課程號,COUNT(學號)FROM選課GROUPBY課程號;例30查詢選修了3門以上課程的學生學號。SELECT學號FROM選課GROUPBY學號HAVINGCOUNT(*)>3SQLServer20005.3數據查詢WHERE子句與HAVING短語的區別:WHERE子句與HAVING短語都用來做選擇,其區別在于作用對象不同。WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組,HAVING短語作用于組,從中選擇滿足條件的組。當WHERE子句與HAVING短語同時出現時,先運行WHERE子句選擇元組,再進行分組統計。例如上例不能寫成:

select學號from選課

groupby學號

wherecount(*)>3SQLServer2000例31:求各門課的課程號,最高分,最低分,平均分SELECT

課程號,MAX(成績)AS最高分,MIN(成績)AS最低分,AVG(成績)AS平均分FROM選課GROUPBY課程號例32:求每個學生的學號、姓名及平均分SELECT

學生.學號,姓名,AVG(成績)AS平均分FROM選課,學生WHERE學生.學號=選課.學號GROUPBY學生.學號,姓名5.3數據查詢SQLServer20002、連接查詢連接查詢的數據源為多個表,連接條件通過where子句表達,連接條件和元組選擇條件之間用and銜接。1)等值和非等值連接其一般格式為:[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>

比較運算符:=、>、<、>=、<=和!=;列名稱為連接字段。

此外,連接條件還可以使用下面形式:[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>

當連接運算符為“=”時,稱為等值連接,其它運算符稱為非等值連接。連接條件中的各連接字段類型必須是可比的,但不必是相同的。5.3數據查詢SQLServer20005.3數據查詢例33:查詢每個學生及其選修課程的情況

SELECT學生.*,選課.*FROM學生,選課

WHERE學生.學號=選課.學號

連接運算有兩種特殊的情況,一種為自然連接,另一種為廣義笛卡爾積連接。SQLServer2000如果使用了一個以上的表,但沒有where子句,則結果為廣義笛卡爾積,其連接結果會產生一些沒有意義的元組。例如:

SELECT學生.學號,課程號,成績FROM學生,選課WHERE學生.學號=選課.學號

結果為學生表與選課表中對應的記錄

SELECT學生.學號,課程號,成績FROM學生,選課

結果為笛卡爾積5.3數據查詢SQLServer20005.3數據查詢

若在等值連接中把目標列中重復的屬性列去掉,則為自然連接。如:上例用自然連接完成:SELECT學生.學號,姓名,性別,年齡,所在系,課程號,

成績FROM學生,選課WHERE學生.學號=選課.學號SQLServer2000例34:查詢學生的學號,姓名及所選修的課程名及成績

SELECT學生.學號,姓名,課程名,成績FROM學生,課程,選課

WHERE學生.學號=選課.學號and課程.課程號=選課.課程號例35:查詢考試成績有不及格的學生的學號、姓名SELECTDISTINCT學生.學號,姓名FROM學生,選課WHERE成績<60AND學生.學號=選課.學號5.3數據查詢SQLServer2000例36:查詢每一門課的間接先行課(即先行課的先行課)SELECTA.課程號,A.課程名,B.先行課FROM課程A,課程BWHEREA.先行課=B.課程號2)自身連接

連接操作不只在兩個表之間進行,一個表內也可以進行自身連接5.3數據查詢SQLServer2000課程號課程名先行課c1 計算機導論NULLc2 C語言 c1c3 數據結構 c2c4 數據庫原理 c3c5 軟件工程 c4c6 高等數學NULLc7 DB_Design c3A課程號課程名先行課c1 計算機導論NULLc2 C語言 c1c3 數據結構 c2c4 數據庫原理 c3c5 軟件工程 c4c6 高等數學NULLc7 DB_Design c3B5.3數據查詢SQLServer20003)外連接內連接:結果集中只保留了符合連接條件的元組,而排除了兩個表中沒有匹配的元組情況,前面所舉的例子均屬內連接

如果要求查詢結果集中保留非匹配的元組,就要執行外部連接操作。左外部連接:結果集中保留連接表達式左表中的非匹配記錄。左外部連接符號為“*=”右外部連接:結果集中保留連接表達式右表中的非匹配記錄。右外部連接符號為“=*”外部連接中不匹配的分量用NULL表示。5.3數據查詢SQLServer2000職工號姓名性別年齡所在部門

部門號部門名稱電話1010李勇男201111生產科5661011劉晨女19

12計劃科5781012王敏女221213一車間4671014張立男211314科研所

5.3數據查詢內連接:

SELECT職工.*,部門名稱,電話

FROM職工,部門

WHERE職工.所在部門=部門.部門號;SQLServer2000左外部連接:

SELECT職工.*,部門名稱,電話

FROM職工,部門

WHERE職工.所在部門*=部門.部門號;右外部連接:

SELECT職工.*,部門名稱,電話

FROM職工,部門

WHERE職工.所在部門=*部門.部門號;5.3數據查詢SQLServer2000例37:所有學生的選課情況(包括沒有選課的學生)

SELECT學生.學號,課程號,成績FROM學生,選課

WHERE學生.學號*=選課.學號

例38:查詢全部選課情況(包括學生表中沒有的學生的選課信息)SELECT學生.學號,課程號,成績FROM學生,選課WHERE學生.學號=*選課.學號

5.3數據查詢SQLServer2000一個SELECT…FROM…WHERE語句稱為一個查詢塊,將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢叫嵌套查詢。

SQL語言允許多層嵌套查詢,即:一個子查詢中還可以嵌套其它子查詢。注意:子查詢的SELECT語句中不能使用ORDERBY子句,ORDERBY子句只能對最終查詢結果排序。3、嵌套查詢5.3數據查詢有以下4種子查詢:

帶IN謂詞的子查詢帶比較運算符的子查詢帶ANY或ALL的子查詢帶EXISTS謂詞的子查詢5.3數據查詢5.3數據查詢1)帶IN謂詞的子查詢

使用IN運算符的子查詢用于判斷某個屬性列的值是否在子查詢的結果中。例39查詢與“劉晨”在同一個系學習的學生信息。SELECT*FROM學生WHERE所在系IN(SELECT所在系

FROM學生

WHERE姓名=‘劉晨’)也可以用自身連接來完成:SELECTS1.*FROM學生S1,學生S2WHERES1.所在系=S2.所在系ANDS2.姓名=‘劉晨’;5.3數據查詢例40求選修了高等數學的學生學號和姓名。SELECT學號,姓名FROM學生WHERE學號IN(SELECT學號FROM選課

WHERE課程號IN(SELECT課程號

FROM課程

WHERE課程名=‘高等數學'));SQLServer2000也可以使用連接查詢:SELECT學生.學號,姓名FROM學生,課程,選課WHERE學生.學號=課程.學號AND課程.課程號=選課.課程號AND課程.課程名='高等數學';SQLServer2000例41:求選修了“計算機導論”的學生學號

SELECT學號FROM選課WHERE課程號IN(SELECT課程號FROM課程WHERE課程名='計算機導論')此例也可用連接查詢:SELECT學號

FROM選課,課程WHERE選課.課程號=課程.課程號and課程名='計算機導論'5.3數據查詢SQLServer2000例42:求沒有選修“計算機導論”的學生學號SELECT學號FROM學生WHERE學號NOTIN(SELECT學號FROM選課WHERE課程號IN(SELECT課程號FROM課程WHERE課程名='計算機導論'))5.3數據查詢SQLServer2000如下語句是否正確:SELECT學號FROM選課WHERE課程號NOTIN(SELECT課程號FROM課程WHERE課程名='計算機導論')(2)SELECT學號FROM選課,課程WHERE選課.課程號=課程.課程號AND課程名<>'計算機導論'5.3數據查詢SQLServer20005.3數據查詢2)使用比較運算符的子查詢例39查詢與“劉晨”在同一個系學習的學生信息。SELECT*FROM學生WHERE所在系IN(SELECT所在系

FROM學生

WHERE姓名=‘劉晨’)可以用“=”代替INSQLServer20005.3數據查詢例43求c1課程成績高于“王紅”的學生學號,成績SELECT學號,成績FROM選課WHERE課程號=‘c1’AND成績

>

(SELECT成績FROM選課WHERE課程號='c1'AND學號=(SELECT學號FROM學生WHERE姓名='王紅'))SQLServer20005.3數據查詢3)使用ANY或ALL的嵌套查詢

使用ANY或ALL操作符時,必須與比較符配合使用,其格式為:<字段><比較符>[ANY|ALL]<子查詢>操作符語意>ANY大于子查詢結果中的某個值,即表示大于查詢結果中最小值>ALL大于子查詢結果中的所有值,即表示大于查詢結果中最大值<ANY小于子查詢結果中的某個值,即表示小于查詢結果中最大值<ALL小于子查詢結果中的所有值,即表示小于查詢結果中最小值>=ANY大于等于子查詢結果中的某個值,即表示大于等于結果集中最小值>=ALL大于等于子查詢結果中的所有值,即表示大于等于結果集中最大值<=ANY小于等于子查詢結果中的某個值,即表示小于等于結果集中最大值<=ALL小于等于子查詢結果中的所有值,即表示小于等于結果集中最小值=ANY等于子查詢結果中的某個值,即相當于IN=ALL等于子查詢結果中的所有值(通常沒有實際意義)!=(或<>)ANY不等于子查詢結果中的某個值,!=(或<>)ALL不等于子查詢結果中的任何一個值,即相當于NOTINSQLServer2000例44:求其他系中比計算機系某一學生年齡小的學生的信息。(即求年齡小于計算機系年齡最大者的學生)SELECT*FROM學生WHERE所在系<>’計算機’AND年齡<ANY(SELECT年齡FROM學生WHERE所在系='計算機')

此例也可用max():SELECT

*FROM學生WHERE所在系<>'計算機'AND年齡<(SELECTMAX(年齡)FROM學生WHERE所在系=‘計算機’)

5.3數據查詢SQLServer2000例45:檢索所有課程成績都在80分及80分以上的學生學號、姓名如下語句是否正確:SELECT學號,姓名FROM學生WHERE

學號IN(SELECT學號FROM選課WHERE成績>80)(2)SELECT學號,姓名FROM學生

WHERE

學號NOTIN(SELECT學號FROM選課WHERE成績<80)5.3數據查詢正確語句:SELECTDISTINCT學生.學號,姓名FROM學生,選課

WHERE學生.學號=選課.學號AND學號NOTIN(SELECT學號FROM選課WHERE成績<80OR成績ISNULL)

SQLServer2000例46:求其他系中比計算機系學生年齡都小的學生的信息。(即求年齡小于計算機系年齡最小者的學生)SELECT*FROM學生WHERE年齡<ALL(SELECT年齡FROM學生WHERE所在系='計算機')AND所在系<>’計算機’也可以用集函數表示:SELECT*FROM學生WHERE年齡<(SELECTMIN(年齡)

FROM學生WHERE所在系='計算機')AND所在系<>’計算機’5.3數據查詢SQLServer2000例47:求選課門數最多的學生的學號SELECT學號FROM選課GROUPBY學號HAVINGCOUNT(課程號)>=ALL(SELECTCOUNT(課程號)FROM選課GROUPBY學號)5.3數據查詢SQLServer2000例48:求選課門數最多的學生的學號、姓名SELECT學號,姓名FROM學生WHERE學號IN(SELECT學號FROM選課

GROUPBY學號HAVINGCOUNT(課程號)>=ALL(SELECTCOUNT(課程號)FROM選課GROUPBY學號))5.3數據查詢SQLServer2000或:SELECT學生.學號,姓名FROM學生,選課

WHERE學生.學號=選課.學號GROUPBY學生.學號,姓名

HAVINGCOUNT(課程號)>=ALL(SELECTCOUNT(課程號)FROM選課GROUPBY學號)5.3數據查詢SQLServer20005.3數據查詢4)使用EXISTS操作符的嵌套查詢

EXISTS代表存在量詞。EXISTS操作符后子查詢的結果集中如果不為空,則產生邏輯真值“true”,否則產生假值“false”。例49求選修了C2課程的學生姓名。

也可以用連接查詢實現:SELECT姓名FROM學生,選課WHERE學生.學號=選課.學號AND課程號=‘C2’;SELECT姓名FROM學生

WHEREEXISTS(SELECT*FROM選課

WHERE學生.學號=學號AND課程號='C2');SQLServer20005.3數據查詢例50求沒有選修C2課程的學生姓名。SELECT姓名

FROM學生

WHERENOTEXISTS(SELECT*FROM選課

WHERE學生.學號=學號AND課程號='C2');查詢與“劉晨”在同一個系學習的學生信息SELECT*FROM學生S1WHEREEXISTS(SELECT*FROM學生S2WHERES1.所在系=所在系AND姓名=‘劉晨’)5.3數據查詢5.3數據查詢

SQL語言沒有全稱量詞,但是總可以把帶有全稱量詞的謂詞轉換為帶有存在量詞的謂詞:例51查詢選修了全部課程的學生的姓名SELECT姓名FROM學生

WHERENOTEXISTS(SELECT*FROM課程

WHERENOTEXISTS(SELECT*

FROM選課

WHERE學生.學號=學號AND課程.課程號=課程號));5.3數據查詢例52求至少選修了學號為“S2”的學生所選修的全部課程的學生學號和姓名。

SELECT學號,姓名

FROM學生

WHERENOTEXISTS(SELECT*FROM選課選課1WHERE選課1.學號='S2'ANDNOTEXISTS(SELECT*FROM選課選課2WHERE學生.學號=選課2.學號AND選課2.課程號=選課1.課程號);SQLServer2000例53:求選修了C1課程或選修了C2課程的學生的學號SELECT學號FROM選課WHERE課程號='C1'OR課程號='C2'4、組合查詢或:SELECT學號FROM選課WHERE課程號='C1'

UNIONSELECT學號FROM選課WHERE課程號='C2'5.3數據查詢5.3數據查詢例54:求選修了C1課程又選修了C2課程的學生的學號如下語句是否正確:SELECT學號FROM選課WHERE課程號='C1'AND課程號='C2'應該為SELECT學號FROM選課WHERE課程號=‘C1’AND學號IN(SELECT學號FROM選課WHERE課程號='C2')SQLServer20001、插入數據

(1)插入單個元組語句格式:

INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]

VALUES

(<常量1>[,<常量2>]…)注:a、在INTO子句中若沒有指明任何列名,則在VALUES子句中必須在每個列上均有值,并且要與表中屬性的邏輯順序對應例:

INSERTINTO選課VALUES(‘98008’,‘c5’,70)INSERTINTO選課VALUES(‘98010’,‘c5’)INSERTINTO選課VALUES(‘c2’,‘98008’,70)

5.4數據更新對錯錯SQLServer2000b、如果某些列在INTO子句中沒有出現,則新插入的記錄在這些列上取空值,但如果這些列在表定義是定義為NOTNULL,則不能在INTO子句中省略例:

INSERTINTO選課(學號,課程號)VALUES(‘98008’,‘c4’)

INSERTINTO選課(學號,成績)VALUES(‘98008’,70)c、INTO子句中列名與VALUES子句中的常量要求邏輯順序一致例:INSERTINTO選課(學號,課程號)VALUES(‘98008’,‘c4’)

INSERTINTO選課(學號,課程號)VALUES(‘c1’,’98008’)5.4數據更新對錯對錯SQLServer2000例55將一個新學生記錄(學號:‘98010’,姓名:‘張三’,年齡:20,所在系:‘計算機系’)插入到學生表中。INSERT

INTO學生

VALUES(‘98010’,‘張三’,20,‘計算機系’);5.4數據更新SQLServer2000(2)插入子查詢的結果集語句格式:INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…)]<子查詢>;例56:求每個系學生的平均年齡,并要求將結果存入數據庫中。此例要求先建立系平均年齡表,再將各系的平均年齡寫入此表中CREATETABLE系平均年齡(系名稱CHAR(10),

平均年齡SMALLINT);INSERTINTO系平均年齡

SELECT所在系,AVG(年齡)FROM學生GROUPBY所在系5.4數據更新SQLServer2000

2、修改數據

語句格式:

UPDATE<表名>

SET<列名1>=<表達式1>[,<列名2>=<表達式2>][,…n][WHERE<條件>]注:

a、如果無WHERE子句,則表示修改表中全部元組例57:將學生表中每個學生年齡加1UPDATE學生SET年齡=年齡+15.4數據更新SQLServer2000b、可以通過WHERE子句中的條件表達式修改某一個元組的值例57將學生95001的年齡改為22歲。UPDATE學生SET年齡=22WHERE學號=‘95001’;c、WHERE子句中可以嵌入子查詢

例58:將“高等數學”的成績加5分

UPDATE選課SET成績=成績+5WHERE課程號IN(SELECT課程號FROM課程WHERE課程名='高等數學')5.4數據更新SQLServer20003、刪除數據

語句格式:

DELETEFROM<表名>[WHERE<條件>]注:

a、如果無WHERE子句,則表示刪除表中全部元組例59刪除所有學生選課記錄DELETEFROM選課5.4數據更新SQLServer2000b、可以通過WHERE子句中的條件表達式刪除一個元組的值例60刪除學號為95019的學生記錄DELETEFROM學生WHERE學號=‘95019’;c、WHERE子句中可以嵌入子查詢5.4數據更新SQLServer2000DELETEFROM學生WHERE所在系=‘數學’5.4數據更新d、一個DELETE語句只能刪除一個表中的元組,即FROM子句中只能有一個表名,不允許有多個表名。例61:刪除“數學系”的學生記錄及該系學生的所有選課記錄

DELETEFROM選課WHERE學號IN(SELECT學號

FROM學生WHERE所在系=‘數學’)

SQLServer2000

視圖是從一個或者多個表或視圖中導出的表,和真實的表一樣,視圖也包括幾個被定義的數據列和多個數據行,但視圖是一個虛擬表,所以數據庫中只存放視圖的定義,而不存放視圖的數據,這些數據來源于基本表。

使用視圖的優點和作用

①可以使視圖集中數據、簡化和定制不同用戶對數據庫的不同數據要求。②使用視圖可以屏蔽數據的復雜性,用戶不必了解數據庫的結構,就可以方便地使用和管理數據,簡化數據權限管理和重新組織數據以便輸出到其他應用程序中。5.5視圖SQLServer2000③視圖可以使用戶只關心他感興趣的某些特定數據和他們所負責的特定任務,而那些不需要的或者無用的數據則不在視圖中顯示。④視圖大大地簡化了用戶對數據的操作。⑤視圖可以讓不同的用戶以不同的方式看到不同或者相同的數據集。⑥在某些情況下,由于表中數據量太大,因此在表的設計時常將表進行水平或者垂直分割,但表的結構的變化不會對應用程序產生不良的影

溫馨提示

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

評論

0/150

提交評論