SQL——第三章(1)
3.1 SQL概述
3.1.1 SQL的特點
綜合統一;高度非過程化;面向集合的操作方式;以同一種語法結構提供多種使用方式;語言簡結,易學易用。
高度非過高度非過程化程化高度非過程化
3.2 學生-課程資料庫
學生表:Student(Sno,Sname,Ssex,Sage,Sdept)
課程表:Course(Cno,Cname,Cpno,Ccredit)
學生選課表:SC(Sno,Cno,Grade)
3.3 資料定義
SQL的資料定義功能:
3.3.1 模式的定義與刪除
1.模式定義
[例1] 為使用者WANG定義一個學生-課程模式S-T
CREATE SCHEMA “S-T” AUTHORIZATION WANG;
[例2] CREATE SCHEMA AUTHORIZATION WANG;
該語句沒有指定<模式名>,<模式名>隱含為<使用者名稱>
v定義模式實際上定義了一個名稱空間。
v在這個空間中可以定義該模式包含的資料庫物件,例如基本表、檢視、索引等。
v在CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。
CREATE SCHEMA <模式名> AUTHORIZATION <使用者名稱>[<表定義子句>|<檢視定義子句>|<授權定義子句>]
[例] 為使用者ZHANG建立了一個模式TEST,並且在其中定義一個表TAB1
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1 ( COL1 SMALLINT,
COL2 INT
,COL3 CHAR(20),
COL4 NUMERIC(10,3),
COL5 DECIMAL(5,2)
);
2.刪除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
(1)CASCADE(級聯)
刪除模式的同時把該模式中所有的資料庫物件全部刪除
(2)RESTRICT(限制)
l如果該模式中定義了下屬的資料庫物件(如表、檢視等),則拒絕該刪除語句的執行。
l僅當該模式中沒有任何下屬的物件時才能執行。
[例] DROP SCHEMA ZHANG CASCADE;
3.3.2 基本表的定義、刪除與修改
1.定義基本表
CREATE TABLE <表名>
(<列名> <資料型別>[ <列級完整性約束條件> ]
[,<列名> <資料型別>[ <列級完整性約束條件>] ]
…
[,<表級完整性約束條件> ] );
- <表名>:所要定義的基本表的名字
- <列名>:組成該表的各個屬性(列)
- <列級完整性約束條件>:涉及相應屬性列的完整性約束條件
- <表級完整性約束條件>:涉及一個或多個屬性列的完整性約束條件
如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級。
[例1] 建立“學生”表Student。學號是主碼,姓名取值唯一。
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY, /* 列級完整性約束條件,Sno是主碼*/
Sname CHAR(20) UNIQUE, /* Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
[例2] 建立一個學生選課表SC
CREATE TABLE SC
(Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY (Sno,Cno), /* 主碼由兩個屬性構成,必須作為表級完整性進行定義*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表級完整性約束條件,Sno是外碼,被參照表是Student */
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表級完整性約束條件, Cno是外碼,被參照表是Course*/
);
2.資料型別表:
資料型別 |
含義 |
CHAR(n),CHARACTER(n) |
長度為n的定長字串 |
VARCHAR(n), CHARACTERVARYING(n) |
最大長度為n的變長字串 |
CLOB |
字串大物件 |
BLOB |
二進位制大物件 |
INT,INTEGER |
長整數(4位元組) |
SMALLINT |
短整數(2位元組) |
BIGINT |
大整數(8位元組) |
NUMERIC(p,d) |
定點數,由p位數字(不包括符號、小數點)組成,小數後面有d位數字 |
DECIMAL(p, d), DEC(p, d) |
同NUMERIC |
REAL |
取決於機器精度的單精度浮點數 |
DOUBLE PRECISION |
取決於機器精度的雙精度浮點數 |
FLOAT(n) |
可選精度的浮點數,精度至少為n位數字 |
BOOLEAN |
邏輯布林量 |
DATE |
日期,包含年、月、日,格式為YYYY-MM-DD |
TIME |
時間,包含一日的時、分、秒,格式為HH:MM:SS |
TIMESTAMP |
時間戳型別 |
INTERVAL |
時間間隔型別 |
3.模式與表
(1)每一個基本表都屬於某一個模式
(2)一個模式包含多個基本表
(3)定義基本表所屬模式
- 方法一:在表名中明顯地給出模式名
Create table"S-T".Student(......); /*模式名為 S-T*/
Create table "S-T".Cource(......);
Create table "S-T".SC(......);
(4)建立基本表(其他資料庫物件也一樣)時,若沒有指定模式,系統根據搜尋路徑來確定該物件所屬的模式
- 方法二:在建立模式語句中同時建立表
- 方法三:設定所屬的模式
(5)關係資料庫管理系統會使用模式列表中第一個存在的模式作為資料庫物件的模式名
(6) 若搜尋路徑中的模式名都不存在,系統將給出錯誤
- 顯示當前的搜尋路徑: SHOW search_path;
- 搜尋路徑的當前預設值是:$user, PUBLIC
(7)資料庫管理員使用者可以設定搜尋路徑,然後定義基本表
SET search_path TO "S-T",PUBLIC;
Create table Student(......); 結果建立了S-T.Student基本表。
關係資料庫管理系統發現搜尋路徑中第一個模式名S-T,就把該模式作為基本表Student所屬的模式。
4.修改基本表
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <資料型別> [ 完整性約束 ] ]
[ ADD <表級完整性約束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性約束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><資料型別> ] ;
- <表名>是要修改的基本表
- ADD子句用於增加新列、新的列級完整性約束條件和新的表級完整性約束條件
- DROP COLUMN子句用於刪除表中的列
n如果指定了CASCADE短語,則自動刪除引用了該列的其他物件
n如果指定了RESTRICT短語,則如果該列被其他物件引用,關係資料庫管理系統將拒絕刪除該列
- DROP CONSTRAINT子句用於刪除指定的完整性約束條件
- ALTER COLUMN子句用於修改原有的列定義,包括修改列名和資料型別
[例 1] 向Student表增加“入學時間”列,其資料型別為日期型
ALTER TABLE Student ADD S_entrance DATE;
注意:不管基本表中原來是否已有資料,新增加的列一律為空值
[例2] 將年齡的資料型別由字元型改為整數。
ALTER TABLE Student ALTER COLUMN Sage INT;
[例3] 增加課程名稱必須取唯一值的約束條件。
ALTER TABLE Course ADD UNIQUE(Cname);
5.刪除基本表
DROP TABLE <表名>[RESTRICT| CASCADE];
①RESTRICT:刪除表是有限制的。
- 欲刪除的基本表不能被其他表的約束所引用
- 如果存在依賴該表的物件,則此表不能被刪除
②CASCADE:刪除該表沒有限制。
- 在刪除基本表的同時,相關的依賴物件一起刪除
3.3.3 索引的建立與刪除
1.建立索引
- 誰可以建立索引:資料庫管理員 或 表的屬主(即建立表的人)
- 誰維護索引:關係資料庫管理系統自動完成
- 使用索引:關係資料庫管理系統自動選擇合適的索引作為存取路徑,使用者不必也不能顯式地選擇索引
語句格式
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
- <表名>:要建索引的基本表的名字
- 索引:可以建立在該表的一列或多列上,各列名之間用逗號分隔
- <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。預設值:ASC
- UNIQUE:此索引的每一個索引值只對應唯一的資料記錄
- CLUSTER:表示要建立的索引是聚簇索引
例:SC表按學號升序和課程號降序建唯一索引
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
2.修改索引
ALTER INDEX <舊索引名> RENAME TO <新索引名>
[例] 將SC表的SCno索引名改為SCSno
ALTER INDEX SCno RENAME TO SCSno;
3.刪除索引
DROP INDEX <索引名>; 刪除索引時,系統會從資料字典中刪去有關該索引的描述。
3.4 資料查詢
語句格式
SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …
FROM <表名或檢視名>[,<表名或檢視名> ]…|(SELECT 語句)
[AS]<別名>
[ WHERE <條件表示式> ]
[ GROUP BY <列名1> [ HAVING <條件表示式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
- SELECT子句:指定要顯示的屬性列
- FROM子句:指定查詢物件(基本表或檢視)
- WHERE子句:指定查詢條件
- GROUP BY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組為一個組。通常會在每組中作用聚集函式。
- HAVING短語:只有滿足指定條件的組才予以輸出
- ORDER BY子句:對查詢結果表按指定列值的升序或降序排序
3.4.1 單表查詢
1.選擇表中的若干列
(1)查詢指定列
[例] 查詢全體學生的學號與姓名。
SELECT Sno,Sname
FROM Student;
(2)查詢全部列
①在SELECT關鍵字後面列出所有列名
②將<目標列表達式>指定為 *
[例] 查詢全體學生的詳細記錄
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
或
SELECT *
FROM Student;
(3)查詢經過計算的值
SELECT子句的<目標列表達式>不僅可以為表中的屬性列,也可以是表示式
[例1] 查詢全體學生的姓名、出生年份和所在的院系,要求用小寫字母表示系名。
SELECT Sname,'Year of Birth: ',2014-Sage,LOWER(Sdept)
FROM Student;
輸出結果:
Sname 'Year of Birth:' 2014-Sage LOWER(Sdept)
李勇 Year of Birth: 1994 cs
注意:出生年份即當前年份-年齡,此題目假設當時為2014年
【例2】使用列別名改變查詢結果的列標題:
SELECT Sname NAME,'Year of Birth:' BIRTH, 2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
輸出結果:
NAME BIRTH BIRTHDAY DEPARTMENT
李勇 Year of Birth: 1994 cs
2.選擇表中的若干元組
(1)消除取值重複的行
① 如果沒有指定DISTINCT關鍵詞,則預設為ALL
[例1] 查詢選修了課程的學生學號。
SELECT Sno FROM SC; 等價於:SELECT ALL Sno FROM SC;
執行上面的SELECT語句後,結果為:
Sno
201215121
201215121
201215121
201215122
201215122
② 指定DISTINCT關鍵詞,去掉表中重複的行
SELECT DISTINCT Sno FROM SC;
執行結果:
Sno
201215121
201215122
(2)查詢滿足條件的元組
常用的查詢條件:
查 詢 條 件 |
謂 詞 |
比 較 |
=, >, <, >=, <=, !=, <>, !>, !<; NOT+上述比較運算子 |
確定範圍 |
BETWEEN AND, NOT BETWEEN AND |
確定集合 |
IN, NOT IN |
字元匹配 |
LIKE, NOT LIKE |
空 值 |
IS NULL, IS NOT NULL |
多重條件(邏輯運算) |
AND, OR, NOT |
[例1] 查詢年齡在20~23歲(包括20歲和23歲)之間的學生的姓名、系別和年齡
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
[例2] 查詢計算機科學系(CS)、數學系(MA)和資訊系(IS)學生的姓名和性別。
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS','MA’,'IS' );
Ⅰ 字元匹配:
謂詞: [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <換碼字元>’]
<匹配串>可以是一個完整的字串,也可以含有萬用字元%和 _
① % (百分號) 代表任意長度(長度可以為0)的字串
例如a%b表示以a開頭,以b結尾的任意長度的字串
②_ (下橫線) 代表任意單個字元。
例如