以下内容來自 3c school
1:Sql 分為兩個部分: 6
2:查詢 7
3:插入: 9
4:資料庫更新 UPDATE 9
5:删除 DELETE 10
6:Sql TOP 子句: 10
7: SQL LIKE 操作符 11
8:SQL 通配符 13
² 使用 % 通配符 13
² 使用 _ 通配符 14
例子 1 14
例子 2 14
² 使用 [charlist] 通配符 15
例子 1 15
例子 2 15
9:IN 操作符 15
10: BETWEEN 操作符 16
11:Alias (别名) 17
l Alias 執行個體: 使用表名稱别名 17
l Alias 執行個體: 使用一個列名别名 18
12: JOIN 18
Join 和 Key 18
l 引用兩個表 19
² 不同的 SQL JOIN 20
13:SQL INNER JOIN 關鍵字 20
INNER JOIN 關鍵字文法 20
内連接配接(INNER JOIN)執行個體 21
14:SQL LEFT JOIN 關鍵字 21
LEFT JOIN 關鍵字文法 21
l 左連接配接(LEFT JOIN)執行個體 22
15:SQL RIGHT JOIN 關鍵字 22
RIGHT JOIN 關鍵字文法 22
l 右連接配接(RIGHT JOIN)執行個體 22
16:SQL FULL JOIN 關鍵字 23
FULL JOIN 關鍵字文法 23
17:SQL UNION 和 UNION ALL 操作符 24
SQL UNION 文法 24
SQL UNION ALL 文法 24
l 執行個體 25
l 使用 UNION ALL 指令 25
執行個體: 25
18:SQL SELECT INTO 語句 26
SQL SELECT INTO 文法 26
l SQL SELECT INTO 執行個體 - 制作備份複件 26
l SQL SELECT INTO 執行個體 - 帶有 WHERE 子句 27
l SQL SELECT INTO 執行個體 - 被連接配接的表 27
19:SQL CREATE DATABASE 語句 27
SQL CREATE DATABASE 文法 27
20:SQL CREATE DATABASE 執行個體 27
21:CREATE TABLE 語句 28
SQL CREATE TABLE 文法 28
SQL CREATE TABLE 執行個體 29
22:SQL 限制 29
SQL NOT NULL 限制 29
l SQL UNIQUE 限制 30
l SQL UNIQUE Constraint on CREATE TABLE 30
MySQL: 30
SQL Server / Oracle / MS Access: 30
MySQL / SQL Server / Oracle / MS Access: 31
SQL UNIQUE Constraint on ALTER TABLE 31
MySQL / SQL Server / Oracle / MS Access: 31
MySQL / SQL Server / Oracle / MS Access: 31
撤銷 UNIQUE 限制 31
MySQL: 32
SQL Server / Oracle / MS Access: 32
l SQL PRIMARY KEY 限制 32
SQL PRIMARY KEY Constraint on CREATE TABLE 32
MySQL: 32
SQL Server / Oracle / MS Access: 32
MySQL / SQL Server / Oracle / MS Access: 33
SQL PRIMARY KEY Constraint on ALTER TABLE 33
MySQL / SQL Server / Oracle / MS Access: 33
MySQL / SQL Server / Oracle / MS Access: 33
撤銷 PRIMARY KEY 限制 33
MySQL: 34
SQL Server / Oracle / MS Access: 34
l SQL FOREIGN KEY 限制 34
SQL FOREIGN KEY Constraint on CREATE TABLE 34
MySQL: 35
SQL Server / Oracle / MS Access: 35
MySQL / SQL Server / Oracle / MS Access: 35
SQL FOREIGN KEY Constraint on ALTER TABLE 35
MySQL / SQL Server / Oracle / MS Access: 35
MySQL / SQL Server / Oracle / MS Access: 36
撤銷 FOREIGN KEY 限制 36
MySQL: 36
SQL Server / Oracle / MS Access: 36
l SQL CHECK 限制 36
SQL CHECK Constraint on CREATE TABLE 36
My SQL: 36
SQL Server / Oracle / MS Access: 37
MySQL / SQL Server / Oracle / MS Access: 37
SQL CHECK Constraint on ALTER TABLE 37
MySQL / SQL Server / Oracle / MS Access: 37
MySQL / SQL Server / Oracle / MS Access: 38
撤銷 CHECK 限制 38
SQL Server / Oracle / MS Access: 38
MySQL: 38
l SQL DEFAULT 限制 38
SQL DEFAULT Constraint on CREATE TABLE 38
My SQL / SQL Server / Oracle / MS Access: 38
SQL DEFAULT Constraint on ALTER TABLE 39
MySQL: 39
SQL Server / Oracle / MS Access: 39
撤銷 DEFAULT 限制 39
MySQL: 39
SQL Server / Oracle / MS Access: 39
23:SQL CREATE INDEX 語句 40
索引 40
SQL CREATE INDEX 文法 40
SQL CREATE UNIQUE INDEX 文法 40
CREATE INDEX 執行個體 40
24:SQL 撤銷索引、表以及資料庫 41
SQL DROP INDEX 語句 41
用于 Microsoft SQLJet (以及 Microsoft Access) 的文法: 41
用于 MS SQL Server 的文法: 41
用于 IBM DB2 和 Oracle 文法: 41
用于 MySQL 的文法: 41
SQL DROP TABLE 語句 41
SQL DROP DATABASE 語句 42
SQL TRUNCATE TABLE 語句 42
25:SQL ALTER TABLE 語句 42
ALTER TABLE 語句 42
SQL ALTER TABLE 文法 42
Eg: 43
我們希望在表 "Persons" 中添加一個名為 "Birthday" 的新列。 43
26:SQL AUTO INCREMENT 字段 43
AUTO INCREMENT 字段 43
l 用于 MySQL 的文法 43
l 用于 SQL Server 的文法 44
l 用于 Access 的文法 44
l 用于 Oracle 的文法 45
27:SQL VIEW(視圖) 46
SQL CREATE VIEW 語句 46
什麼是視圖? 46
SQL CREATE VIEW 文法 46
SQL CREATE VIEW 執行個體 46
SQL 更新視圖 47
SQL 撤銷視圖 48
28:SQL Date 函數 48
MySQL Date 函數 48
SQL Server Date 函數 49
SQL Date 資料類型 49
SQL 日期處理 49
29:SQL NULL 值 50
SQL NULL 值 50
SQL 的 NULL 值處理 51
SQL IS NULL 51
SQL IS NOT NULL 52
30:SQL NULL 函數 52
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函數 52
SQL Server / MS Access 53
Oracle 53
MySQL 53
31:SQL 資料類型 53
Microsoft Access 資料類型 53
MySQL 資料類型 54
Text 類型: 54
Number 類型: 55
Date 類型: 56
SQL Server 資料類型 56
Character 字元串: 56
Unicode 字元串: 57
Binary 類型: 57
Number 類型: 57
Date 類型: 58
其他資料類型: 58
Sql 函數 59
31:函數的文法 59
函數的類型 59
合計函數(Aggregate functions) 59
"Persons" table (在大部分的例子中使用過) 59
MS Access 中的合計函數 59
在 SQL Server 中的合計函數 60
Scalar 函數 60
MS Access 中的 Scalar 函數 61
32:SQL AVG 函數 61
定義和用法 61
SQL AVG() 文法 61
SQL AVG() 執行個體 61
例子 1 62
例子 2 62
33:SQL COUNT() 函數 62
SQL COUNT() 文法 63
SQL COUNT(column_name) 文法 63
SQL COUNT(*) 文法 63
SQL COUNT(DISTINCT column_name) 文法 63
SQL COUNT(column_name) 執行個體 63
SQL COUNT(DISTINCT column_name) 執行個體 64
34:SQL FIRST() 函數 64
FIRST() 函數 64
SQL FIRST() 文法 65
SQL FIRST() 執行個體 65
35:SQL LAST() 函數 65
LAST() 函數 65
SQL LAST() 文法 66
SQL LAST() 執行個體 66
36:SQL MAX() 函數 66
MAX() 函數 66
SQL MAX() 文法 67
SQL MAX() 執行個體 67
37:SQL MIN() 函數 67
MIN() 函數 67
SQL MIN() 文法 67
SQL MIN() 執行個體 68
38:SQL SUM() 函數 68
SUM() 函數 68
SQL SUM() 文法 68
SQL SUM() 執行個體 69
39:SQL GROUP BY 語句 69
GROUP BY 語句 69
SQL GROUP BY 文法 69
SQL GROUP BY 執行個體 70
GROUP BY 一個以上的列 71
40:SQL HAVING 子句 71
HAVING 子句 71
SQL HAVING 文法 71
SQL HAVING 執行個體 71
41:SQL UCASE() 函數 72
UCASE() 函數 72
SQL UCASE() 文法 73
SQL UCASE() 執行個體 73
42:SQL LCASE() 函數 73
LCASE() 函數 73
SQL LCASE() 文法 73
SQL LCASE() 執行個體 74
43:SQL MID() 函數 74
MID() 函數 74
SQL MID() 文法 74
SQL MID() 執行個體 75
44:SQL LEN() 函數 75
LEN() 函數 75
SQL LEN() 文法 75
SQL LEN() 執行個體 75
45:SQL ROUND() 函數 76
ROUND() 函數 76
SQL ROUND() 文法 76
SQL ROUND() 執行個體 76
45:SQL NOW() 函數 77
NOW() 函數 77
SQL NOW() 文法 77
SQL NOW() 執行個體 77
46:SQL FORMAT() 函數 78
FORMAT() 函數 78
SQL FORMAT() 文法 78
SQL FORMAT() 執行個體 78
47:SQL 快速參考 79
SQL 語句 79
1:Sql 分為兩個部分:
l 資料操作語言 DML:
SELECT 查詢
UPDATE 更新
DELETE 删除
INSERT INTO 插入
l 資料定義語言 DDL
CREATE DATABASE 建立資料庫
ALTER DATABASE 修改資料庫結構
CREATE TABLE 建立表
DROP TABLE 删除表
CREATE INDEX 建立索引
DROP INDEX 删除索引
2:查詢
v 查詢指定的列資訊:
SELECT 列名,列名... FROM 表名
v 查詢表中所有資訊:
SELECT * FROM 表名
v 如果不希望查詢出的某列中包含重複的值則使用 DISTINCT 關鍵字
SELECTL DISTINCT列名 FROM 表名
v 指定條件查詢 使用關鍵字 WHERE
SELECT 列名 FROM 表名 WHERE 列 運算符 值
Eg:
SELECT * FROM Persons WHERE City='Beijing'
SELECT * FROM Persons WHERE Year>1965
(注意 文本值 使用單引号, 數值不用)
v AND 和 OR 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結合起來。
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中隻要有一個成立,則 OR 運算符顯示一條記錄。
Eg:
使用AND:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
使用OR:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
組合使用 AND OR:
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'
v 使用ORDER BY 對結果集進行排序
ORDER BY 預設對結果集進行升序排序,如果要是采用降序:使用DESC 關鍵字
① SELECT Company, OrderNumber FROM Orders ORDER BY Company
以字母順序顯示公司名稱:
② SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
以字母順序顯示公司名稱(Company),并以數字順序顯示順序号(OrderNumber):
③ SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母順序顯示公司名稱:
④ SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
以逆字母順序顯示公司名稱,并以數字順序顯示順序号:
備注:
升序 : ascending order
降序: descending order
3:插入:
l INSERT INTO 語句用于向表格中插入新的行。
文法: INSERT INTO 表名 VALUES (值1,值2.。。。)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
l 我們也可以指定所要插入資料的列:
INSERT INTO table_name (列1,列2,...) VALUES (值1,值2,...)
INSERT INTO Persons (LastName, Address) VALUES ('Wilson','Champs-Elysees')
4:資料庫更新 UPDATE
Update 語句用于修改表中的資料。
UPDATE 表名 SET 列名=新值 WHERE 列名 = 某值
l 我們為 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
l 我們會修改位址(address),并添加城市名稱(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'WHERE LastName = 'Wilson'
5:删除 DELETE
DELETE 語句用于删除表中的行
l DELETE FROM 表名 WHERE 列名= 值
DELETE FROM Person WHERE LastName = 'Wilson'
l 删除所有行,表的結構、屬性和索引 都是完整的
① DELETE FROM table_name
② DELETE * FROM table_name
6:Sql TOP 子句:
TOP 子句用于規定要傳回的記錄的數目
SELETE TOP number| percent colum_name(s) FROM table
Eg:
1) SELECT TOP 2 * FROM Persons
我們希望從上面的 "Persons" 表中選取 50% 的記錄。
2) SELECT TOP 50 PERCENT * FROM Persons
7: SQL LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜尋列中指定模式
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
l Eg1:
l Eg:2
l Eg:3
l Eg:4
8:SQL 通配符
Ø 在搜尋資料庫中的資料時,SQL 通配符可以替代一個或多個字元。
Ø SQL 通配符必須與 LIKE 運算符一起使用。
Eg:
² 使用 % 通配符
例如1:
現在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE 'Ne%'
例如2:
接下來,我們希望從 "Persons" 表中選取居住在包含 "lond" 的城市裡的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '%lond%'
² 使用 _ 通配符
例子 1
現在,我們希望從上面的 "Persons" 表中選取名字的第一個字元之後是 "eorge" 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
例子 2
接下來,我們希望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字元,然後是 "r",然後是任意字元,然後是 "er":
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'
² 使用 [charlist] 通配符
例子 1
現在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
例子 2
現在,我們希望從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'
9:IN 操作符
IN 操作符允許我們再WHERE 子句中規定多值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
現在,我們希望從上表中選取姓氏為 Adams 和 Carter 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
10: BETWEEN 操作符
操作符 BETWEEN ... AND 會選取介于兩個值之間的資料範圍。這些值可以是數值、文本或者日期。
l 如需以字母順序顯示介于 "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" 。
是以,請檢查你的資料庫是如何處理 BETWEEN....AND 操作符的!
l 如需使用上面的例子顯示範圍之外的人,請使用 NOT 操作符:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
11:Alias (别名)
通過使用 SQL,可以為列名稱和表名稱指定别名(Alias)。
表的文法:
SELECT column_name(s) FROM table_name AS alias_name
列的文法:
SELECT column_name AS alias_name FROM table_name
l Alias 執行個體: 使用表名稱别名
假設我們有兩個表分别是:"Persons" 和 "Product_Orders"。我們分别為它們指定别名 "p" 和 "po"。
現在,我們希望列出 "John Adams" 的所有定單。
我們可以使用下面的 SELECT 語句:
SELECT po.OrderID, p.LastName, p.FirstNameFROM Persons AS p, Product_Orders AS poWHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 語句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstNameFROM Persons, Product_OrdersWHERE Persons.LastName='Adams' AND Persons.FirstName='John'
從上面兩條 SELECT 語句您可以看到,别名使查詢程式更易閱讀和書寫。
l Alias 執行個體: 使用一個列名别名
SELECT LastName AS Family, FirstName AS Name FROM Persons
12: JOIN
SQL join 用于根據兩個或多個表中的列之間的關系,從這些表中查詢資料
Join 和 Key
有時為了得到完整的結果,我們需要從兩個或更多的表中擷取結果。我們就需要執行 join。
資料庫中的表可通過鍵将彼此聯系起來。主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的。在表中,每個主鍵的值都是唯一的。這樣做的目的是在不重複每個表中的所有資料的情況下,把表間的資料交叉捆綁在一起。
請注意,"Id_P" 列是 Persons 表中的的主鍵。這意味着沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P 也可以區分他們。
接下來請看 "Orders" 表:
請注意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而無需使用他們的确切姓名。
請留意,"Id_P" 列把上面的兩個表聯系了起來。
l 引用兩個表
我們可以通過引用兩個表的方式,從兩個表中擷取資料:
誰訂購了産品,并且他們訂購了什麼産品?
① SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons, OrdersWHERE Persons.Id_P = Orders.Id_P
除了上面的方法,我們也可以使用關鍵詞 JOIN 來從兩個表中擷取資料。
如果我們希望列出所有人的定購,可以使用下面的 SELECT 語句:
② SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM Persons
INNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName
² 不同的 SQL JOIN
除了我們在上面的例子中使用的 INNER JOIN(内連接配接),我們還可以使用其他幾種連接配接。
下面列出了您可以使用的 JOIN 類型,以及它們之間的差異。
· JOIN: 如果表中有至少一個比對,則傳回行
· LEFT JOIN: 即使右表中沒有比對,也從左表傳回所有的行
· RIGHT JOIN: 即使左表中沒有比對,也從右表傳回所有的行
· FULL JOIN: 隻要其中一個表中存在比對,就傳回行
13:SQL INNER JOIN 關鍵字
在表中存在至少一個比對時,INNER JOIN 關鍵字傳回行。
INNER JOIN 關鍵字文法
SELECT column_name(s)FROM table_name1INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:INNER JOIN 與 JOIN 是相同的。
内連接配接(INNER JOIN)執行個體
現在,我們希望列出所有人的定購。
l 您可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
14:SQL LEFT JOIN 關鍵字
LEFT JOIN 關鍵字會從左表 (table_name1) 那裡傳回所有的行,即使在右表 (table_name2) 中沒有比對的行。
LEFT JOIN 關鍵字文法
SELECT column_name(s)FROM table_name1LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:在某些資料庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。
l 左連接配接(LEFT JOIN)執行個體
現在,我們希望列出所有的人,以及他們的定購 - 如果有的話。
您可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsLEFT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
15:SQL RIGHT JOIN 關鍵字
RIGHT JOIN 關鍵字會右表 (table_name2) 那裡傳回所有的行,即使在左表 (table_name1) 中沒有比對的行。
RIGHT JOIN 關鍵字文法
SELECT column_name(s)FROM table_name1RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:在某些資料庫中, RIGHT JOIN 稱為 RIGHT OUTER JOIN。
l 右連接配接(RIGHT JOIN)執行個體
現在,我們希望列出所有的定單,以及定購它們的人 - 如果有的話。
您可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
16:SQL FULL JOIN 關鍵字
隻要其中某個表存在比對,FULL JOIN 關鍵字就會傳回行。
FULL JOIN 關鍵字文法
SELECT column_name(s)FROM table_name1FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
注釋:在某些資料庫中, FULL JOIN 稱為 FULL OUTER JOIN。
現在,我們希望列出所有的人,以及他們的定單,以及所有的定單,以及定購它們的人。
您可以使用下面的 SELECT 語句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
17:SQL UNION 和 UNION ALL 操作符
UNION 操作符用于合并兩個或多個 SELECT 語句的結果集。
請注意,UNION 内部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料類型。同時,每條 SELECT 語句中的列的順序必須相同。
SQL UNION 文法
SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
注釋:預設地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。
SQL UNION ALL 文法
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 語句中的列名。
l 執行個體
列出所有在中國和美國的不同的雇員名:
SELECT E_Name FROM Employees_ChinaUNIONSELECT E_Name FROM Employees_USA
注釋:這個指令無法列出在中國和美國的所有雇員。在上面的例子中,我們有兩個名字相同的雇員,他們當中隻有一個人被列出來了。UNION 指令隻會選取不同的值。
l 使用 UNION ALL 指令
執行個體:
列出在中國和美國的所有的雇員:
SELECT E_Name FROM Employees_ChinaUNION ALLSELECT E_Name FROM Employees_USA
18:SQL SELECT INTO 語句
SELECT INTO 語句從一個表中選取資料,然後把資料插入另一個表中。
SELECT INTO 語句常用于建立表的備份複件或者用于對記錄進行存檔。
SQL SELECT INTO 文法
您可以把所有的列插入新表:
SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename
或者隻把希望的列插入新表:
SELECT column_name(s)INTO new_table_name [IN externaldatabase] FROM old_tablename
l SQL SELECT INTO 執行個體 - 制作備份複件
下面的例子會制作 "Persons" 表的備份複件:
SELECT *INTO Persons_backupFROM Persons
IN 子句可用于向另一個資料庫中拷貝表:
SELECT *INTO Persons IN 'Backup.mdb'FROM Persons
如果我們希望拷貝某些域,可以在 SELECT 語句後列出這些域:
SELECT LastName,FirstNameINTO Persons_backupFROM Persons
l SQL SELECT INTO 執行個體 - 帶有 WHERE 子句
我們也可以添加 WHERE 子句。
下面的例子通過從 "Persons" 表中提取居住在 "Beijing" 的人的資訊,建立了一個帶有兩個列的名為 "Persons_backup" 的表:
SELECT LastName,FirstnameINTO Persons_backupFROM PersonsWHERE City='Beijing'
l SQL SELECT INTO 執行個體 - 被連接配接的表
從一個以上的表中選取資料也是可以做到的。
下面的例子會建立一個名為 "Persons_Order_Backup" 的新表,其中包含了從 Persons 和 Orders 兩個表中取得的資訊:
SELECT Persons.LastName,Orders.OrderNoINTO Persons_Order_BackupFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_P
19:SQL CREATE DATABASE 語句
CREATE DATABASE 用于建立資料庫。
SQL CREATE DATABASE 文法
CREATE DATABASE database_name
20:SQL CREATE DATABASE 執行個體
現在我們希望建立一個名為 "my_db" 的資料庫。
我們使用下面的 CREATE DATABASE 語句:
CREATE DATABASE my_db
可以通過 CREATE TABLE 來添加資料庫表。
21:CREATE TABLE 語句
CREATE TABLE 語句用于建立資料庫中的表。
SQL CREATE TABLE 文法
CREATE TABLE 表名稱(列名稱1 資料類型,列名稱2 資料類型,列名稱3 資料類型,....)
資料類型(data_type)規定了列可容納何種資料類型。下面的表格包含了SQL中最常用的資料類型:
資料類型 | 描述 |
· integer(size) · int(size) · smallint(size) · tinyint(size) | 僅容納整數。在括号内規定數字的最大位數。 |
· decimal(size,d) · numeric(size,d) | 容納帶有小數的數字。 "size" 規定數字的最大位數。"d" 規定小數點右側的最大位數。 |
char(size) | 容納固定長度的字元串(可容納字母、數字以及特殊字元)。 在括号中規定字元串的長度。 |
varchar(size) | 容納可變長度的字元串(可容納字母、數字以及特殊的字元)。 在括号中規定字元串的最大長度。 |
date(yyyymmdd) | 容納日期。 |
SQL CREATE TABLE 執行個體
本例示範如何建立名為 "Person" 的表。
該表包含 5 個列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":
CREATE TABLE Persons(Id_P int,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255))
Id_P 列的資料類型是 int,包含整數。其餘 4 列的資料類型是 varchar,最大長度為 255 個字元。
22:SQL 限制
限制用于限制加入表的資料的類型。
可以在建立表時規定限制(通過 CREATE TABLE 語句),或者在表建立之後也可以(通過 ALTER TABLE 語句)。
我們将主要探讨以下幾種限制:
· NOT NULL
· UNIQUE
· PRIMARY KEY
· FOREIGN KEY
· CHECK
· DEFAULT
SQL NOT NULL 限制
l NOT NULL 限制強制列不接受 NULL 值。
NOT NULL 限制強制字段始終包含值。這意味着,如果不向字段添加值,就無法插入新記錄或者更新記錄。
下面的 SQL 語句強制 "Id_P" 列和 "LastName" 列不接受 NULL 值:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
l SQL UNIQUE 限制
UNIQUE 限制唯一辨別資料庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 限制均為列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 限制。
請注意,每個表可以有多個 UNIQUE 限制,但是每個表隻能有一個 PRIMARY KEY 限制。
l SQL UNIQUE Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表建立時在 "Id_P" 列建立 UNIQUE 限制:
MySQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),UNIQUE (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL UNIQUE,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
如果需要命名 UNIQUE 限制,以及為多個列定義 UNIQUE 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName))
SQL UNIQUE Constraint on ALTER TABLE
當表已被建立時,如需在 "Id_P" 列建立 UNIQUE 限制,請使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD UNIQUE (Id_P)
如需命名 UNIQUE 限制,并定義多個列的 UNIQUE 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤銷 UNIQUE 限制
如需撤銷 UNIQUE 限制,請使用下面的 SQL:
MySQL:
ALTER TABLE PersonsDROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT uc_PersonID
l SQL PRIMARY KEY 限制
PRIMARY KEY 限制唯一辨別資料庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,并且每個表隻能有一個主鍵。
SQL PRIMARY KEY Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表建立時在 "Id_P" 列建立 PRIMARY KEY 限制:
MySQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL PRIMARY KEY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
如果需要命名 PRIMARY KEY 限制,以及為多個列定義 PRIMARY KEY 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName))
SQL PRIMARY KEY Constraint on ALTER TABLE
如果在表已存在的情況下為 "Id_P" 列建立 PRIMARY KEY 限制,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD PRIMARY KEY (Id_P)
如果需要命名 PRIMARY KEY 限制,以及為多個列定義 PRIMARY KEY 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注釋:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次建立時)。
撤銷 PRIMARY KEY 限制
如需撤銷 PRIMARY KEY 限制,請使用下面的 SQL:
MySQL:
ALTER TABLE PersonsDROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT pk_PersonID
l SQL FOREIGN KEY 限制
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
讓我們通過一個例子來解釋外鍵。請看下面兩個表:
SQL FOREIGN KEY Constraint on CREATE TABLE
下面的 SQL 在 "Orders" 表建立時為 "Id_P" 列建立 FOREIGN KEY:
MySQL:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (Id_O),FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Orders(Id_O int NOT NULL PRIMARY KEY,OrderNo int NOT NULL,Id_P int FOREIGN KEY REFERENCES Persons(Id_P))
如果需要命名 FOREIGN KEY 限制,以及為多個列定義 FOREIGN KEY 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (Id_O),CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)REFERENCES Persons(Id_P))
SQL FOREIGN KEY Constraint on ALTER TABLE
如果在 "Orders" 表已存在的情況下為 "Id_P" 列建立 FOREIGN KEY 限制,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD FOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
如果需要命名 FOREIGN KEY 限制,以及為多個列定義 FOREIGN KEY 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD CONSTRAINT fk_PerOrdersFOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
撤銷 FOREIGN KEY 限制
如需撤銷 FOREIGN KEY 限制,請使用下面的 SQL:
MySQL:
ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE OrdersDROP CONSTRAINT fk_PerOrders
l SQL CHECK 限制
CHECK 限制用于限制列中的值的範圍。
如果對單個列定義 CHECK 限制,那麼該列隻允許特定的值。
如果對一個表定義 CHECK 限制,那麼此限制會在特定的列中對值進行限制。
SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表建立時為 "Id_P" 列建立 CHECK 限制。CHECK 限制規定 "Id_P" 列必須隻包含大于 0 的整數。
My SQL:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CHECK (Id_P>0))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL CHECK (Id_P>0),LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
如果需要命名 CHECK 限制,以及為多個列定義 CHECK 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes'))
SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情況下為 "Id_P" 列建立 CHECK 限制,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CHECK (Id_P>0)
如果需要命名 CHECK 限制,以及為多個列定義 CHECK 限制,請使用下面的 SQL 文法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤銷 CHECK 限制
如需撤銷 CHECK 限制,請使用下面的 SQL:
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE PersonsDROP CHECK chk_Perso
l SQL DEFAULT 限制
DEFAULT 限制用于向列中插入預設值。
如果沒有規定其他的值,那麼會将預設值添加到所有的新記錄。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表建立時為 "City" 列建立 DEFAULT 限制:
My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255) DEFAULT 'Sandnes')
通過使用類似 GETDATE() 這樣的函數,DEFAULT 限制也可以用于插入系統值:
CREATE TABLE Orders(Id_O int NOT NULL,OrderNo int NOT NULL,Id_P int,OrderDate date DEFAULT GETDATE())
SQL DEFAULT Constraint on ALTER TABLE
如果在表已存在的情況下為 "City" 列建立 DEFAULT 限制,請使用下面的 SQL:
MySQL:
ALTER TABLE PersonsALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City SET DEFAULT 'SANDNES'
撤銷 DEFAULT 限制
如需撤銷 DEFAULT 限制,請使用下面的 SQL:
MySQL:
ALTER TABLE PersonsALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City DROP DEFAULT
23:SQL CREATE INDEX 語句
CREATE INDEX 語句用于在表中建立索引。
在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查找資料。
索引
您可以在表中建立索引,以便更加快速高效地查詢資料。
使用者無法看到索引,它們隻能被用來加速搜尋/查詢。
注釋:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由于索引本身也需要更新。是以,理想的做法是僅僅在常常被搜尋的列(以及表)上面建立索引。
SQL CREATE INDEX 文法
在表上建立一個簡單的索引。允許使用重複的值:
CREATE INDEX index_nameON table_name (column_name)
注釋:"column_name" 規定需要索引的列。
SQL CREATE UNIQUE INDEX 文法
在表上建立一個唯一的索引。唯一的索引意味着兩個行不能擁有相同的索引值。
CREATE UNIQUE INDEX index_nameON table_name (column_name)
CREATE INDEX 執行個體
本例會建立一個簡單的索引,名為 "PersonIndex",在 Person 表的 LastName 列:
CREATE INDEX PersonIndexON Person (LastName)
如果您希望以降序索引某個列中的值,您可以在列名稱之後添加保留字 DESC:
CREATE INDEX PersonIndexON Person (LastName DESC)
假如您希望索引不止一個列,您可以在括号中列出這些列的名稱,用逗号隔開:
CREATE INDEX PersonIndexON Person (LastName, FirstName)
24:SQL 撤銷索引、表以及資料庫
通過使用 DROP 語句,可以輕松地删除索引、表和資料庫。
SQL DROP INDEX 語句
我們可以使用 DROP INDEX 指令删除表格中的索引。
用于 Microsoft SQLJet (以及 Microsoft Access) 的文法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的文法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 文法:
DROP INDEX index_name
用于 MySQL 的文法:
ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 語句
DROP TABLE 語句用于删除表(表的結構、屬性以及索引也會被删除):
DROP TABLE 表名稱
SQL DROP DATABASE 語句
DROP DATABASE 語句用于删除資料庫:
DROP DATABASE 資料庫名稱
SQL TRUNCATE TABLE 語句
如果我們僅僅需要除去表内的資料,但并不删除表本身,那麼我們該如何做呢?
請使用 TRUNCATE TABLE 指令(僅僅删除表格中的資料):
TRUNCATE TABLE 表名稱
25:SQL ALTER TABLE 語句
ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加、修改或删除列。
SQL ALTER TABLE 文法
如需在表中添加列,請使用下列文法:
ALTER TABLE table_nameADD column_name datatype
要删除表中的列,請使用下列文法:
ALTER TABLE table_name DROP COLUMN column_name
注釋:某些資料庫系統不允許這種在資料庫表中删除列的方式 (DROP COLUMN column_name)。
要改變表中列的資料類型,請使用下列文法:
ALTER TABLE table_nameALTER COLUMN column_name datatype
Eg:
我們希望在表 "Persons" 中添加一個名為 "Birthday" 的新列。
l ALTER TABLE PersonsADD Birthday date
現在我們希望改變 "Persons" 表中 "Birthday" 列的資料類型。
l ALTER TABLE PersonsALTER COLUMN Birthday year
請注意,"Birthday" 列的資料類型是 year,可以存放 2 位或 4 位格式的年份。
接下來,我們删除 "Person" 表中的 "Birthday" 列:
l ALTER TABLE PersonDROP COLUMN Birthday
26:SQL AUTO INCREMENT 字段
Auto-increment 會在新記錄插入表中時生成一個唯一的數字。
AUTO INCREMENT 字段
我們通常希望在每次插入新記錄時,自動地建立主鍵字段的值。
我們可以在表中建立一個 auto-increment 字段。
l 用于 MySQL 的文法
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義為 auto-increment 主鍵:
CREATE TABLE Persons(P_Id int NOT NULL AUTO_INCREMENT,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (P_Id))
MySQL 使用 AUTO_INCREMENT 關鍵字來執行 auto-increment 任務。
預設地,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1。
要讓 AUTO_INCREMENT 序列以其他的值起始,請使用下列 SQL 文法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規定值(會自動添加一個唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 語句會在 "Persons" 表中插入一條新記錄。"P_Id" 會被賦予一個唯一的值。"FirstName" 會被設定為 "Bill","LastName" 列會被設定為 "Gates"。
l 用于 SQL Server 的文法
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義為 auto-increment 主鍵:
CREATE TABLE Persons(P_Id int PRIMARY KEY IDENTITY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
MS SQL 使用 IDENTITY 關鍵字來執行 auto-increment 任務。
預設地,IDENTITY 的開始值是 1,每條新記錄遞增 1。
要規定 "P_Id" 列以 20 起始且遞增 10,請把 identity 改為 IDENTITY(20,10)
要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規定值(會自動添加一個唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 語句會在 "Persons" 表中插入一條新記錄。"P_Id" 會被賦予一個唯一的值。"FirstName" 會被設定為 "Bill","LastName" 列會被設定為 "Gates"。
l 用于 Access 的文法
下列 SQL 語句把 "Persons" 表中的 "P_Id" 列定義為 auto-increment 主鍵:
CREATE TABLE Persons(P_Id int PRIMARY KEY AUTOINCREMENT,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
MS Access 使用 AUTOINCREMENT 關鍵字來執行 auto-increment 任務。
預設地,AUTOINCREMENT 的開始值是 1,每條新記錄遞增 1。
要規定 "P_Id" 列以 20 起始且遞增 10,請把 autoincrement 改為 AUTOINCREMENT(20,10)
要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規定值(會自動添加一個唯一的值):
INSERT INTO Persons (FirstName,LastName)VALUES ('Bill','Gates')
上面的 SQL 語句會在 "Persons" 表中插入一條新記錄。"P_Id" 會被賦予一個唯一的值。"FirstName" 會被設定為 "Bill","LastName" 列會被設定為 "Gates"。
l 用于 Oracle 的文法
在 Oracle 中,代碼稍微複雜一點。
您必須通過 sequence 對建立 auto-increment 字段(該對象生成數字序列)。
請使用下面的 CREATE SEQUENCE 文法:
CREATE SEQUENCE seq_personMINVALUE 1START WITH 1INCREMENT BY 1CACHE 10
上面的代碼建立名為 seq_person 的序列對象,它以 1 起始且以 1 遞增。該對象緩存 10 個值以提高性能。CACHE 選項規定了為了提高通路速度要存儲多少個序列值。
要在 "Persons" 表中插入新記錄,我們必須使用 nextval 函數(該函數從 seq_person 序列中取回下一個值):
INSERT INTO Persons (P_Id,FirstName,LastName)VALUES (seq_person.nextval,'Lars','Monsen')
上面的 SQL 語句會在 "Persons" 表中插入一條新記錄。"P_Id" 的指派是來自 seq_person 序列的下一個數字。"FirstName" 會被設定為 "Bill","LastName" 列會被設定為 "Gates"。
27:SQL VIEW(視圖)
視圖是可視化的表。
SQL CREATE VIEW 語句
什麼是視圖?
在 SQL 中,視圖是基于 SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個資料庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以送出資料,就像這些來自于某個單一的表。
注釋:資料庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響。
SQL CREATE VIEW 文法
CREATE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
注釋:視圖總是顯示最近的資料。每當使用者查詢視圖時,資料庫引擎通過使用 SQL 語句來重建資料。
SQL CREATE VIEW 執行個體
可以從某個查詢内部、某個存儲過程内部,或者從另一個視圖内部來使用視圖。通過向視圖添加函數、join 等等,我們可以向使用者精确地送出我們希望送出的資料。
樣本資料庫 Northwind 擁有一些被預設安裝的視圖。視圖 "Current Product List" 會從 Products 表列出所有正在使用的産品。這個視圖使用下列 SQL 建立:
CREATE VIEW [Current Product List] ASSELECT ProductID,ProductNameFROM ProductsWHERE Discontinued=No
我們可以查詢上面這個視圖:
SELECT * FROM [Current Product List]
Northwind 樣本資料庫的另一個視圖會選取 Products 表中所有機關價格高于平均機關價格的産品:
CREATE VIEW [Products Above Average Price] ASSELECT ProductName,UnitPriceFROM ProductsWHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
我們可以像這樣查詢上面這個視圖:
SELECT * FROM [Products Above Average Price]
另一個來自 Northwind 資料庫的視圖執行個體會計算在 1997 年每個種類的銷售總數。請注意,這個視圖會從另一個名為 "Product Sales for 1997" 的視圖那裡選取資料:
CREATE VIEW [Category Sales For 1997] ASSELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySalesFROM [Product Sales for 1997]GROUP BY CategoryName
我們可以像這樣查詢上面這個視圖:
SELECT * FROM [Category Sales For 1997]
我們也可以向查詢添加條件。現在,我們僅僅需要檢視 "Beverages" 類的全部銷量:
SELECT * FROM [Category Sales For 1997]WHERE CategoryName='Beverages'
SQL 更新視圖
您可以使用下面的文法來更新視圖:
SQL CREATE OR REPLACE VIEW SyntaxCREATE OR REPLACE VIEW view_name ASSELECT column_name(s)FROM table_nameWHERE condition
現在,我們希望向 "Current Product List" 視圖添加 "Category" 列。我們将通過下列 SQL 更新視圖:
CREATE VIEW [Current Product List] ASSELECT ProductID,ProductName,CategoryFROM ProductsWHERE Discontinued=No
SQL 撤銷視圖
您可以通過 DROP VIEW 指令來删除視圖。
SQL DROP VIEW SyntaxDROP VIEW view_name
28:SQL Date 函數
當我們處理日期時,最難的任務恐怕是確定所插入的日期的格式,與資料庫中日期列的格式相比對。
隻要資料包含的隻是日期部分,運作查詢就不會出問題。但是,如果涉及時間,情況就有點複雜了。
MySQL Date 函數
下面的表格列出了 MySQL 中最重要的内建日期函數:
函數 | 描述 |
NOW() | 傳回目前的日期和時間 |
CURDATE() | 傳回目前的日期 |
CURTIME() | 傳回目前的時間 |
DATE() | 提取日期或日期/時間表達式的日期部分 |
EXTRACT() | 傳回日期/時間按的單獨部分 |
DATE_ADD() | 給日期添加指定的時間間隔 |
DATE_SUB() | 從日期減去指定的時間間隔 |
DATEDIFF() | 傳回兩個日期之間的天數 |
DATE_FORMAT() | 用不同的格式顯示日期/時間 |
SQL Server Date 函數
下面的表格列出了 SQL Server 中最重要的内建日期函數:
函數 | 描述 |
GETDATE() | 傳回目前日期和時間 |
DATEPART() | 傳回日期/時間的單獨部分 |
DATEADD() | 在日期中添加或減去指定的時間間隔 |
DATEDIFF() | 傳回兩個日期之間的時間 |
CONVERT() | 用不同的格式顯示日期/時間 |
SQL Date 資料類型
MySQL 使用下列資料類型在資料庫中存儲日期或日期/時間值:
· DATE - 格式 YYYY-MM-DD
· DATETIME - 格式: YYYY-MM-DD HH:MM:SS
· TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
· YEAR - 格式 YYYY 或 YY
SQL Server 使用下列資料類型在資料庫中存儲日期或日期/時間值:
· DATE - 格式 YYYY-MM-DD
· DATETIME - 格式: YYYY-MM-DD HH:MM:SS
· SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
· TIMESTAMP - 格式: 唯一的數字
SQL 日期處理
如果不涉及時間部分,那麼我們可以輕松地比較兩個日期!
假設我們有下面這個 "Orders" 表:
OrderId | ProductName | OrderDate |
1 | computer | 2008-12-26 |
2 | printer | 2008-12-26 |
3 | electrograph | 2008-11-12 |
4 | telephone | 2008-10-19 |
現在,我們希望從上表中選取 OrderDate 為 "2008-12-26" 的記錄。
我們使用如下 SELECT 語句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
結果集:
OrderId | ProductName | OrderDate |
1 | computer | 2008-12-26 |
3 | electrograph | 2008-12-26 |
現在假設 "Orders" 類似這樣(請注意 "OrderDate" 列中的時間部分):
OrderId | ProductName | OrderDate |
1 | computer | 2008-12-26 16:23:55 |
2 | printer | 2008-12-26 10:45:26 |
3 | electrograph | 2008-11-12 14:12:08 |
4 | telephone | 2008-10-19 12:56:10 |
如果我們使用上面的 SELECT 語句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
那麼我們得不到結果。這是由于該查詢不含有時間部分的日期。
提示:如果您希望使查詢簡單且更易維護,那麼請不要在日期中使用時間部分!
29:SQL NULL 值
NULL 值是遺漏的未知資料。
預設地,表的列可以存放 NULL 值。
SQL NULL 值
如果表中的某個列是可選的,那麼我們可以在不向該列添加值的情況下插入新記錄或更新已有的記錄。這意味着該字段将以 NULL 值儲存。
NULL 值的處理方式與其他值不同。
NULL 用作未知的或不适用的值的占位符。
注釋:無法比較 NULL 和 0;它們是不等價的。
SQL 的 NULL 值處理
請看下面的 "Persons" 表:
Id | LastName | FirstName | Address | City |
1 | Adams | John | London | |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Beijing |
假如 "Persons" 表中的 "Address" 列是可選的。這意味着如果在 "Address" 列插入一條不帶值的記錄,"Address" 列會使用 NULL 值儲存。
那麼我們如何測試 NULL 值呢?
無法使用比較運算符來測試 NULL 值,比如 =, <, 或者 <>。
我們必須使用 IS NULL 和 IS NOT NULL 操作符。
SQL IS NULL
我們如何僅僅選取在 "Address" 列中帶有 NULL 值的記錄呢?
我們必須使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NULL
結果集:
LastName | FirstName | Address |
Adams | John | |
Carter | Thomas |
提示:請始終使用 IS NULL 來查找 NULL 值。
SQL IS NOT NULL
我們如何選取在 "Address" 列中不帶有 NULL 值的記錄呢?
我們必須使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NOT NULL
結果集:
LastName | FirstName | Address |
Bush | George | Fifth Avenue |
30:SQL NULL 函數
SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函數
請看下面的 "Products" 表:
P_Id | ProductName | UnitPrice | UnitsInStock | UnitsOnOrder |
1 | computer | 699 | 25 | 15 |
2 | printer | 365 | 36 | |
3 | telephone | 280 | 159 | 57 |
假如 "UnitsOnOrder" 是可選的,而且可以包含 NULL 值。
我們使用如下 SELECT 語句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)FROM Products
在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那麼結果是 NULL。
微軟的 ISNULL() 函數用于規定如何處理 NULL 值。
NVL(), IFNULL() 和 COALESCE() 函數也可以達到相同的結果。
在這裡,我們希望 NULL 值為 0。
下面,如果 "UnitsOnOrder" 是 NULL,則不利于計算,是以如果值是 NULL 則 ISNULL() 傳回 0。
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))FROM Products
Oracle
Oracle 沒有 ISNULL() 函數。不過,我們可以使用 NVL() 函數達到相同的結果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))FROM Products
MySQL
MySQL 也擁有類似 ISNULL() 的函數。不過它的工作方式與微軟的 ISNULL() 函數有點不同。
在 MySQL 中,我們可以使用 IFNULL() 函數,就像這樣:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))FROM Products
或者我們可以使用 COALESCE() 函數,就像這樣:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))FROM Products
31:SQL 資料類型
Microsoft Access、MySQL 以及 SQL Server 所使用的資料類型和範圍。
Microsoft Access 資料類型
資料類型 | 描述 | 存儲 |
Text | 用于文本或文本與數字的組合。最多 255 個字元。 | |
Memo | Memo 用于更大數量的文本。最多存儲 65,536 個字元。 注釋:無法對 memo 字段進行排序。不過它們是可搜尋的。 | |
Byte | 允許 0 到 255 的數字。 | 1 位元組 |
Integer | 允許介于 -32,768 到 32,767 之間的數字。 | 2 位元組 |
Long | 允許介于 -2,147,483,648 與 2,147,483,647 之間的全部數字 | 4 位元組 |
Single | 單精度浮點。處理大多數小數。 | 4 位元組 |
Double | 雙精度浮點。處理大多數小數。 | 8 位元組 |
Currency | 用于貨币。支援 15 位的元,外加 4 位小數。 提示:您可以選擇使用哪個國家的貨币。 | 8 位元組 |
AutoNumber | AutoNumber 字段自動為每條記錄配置設定數字,通常從 1 開始。 | 4 位元組 |
Date/Time | 用于日期和時間 | 8 位元組 |
Yes/No | 邏輯字段,可以顯示為 Yes/No、True/False 或 On/Off。 在代碼中,使用常量 True 和 False (等價于 1 和 0) 注釋:Yes/No 字段中不允許 Null 值 | 1 比特 |
Ole Object | 可以存儲圖檔、音頻、視訊或其他 BLOBs (Binary Large OBjects) | 最多 1GB |
Hyperlink | 包含指向其他檔案的連結,包括網頁。 | |
Lookup Wizard | 允許你建立一個可從下列清單中進行選擇的選項清單。 | 4 位元組 |
MySQL 資料類型
在 MySQL 中,有三種主要的類型:文本、數字和日期/時間類型。
Text 類型:
資料類型 | 描述 |
CHAR(size) | 儲存固定長度的字元串(可包含字母、數字以及特殊字元)。在括号中指定字元串的長度。最多 255 個字元。 |
VARCHAR(size) | 儲存可變長度的字元串(可包含字母、數字以及特殊字元)。在括号中指定字元串的最大長度。最多 255 個字元。 注釋:如果值的長度大于 255,則被轉換為 TEXT 類型。 |
TINYTEXT | 存放最大長度為 255 個字元的字元串。 |
TEXT | 存放最大長度為 65,535 個字元的字元串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 位元組的資料。 |
MEDIUMTEXT | 存放最大長度為 16,777,215 個字元的字元串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 位元組的資料。 |
LONGTEXT | 存放最大長度為 4,294,967,295 個字元的字元串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 位元組的資料。 |
ENUM(x,y,z,etc.) | 允許你輸入可能值的清單。可以在 ENUM 清單中列出最大 65535 個值。如果清單中不存在插入的值,則插入空值。 注釋:這些值是按照你輸入的順序存儲的。 可以按照此格式輸入可能的值:ENUM('X','Y','Z') |
SET | 與 ENUM 類似,SET 最多隻能包含 64 個清單項,不過 SET 可存儲一個以上的值。 |
Number 類型:
資料類型 | 描述 |
TINYINT(size) | -128 到 127 正常。0 到 255 無符号*。在括号中規定最大位數。 |
SMALLINT(size) | -32768 到 32767 正常。0 到 65535 無符号*。在括号中規定最大位數。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 無符号*。在括号中規定最大位數。 |
INT(size) | -2147483648 到 2147483647 正常。0 到 4294967295 無符号*。在括号中規定最大位數。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 正常。0 到 18446744073709551615 無符号*。在括号中規定最大位數。 |
FLOAT(size,d) | 帶有浮動小數點的小數字。在括号中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
DOUBLE(size,d) | 帶有浮動小數點的大數字。在括号中規定最大位數。在 d 參數中規定小數點右側的最大位數。 |
DECIMAL(size,d) | 作為字元串存儲的 DOUBLE 類型,允許固定的小數點。 |
* 這些整數類型擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果添加 UNSIGNED 屬性,那麼範圍将從 0 開始,而不是某個負數。
Date 類型:
資料類型 | 描述 |
DATE() | 日期。格式:YYYY-MM-DD 注釋:支援的範圍是從 '1000-01-01' 到 '9999-12-31' |
DATETIME() | *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS 注釋:支援的範圍是從 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() | *時間戳。TIMESTAMP 值使用 Unix 紀元('1970-01-01 00:00:00' UTC) 至今的描述來存儲。格式:YYYY-MM-DD HH:MM:SS 注釋:支援的範圍是從 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC |
TIME() | 時間。格式:HH:MM:SS 注釋:支援的範圍是從 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。 注釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 傳回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設定為目前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
SQL Server 資料類型
Character 字元串:
資料類型 | 描述 | 存儲 |
char(n) | 固定長度的字元串。最多 8,000 個字元。 | n |
varchar(n) | 可變長度的字元串。最多 8,000 個字元。 | |
varchar(max) | 可變長度的字元串。最多 1,073,741,824 個字元。 | |
text | 可變長度的字元串。最多 2GB 字元資料。 |
Unicode 字元串:
資料類型 | 描述 | 存儲 |
nchar(n) | 固定長度的 Unicode 資料。最多 4,000 個字元。 | |
nvarchar(n) | 可變長度的 Unicode 資料。最多 4,000 個字元。 | |
nvarchar(max) | 可變長度的 Unicode 資料。最多 536,870,912 個字元。 | |
ntext | 可變長度的 Unicode 資料。最多 2GB 字元資料。 |
Binary 類型:
資料類型 | 描述 | 存儲 |
bit | 允許 0、1 或 NULL | |
binary(n) | 固定長度的二進制資料。最多 8,000 位元組。 | |
varbinary(n) | 可變長度的二進制資料。最多 8,000 位元組。 | |
varbinary(max) | 可變長度的二進制資料。最多 2GB 位元組。 | |
image | 可變長度的二進制資料。最多 2GB。 |
Number 類型:
資料類型 | 描述 | 存儲 |
tinyint | 允許從 0 到 255 的所有數字。 | 1 位元組 |
smallint | 允許從 -32,768 到 32,767 的所有數字。 | 2 位元組 |
int | 允許從 -2,147,483,648 到 2,147,483,647 的所有數字。 | 4 位元組 |
bigint | 允許介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之間的所有數字。 | 8 位元組 |
decimal(p,s) | 固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。 p 參數訓示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。預設是 18。 s 參數訓示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。預設是 0。 | 5-17 位元組 |
numeric(p,s) | 固定精度和比例的數字。允許從 -10^38 +1 到 10^38 -1 之間的數字。 p 參數訓示可以存儲的最大位數(小數點左側和右側)。p 必須是 1 到 38 之間的值。預設是 18。 s 參數訓示小數點右側存儲的最大位數。s 必須是 0 到 p 之間的值。預設是 0。 | 5-17 位元組 |
smallmoney | 介于 -214,748.3648 和 214,748.3647 之間的貨币資料。 | 4 位元組 |
money | 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之間的貨币資料。 | 8 位元組 |
float(n) | 從 -1.79E + 308 到 1.79E + 308 的浮動精度數字資料。 參數 n 訓示該字段儲存 4 位元組還是 8 位元組。float(24) 儲存 4 位元組,而 float(53) 儲存 8 位元組。n 的預設值是 53。 | 4 或 8 位元組 |
real | 從 -3.40E + 38 到 3.40E + 38 的浮動精度數字資料。 | 4 位元組 |
Date 類型:
資料類型 | 描述 | 存儲 |
datetime | 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 3.33 毫秒。 | 8 bytes |
datetime2 | 從 1753 年 1 月 1 日 到 9999 年 12 月 31 日,精度為 100 納秒。 | 6-8 bytes |
smalldatetime | 從 1900 年 1 月 1 日 到 2079 年 6 月 6 日,精度為 1 分鐘。 | 4 bytes |
date | 僅存儲日期。從 0001 年 1 月 1 日 到 9999 年 12 月 31 日。 | 3 bytes |
time | 僅存儲時間。精度為 100 納秒。 | 3-5 bytes |
datetimeoffset | 與 datetime2 相同,外加時區偏移。 | 8-10 bytes |
timestamp | 存儲唯一的數字,每當建立或修改某行時,該數字會更新。timestamp 基于内部時鐘,不對應真實時間。每個表隻能有一個 timestamp 變量。 |
其他資料類型:
資料類型 | 描述 |
sql_variant | 存儲最多 8,000 位元組不同資料類型的資料,除了 text、ntext 以及 timestamp。 |
uniqueidentifier | 存儲全局辨別符 (GUID)。 |
xml | 存儲 XML 格式化資料。最多 2GB。 |
cursor | 存儲對用于資料庫操作的指針的引用。 |
table | 存儲結果集,供稍後處理。 |
Sql 函數
SQL 擁有很多可用于計數和計算的内建函數。
31:函數的文法
内建 SQL 函數的文法是:
SELECT function(列) FROM 表
函數的類型
在 SQL 中,基本的函數類型和種類有若幹種。函數的基本類型是:
· Aggregate 函數
· Scalar 函數
合計函數(Aggregate functions)
Aggregate 函數的操作面向一系列的值,并傳回一個單一的值。
注釋:如果在 SELECT 語句的項目清單中的衆多其它表達式中使用 SELECT 語句,則這個 SELECT 必須使用 GROUP BY 語句!
"Persons" table (在大部分的例子中使用過)
Name | Age |
Adams, John | 38 |
Bush, George | 33 |
Carter, Thomas | 28 |
MS Access 中的合計函數
函數 | 描述 |
AVG(column) | 傳回某列的平均值 |
COUNT(column) | 傳回某列的行數(不包括 NULL 值) |
COUNT(*) | 傳回被選行數 |
FIRST(column) | 傳回在指定的域中第一個記錄的值 |
LAST(column) | 傳回在指定的域中最後一個記錄的值 |
MAX(column) | 傳回某列的最高值 |
MIN(column) | 傳回某列的最低值 |
STDEV(column) | |
STDEVP(column) | |
SUM(column) | 傳回某列的總和 |
VAR(column) | |
VARP(column) |
在 SQL Server 中的合計函數
函數 | 描述 |
AVG(column) | 傳回某列的平均值 |
BINARY_CHECKSUM | |
CHECKSUM | |
CHECKSUM_AGG | |
COUNT(column) | 傳回某列的行數(不包括NULL值) |
COUNT(*) | 傳回被選行數 |
COUNT(DISTINCT column) | 傳回相異結果的數目 |
FIRST(column) | 傳回在指定的域中第一個記錄的值(SQLServer2000 不支援) |
LAST(column) | 傳回在指定的域中最後一個記錄的值(SQLServer2000 不支援) |
MAX(column) | 傳回某列的最高值 |
MIN(column) | 傳回某列的最低值 |
STDEV(column) | |
STDEVP(column) | |
SUM(column) | 傳回某列的總和 |
VAR(column) | |
VARP(column) |
Scalar 函數
Scalar 函數的操作面向某個單一的值,并傳回基于輸入值的一個單一的值。
MS Access 中的 Scalar 函數
函數 | 描述 |
UCASE(c) | 将某個域轉換為大寫 |
LCASE(c) | 将某個域轉換為小寫 |
MID(c,start[,end]) | 從某個文本域提取字元 |
LEN(c) | 傳回某個文本域的長度 |
INSTR(c,char) | 傳回在某個文本域中指定字元的數值位置 |
LEFT(c,number_of_char) | 傳回某個被請求的文本域的左側部分 |
RIGHT(c,number_of_char) | 傳回某個被請求的文本域的右側部分 |
ROUND(c,decimals) | 對某個數值域進行指定小數位數的四舍五入 |
MOD(x,y) | 傳回除法操作的餘數 |
NOW() | 傳回目前的系統日期 |
FORMAT(c,format) | 改變某個域的顯示方式 |
DATEDIFF(d,date1,date2) | 用于執行日期計算 |
32:SQL AVG 函數
· SQL functions
· SQL count()
定義和用法
AVG 函數傳回數值列的平均值。NULL 值不包括在計算中。
SQL AVG() 文法
SELECT AVG(column_name) FROM table_name
SQL AVG() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
例子 1
現在,我們希望計算 "OrderPrice" 字段的平均值。
我們使用如下 SQL 語句:
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
結果集類似這樣:
OrderAverage |
950 |
例子 2
現在,我們希望找到 OrderPrice 值高于 OrderPrice 平均值的客戶。
我們使用如下 SQL 語句:
SELECT Customer FROM OrdersWHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
結果集類似這樣:
Customer |
Bush |
Carter |
Adams |
33:SQL COUNT() 函數
· SQL avg()
· SQL first()
COUNT() 函數傳回比對指定條件的行數。
SQL COUNT() 文法
SQL COUNT(column_name) 文法
COUNT(column_name) 函數傳回指定列的值的數目(NULL 不計入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(*) 文法
COUNT(*) 函數傳回表中的記錄數:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 文法
COUNT(DISTINCT column_name) 函數傳回指定列的不同值的數目:
SELECT COUNT(DISTINCT column_name) FROM table_name
注釋:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是無法用于 Microsoft Access。
SQL COUNT(column_name) 執行個體
我們擁有下列 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望計算客戶 "Carter" 的訂單數。
我們使用如下 SQL 語句:
SELECT COUNT(Customer) AS CustomerNilsen FROM OrdersWHERE Customer='Carter'
以上 SQL 語句的結果是 2,因為客戶 Carter 共有 2 個訂單:
CustomerNilsen |
2 |
SQL COUNT(*) 執行個體
如果我們省略 WHERE 子句,比如這樣:
SELECT COUNT(*) AS NumberOfOrders FROM Orders
結果集類似這樣:
NumberOfOrders |
6 |
這是表中的總行數。
SQL COUNT(DISTINCT column_name) 執行個體
現在,我們希望計算 "Orders" 表中不同客戶的數目。
我們使用如下 SQL 語句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
結果集類似這樣:
NumberOfCustomers |
3 |
這是 "Orders" 表中不同客戶(Bush, Carter 和 Adams)的數目。
34:SQL FIRST() 函數
· SQL count()
· SQL last()
FIRST() 函數
FIRST() 函數傳回指定的字段中第一個記錄的值。
提示:可使用 ORDER BY 語句對記錄進行排序。
SQL FIRST() 文法
SELECT FIRST(column_name) FROM table_name
SQL FIRST() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找 "OrderPrice" 列的第一個值。
我們使用如下 SQL 語句:
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
結果集類似這樣:
FirstOrderPrice |
1000 |
35:SQL LAST() 函數
· SQL first()
· SQL max()
LAST() 函數
LAST() 函數傳回指定的字段中最後一個記錄的值。
提示:可使用 ORDER BY 語句對記錄進行排序。
SQL LAST() 文法
SELECT LAST(column_name) FROM table_name
SQL LAST() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找 "OrderPrice" 列的最後一個值。
我們使用如下 SQL 語句:
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
結果集類似這樣:
LastOrderPrice |
100 |
36:SQL MAX() 函數
· SQL last()
· SQL min()
MAX() 函數
MAX 函數傳回一列中的最大值。NULL 值不包括在計算中。
SQL MAX() 文法
SELECT MAX(column_name) FROM table_name
注釋:MIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值。
SQL MAX() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找 "OrderPrice" 列的最大值。
我們使用如下 SQL 語句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
結果集類似這樣:
LargestOrderPrice |
2000 |
37:SQL MIN() 函數
· SQL max()
· SQL sum()
MIN() 函數
MIN 函數傳回一列中的最小值。NULL 值不包括在計算中。
SQL MIN() 文法
SELECT MIN(column_name) FROM table_name
注釋:MIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值。
SQL MIN() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找 "OrderPrice" 列的最小值。
我們使用如下 SQL 語句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
結果集類似這樣:
SmallestOrderPrice |
100 |
38:SQL SUM() 函數
· SQL min()
· SQL Group By
SUM() 函數
SUM 函數傳回數值列的總數(總額)。
SQL SUM() 文法
SELECT SUM(column_name) FROM table_name
SQL SUM() 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找 "OrderPrice" 字段的總數。
我們使用如下 SQL 語句:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
結果集類似這樣:
OrderTotal |
5700 |
39:SQL GROUP BY 語句
· SQL sum()
· SQL Having
合計函數 (比如 SUM) 常常需要添加 GROUP BY 語句。
GROUP BY 語句
GROUP BY 語句用于結合合計函數,根據一個或多個列對結果集進行分組。
SQL GROUP BY 文法
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_name
SQL GROUP BY 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找每個客戶的總金額(總訂單)。
我們想要使用 GROUP BY 語句對客戶進行組合。
我們使用下列 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY Customer
結果集類似這樣:
Customer | SUM(OrderPrice) |
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
很棒吧,對不對?
讓我們看一下如果省略 GROUP BY 會出現什麼情況:
SELECT Customer,SUM(OrderPrice) FROM Orders
結果集類似這樣:
Customer | SUM(OrderPrice) |
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
上面的結果集不是我們需要的。
那麼為什麼不能使用上面這條 SELECT 語句呢?解釋如下:上面的 SELECT 語句指定了兩列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 傳回一個單獨的值("OrderPrice" 列的總計),而 "Customer" 傳回 6 個值(每個值對應 "Orders" 表中的每一行)。是以,我們得不到正确的結果。不過,您已經看到了,GROUP BY 語句解決了這個問題。
GROUP BY 一個以上的列
我們也可以對一個以上的列應用 GROUP BY 語句,就像這樣:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM OrdersGROUP BY Customer,OrderDate
40:SQL HAVING 子句
· SQL Group By
· SQL ucase()
HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函數一起使用。
SQL HAVING 文法
SELECT column_name, aggregate_function(column_name)FROM table_nameWHERE column_name operator valueGROUP BY column_nameHAVING aggregate_function(column_name) operator value
SQL HAVING 執行個體
我們擁有下面這個 "Orders" 表:
O_Id | OrderDate | OrderPrice | Customer |
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
現在,我們希望查找訂單總金額少于 2000 的客戶。
我們使用如下 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY CustomerHAVING SUM(OrderPrice)<2000
結果集類似:
Customer | SUM(OrderPrice) |
Carter | 1700 |
現在我們希望查找客戶 "Bush" 或 "Adams" 擁有超過 1500 的訂單總金額。
我們在 SQL 語句中增加了一個普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM OrdersWHERE Customer='Bush' OR Customer='Adams'GROUP BY CustomerHAVING SUM(OrderPrice)>1500
結果集:
Customer | SUM(OrderPrice) |
Bush | 2000 |
Adams | 2000 |
41:SQL UCASE() 函數
· SQL Having
· SQL lcase()
UCASE() 函數
UCASE 函數把字段的值轉換為大寫。
SQL UCASE() 文法
SELECT UCASE(column_name) FROM table_name
SQL UCASE() 執行個體
我們擁有下面這個 "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" 列的内容,然後把 "LastName" 列轉換為大寫。
我們使用如下 SQL 語句:
SELECT UCASE(LastName) as LastName,FirstName FROM Persons
結果集類似這樣:
LastName | FirstName |
ADAMS | John |
BUSH | George |
CARTER | Thomas |
42:SQL LCASE() 函數
· SQL ucase()
· SQL mid()
LCASE() 函數
LCASE 函數把字段的值轉換為小寫。
SQL LCASE() 文法
SELECT LCASE(column_name) FROM table_name
SQL LCASE() 執行個體
我們擁有下面這個 "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" 列的内容,然後把 "LastName" 列轉換為小寫。
我們使用如下 SQL 語句:
SELECT LCASE(LastName) as LastName,FirstName FROM Persons
結果集類似這樣:
LastName | FirstName |
adams | John |
bush | George |
carter | Thomas |
43:SQL MID() 函數
· SQL lcase()
· SQL len()
MID() 函數
MID 函數用于從文本字段中提取字元。
SQL MID() 文法
SELECT MID(column_name,start[,length]) FROM table_name
參數 | 描述 |
column_name | 必需。要提取字元的字段。 |
start | 必需。規定開始位置(起始值是 1)。 |
length | 可選。要傳回的字元數。如果省略,則 MID() 函數傳回剩餘文本。 |
SQL MID() 執行個體
我們擁有下面這個 "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 |
現在,我們希望從 "City" 列中提取前 3 個字元。
我們使用如下 SQL 語句:
SELECT MID(City,1,3) as SmallCity FROM Persons
結果集類似這樣:
SmallCity |
Lon |
New |
Bei |
44:SQL LEN() 函數
· SQL mid()
· SQL round()
LEN() 函數
LEN 函數傳回文本字段中值的長度。
SQL LEN() 文法
SELECT LEN(column_name) FROM table_name
SQL LEN() 執行個體
我們擁有下面這個 "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 |
現在,我們希望取得 "City" 列中值的長度。
我們使用如下 SQL 語句:
SELECT LEN(City) as LengthOfCity FROM Persons
結果集類似這樣:
LengthOfCity |
6 |
8 |
7 |
45:SQL ROUND() 函數
· SQL len()
· SQL now()
ROUND() 函數
ROUND 函數用于把數值字段舍入為指定的小數位數。
SQL ROUND() 文法
SELECT ROUND(column_name,decimals) FROM table_name
參數 | 描述 |
column_name | 必需。要舍入的字段。 |
decimals | 必需。規定要傳回的小數位數。 |
SQL ROUND() 執行個體
我們擁有下面這個 "Products" 表:
Prod_Id | ProductName | Unit | UnitPrice |
1 | gold | 1000 g | 32.35 |
2 | silver | 1000 g | 11.56 |
3 | copper | 1000 g | 6.85 |
現在,我們希望把名稱和價格舍入為最接近的整數。
我們使用如下 SQL 語句:
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
結果集類似這樣:
ProductName | UnitPrice |
gold | 32 |
silver | 12 |
copper | 7 |
45:SQL NOW() 函數
· SQL round()
· SQL format()
NOW() 函數
NOW 函數傳回目前的日期和時間。
提示:如果您在使用 Sql Server 資料庫,請使用 getdate() 函數來獲得目前的日期時間。
SQL NOW() 文法
SELECT NOW() FROM table_name
SQL NOW() 執行個體
我們擁有下面這個 "Products" 表:
Prod_Id | ProductName | Unit | UnitPrice |
1 | gold | 1000 g | 32.35 |
2 | silver | 1000 g | 11.56 |
3 | copper | 1000 g | 6.85 |
現在,我們希望顯示當天的日期所對應的名稱和價格。
我們使用如下 SQL 語句:
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
結果集類似這樣:
ProductName | UnitPrice | PerDate |
gold | 32.35 | 12/29/2008 11:36:05 AM |
silver | 11.56 | 12/29/2008 11:36:05 AM |
copper | 6.85 | 12/29/2008 11:36:05 A |
46:SQL FORMAT() 函數
· SQL now()
· SQL 快速參考
FORMAT() 函數
FORMAT 函數用于對字段的顯示進行格式化。
SQL FORMAT() 文法
SELECT FORMAT(column_name,format) FROM table_name
參數 | 描述 |
column_name | 必需。要格式化的字段。 |
format | 必需。規定格式。 |
SQL FORMAT() 執行個體
我們擁有下面這個 "Products" 表:
Prod_Id | ProductName | Unit | UnitPrice |
1 | gold | 1000 g | 32.35 |
2 | silver | 1000 g | 11.56 |
3 | copper | 1000 g | 6.85 |
現在,我們希望顯示每天日期所對應的名稱和價格(日期的顯示格式是 "YYYY-MM-DD")。
我們使用如下 SQL 語句:
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDateFROM Products
結果集類似這樣:
ProductName | UnitPrice | PerDate |
gold | 32.35 | 12/29/2008 |
silver | 11.56 | 12/29/2008 |
copper | 6.85 | 12/29/2008 |
47:SQL 快速參考
· SQL format()
· SQL 教程總結
來自 W3School 的 SQL 快速參考。可以列印它,以備日常使用。
SQL 語句
語句 | 文法 |
AND / OR | SELECT column_name(s) FROM table_name WHERE condition AND|OR condition |
ALTER TABLE (add column) | ALTER TABLE table_name ADD column_name datatype |
ALTER TABLE (drop column) | ALTER TABLE table_name DROP COLUMN column_name |
AS (alias for column) | SELECT column_name AS column_alias FROM table_name |
AS (alias for table) | SELECT column_name FROM table_name AS table_alias |
BETWEEN | SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 |
CREATE DATABASE | CREATE DATABASE database_name |
CREATE INDEX | CREATE INDEX index_name ON table_name (column_name) |
CREATE TABLE | CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, ....... ) |
CREATE UNIQUE INDEX | CREATE UNIQUE INDEX index_name ON table_name (column_name) |
CREATE VIEW | CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition |
DELETE FROM | DELETE FROM table_name (Note: Deletes the entire table!!) or DELETE FROM table_name WHERE condition |
DROP DATABASE | DROP DATABASE database_name |
DROP INDEX | DROP INDEX table_name.index_name |
DROP TABLE | DROP TABLE table_name |
GROUP BY | SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 |
HAVING | SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 HAVING SUM(column_name2) condition value |
IN | SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..) |
INSERT INTO | INSERT INTO table_name VALUES (value1, value2,....) or INSERT INTO table_name (column_name1, column_name2,...) VALUES (value1, value2,....) |
LIKE | SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern |
ORDER BY | SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC] |
SELECT | SELECT column_name(s) FROM table_name |
SELECT * | SELECT * FROM table_name |
SELECT DISTINCT | SELECT DISTINCT column_name(s) FROM table_name |
SELECT INTO (used to create backup copies of tables) | SELECT * INTO new_table_name FROM original_table_name or SELECT column_name(s) INTO new_table_name FROM original_table_name |
TRUNCATE TABLE (deletes only the data inside the table) | TRUNCATE TABLE table_name |
UPDATE | UPDATE table_name SET column_name=new_value [, column_name=new_value] WHERE column_name=some_value |
WHERE | SELECT column_name(s) FROM table_name WHERE condition |