1. 程式人生 > 實用技巧 >資料結構與演算法(九)——高階搜尋樹(下)

資料結構與演算法(九)——高階搜尋樹(下)

一、概述

SQL的特點

  1. 綜合統一:集模式資料定義語言(DDL)、外模式資料定義語言(SDDL)、資料儲存描述語言(DSDL)、資料操縱語言(DML)於一體。

  2. 高度非過程化:只需提出“做什麼”,而不需給出“怎麼做”。

  3. 面向集合的操作方式:操作的物件與結果均是集合。

  4. 以同一種語法提供多種使用方式:直接使用\(SQL\)以及嵌入式的\(SQL\)

  5. 語言簡潔,簡單易學

下列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')

在巢狀查詢中,外層查詢稱父查詢,內層查詢稱子查詢;

可使用ANYALL謂詞來比較子查詢返回的值:參考部落格

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 NULLIS 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

查詢檢視

在查詢檢視時,首先進行有效性檢查,例如涉及的表、檢視是否存在。若存在,則從資料字典中取出檢視的定義,把定義中的子查詢和使用者的查詢結合起來,轉換成等價的對基本表的查詢,然後執行修正了的查詢。這一轉換稱為檢視消解

更新檢視與查詢檢視是同樣的原理,將對檢視的更新轉換為對

檢視的作用

  1. 檢視能夠簡化使用者的操作。
  2. 檢視使使用者能以多種角度看待同一資料。
  3. 檢視對重構資料庫提供了一定程度的邏輯獨立性。
  4. 檢視能夠對機密資料提供安全保護。
  5. 適當利用檢視可以更清晰地表達查詢。