一、SQL概述
SQL的特點
- 綜合統一
- 高度非過程化
- 面向集合的操作方式
- 以一同一種語法結構提供兩種使用方法
- 語言簡潔,易學易用
SQL功能 | 動詞 |
---|---|
數據定義 | CREATE,DROP,ALTER |
數據查詢 | SELECT |
數據操縱 | INSERT,UPDATE,DELETE |
數據控制 | CRANT,REVOKE |
SQL的操作涉及到模式和外模式,涉及不到內模式
二、學生-課程數據庫
本章節用學生課程數據庫爲例講解sql各種操作
- 學生表:Student(Sno,Sname,Ssex,Sage,Sdept)(學號,姓名,性別,年齡,所在系)
- 課程表:Course(Con,Cname,Cpno,Ccredit),(課程號,課程名,先行課,學分)
- 學生選課表:SC(Sno,Cno,Grade),(學號,課程號,成績)
三、數據定義
操作對象 | 創建 | 刪除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
視圖 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
(一)模式的定義與刪除
- 定義模式
CREATE SCHEMA<模式名> AUTHORIZATION<用戶名>;
【注意】:能創建模式的用戶擁有DBA權限,或者獲得DBA授予的CREATE SCHEMA權限
定義模式實際上是定義一個命名空間,在這個空間上可以進一步定義該模式包含的數據庫對象,如基本表,視圖和索引等
示例: - 模式的刪除
DROP SCHEMA<模式名><CASCADE|RESTRICT>
CASCADE(級聯):表示在刪除模式的同時把該模式中所有的數據庫對象全部刪除
RESTRICT(限制):表示若模式中已定義下屬的數據庫對象(表,視圖)時,拒絕該刪除語句的執行
(二)基本表的定義語句格式
CREATE TABLEV表名〉(<列名><數據類型>[列級完整性約束條件]
[,<列名><數據類型>[列級完整性約束條件]]
[,<表級完整性約束條件>]);
列級完整性約束條件:涉及相應屬性列的約束條件
表級完整性約束條件:涉及一個或多個屬性列的約束條件
- 定義基本表
常用完整性約束
主碼約束:PRIMARY KEY
唯一性約束:UNIQUE
非空值約束:NOT NULL
參照完整性約束
【注】主碼不可爲空,唯一性約束可以爲空
示例:
- 修改基本表
ALTER TABLE<表名>
[ADD <新列名><數據類型>[完整性約束]]
[ADD<表級完整性約束>]
[DROP <列名>[CASCADE|RESTRICT]]
[DROP <完整性約束名>[RESTRICT | CASCADE ]]
[MODIFY<列名><數據類型>];
示例:
- 刪除基本表
DROP TABLE<表名>
基本表刪除–>數據,表上的索引都刪除,視圖會保留但無法引用
刪除基本表時,系統會從數據字典中刪去有關該基本表及其索引的描述
(三)建立與刪除索引
建立索引是加快查詢速度的有效手段
DBA 或表的屬主根據需要建立,有些DBMS自動建立以下列上的索引
PRIMARY KEY
UNIQUE
維護索引:DBMS自動完成
使用索引:DBMS自動選擇是否使用索引以及使用哪些索引
- 建立索引
CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON<表名>(<列名>[<次序>][,<列名><次序>]]…);
索引可以建立在一列或多列上,各列之間用逗號分隔
用<次序>指定索引值的排列次序,升序:ASC,降序:DESC,缺省值:ASC
UNIQUE:表名此索引的每一索引值只對應唯一的數據記錄
CLUSTER:聚簇索引
示例:
聚簇索引:建立這個索引後,基表中的數據也需要按照指定值得升序或降序存放
2. 刪除索引
DROP INDEX<索引名>
刪除索引時,系統會從數據字典中刪去有關該索引的描述
四、數據查詢
- 查詢語句概述
語句格式
SELECT子句:指定要顯示的屬性列
FROM:指定查詢對象(基本表或視圖)
WHERE:指定查詢條件
GROUP BY:對查詢結果按指定列的值分組,該屬性列值相等的元組爲一個組,通常會在每組中用集函數
HAVING短語:篩選出只有滿足指定條件的組
ORDER BY:對查詢結果按照指定列值得升序或降序排序
【注】首先按WHERE篩選,然後按照GROUP BY分組,然後是HAVING。然後是ORDER BY
(一)單表查詢
- 選擇表中的若干列
- 查詢經過計算的值
- 選擇表中的若干元組
- 消除重複取值的行
用DISTINCT
如:SELECT DISTINCT Sno
FROM SC; - 查詢滿足條件的元組
通過WHERE來實現
1)比較大小
2)確定範圍
用BETWEEN…AND…和NOT BETWEEN…AND…,其中BETWEEN後跟範圍的下限,AND後跟範圍的上限
例:
3)確定集合
用IN 和NOT IN
例:
4)字符匹配
用LIKE 實現 [NOT] LIKE’<匹配串>’[ESCQPE’<換碼字符>’]
其中<匹配串>:指定匹配模板
當匹配模板不含通配符時,可以用=取代LIKE ,用!=或<>取代NOT LIKE - 通配符
%:代表任意長度字符串
_ 代表任意單個字符
ESCAPE 短語:後面跟換碼字符,爲了使字符本身含有的%與_跟通配符不衝突
例:
5)涉及空值的查詢
6)多重條件查詢
邏輯運算法ADN和OR可用來連接多個查詢。AND的優先級高於OR,但用戶可以用括號改變優先級
例:
- 對查詢結果排序
用戶可以用ORDER BY子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序 (DESC)排列,默認值爲升序。
- 使用集函數
COUNT(*) | 統計元組個數 |
---|---|
CONUT(列名) | 統計一列中值得個數 |
SUM | 計算一列值的總和 |
AVG | 平均值 |
MAX | 最大值 |
MIN | 最小值 |
例:
5. 對查詢結果分組
使用GROUP BY 子句分組
分組方法:按指定的一列或多列值分組,值相等的爲一組
使用GROUP BY後,SELECT子句的列名列表後只能出現分組函數和集哈數
可以試用HAVING短語篩選出最終輸出結果
HAVING與WHERE的區別:作用對象不同,WHERE作用於基表或者視圖,從中選擇滿足條件的元組;HAVING 作用於組,從中選擇滿足條件的組
例: