關係型數據庫與SQL簡介
說明:
本文節選自《Python語言及應用》的第八章《數據的歸宿》,稍有改動;
因在CSDN找不到合適分類,故暫列爲原創。
關係型數據庫
儘管關係型數據庫只有40多年的歷史,卻無處不在,經常會使用到其提供的如下功能:
- 多用戶同時訪問數據庫;
- 用戶使用數據的保護;
- 高效地存儲和檢索數據;
- 數據被模式定義,以及被約束限制;
- Joins通過連接發現不同數據之間的關係;
- 聲明式(非命令式)查詢語言,SQL(Structured Query Language)。
被稱爲 關係型(relational) 的原因是數據庫展現了 表單(table) 形式的不同類型數據之間的關係。
表單是一個具有行和列的二元組,和電子表格類似。要創建一個表單,需要給他命名,明確次序、每一項的名稱以及每一列的類型。每一行都存在相同的列,即使允許缺失項(也稱爲null)。
某一行或某幾行通常作爲表單的主鍵,在表單中主鍵的值是獨一無二的,防止重複添加數據項。這些鍵在查詢時被快速索引,類似於圖示的索引,方面快速地找到指定行。
每一個表單都附屬於某個數據庫,類似於一個文件都存在於某目錄下,兩層的層次結構便於更好地組織和管理。
如果想通過非主鍵的列的值查找數據,可以定義一個二級索引,否則數據庫服務器需要掃描整個表單,暴力搜索每一行找到匹配列的值。
表單之間可以通過外鍵建立關係,列的值受這些鍵的約束。
SQL
SQL既不是一個API也不是一種協議,而是一種聲明式語言,只需要告訴SQL需要做什麼即可。它是關係型數據庫的通用語言。SQL查詢是客戶端發送給數據庫服務器的文本字符串,指明需要執行的具體操作。
儘管SQL語言存在很多標準定義格式,但是所有的數據庫製造商都會增加自己的擴展,導致產生許多SQL方言。如果你把數據存儲在關係型數據庫中,SQL會帶來一定的可移植性,但是方言和操作差異仍然會導致難以將數據移植到另一種類似的數據庫中。
SQL語句有兩種主要的類型:
-
DDL(數據定義語言)
處理用戶用戶、數據庫以及表單的創建、刪除、約束和權限等。
-
DML(數據操作語言)
處理數據插入、選擇、更新和刪除
表1 基本的SQL DDL語句
操作 | SQL模式 | SQL示例 |
---|---|---|
創建數據庫 | CREATE DATABSE dbname | CREATE DATABSE d |
選擇當前數據庫 | use dbname | use d |
刪除數據庫及表單 | DROP DATABASE dbname | DROP DATABASE d |
創建表單 | CREATE TABLE tbname (coldefs) | CREATE TABLE t(id INT,count INT) |
刪除表單 | DROP TABLE tbname | DROP TABLE t |
刪除表單中所有的行 | TRUNCATE TABLE tbname | TRUNCATE TABLE t |
說明:爲什麼語句中命令都是大寫?SQL是不區分大小寫的,但一般爲了區分命令和名稱,在代碼示例中還是用大寫字母。
SQL關係型數據庫的主要DML操作可以縮略爲CRUD。
- Create:使用INSERT語句創建
- Read:使用SELECT語句選擇
- Update:使用UPDATE語句更新
- Delete:使用DELETE語句刪除
表2 基本的SQL DML語句
操作 | SQL模式 | SQL示例 |
---|---|---|
增加行 | INSERT INTO tbname VALUES(…) | INSERT INTO t VALUES(7,40) |
選擇全部行和全部列 | SELECT * FROM tbname | SELECT * FROM t |
選擇全部行和部分列 | SELECT cols FROM tbname | SELECT id,count FROM t |
選擇部分行和部分列 | SELECT cols FROM tbname WHERE condition | SELECT id,count FROM t WHERE count > 5 AND id=9 |
修改一列的部分行 | UPDATE tbname SET col=vaule WHERE condition | UPDATE t SET count=3 WHERE id=5 |
刪除部分行 | DELETE FROM tbname WHERE condition | DELETE FROM t WHERE count <= 10 OR id = 16 |