1.SQL語句
Id | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
您需要在數據庫上執行的大部分工作都是由SQL語句完成的。
下面的語句從表中選取LastName列的數據:
SELECT LastName from Persons
結果集類似這樣:
LastName | |||
---|---|---|---|
Adams | |||
Bush | |||
Carter |
注意事項:SQL對大小寫不敏感
2. 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 - 刪除索引
3. SQL SELECT 語句
SELECT 語句用于從表中選取數據。結果被存儲在一個結果表中(稱為結果集)。
3.1 SQL SELECT 語法
SELECT 列名稱 FROM 表名稱
以及
SELECT * FROM 表名稱
星號(*)是選取所有列的快捷方式。
注釋:SQL語句對大小寫不敏感。SELECT等效于select。
3.2 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 |
3.3 SELECT DISTINCT
在表中,可能會包含重復值。這并不成問題,不過,有時您希望僅僅列出不同(distinct)的值。
關鍵字 DISTINCT
用于返回唯一不同的值。
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
4.SQL WHERE 子句
如果有條件地從表中選取數據,可將WHERE子句添加到SELECT語句。
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
下面的運算符可在WHERE子句中使用:
操作符 | 描述 |
---|---|
= | 等于 |
<> 或者 != | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN .. AND .. | 在某個范圍內 |
LIKE | 搜索某種模式 |
4.1 使用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使用單引號來環繞文本值。如果是數值,請不要使用引號.
5. AND 和 OR 運算符
AND 和 OR 可在 WHERE 子句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則OR 運算符顯示一條記錄。
5.1 AND 運算符實例
假設原始的表:
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 來顯示所有姓為"Carter"并且名為"Thomas"的人:
SELECT * FROM Persons WHERE FirstName='Thomas'
AND
LastName='Carter'
結果:
LastName | FirstName | Address | City |
---|---|---|---|
Carter | Thomas | Changan Street | Beijing |
5.2 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 |
6. ORDER BY 語句
ORDER BY 語句用于根據指定的列對結果集進行排序。
ORDER BY 語句默認按照升序對記錄進行排序。
如果您希望按照降序對記錄進行排序,可以使用DESC 關鍵字。
原始Orders表:
Company | OrderNumber |
---|---|
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
6.1 以字母順序顯示公司名稱:
SELECT Company,OrderNumber FROM Orders
ORDER BY Company
結果:
Company | OrderNumber |
---|---|
Apple | 4698 |
IBM | 3532 |
W3School | 6953 |
W3School | 2356 |
6.2 以字母順序顯示公司名稱(Company),并以數字順序顯示順序號(OrderNumber):
SELECT Company,OrderNumber FROM Orders
ORDER BY Company,OrderNumber
Company | OrderNumber |
---|---|
Apple | 4698 |
IBM | 3532 |
W3School | 2356 |
W3School | 6953 |
6.3 以逆字母順序顯示公司名稱:
SELECT Company,OrderNumber FROM Orders
ORDER BY Company DESC
Company | OrderNumber |
---|---|
W3School | 6953 |
W3School | 2356 |
IBM | 3532 |
Apple | 4698 |
7. 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 |
8. SQL UPDATE 語句
Update 語句用于修改表中的數據。
語法:
UPDATE 表名稱 SET 列名稱= 新值 WHERE 列名稱= 某值
9. DELETE 語句
DELETE語句用于刪除表中的行。
DELETE FROM 表名稱 WHERE 列名稱=值
刪除所有行:
可以在不刪除表的情況下刪除所有行。這意味著表的結構,屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name
10. SQL 通配符
在搜索數據庫中的數據時,SQL通配符可以替代一個或多個字符。
SQL通配符必須與LIKE
運算符一起使用。
在SQL中,可以使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代一個或多個字符 |
_ | 僅替代一個字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何單一字符 |
11. SQL BETWEEN 操作符
BETWEEN 操作符在 WHERE 子句中使用,作用是選取介于兩個值之間的數據范圍。
SELECT colume_name FROM table_name WHERE colume_name
BETWEEN
values1AND
value2
11.1 BETWEEN 操作符實例
如需以字母順序顯示介于"Adams"(包括) 和"Carter"(不包括)之間的人,請使用下面的SQL:
SELECT * FROM Persons WHERE LastName
BETWEEN
'Adams'AND
'Carter'
注意事項:
不同的數據庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些數據庫會列出介于 "Adams" 和 "Carter" 之間的人,但不包括 "Adams" 和 "Carter" ;某些數據庫會列出介于 "Adams" 和 "Carter" 之間并包括 "Adams" 和 "Carter" 的人;而另一些數據庫會列出介于 "Adams" 和 "Carter" 之間的人,包括 "Adams" ,但不包括 "Carter" 。
11.2 如需使用上面的列子顯示范圍之外的人,請使用NOT 操作符:
SELECT * FROM Persons WHERE LastName
NOT
BETWEEN
'Adams'AND
'Carter'
12. SQL INNER JOIN 關鍵字
在表中存在至少一個匹配時,INNER JOIN 關鍵字 返回行。
INNER JOIN 關鍵字語法
SELECT column_name(s)
FROM table_name1
INNER JOIN
table_name2
ON
table_name1.column_name=table_name2.column_name
注釋:INNER JOIN 與JOIN 是相同的。
原始表:"Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
內連接(INNER JOIN) 實例
現在,我們希望列出所有人的訂購。您可以使用下面的SELECT語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN
Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
13. SQL LEFT JOIN 關鍵字
LEFT JOIN 關鍵字會從左表(table_name1)那里返回所有的行,即使在右表(table_name2)中沒有匹配的行。
LEFT JOIN 關鍵字語法
SELECT column_name FROM table_name1
LEFT JOIN
table_name2ON
table_name1.column_name=table_name2.column_name
”Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
左連接(LEFT JOIN) 實例
我們列出所有人,以及它們的訂購,如果有的話。
可以使用下面的SELECT 語句:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.id_P=Orders.ID_P ORDER BY Persons.LastName
結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
Bush | George |
LEFT JOIN 關鍵字會從左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中沒有匹配的行。
14.SQL RIGHT JOIN 關鍵字
RIGHT JOIN 關鍵字會右表(table_name2)那里返回所有的行,即使左邊(table_name1)中沒有匹配的行。
RIGHT JOIN 關鍵字語法
SELECT column_name FROM table_name1
RIGHT JOIN
table_name2ON
table_name1.column_name=table_name2.column_name
原始的表:
"Persons"表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
"Orders"表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
右連接(RIGHT JOIN) 實例
我們希望列出所有的訂單,以及訂購它們的人-如果有的話。
可以使用下面的SELECT 語句:
SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo
FROM PersonsRIGHT JOIN
OrdersON
Persons.Id_P=Orders.ID_P ORDER BY Persons.LastName
結果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
34764 |
RIGHT JOIN 關鍵字會從右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中沒有匹配的行。