SQL 是用于訪問和處理數(shù)據(jù)庫的標(biāo)準(zhǔn)的計算機語言。
什么是 SQL?
SQL 指結(jié)構(gòu)化查詢語言
SQL 使我們有能力訪問數(shù)據(jù)庫
SQL 是一種 ANSI 的標(biāo)準(zhǔn)計算機語言
編者注:ANSI,美國國家標(biāo)準(zhǔn)化組織
SQL 能做什么?
SQL 面向數(shù)據(jù)庫執(zhí)行查詢
SQL 可從數(shù)據(jù)庫取回數(shù)據(jù)
SQL 可在數(shù)據(jù)庫中插入新的記錄
SQL 可更新數(shù)據(jù)庫中的數(shù)據(jù)
SQL 可從數(shù)據(jù)庫刪除記錄
SQL 可創(chuàng)建新數(shù)據(jù)庫
SQL 可在數(shù)據(jù)庫中創(chuàng)建新表
SQL 可在數(shù)據(jù)庫中創(chuàng)建存儲過程
SQL 可在數(shù)據(jù)庫中創(chuàng)建視圖
SQL 可以設(shè)置表、存儲過程和視圖的權(quán)限
重要事項
一定要記住,SQL 對大小寫不敏感!
SQL DML 和 DDL
可以把 SQL 分為兩個部分:數(shù)據(jù)操作語言 (DML) 和 數(shù)據(jù)定義語言 (DDL)。
SQL (結(jié)構(gòu)化查詢語言)是用于執(zhí)行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。
查詢和更新指令構(gòu)成了 SQL 的 DML 部分:
- SELECT - 從數(shù)據(jù)庫表中獲取數(shù)據(jù)
- UPDATE - 更新數(shù)據(jù)庫表中的數(shù)據(jù)
- DELETE - 從數(shù)據(jù)庫表中刪除數(shù)據(jù)
- INSERT INTO - 向數(shù)據(jù)庫表中插入數(shù)據(jù)
SQL 的數(shù)據(jù)定義語言 (DDL) 部分使我們有能力創(chuàng)建或刪除表格。我們也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
- CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫
- ALTER DATABASE - 修改數(shù)據(jù)庫
- CREATE TABLE - 創(chuàng)建新表
- ALTER TABLE - 變更(改變)數(shù)據(jù)庫表
- DROP TABLE - 刪除表
- CREATE INDEX - 創(chuàng)建索引(搜索鍵)
- DROP INDEX - 刪除索引
SELECT 語句用于從表中選取數(shù)據(jù)。
語法:
SELECT 列名稱 FROM 表名稱以及:
SELECT * FROM 表名稱
提示:星號(*)是選取所有列的快捷方式。
SQL SELECT DISTINCT 語句
在表中,可能會包含重復(fù)值。這并不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。
關(guān)鍵詞 DISTINCT 用于返回唯一不同的值。
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
WHERE 子句
| 操作符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某個范圍內(nèi) |
| LIKE | 搜索某種模式 |
注釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
如需有條件地從表中選取數(shù)據(jù),可將 WHERE 子句添加到 SELECT 語句。
語法
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
引號的使用
請注意,我們在例子中的條件值周圍使用的是單引號。
SQL 使用單引號來環(huán)繞文本值(大部分?jǐn)?shù)據(jù)庫系統(tǒng)也接受雙引號)。如果是數(shù)值,請不要使用引號。
文本值:
- 這是正確的:
SELECT * FROM Persons WHERE FirstName='Bush' - 這是錯誤的:
SELECT * FROM Persons WHERE FirstName=Bush
數(shù)值:
- 這是正確的:
SELECT * FROM Persons WHERE Year>1965 - 這是錯誤的:
SELECT * FROM Persons WHERE Year>'1965'
AND 和 OR 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結(jié)合起來。
原始的表 (用在例子中的):
| 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'
使用 OR 來顯示所有姓為 "Carter" 或者名為 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
我們也可以把 AND 和 OR 結(jié)合起來(使用圓括號來組成復(fù)雜的表達(dá)式):
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'
ORDER BY 語句
ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進(jìn)行排序。
ORDER BY 語句默認(rèn)按照升序對記錄進(jìn)行排序。
如果您希望按照降序對記錄進(jìn)行排序,可以使用 DESC 關(guān)鍵字。
原始的表 (用在例子中的):
Orders 表:
| Company | OrderNumber |
|---|---|
| IBM | 3532 |
| W3School | 2356 |
| Apple | 4698 |
| W3School | 6953 |
以字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以字母順序顯示公司名稱(Company),并以數(shù)字順序顯示順序號(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
以逆字母順序顯示公司名稱:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母順序顯示公司名稱,并以數(shù)字順序顯示順序號:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO 語句
INSERT INTO 語句用于向表格中插入新的行。
語法
INSERT INTO 表名稱 VALUES (值1, 值2,....)
我們也可以指定所要插入數(shù)據(jù)的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
Update 語句用于修改表中的數(shù)據(jù)。
語法:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
更新某一行中的一個列
我們?yōu)?lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
更新某一行中的若干列
我們會修改地址(address),并添加城市名稱(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
DELETE 語句
DELETE 語句用于刪除表中的行。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結(jié)構(gòu)、屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name
IN 操作符
IN 操作符允許我們在 WHERE 子句中規(guī)定多個值。
SQL IN 語法
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
現(xiàn)在,我們希望從上表中選取姓氏為 Adams 和 Carter 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
BETWEEN 操作符
操作符 BETWEEN ... AND 會選取介于兩個值之間的數(shù)據(jù)范圍。這些值可以是數(shù)值、文本或者日期。
SQL BETWEEN 語法
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
如需以字母順序顯示介于 "Adams"(包括)和 "Carter"(不包括)之間的人,請使用下面的 SQL:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
如需使用上面的例子顯示范圍之外的人,請使用 NOT 操作符:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
通過使用 SQL,可以為列名稱和表名稱指定別名(Alias)。
SQL Alias
表的 SQL Alias 語法
SELECT column_name(s) FROM table_name AS alias_name
列的 SQL Alias 語法
SELECT column_name AS alias_name FROM table_name
Alias 實例: 使用表名稱別名
假設(shè)我們有兩個表分別是:"Persons" 和 "Product_Orders"。我們分別為它們指定別名 "p" 和 "po"。
現(xiàn)在,我們希望列出 "John Adams" 的所有定單。
我們可以使用下面的 SELECT 語句:
SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'
不使用別名的 SELECT 語句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName FROM Persons, Product_Orders WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
從上面兩條 SELECT 語句您可以看到,別名使查詢程序更易閱讀和書寫。
Alias 實例: 使用一個列名別名
表 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 |
SQL:
SELECT LastName AS Family, FirstName AS Name FROM Persons
結(jié)果:
| Family | Name |
|---|---|
| Adams | John |
| Bush | George |
| Carter | Thomas |