數據庫基礎


基本理論知識

數據模型

數據庫是長期存儲在計算機內有組織的大量的共享的數據集合,數據庫系統的核心和基礎是數據模型

第一類數據模型:概念模型,信息模型,按照用戶的觀點來對數據和信息建模,主要用於數據庫設計

第二類數據模型:邏輯模型和物理模型。

---邏輯模型包括:層次模型、網狀模型、關系模型、面向對象模型、對象關系模型等

---物理模型:對數據最底層的抽象,描述數據在系統內部的表示方法和存取方法,在磁盤或磁帶上的存儲方式和存取方法,是面向計算機系統的。

數據模型一般由數據結構、數據操作和完整性約束三部分組成。

數據結構

存儲在數據庫中對象類型的集合,作用是描述數據庫組成對象以及對象之間的聯系。

數據操作

對數據庫中各種對象實例允許執行的操作的集合,包括操作及相關的操作規則。

數據完整性約束條件

在給定的數據模型中,數據及其聯系所遵守的一組通用的完整性規則,它能保證數據的正確性和一致性。

關系模型

關系模型是目前最重要的一種數據模型,關系數據庫系統用關系模型作為數據的組織方式,關系模型中數據的邏輯結構是一張二維表

(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';

參考:

《王道程序員面試寶典》

《程序員面試寶典》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM