資料結構與演算法(九)——高階搜尋樹(下)
阿新 • • 發佈:2020-12-20
一、概述
SQL的特點
-
綜合統一:集模式資料定義語言(DDL)、外模式資料定義語言(SDDL)、資料儲存描述語言(DSDL)、資料操縱語言(DML)於一體。
-
高度非過程化:只需提出“做什麼”,而不需給出“怎麼做”。
-
面向集合的操作方式:操作的物件與結果均是集合。
-
以同一種語法提供多種使用方式:直接使用\(SQL\)以及嵌入式的\(SQL\)。
-
語言簡潔,簡單易學。
下列SQL操作使用mysql資料庫來執行。
二、資料定義
模式定義與刪除
# 建立模式(資料庫) create database learn_sql; # 刪除模式(資料庫) drop database learn_sql;
基本表的定義、刪除與修改
建立基本表:
# 建立學生表 create table Student(sno VARCHAR(20) PRIMARY KEY, Sname VARCHAR(20) UNIQUE, S sex CHAR(2), Sage TinyINT, Sdept CHAR(20)); # 建立課程表 create table course(cno char(4) primary key, cname char(40) NOT null, cpno CHAR(4), Ccredit smallint, foreign key (cpno) references course(cno)); # 建立成績表 create table sc (sno char(9), cno char(4), grade tinyint, primary key(sno, cno), foreign key(sno) references student(sno), foreign key(cno) references course(cno));
每一個基本表都屬於某一個模式,一個模式包含多個基本表。
修改基本表:
# 向Student表中增加“入學時間”列
alter table Student add S_entrance date;
# 增加課程名必須取唯一值的約束條件
alter table course add unique(cname);
刪除基本表:
# 刪除基本表、
# 級聯刪除
DROP TABLE student CASCADE
# 條件刪除
DROP TABLE student CASCADE
索引的建立和刪除:
# 建立索引 create UNIQUE INDEX Stuno ON Student(sno); create UNIQUE INDEX coucno ON Course(cno); create UNIQUE INDEX Scno ON SC(Sno ASC, Cno DESC); # 刪除索引 DROP INDEX Coucno ON Course;
三、資料查詢
SQL查詢的基本形式:
SELECT <列名>
FROM <表名>
WHERE <條件>
GROUP BY <列名>
HAVING <條件>
ORDER BY <列名> <ASC|DESC>
單表查詢:
# DISTINCT用於消除重複行
SELECT DISTINCT Sno
FROM SC
# ALL用於保留重複行
SELECT DISTINCT Sno
FROM SC
條件查詢:
SELECT Sname
FROM Student
WHERE Sdept='SC'
-
BEETWEEN value1 AND value2
範圍查詢語句。 -
IS NULL, NOT NULL
判空條件
聚合函式:
- COUNT( ):統計資料的行數
- MIN( ):找出column中最小的一行
- MAX( ):找出column中最大的一行
- AVG( ):對column所有的行取平均值
- SUM( ):對column所有的行求和
GROUP BY子句:
GROUP BY
子句用根據指定屬性分組,分組後聚合函式將作用於每一個組。
SELECT Cno, COUNT(Sno)
FROM SC
GROUP BY Cno
連線查詢:
SELECT S.*, SC.*
FROM Student AS s, SC
WHERE s.Sno = SC.Sno
巢狀查詢:
SELECT Sname
FROM Student
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Cno = '2')
在巢狀查詢中,外層查詢稱父查詢,內層查詢稱子查詢;
可使用ANY
或ALL
謂詞來比較子查詢返回的值:參考部落格
SELECT Sname, Sage
FROM Student
WHERE Sage < ANY(SELECT Sage
FROM Student
WHERE Sdept = 'CS')
還可使用EXISTS
謂語來判斷子查詢是否返回資料:[參考部落格
集合查詢
集合查詢操作:參考部落格
- UNION
- INTERSECT
- EXCEPT
基於派生表的查詢
在FROM
語子句中嵌入一個查詢:
SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade)
FROM SC
GROUP BY Sno
)AS Avg_sc(avg_sno, avg_grade)
四、資料更i效能
插入資料
# 兩種插入方式
INSERT INTO Sutdent(Sno, Sname, Ssex, Sage)
VALUES('201215128', '張三', 'IS', '18')
INSERT INTO Sutdent VALUES('201215128', '張三', 'IS', '18')
# 插入子查詢的結果
ISNERT INTO S1
SELECT *
FROM S2;
修改資料
# 修改滿足條件的元組的值
UPDATE Student
SET Sage = 22
WHERE Sno = '14182401708'
# 修改表中所有元組的值
UPDATE Student
SET Sage = Sage + 1
刪除資料
# 刪除滿足條件的元組的值
DELETE
FROM Student
WHERE Sno = '14182401708'
# 刪除表中所有元組的值
DELETE
FROM Student
五、空值的處理
空值(NULL)即不存在的、無意義的值。
空值的判斷
空值可以使用IS NULL
或IS NOT NULL
來表示,
SELECT *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL
六、檢視
檢視是從一個或幾個基本表(或檢視)匯出的表。它與基本表不同,是一個虛表。資料庫中只存放檢視的定義,而不存放檢視對應的資料。
定義檢視
# 建立檢視
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION
CREATE VIEW只是把檢視的定義存入資料字典,並不執行其中的SELECT語句。
刪除檢視
DROP VIEW IS_Student
查詢檢視
在查詢檢視時,首先進行有效性檢查,例如涉及的表、檢視是否存在。若存在,則從資料字典中取出檢視的定義,把定義中的子查詢和使用者的查詢結合起來,轉換成等價的對基本表的查詢,然後執行修正了的查詢。這一轉換稱為檢視消解。
更新檢視與查詢檢視是同樣的原理,將對檢視的更新轉換為對
檢視的作用
- 檢視能夠簡化使用者的操作。
- 檢視使使用者能以多種角度看待同一資料。
- 檢視對重構資料庫提供了一定程度的邏輯獨立性。
- 檢視能夠對機密資料提供安全保護。
- 適當利用檢視可以更清晰地表達查詢。