天天看點

SQL進階篇之進階應用

SQL CREATE DATABASE 語句

CREATE DATABASE 用于建立資料庫。

SQL CREATE DATABASE 文法

CREATE DATABASE database_name
           

SQL CREATE DATABASE 執行個體

建立一個名為 "my_db" 的資料庫,使用下面的 CREATE DATABASE 語句:

CREATE DATABASE my_db
           

SQL CREATE TABLE 語句

CREATE TABLE 語句用于建立資料庫中的表

SQL CREATE TABLE 文法

CREATE TABLE 表名稱
(
列名稱1 資料類型,
列名稱2 資料類型,
列名稱3 資料類型,
....
)
           

資料類型(data_type)規定了列可容納何種資料類型,如下表所示:

資料類型 描述
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 個字元。

空的 "Persons" 表類似這樣:

Id_P LastName FirstName Address City

SQL ALTER TABLE 語句

ALTER TABLE 語句用于在已有的表中添加、修改或删除列

SQL ALTER TABLE 文法

如需在表中添加列,請使用下列文法:

ALTER TABLE table_name
ADD column_name datatype
           

要删除表中的列,請使用下列文法:

ALTER TABLE table_name
DROP COLUMN column_name
           
注釋:某些資料庫系統不允許這種在資料庫表中删除列的方式 (DROP COLUMN column_name)

要改變表中列的資料類型,請使用下列文法:

ALTER TABLE table_name
ALTER COLUMN column_name datatype
           

原始的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 ALTER TABLE 執行個體

在表 "Persons" 中添加一個名為 "Birthday" 的新列,使用下列 SQL 語句:

ALTER TABLE Persons
ADD Birthday date
           

請注意,新列 "Birthday" 的類型是 date,可以存放日期。資料類型規定列中可以存放的資料的類型。

新的 "Persons" 表類似這樣:

Id LastName FirstName Address City Birthday
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

改變 "Persons" 表中 "Birthday" 列的資料類型,使用下列 SQL 語句:

ALTER TABLE Persons
ALTER COLUMN Birthday year
           

請注意,"Birthday" 列的資料類型是 year,可以存放 2 位或 4 位格式的年份

DROP COLUMN 執行個體

接下來,我們删除 "Person" 表中的 "Birthday" 列:

ALTER TABLE Person
DROP COLUMN Birthday
           

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 CREATE INDEX 語句

CREATE INDEX 語句用于在表中建立索引,在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查找資料

在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查找資料

無法看到索引,它們隻能被用來加速搜尋/查詢

注釋:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由于索引本身也需要更新。是以,理想的做法是僅僅在常常被搜尋的列(以及表)上面建立索引。

SQL CREATE INDEX 文法

在表上建立一個簡單的索引。允許使用重複的值:

CREATE INDEX index_name
ON table_name (column_name)
           

注釋:"column_name" 規定需要索引的列。

SQL CREATE UNIQUE INDEX 文法

在表上建立一個唯一的索引。唯一的索引意味着兩個行不能擁有相同的索引值。

CREATE UNIQUE INDEX index_name
ON table_name (column_name)
           

CREATE INDEX 執行個體

建立一個簡單的索引,名為 "Index_Pers",在 Person 表的 LastName 列:

CREATE INDEX Index_Pers
ON Person (LastName) 
           

如果您希望以降序索引某個列中的值,您可以在列名稱之後添加保留字 DESC:

CREATE INDEX Index_Pers
ON Person (LastName DESC) 
           

假如您希望索引不止一個列,您可以在括号中列出這些列的名稱,用逗号隔開:

CREATE INDEX Index_Pers
ON Person (LastName, FirstName)
           

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 表名稱
           

SQL AUTO INCREMENT 字段

Auto-increment 會在新記錄插入表中時生成一個唯一的數字

用于 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"。

用于 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"。

用于 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"。

用于 Oracle 的文法

在 Oracle 中,代碼稍微複雜一點,必須通過 sequence 對建立 auto-increment 字段(該對象生成數字序列)。

請使用下面的 CREATE SEQUENCE 文法:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 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"。

SQL TOP 子句

TOP 子句用于規定要傳回的記錄的數目,對于擁有數千條記錄的大型表來說,TOP 子句是非常有用的。

注釋:并非所有的資料庫系統都支援 TOP 子句。

SQL Server 的文法:

SELECT TOP number|percent column_name(s)
FROM table_name
           

