學習數據庫概論第三天

第三章

3.1 SQL概述

SQL集數據查詢、數據操縱、數據定義和數據控制功能於一體。主要特點:
1.綜合統一
數據庫系統的主要功能是通過數據庫支持的數據語言來實現的。
非關係模型(層次模型、網狀模型)的數據語言一般都分爲:
(1)模式數據定義語言(模式DDL)
(2)外模式數據定義語言(外模式DDL或子模式DDL)
(3)數據存儲有關的描述語言(DSDL)
(4)數據操縱語言(DML)
它們分別用於定義模式、外模式、內模式和進行數據的存取和處置。
SQL集數據定義語言、數據操縱語言、數據控制語言的功能於一體。可以獨立完成數據庫生命週期中的全部活動,包括以下一系列操作要求:
(1)定義和修改、刪除關係模式,定義和刪除視圖,插入數據,建立數據庫。
(2)對數據庫中的數據進行查詢和更新。
(3)數據庫重構和維護。
(4)數據庫安全性、完整性控制,以及事務控制。
(5)嵌入式SQL和動態SQL定義。
2.高度非過程化
存取路徑的選擇以及SQL的操作過程由系統自動完成。
3.面向集合的操作方式
4.以同一種語法結構提供多種使用方式
SQL既是獨立的語言,又是嵌入式語言。
5.語言簡潔,易學易用

3.2學生-課程數據庫

Student
學號Sno 姓名Sname 性別Ssex 年齡Sage 所在系Sdept
201215121 李勇 男 20 CS
201215122 劉晨 女 19 CS
201215123 王敏 女 18 MA
201215125 張立 男 19 IS

Course
課程號Cno 課程名Cname 先行課Cpno 學分Credit
1 數據庫 5 4
2 數學 2
3 信息系統 1 4
4 操作系統 6 3
5 數據結構 7 4
6 數據處理 2
7 PASCAL語言 6 4

SC
學號Sno 課程號Cno 成績Grade
201215121 1 92
201215121 2 85
201215121 3 88
201215122 2 90
201215122 3 80

3.3數據定義

一個關係數據庫管理系統的實例中可以建立多個數據庫,一個數據庫中可以建立多個模式,一個模式下通常包括多個表、視圖和索引等數據庫對象。

1.定義模式
Create schema 模式名 authorization 用戶名;
如果沒有指定模式名,那麼模式名隱含爲用戶名。
要創建模式,調用該命令的用戶必須擁有數據庫管理員權限,或者獲得了數據庫管理員授予的create schema的權限。

例3.1 爲用戶wang定義一個學生-課程模式S-T。
Create schema S-T authorization wang;

例3.3 爲用戶zhang創建一個模式test,並且在其中定義一個表tab1.
Create schema test authorization zhang;
Create table tab1(
Col1 smallint,
Col2 int,
Col3 char(20),
Col4 numeric(10,3),
);
2.刪除模式
Drop schema 模式名 [cascade|restrict]
其中cascade和restrict兩者必選其一。選擇了cascade(級聯),表示在刪除模式的同時把該模式中所有的數據庫對象刪除。選擇了restrict(限制),表示如果該模式中已經定義了下屬的數據庫對象(如表、視圖等),則拒絕該刪除語句的執行。只有當該模式中沒有任何下屬的對象時才能執行drop schema語句。

1.定義基本表
創建了一個模式就建立了一個數據庫的命名空間,一個框架。在這個空間中首先要定義的是該模式包含的數據庫基本表。
Create table 表名 (
列名 數據類型 [列級完整性約束條件],
列名 數據類型 [列級完整性約束條件],
列名 數據類型 [列級完整性約束條件],

[表級完整性約束條件]
);

例3.5 建立一個“學生”表Student.
Create table Student(
Sno char(9) primary key, /列級完整性約束條件,Sno是主碼/
Sname char(20) unique, /Sname取唯一值/
Ssex char(2),
Sage smallint,
Sdept char(20)
);

例3.6 建立一個“課程”表Course.
Create table Course(
Cno char(4) primary key, /列級完整性約束條件,Con是主碼/
Cname char(40) not null, /列級完整性約束條件,Cname不能取空值/
Cpno char(4),
Ccredit smallint,
Foreign key (Cpno) references Course (Cno)/表級完整性約束條件,Cpno是外碼,被參照表是Course,被參照列是Cno/
);
例3.7 建立學生選課表SC。
Create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
Primary key(Sno,Cno),/表級完整性約束條件,Sno,Con是主碼/
foregin key (Sno) references Student (Sno),/表級完整性約束條件,Sno是外碼,被參照表是Student,被參照列是Sno/
Foregin key (Cno)references Course (Cno)/表級完整性約束條件,Cno是外碼,被參照表是Course,被參照列是Cno/
);

2.模式和表
現要在S-T模式中定義Student、Course、SC等基本表
方法一:在表名中明顯地給出模式名。
Create table “S-T”.Student(…);
Create table “S-T”.Course(…);
方法二:在創建模式語句中同時創建表。
方法三:設置所屬的模式,這樣在創建表時表名中不必給出模式名。

當用戶創建基本表(其他數據庫對象也一樣)時若沒有指定模式,系統根據搜索路徑(Search path)來確定該對象所屬的模式。
搜索路徑包含一組模式列表,關係數據庫管理系統會使用模式列表中第一個存在的模式作爲數據庫對象的模式名。若搜索路徑中的模式名都不存在,系統會給出錯誤。
使用show search_path;可以顯示當前的搜索路徑。
搜索路徑當前默認值是$user,PUBLIC.其含義是首先搜索與用戶名相同的模式名,如果該模式名不存在,則使用PUBLIC模式。
數據庫管理員也可以設置搜索路徑,例:set search_path to “S-T”,PUBLIC;然後,定義表:create table Student(…); 實際結果是建立了S-T.Student基本表。因爲關係數據庫管理系統發現搜索路徑中第一個模式名S-T存在,就把該模式作爲基本表Student所屬的模式。

3.修改基本表
Alter table 表名
[add 列名 數據類型 [完整性約束] ]
[add 表級完整性約束]
[drop 列名 [cascade|restrict] ]
[drop constraint 完整性約束名 [restrict|cascade] ]
[alter column 列名 數據類型];

例3.8 向Student表增加“入學時間”列,其數據類型爲日期型。
Alter table Student add Schooltime date;
不論基本表中原來是否已有數據,新增加的列一律爲空值。
例3.9 將年齡的數據類型由字符型改爲整數。
Alter table Student alter column Sage int;
例3.10 增加課程名稱必須取唯一值的約束條件。
Alter table Course add unique(Cname);

4.刪除基本表
Drop table 表名 [reatrict|cascade];

數據庫索引有多種類型,常見索引包括順序文件上的索引、B+樹索引、散列索引、位圖索引等。
順序文件上的索引是針對按指定屬性值升序或降序存儲的關係,在該屬性上建立一個順序索引文件,索引文件由屬性值和相應的元組指針組成。
B+樹索引是將索引屬性組織成B+樹形式,B+樹的葉結點爲屬性值和相應的元組指針。B+樹索引具有動態平衡的優點。
散列索引是建立若干個桶,將索引屬性按照其散列函數值映射到相應桶中,桶中存放索引屬性值和相應的元組指針。散列索引具有查找速度快的特點。
位圖索引是用位向量記錄索引屬性中可能出現的值,每個位向量對應一個可能性。

關係數據庫管理系統在執行查詢時會自動地選擇合適的索引作爲存取路徑,用戶不必也不能顯式的地選擇索引。

1.建立索引
Create [unique][cluster] index 索引名 on 表名(列名 [次序],列名 [次序],…);
索引可以建立在該表的一列或者多列上,ASC是升序,DESC是降序,默認是ASC。
Unique表明此索引的每一個索引值只對應唯一的數據記錄。
Cluster表示要建立的索引爲聚簇索引。

例3.13 爲學生-課程數據庫中的Student、Course和SC三個表建立索引。其中Student表按照學號升序建唯一索引,Course表按課程號升序建唯一索引,SC表按學號升序和課程號降序建唯一索引。
Create unique index S-Student on Student (Sno ASC);
Create unique index S-Course on Course(Cno ASC);
Create unique index S-SC on SC(Sno ASC,Cno DESC);
2.修改索引
Alter index 舊索引名 rename 新索引名;
3.刪除索引
Drop index 索引名;

3.4數據查詢

Select [all|distinct] 列名,列名,…
From 表名或視圖名,表名或視圖名,…
Where 條件表達式
[group by 列名 [having 條件表達式] ]
[order by 列名[ASC|DESC] ];

1.單表查詢
例3.16 查詢全體學生的學號與姓名。
Select Sno,Sname
From Student;
執行過程:從Student表中取出一個元組,取出該元組在屬性Sno和Sname上的值,形成一個新的元組作爲輸出。對所有元組做相同的處理,最後形成一個結果關係作爲輸出。
例3.17 查詢全體學生的姓名、學號、所在系。
Select Sname,Sno,Sept
From Student;
例3.18 查詢全體學生的詳細記錄。
Select *
From Student;
例3.19查詢全體學生的姓名及其出生年月。
Select Sname,2019-Sage
From Student;
例3.20 查詢全體學生的姓名、出生年月和所在的院系,要求用小寫字母表示系名。
Select Sname,2019-Sage,lower(Sdept)
From Student;
例3.21 查詢選修了課程的學生學號。
Select distinct Sno
From SC;
例3.22 查詢計算機科學系全體學生的名單。
Select Sname
From Student
Where Sdept=’CS’;
例3.23 查詢所有年齡在20歲以下的學生姓名及其年齡。
Select Sname,Sage
From Student
Where Sage<20;
例3.24 查詢考試成績不及格的學生的學號。
Select distinct Sno
From SC
Where Grade<60;
例3.25 查詢年齡在20-23歲之間的學生的姓名、系別和年齡。
Select Sname,Sdept,Sage
From Student
Where Sage between 20 and 23 ;
例3.26 查詢年齡不在20-23歲之間的學生姓名、系別和年齡。
Select Sname,Sdept,Sage
From Student
Where Sage not between 20 and 23;
例3.27 查詢計算機科學系、數學系和信息系學生的姓名和性別。
Select Sname,Ssex
From Student
Where Sdept in(‘CS’,’MA’,’IS’);
例3.28 查詢既不是計算機科學系、數學系,也不是信息系的學生的姓名和性別。
Select Sname,Ssex
From Student
Where Sdept not in(‘CS’,’MA’,’IS’);
例3.29 查詢學號爲201215121的學生的詳細情況。
Select *
From Student
Where Sno=’201215121’;
例3.30 查詢所有姓劉的學生的姓名、學號和性別。
Select Sname,Sno,Ssex
From Student
Where Sname like ‘劉%’;
例3.31 查詢姓“歐陽”且全名爲三個漢字的學生的姓名。
Select Sname
From Student
Where Sname like ‘歐陽_’;
例3.32 查詢名字中第二個字爲“陽”的學生的姓名和學號。
Select Sname,Sno
From Student
Where Sname like ‘陽%’;
例3.33 查詢所有不姓劉的學生的姓名、學號和性別。
Select Sname,Sno,Ssex
From Student
Where Sname not like ‘劉%’;
例3.34 查詢DB_Design課程的課程號和學分。
Select Cno,Ccredit
From Course
Where Cname like ‘DB_Design’ escape ‘\’;
例3.35 查詢以“DB
”開頭,且倒數第三個字符爲i的課程的詳細情況。
Select *
From Course
Where Cname like ‘DB_%i__’ escape ’\’;
例3.36 某些學生選修課程後沒有參加考試,所以有選課記錄,但沒有考試成績。查詢缺少成績的學生的學號和相應的課程號。
Select Sno,Cno
From SC
Where Grade is null;
例3.37 查所有有成績的學生學號和課程號。
Select Sno,Cno
From SC
Where Grade is not null;
例3.38 查詢計算機科學系年齡在20歲以下的學生姓名。
Select Sname
From Student
Where Sdept=’CS’ and Sage<20;
例3.39查詢選修了3號課程的學生的學號及其成績,查詢結果按分數的降序排列。
Select Sno,Grade
From SC
Where Cno=’3’
Order by Grade DESC;
例3.40 查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列。
Select *
From Student
Order by Sdept,Sage DESC;
例3.41 查詢學生總人數。
Select count()
From Student;
例3.42 查詢選修了課程的學生人數。
Select count(distinct Sno)
From SC;
例3.43 計算選修1號課程的學生平均成績。
Select avg(Grade)
From SC
Where Cno=’1’;
例3.44 查詢選修1號課程的學生最高分數。
Select max(Grade)
From SC
Where Cno=’1’;
例3.45 查詢學生201215012選修課程的總學分
Select sum(Ccredit)
From SC,Course
Where Sno=’201215012’ and SC.Cno=Course.Cno;
當聚集函數遇到空值時,除count(
)外,都跳過空值而只處理非空值。
聚集函數只用於select子句和group by 中的having子句。
例3.46 求各個課程號及相應的選課人數。
Select Cno,count(Sno)
From SC
Group by Cno;
例3.47 查詢選修了三門以上課程的學生學號。
Select Sno
From SC
Group by Sno
Having count(*)>3;
Where子句作用於基本表或試圖,從中選擇滿足條件的元組。Having短語作用於組,從中選擇滿足條件的組。
例3.48 查詢平均成績大於等於90分的學生學號和平均成績。
Select Sno,avg(Grade)
From SC
Group by Sno
Having avg(Grade)>=90;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章