3.1關係數據庫標準語言SQL
(Structured Query Language )結構化查詢語言
數據查詢:SELECT
數據定義:CREATE\DROP
數據操縱:INSERT\UPDATE\DELETE
數據控制:GRANT\REVOKE
3.1.1 數據定義
操作對象 | 創建 | 刪除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
視圖 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
3.1.2 模式的定義與刪除
定義模式
CREATE SCHEMA 名字 AUTHORIZATION 用戶名
create schema "test" authorization wang
CREATE TABLE NAME(SID INT,
SNAME CHAR(20)
);
刪除模式
DROP SCHEMA 名字 CASCADE|RESTRICT
CASCADE:級聯 RESTRICT:限制
3.1.3 基本表的定義與修改
定義基本表
CREATE TABLE 表名 (列名 數據類型 列級完整性約束條件,
列名 數據類型 約束條件
表級完整性約束條件);
約束條件:UNIQUE\PRIMARY KEY\NOT NULL
表級完整性約束條件:FOREIGN KEY(Sno) REFERENCES Course(Cno)
數據類型:char(n)定長、varchar(n)變長字符串、BLOB二進制大對象、TIME時分秒、Date年月日等
修改基本表
ALTER TABLE 表名
ADD COLUMN 新列名 數據類型 [約束]
ADD [表級完整性約束條件]
DROP COLUMN 列名 CASCADE|RESTRICT
DROP CONSTRAINT 約束 CASCADE|RESTRICT
DROP COLUMN 列名 數據類型
刪除基本表
DROP TABLE 表名 CASCADE|RESTRICT
3.1.3 索引的建立與刪除
建立索引
CREATE [UNIQUE] [CLUSTER] INDEX 索引名 ON 表名 (列名)
CREATE UNIQUE INDEX Stuno ON Student(Sno);
ASC升序、DESC降序
修改索引
ALTER INDEX 舊索引名 RENAME TO 新索引名
3.2 數據查詢
SELECT ALL|DISTINCT 目標列表達式 FROM 表名或視圖名 WHERE 條件表達式 GROUP BY 列名 HAVING 條件表達式 ORDER BY 列名 ASC|DESC
DISTINCT:消除重複行
比較運算符=、>、>=、<、<=、!=或<>、!>、!<
邏輯運算符and、or、not
模糊匹配
like
NO LIKE
%表示任意多個任意字符
_表示一個任意字符
查詢姓黃的學生
select * from chanpin where name like '%車';
查詢名字以車結尾的產品
範圍查詢
in表示在一個非連續的範圍內
not in表示不在一個非連續的範圍內
BETWEEN 下限 AND 上限、 NOT BETWEEN AND
空值查詢
is null
is not null
3.2.1 聚合函數
- COUNT():統計行數量
- SUM:獲取單個列的合計值
- AVG:計算某個列的平均值
- MAX:計算列的最大值
- MIN:計算列的最小值
案例:
(1)查詢選修課程的學生人數 SELECT COUNT(DISTINCT Sno) FROM SC;
(2)計算選修1號課程的學生的平均成績 SELECT AVG(GRADE) FROM SC WHERE Cno='1';
(3)查詢學生201507110選修課程的總課程 SELECT SUM(Ccredit) FROM SC,Course WHERE Sno='201507110' AND SC.Sno=Course.Cno
(4)求各個課程號及其相應的選課人數 SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;
(5)選修三門以上課程的學生學號:SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3;
GROUP BY 將查詢結果按某一列或多列的值分組,值相等爲一組。
WHERE 子句與HAVING短句的區別在於作用對象不同。WHERE 子句--基本表或視圖、HAVING短句--組,後面可以加聚集函數
3.2.2 連接查詢
等值與非等值連接查詢
連接運算符是=時,稱爲等值連接。
在等值連接時中把目標列中重複的屬性列去掉則爲自然連接
自身連接
給表取別名
SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno = SECOND.Cno
外連接
不滿足條件的元組也保存,即保存懸浮元組
SELECT * FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
內連接
select a.*,b.* from a inner join b on a.id=b.parent_id
多表查詢
SELECT * FROM SC,Student,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
嵌套查詢
一個SELECT-FROM-WHERE稱爲查詢塊
將查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短句的條件中
注意!!!子查詢的SELECT語句中不能使用ORDER BY子句,ORDER BY子句只能對最後的查詢結果排序
帶有IN謂詞的子查詢
- 不相關子查詢:子查詢的查詢條件不依賴於父查詢
實例:SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname='amber');
- 相關子查詢:子查詢的查詢條件依賴於父查詢
帶比較運算符的子查詢:用=、>、<等代替IN
帶ANY(SOME)或ALL的子查詢,如<ANY、>SOME等
帶EXISTS、NOT EXISTS謂詞的子查詢,不返回任何數據,只返回true或false
3.2.2 集合查詢
UNION:並操作,查詢結果列數一定要相同,對應項的數據類型也必須相同
INTERSECT:交操作
EXCEPT:差操作
3.3 數據更新
插入元組在: INSERT INTO 表名 屬性列 VALUES()
INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage)FROM Student GROUP BY Sdept;
修改操作
UPDATE Student SET Sage=22 WHERE Sno='201507110';
刪除數據
DELETE FROM Student WHERE Sno='201507111';
3.4 視圖
3.4.1 建立視圖
CREATE VIEW 視圖名 (列名,列名,,) AS 子查詢 [ WITH CHECK OPTION];
WITH CHECK OPTION:刪改查操作時必須滿足視圖定義的謂詞條件(即子查詢中的條件表達式)
分組視圖:帶有聚集函數和GROUP BY 子句的查詢來定義視圖
刪除視圖:DROP VIEW 視圖名 CASCADE
3.4.2 查詢視圖
視圖消解:從數據字典中取出視圖的定義,把定義中的子查詢和用戶查詢結合起來,轉換成等價的基本表查詢,再執行修改後的查詢。(對師徒查詢轉換成對基本表的查詢)
SELECT Sno,Sage FROM IS_Student WHERE Sage <20
轉換後:SELECT Sno,Sage FROM Student WHERE Sdept='IS' and Sage <20
3.4.3 更新視圖
不是所有試圖都是可更新的。由兩個以上的基本表導出的,則此視圖不允許更新等。
UPDATE Sno,Sage FROM Student WHERE Sdept='IS' and Sage <20
轉換爲更新基本表