MySQL 和 Oracle 中的 SQL SELECT TOP 是等價的

MySQL 文法

SELECT column_name(s)
FROM table_name
LIMIT number
           

例子

SELECT *
FROM Persons
LIMIT 5
           

Oracle 文法

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
           

例子

SELECT *
FROM Persons
WHERE ROWNUM <= 5
           

原始的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
4 Obama Barack Pennsylvania Avenue Washington

SQL TOP 執行個體

從上面的 "Persons" 表中選取頭兩條記錄,可以使用下面的 SELECT 語句:

SELECT TOP 2 * FROM Persons
           

結果:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL TOP PERCENT 執行個體

從上面的 "Persons" 表中選取 50% 的記錄,可以使用下面的 SELECT 語句:

SELECT TOP 50 PERCENT * FROM Persons
           

結果:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜尋列中的指定模式

SQL LIKE 操作符文法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
           

原始的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

LIKE 操作符執行個體

從上面的 "Persons" 表中選取居住在以 "N" 開始的城市裡的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE 'N%'
           

提示:"%" 可用于定義通配符(模式中缺少的字母)。

結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

從 "Persons" 表中選取居住在以 "g" 結尾的城市裡的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%g'
           

結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

從 "Persons" 表中選取居住在包含 "lon" 的城市裡的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%lon%'
           

結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London

通過使用 NOT 關鍵字,從 "Persons" 表中選取居住在不包含 "lon" 的城市裡的人,可以使用下面的SELECT 語句:

SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'
           

結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing

SQL 通配符

  • 在搜尋資料庫中的資料時,SQL 通配符可以替代一個或多個字元
  • SQL 通配符必須與 LIKE 運算符一起使用
通配符 描述
% 代表零個或多個字元
_ 僅替代一個字元
[charlist] 字元列中的任何單一字元
[^charlist]或者[!charlist] 不在字元列中的任何單一字元

原始的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

使用 % 通配符

從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市裡的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE 'Ne%'
           

結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

從 "Persons" 表中選取居住在包含 "lond" 的城市裡的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '%lond%'
           

結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London

使用 _ 通配符

從上面的 "Persons" 表中選取名字的第一個字元之後是 "eorge" 的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE FirstName LIKE '_eorge'
           

結果集:

Id LastName FirstName Address City
2 Bush George Fifth Avenue New York

望從 "Persons" 表中選取的這條記錄的姓氏以 "C" 開頭,然後是一個任意字元,然後是 "r",然後是一個任意字元,然後是 "er",可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE LastName LIKE 'C_r_er'
           

結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

使用 [charlist] 通配符

從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '[ALN]%'
           

結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開頭的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'
           

結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing

SQL IN 操作符

IN 操作符允許我們在 WHERE 子句中規定多個值

SQL IN 文法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
           

原始的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

IN 操作符執行個體

從上表中選取姓氏為 Adams 和 Carter 的人,可以使用下面的 SELECT 語句:

SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
           

結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
3 Carter Thomas Changan Street Beijing

SQL BETWEEN 操作符

操作符 BETWEEN ... AND 會選取介于兩個值之間的資料範圍。這些值可以是數值、文本或者日期

SQL BETWEEN 文法

SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
           

原始的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
4 Gates Bill Xuanwumen 10 Beijing

BETWEEN 操作符執行個體

如需以字母順序顯示介于 "Adams"(包括)和 "Carter"(不包括)之間的人,請使用下面的 SQL:

SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
           

結果集:

Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York

重要事項:不同的資料庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些資料庫會列出介于 "Adams" 和 "Carter" 之間的人,但不包括 "Adams" 和 "Carter" ;某些資料庫會列出介于 "Adams" 和 "Carter" 之間并包括 "Adams" 和 "Carter" 的人;而另一些資料庫會列出介于 "Adams" 和 "Carter" 之間的人,包括 "Adams" ,但不包括 "Carter"

如需使用上面的例子顯示範圍之外的人,請使用 NOT 操作符:

SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'
           

結果集:

Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing

SQL SELECT INTO 語句

SQL 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
           

SQL SELECT INTO 執行個體 - 制作備份複件

下面的例子會制作 "Persons" 表的備份複件:

SELECT *
INTO Persons_backup
FROM Persons
           

IN 子句可用于向另一個資料庫中拷貝表:

SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
           

如果我們希望拷貝某些域,可以在 SELECT 語句後列出這些域:

SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
           

SQL SELECT INTO 執行個體 - 帶有 WHERE 子句

下面的例子通過從 "Persons" 表中提取居住在 "Beijing" 的人的資訊,建立了一個帶有兩個列的名為 "Persons_backup" 的表:

SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
           

SQL SELECT INTO 執行個體 - 被連接配接的表

從一個以上的表中選取資料也是可以做到的,下面的例子會建立一個名為 "Persons_Order_Backup" 的新表,其中包含了從 Persons 和 Orders 兩個表中取得的資訊:

SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
           

SQL VIEW(視圖)

在 SQL 中,視圖是基于 SQL 語句的結果集的可視化的表,視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個資料庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以送出資料,就像這些來自于某個單一的表

注釋:資料庫的設計和結構不會受到視圖中的函數、where 或 join 語句的影響

SQL CREATE VIEW 文法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
           

注釋:視圖總是顯示最近的資料。每當使用者查詢視圖時,資料庫引擎通過使用 SQL 語句來重建資料。

SQL CREATE VIEW 執行個體

可以從某個查詢内部、某個存儲過程内部,或者從另一個視圖内部來使用視圖。通過向視圖添加函數、join 等等,我們可以向使用者精确地送出我們希望送出的資料。

視圖 "Current Product List" 會從 Products 表列出所有正在使用的産品。這個視圖使用下列 SQL 建立:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
           

我們可以查詢上面這個視圖:

SELECT * FROM [Current Product List]
           

選取 Products 表中所有機關價格高于平均機關價格的産品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 
           

可以像這樣查詢上面這個視圖:

SELECT * FROM [Products Above Average Price]
           

視圖計算在 1997 年每個種類的銷售總數。請注意,這個視圖會從另一個名為 "Product Sales for 1997" 的視圖那裡選取資料:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [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 Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
           

向 "Current Product List" 視圖添加 "Category" 列。我們将通過下列 SQL 更新視圖:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
           

SQL 撤銷視圖

可以通過 DROP VIEW 指令來删除視圖

SQL DROP VIEW 文法

DROP VIEW view_name
           

SQL Date 函數

當我們處理日期時,最難的任務恐怕是確定所插入的日期的格式,與資料庫中日期列的格式相比對。

隻要資料包含的隻是日期部分,運作查詢就不會出問題。但是,如果涉及時間,情況就有點複雜了。

MySQL Date 函數

函數 描述
NOW() 傳回目前的日期和時間
CURDATE() 傳回目前的日期
CURTIME() 傳回目前的時間
DATE() 提取日期或日期/時間表達式的日期部分
EXTRACT() 傳回日期/時間按的單獨部分
DATE_ADD() 給日期添加指定的時間間隔
DATE_SUB() 從日期減去指定的時間間隔
DATEDIFF() 傳回兩個日期之間的天數
DATE_FORMAT() 用不同的格式顯示日期/時間

SQL Server Date 函數

函數 描述
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
2 printer 2008-12-26
如果日期字段有時間部分,則使用該語句是得不到這樣的結果的
OrderId ProductName OrderDate
1 computer 2008-12-26 16:23:55
2 printer 2008-12-26 17:23:55
3 electrograph 2008-11-12 18:23:55
4 telephone 2008-10-19 19:23:55

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

SELECT Id,LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
           

結果集:

Id LastName FirstName Address
1 Adams John
3 Carter Thomas

提示:請始終使用 IS NULL 來查找 NULL 值。

SQL IS NOT NULL

SELECT Id,LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
           

結果集:

Id LastName FirstName Address
2 Bush George Fifth Avenue

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
           

SQL 資料類型

Microsoft Access 資料類型

SQL進階篇之進階應用

MySQL 資料類型

在 MySQL 中,有三種主要的類型:文本、數字和日期/時間類型。

Text 類型:

SQL進階篇之進階應用

Number 類型:

SQL進階篇之進階應用
  • 這些整數類型擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果添加 UNSIGNED 屬性,那麼範圍将從 0 開始,而不是某個負數。

Date 類型:

SQL進階篇之進階應用
  • 即便 DATETIME 和 TIMESTAMP 傳回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設定為目前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

SQL Server 資料類型

Character 字元串:

SQL進階篇之進階應用

Unicode 字元串:

SQL進階篇之進階應用

Binary 類型:

SQL進階篇之進階應用

Number 類型:

Date 類型:

其他資料類型: