基本理論知識
數據模型
數據庫是長期存儲在計算機內有組織的大量的共享的數據集合,數據庫系統的核心和基礎是數據模型。
第一類數據模型:概念模型,信息模型,按照用戶的觀點來對數據和信息建模,主要用於數據庫設計
第二類數據模型:邏輯模型和物理模型。
---邏輯模型包括:層次模型、網狀模型、關系模型、面向對象模型、對象關系模型等
---物理模型:對數據最底層的抽象,描述數據在系統內部的表示方法和存取方法,在磁盤或磁帶上的存儲方式和存取方法,是面向計算機系統的。
數據模型一般由數據結構、數據操作和完整性約束三部分組成。
數據結構
存儲在數據庫中對象類型的集合,作用是描述數據庫組成對象以及對象之間的聯系。
數據操作
對數據庫中各種對象實例允許執行的操作的集合,包括操作及相關的操作規則。
數據完整性約束條件
在給定的數據模型中,數據及其聯系所遵守的一組通用的完整性規則,它能保證數據的正確性和一致性。
關系模型
關系模型是目前最重要的一種數據模型,關系數據庫系統用關系模型作為數據的組織方式,關系模型中數據的邏輯結構是一張二維表
(1)關系的數據結構:一張表
(2)關系數據模型的數據操作包括:查詢、插入、刪除和更新數據
(3)關系模型的數據完整性約束條件包括:實體完整性、參照完整性、用戶自定義的完整性
主鍵與外鍵
候選碼:若關系中的某一屬性組的值能唯一標識一個元組,則該屬性組為候選碼
主鍵(主關鍵字):若一個表中有多個候選碼,則可選定其中一個為主鍵
主屬性:候選碼的諸屬性稱為主屬性,不包含在任何候選碼中的屬性稱為非主屬性或非碼屬性
外鍵(外關鍵字):如果關系模式R中的某屬性集不是R的主鍵,而是另一個關系R1的主鍵,則該屬性集是關系模式R的外鍵。以另一個關系的外鍵作主鍵的表被稱為主表,具有此外鍵的表被稱為主表的從表。
關系模型的實體完整性規則
若屬性A(一個或一組屬性)是基本關系R的主屬性,則A不能取空值,即主鍵不能為空
關系模型的參照完整性規則
若屬性F(一個或一組屬性)是某基本關系R的外鍵,且它與基本關系R1 的主鍵相對應,則對於R中,每個F上的值或為空值或等於R1中的主鍵值
事務
用戶定義的一個數據庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位
事務的四個特性(ACID特性):原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持續性(Durability)。
索引
對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。
索引的作用
(1)通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性
(2)可以大大加快數據的檢索速度,這是創建索引的最主要原因
(3)可以加速表與表之間的連接,特別是在實現數據的參照完整性方面特別有意義
(4)在使用分組(group by)和排序(order by)字句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間
(5)通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能
為表設置索引的代價
(1)增加了數據庫的存儲空間
(2)在插入和修改數據時要花費較多的時間(因為索引也要隨之變動)
索引建立和刪除語句
//在表Student(學生信息表)上按Sno(學號)降序建唯一索引
CREATE UNIQUE INDEX Stusno ON Student(Sno desc);
//刪除Student表的Stusno索引
ALTER TABLE Student DROP INDEX Stusno;
視圖
從一個或幾個基本表(或視圖)導出的表,與基本表不同,是一個虛表。數據庫中只存放視圖的定義,而不存放視圖對應的數據,這些數據仍然存放在原來的基本表中。所以基本表中的數據發生變化,從視圖中查詢出的數據也就隨之改變了,從這個意義上講,視圖就像一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化。
視圖建立和刪除語句
//建立一個計算機系學生的視圖(在學生表Student的基礎上)
CREATE VIEW CS_Student
AS
SELECT sno, sname
FROM Student
WHERE Sdept='CS';
注:視圖一經建立,就可以像基本表一樣被查詢、刪除
//刪除視圖
DROP view CS_Student;
SQL語句
SQL語句包含:數據定義(create、drop、alter)、數據查詢(select)、數據操縱(insert、update、delete)、數據控制(grant、revoke)
數據定義
定義基本表(create)
CREATE TABLE 表名
(列名 數據類型 列級完整性約束條件,
...... 列名 數據類型 列級完整性約束條件);
//例子:建立“學生信息表”student
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
修改基本表(alter)
ALTER TABLE 表名 [ADD 新列名 數據類型 完整性約束] [DROP 完整性約束名] [MODIFY COLUMN 列名 數據類型]
例子:
//向Student表增加“入學時間”列,數據類型為日期型
ALTER TABLE Student ADD S_entrance DATE;
//將年齡的數據類型由字符型改為整數
ALTER TABLE Student MODIFY COLUMN Sage INT;
//增加Student表Sname必須取唯一值的約束條件
ALTER TABLE Student ADD UNIQUE(Sname);
刪除基本表(drop)
//RESTRICT表示表的刪除是有限制條件的,CASCADE表示表的刪除沒有限制條件 DROP TABLE 表名 [RESTRICT | CASCADE]
//例子:刪除Student表
DROP TABLE Student CASCADE;
數據查詢(select)
SELECT [ALL | DISTINCT] 目標列表達式 FROM 表明或視圖名 [WHERE 條件表達式] [GROUP BY 列名 [HAVING 條件表達式]] [ORDER BY 列名 [ASC | DESC]];選擇
選擇表中的若干列
//在表Student中,查詢名為Bill Gates 的學生信息
SELECT * from Student WHERE Sname='Bill Gates';
//在表Student中,查詢名字中有Bill的學生信息
SELECT * from Student WHERE Sname like '%Bill%';
//在表Student中查詢年齡在20-23歲(包括20與23歲)之間的學生信息
SELECT * from Student WHERE Sage BETWEEN 20 AND 23;
//在表Student中查詢計算機系(CS)、信息系(MA)、數學系(IS)學生的姓名與性別
SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS', 'IS', 'MA');
//在表Student中查詢沒有年齡信息的學生
SELECT * FROM Student WHERE Sage IS NULL;
ORDER BY子句
order by子句對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,默認是升序
//在表Student中,按學生的年齡值升序檢索出全部學生的信息
SELECT * FROM Student ORDER BY Sage;
//在表Student中,先按專業升序,再同一專業按年齡降序,輸出全部學生信息
SELECT * FROM Student ORDER BY Sdept, Sage desc;
LIMIT子句
查詢之后要顯示返回的前幾條或中間某幾行數據
SELECT * FROM TABLE LIMIT [offset, ] rows | rows OFFSET offset //偏移量從0開始
例子:
SELECT * FROM Student LIMIT 5,10; //行,偏移; 檢索記錄行6-15
SELECT * FROM Student LIMIT 5; //檢索前5個記錄行
注:LIMIT n等價於LIMIT 0,n
聚集函數
SQL語句中常用的聚集函數有count、sum、avg、max、min。
總數:select count(*) as totalcount from table1; 求和:select sum(field1) as sumvalue from table1; 平均:select avg(field1) as avgvalue from table1; 最大:select max(field1) as maxvalue from table1; 最小:select min(field1) as minvalue from table1;
GROUP BY子句
根據一個或多個屬性的值來對元組進行分組,值相等的為一組
//查詢Student表中具有相同年齡的每個組的人數
select Sage, count(*) from Student group by Sage;
//HAVING 子句用在GROUP BY子句的SQL語句中,用來選取符合指定條件的分組
select Sage,count(*) from Student group by Sage having count(*) > 1;
連接查詢
若一個查詢同時涉及兩個以上的表,則稱之為連接查詢
//有表Student(學生信息表)、SC(選課表),要求查詢每個學生及其選修課程的情況
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno=SC.Sno;
//若某個學生沒有選課,依然將其保存到結果中,這時需要使用外連接
//下例為左外連接,列出左邊表(Student)中所有元組
SELECT Student.*, SC.*
FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);
數據操縱
向表中添加若干行數據、修改表中的數據、刪除表中的若干行數據
插入元組(insert)
將新元組插入到制定表中,其中新元組的field1的值為value1,field2的值為value2...;
INSERT INTO table1(field1,field2...) VALUES(value1,value2...)
//例:將新學生元組(學號:201009013;姓名:王明;性別:男;所在系:CS;年齡:23)插入到Student表中
INSERT INTO Student(Sno, Sname, Ssex, Sdept, Sage)
VALUES('201009013', '王明', '男', 'CS', '23' );
修改數據(update)
UPDATE table1 SET field1=value1, field2=value2 WHERE 范圍;
//例:將學生201009013的年齡改為22歲
UPDATE Student
SET Sage=22
WHERE Sno='201009013';
刪除數據(delete)
DELETE FROM table1 WHERE 范圍;
//例:刪除學號為201009013的學生記錄
DELETE
FROM Student
WHERE Sno='201009013';
參考:
《王道程序員面試寶典》
《程序員面試寶典》