SQL基礎學習(必備) (整理)
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 * 語句。
· SQL SELECT 語句
· SELECT 語句用於從表中選取資料。
· 結果被儲存在一個結果表中(稱為結果集)。
· SQL SELECT 語法
· SELECT 列名稱 FROM 表名稱
· 以及:
· SELECT * FROM 表名稱
· 註釋:SQL 語句對大小寫不敏感。SELECT 等效於 select。
SQL SELECT 例項
如需獲取名為 "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 |
SQL SELECT * 例項
現在我們希望從 "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 |
在結果集(result-set)中導航
由 SQL 查詢程式獲得的結果被存放在一個結果集中。大多數資料庫軟體系統都允許使用程式設計函式在結果集中進行導航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record等等。
類似這些程式設計函式不在本教程講解之列。如需學習通過函式呼叫訪問資料的知識,請訪問我們的 ADO 教程 和PHP 教程。
本章講解 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" 列中僅選取唯一不同的值,我們需要使用 SELECTDISTINCT 語句:
SELECT DISTINCT
Company FROM Orders
結果:
Company |
IBM |
W3School |
Apple |
現在,在結果集中,"W3School" 僅被列出了一次。
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 WHERE FirstName='Thomas' AND
LastName='Carter'
結果:
LastName |
FirstName |
Address |
City |
Carter |
Thomas |
Changan Street |
Beijing |
OR 運算子例項
使用 OR 來顯示所有姓為 "Carter" 或者名為 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='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 時,情況也是這樣的。
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 語句
INSERTINTO 語句用於向表格中插入新的行。
語法
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 |
DELETE 語句
DELETE 語句用於刪除表中的行。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
Person:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
Wilson |
Fred |
Zhongshan 23 |
Nanjing |
刪除某行
"FredWilson" 會被刪除:
DELETE FROM Person WHERE LastName = 'Wilson'
結果:
LastName |
FirstName |
Address |
City |
Gates |
Bill |
Xuanwumen 10 |
Beijing |
刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結構、屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name