SQList3 and SQL入門學習筆記
SQL 是用於訪問和處理資料庫的標準的計算機語言。
什麼是 SQL?
· SQL 指結構化查詢語言
· SQL 使我們有能力訪問資料庫
· SQL 是一種 ANSI 的標準計算機語言
編者注:ANSI,美國國家標準化組織
SQL 能做什麼?
· SQL 面向資料庫執行查詢
· SQL 可從資料庫取回資料
· SQL 可在資料庫中插入新的記錄
· SQL 可更新資料庫中的資料
· SQL 可從資料庫刪除記錄
· SQL 可建立新資料庫
· SQL 可在資料庫中建立新表
· SQL 可在資料庫中建立儲存過程
· SQL 可在資料庫中建立檢視
· SQL 可以設定表、儲存過程和檢視的許可權
SQL 是一種標準 - 但是...
SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作資料庫系統。SQL 語句用於取回和更新資料庫中的資料。SQL 可與資料庫程式協同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統。
不幸地是,存在著很多不同版本的 SQL 語言,但是為了與 ANSI 標準相相容,它們必須以相似的方式共同地來支援一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
註釋:除了 SQL 標準之外,大部分 SQL 資料庫程式都擁有它們自己的私有擴充套件!
資料庫表
一個數據庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有資料的記錄(行)。
下面的例子是一個名為 "Persons" 的表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市)。
SQL 語句
預設情況下,不會出現紅框中的表頭,需要之前設定,命令為:
.header on
如果想檢視這些表的結構:
select * fromsqlite_master where type="table";
SQLite
資料庫引擎支援下列三種 DDL
語句:
CREATE
ALTER TABLE
DROP
SQLite
資料庫中的資料一般由以下幾種常用的資料型別組成:
NULL - 空值
INTEGER - 有符號整數
REAL - 浮點數
TEXT - 文字字串
BLOB - 二進位制資料,如圖片、聲音等等
SQLite 也可以接受其他資料型別。
修改表 ALTER TABLE
ALTERTABLE Teachers ADD COLUMN Sex text
SQLite 僅僅支援 ALTERTABLE
語句的一部分功能,我們可以用 ALTER TABLE
語句來更改一個表的名字,也可向表中增加一個欄位(列),但是我們不能刪除一個已經存在的欄位,或者更改一個已經存在的欄位的名稱、資料型別、限定符等等。改變表名 - ALTERTABLE
舊錶名 RENAME TO
新表名增加一列 - ALTERTABLE
表名 ADD COLUMN
列名資料型別限定符
刪除表 DROP TABLE刪除一個表很簡單,只要給出表名即可刪除表 - DROPTABLE 表名
您需要在資料庫上執行的大部分工作都由 SQL 語句完成。
下面的語句從表中選取 LastName 列的資料:
SELECT LastName FROM Persons
結果集類似這樣:
LastName |
Adams |
Bush |
Carter |
在本教程中,我們將為您講解各種不同的 SQL 語句。
重要事項
一定要記住,SQL 對大小寫不敏感!
SQL 語句後面的分號?
某些資料庫系統要求在每條 SQL 命令的末端使用分號。在我們的教程中不使用分號。
分號是在資料庫系統中分隔每條 SQL 語句的標準方法,這樣就可以在對伺服器的相同請求中執行一條以上的語句。
如果您使用的是 MS Access 和 SQL Server 2000,則不必在每條 SQL 語句之後使用分號,不過某些資料庫軟體要求必須使用分號。
SQL DML 和 DDL
可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL)。
SQL (結構化查詢語言)是用於執行查詢的語法。但是 SQL 語言也包含用於更新、插入和刪除記錄的語法。
查詢和更新指令構成了 SQL 的 DML 部分:
· SELECT - 從資料庫表中獲取資料
· UPDATE - 更新資料庫表中的資料
· DELETE - 從資料庫表中刪除資料
· INSERT INTO - 向資料庫表中插入資料
SQL 的資料定義語言 (DDL) 部分使我們有能力建立或刪除表格。我們也可以定義索引(鍵),規定表之間的連結,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
· CREATE DATABASE - 建立新資料庫
· ALTER DATABASE - 修改資料庫
· CREATE TABLE - 建立新表
· ALTER TABLE - 變更(改變)資料庫表
· DROP TABLE - 刪除表
· CREATE INDEX - 建立索引(搜尋鍵)
· DROP INDEX - 刪除索引
本章講解 SELECT 和 SELECT * 語句。
SQLSELECT 語句
SELECT 語句用於從表中選取資料。
結果被儲存在一個結果表中(稱為結果集)。
SQL SELECT 語法
SELECT 列名稱 FROM 表名稱
以及:
SELECT * FROM 表名稱
註釋:SQL 語句對大小寫不敏感。SELECT 等效於 select。
SQLSELECT 例項
如需獲取名為 "LastName" 和 "FirstName" 的列的內容(從名為 "Persons" 的資料庫表),請使用類似這樣的 SELECT 語句:
SELECT LastName,FirstName FROM Persons
"Persons" 表:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
結果:
LastName |
FirstName |
Adams |
John |
Bush |
George |
Carter |
Thomas |
SQLSELECT * 例項
現在我們希望從 "Persons" 表中選取所有的列。
請使用符號 * 取代列的名稱,就像這樣:
SELECT *
FROM Persons
提示:星號(*)是選取所有列的快捷方式。
結果:
Id |
LastName |
FirstName |
Address |
City |
1 |
Adams |
John |
Oxford Street |
London |
2 |
Bush |
George |
Fifth Avenue |
New York |
3 |
Carter |
Thomas |
Changan Street |
Beijing |
本章講解 SELECT DISTINCT 語句。
SQL SELECT DISTINCT 語句
在表中,可能會包含重複值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。
關鍵詞 DISTINCT 用於返回唯一不同的值。
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
使用 DISTINCT 關鍵詞
如果要從 "Company" 列中選取所有的值,我們需要使用 SELECT 語句:
SELECT Company FROM Orders
"Orders"表:
Company |
OrderNumber |
IBM |
3532 |
W3School |
2356 |
Apple |
4698 |
W3School |
6953 |
結果:
Company |
IBM |
W3School |
Apple |
W3School |
請注意,在結果集中,W3School 被列出了兩次。
如需從 Company" 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句:
SELECT DISTINCT Company FROM Orders
結果:
Company |
IBM |
W3School |
Apple |
WHERE 子句用於規定選擇的標準。
WHERE 子句
如需有條件地從表中選取資料,可將 WHERE 子句新增到 SELECT 語句。
語法
SELECT 列名稱 FROM 表名稱 WHERE 列 運算子 值
下面的運算子可在 WHERE 子句中使用:
操作符 |
描述 |
= |
等於 |
<> |
不等於 |
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= |
小於等於 |
BETWEEN |
在某個範圍內 |
LIKE |
搜尋某種模式 |
註釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
使用 WHERE 子句
如果只希望選取居住在城市 "Beijing" 中的人,我們需要向 SELECT 語句新增 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
"Persons" 表
LastName |
FirstName |
Address |
City |
Year |
Adams |
John |
Oxford Street |
London |
1970 |
Bush |
George |
Fifth Avenue |
New York |
1975 |
Carter |
Thomas |
Changan Street |
Beijing |
1980 |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
1985 |
結果:
LastName |
FirstName |
Address |
City |
Year |
Carter |
Thomas |
Changan Street |
Beijing |
1980 |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
1985 |
引號的使用
請注意,我們在例子中的條件值周圍使用的是單引號。
SQL 使用單引號來環繞文字值(大部分資料庫系統也接受雙引號)。如果是數值,請不要使用引號。
文字值:
這是正確的:
SELECT * FROM Persons WHERE FirstName='Bush'
這是錯誤的:
SELECT * FROM Persons WHERE FirstName=Bush
數值:
這是正確的:
SELECT * FROM Persons WHERE Year>1965
這是錯誤的:
SELECT * FROM Persons WHERE Year>'1965'
AND 和 OR 運算子用於基於一個以上的條件對記錄進行過濾。
AND 和 OR 運算子
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算子顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算子顯示一條記錄。
原始的表 (用在例子中的):
LastName |
FirstName |
Address |
City |
Adams |
John |
Oxford Street |
London |
Bush |
George |
Fifth Avenue |
New York |
Carter |
Thomas |
Changan Street |
Beijing |
Carter |
William |
Xuanwumen 10 |
Beijing |
AND 運算子例項
使用 AND 來顯示所有姓為 "Carter" 並且名為 "Thomas" 的人:
SELECT * FROM Persons WHEREFirstName='Thomas' AND LastName='Carter'
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
OR 運算子例項
使用 OR 來顯示所有姓為 "Carter" 或者名為 "Thomas" 的人:
SELECT * FROM Persons WHEREfirstname='Thomas' OR lastname='Carter'
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
Carter |
William |
Xuanwumen 10 |
Beijing |
結合 AND 和 OR 運算子
我們也可以把 AND 和 OR 結合起來(使用圓括號來組成複雜的表示式):
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
Carter |
William |
Xuanwumen 10 |
Beijing |
ORDER BY 語句用於對結果集進行排序。
ORDER BY 語句
ORDER BY 語句用於根據指定的列對結果集進行排序。
ORDER BY 語句預設按照升序對記錄進行排序。
如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。
原始的表 (用在例子中的):
Orders 表:
Company |
OrderNumber |
IBM |
3532 |
W3School |
2356 |
Apple |
4698 |
W3School |
6953 |
例項 1
以字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
結果:
Company |
OrderNumber |
Apple |
4698 |
IBM |
3532 |
W3School |
6953 |
W3School |
2356 |
例項 2
以字母順序顯示公司名稱(Company),並以數字順序顯示順序號(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
結果:
Company |
OrderNumber |
Apple |
4698 |
IBM |
3532 |
W3School |
2356 |
W3School |
6953 |
例項 3
以逆字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
結果:
Company |
OrderNumber |
W3School |
6953 |
W3School |
2356 |
IBM |
3532 |
Apple |
4698 |
例項 4
以逆字母順序顯示公司名稱,並以數字順序顯示順序號:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
結果:
Company |
OrderNumber |
W3School |
2356 |
W3School |
6953 |
IBM |
3532 |
Apple |
4698 |
注意:在以上的結果中有兩個相等的公司名稱 (W3School)。只有這一次,在第一列中有相同的值時,第二列是以升序排列的。如果第一列中有些值為 nulls 時,情況也是這樣的。
INSERT INTO 語句
INSERT INTO 語句用於向表格中插入新的行。
語法
INSERT INTO 表名稱 VALUES (值1, 值2,....)
我們也可以指定所要插入資料的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
插入新的行
"Persons" 表:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
SQL 語句:
INSERT INTO Persons VALUES ('Gates', 'Bill','Xuanwumen 10', 'Beijing')
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
在指定的列中插入資料
"Persons" 表:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
SQL 語句:
INSERT INTO Persons (LastName, Address)VALUES ('Wilson', 'Champs-Elysees')
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Champs-Elysees |
Update 語句
Update 語句用於修改表中的資料。
語法:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
Person:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Champs-Elysees |
更新某一行中的一個列
我們為 lastname 是 "Wilson" 的人新增 firstname:
UPDATE Person SET FirstName = 'Fred' WHERELastName = 'Wilson'
結果:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Fred |
Champs-Elysees |
更新某一行中的若干列
我們會修改地址(address),並新增城市名稱(city):
UPDATE Person SET Address = 'Zhongshan 23',City = 'Nanjing'
WHERE LastName = 'Wilson'
結果:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Fred |
Zhongshan 23 |
Nanjing |
DELETE 語句
DELETE 語句用於刪除表中的行。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
Person:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Fred |
Zhongshan 23 |
Nanjing |
刪除某行
"Fred Wilson" 會被刪除:
DELETE FROM Person WHERE LastName = 'Wilson'
結果:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name