1. 程式人生 > >SQL高級教程2

SQL高級教程2

更多 插入行 時間 var order 管理系 ddr 保存 服務

SQL SELECT INTO 語句:

SQL SELECT INTO 語句可用於創建表的備份復件。

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

SQL SELECT INTO 實例 - 制作備份復件

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

CREATE DATABASE 語句

CREATE DATABASE 用於創建數據庫。

SQL CREATE DATABASE 語法

CREATE DATABASE database_name

創建一個名為 "my_db" 的數據庫:

CREATE DATABASE my_db

可以通過 CREATE TABLE 來添加數據庫表。

SQL CREATE TABLE 語句:

CREATE TABLE 語句

CREATE TABLE 語句用於創建數據庫中的表。

SQL CREATE TABLE 語法

CREATE TABLE 表名稱 ( 列名稱1 數據類型, 列名稱2 數據類型, 列名稱3 數據類型, .... )

數據類型(data_type)規定了列可容納何種數據類型。下面的表格包含了SQL中最常用的數據類型:

技術分享圖片

創建名為 "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" 表類似這樣:

技術分享圖片

可使用 INSERT INTO 語句向空表寫入數據。

SQL 約束 (Constraints):

SQL 約束

約束用於限制加入表的數據的類型。

可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在表創建之後也可以(通過 ALTER TABLE 語句)。

主要分為以下幾種約束:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

SQL NOT NULL 約束:

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)
)

SQL UNIQUE 約束

SQL UNIQUE 約束

UNIQUE 約束唯一標識數據庫表中的每條記錄。

UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。

PRIMARY KEY 擁有自動定義的 UNIQUE 約束。

請註意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。

在 "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 Persons
ADD UNIQUE (Id_P)

如需命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

撤銷 UNIQUE 約束

如需撤銷 UNIQUE 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID

SQL PRIMARY KEY 約束:

SQL PRIMARY KEY 約束

PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。

主鍵必須包含唯一的值。

主鍵列不能包含 NULL 值。

每個表都應該有一個主鍵,並且每個表只能有一個主鍵。

在 "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)
)

如果在表已存在的情況下為 "Id_P" 列創建 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons ADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 約束,以及為多個列定義 PRIMARY KEY 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

註釋:如果您使用 ALTER TABLE 語句添加主鍵,必須把主鍵列聲明為不包含 NULL 值(在表首次創建時)。

撤銷 PRIMARY KEY 約束

如需撤銷 PRIMARY KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID


SQL FOREIGN KEY 約束

SQL FOREIGN KEY 約束

一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。

讓我們通過一個例子來解釋外鍵。請看下面兩個表:

技術分享圖片

"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。

"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。

"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。

FOREIGN KEY 約束用於預防破壞表之間連接的動作。

FOREIGN KEY 約束也能防止非法數據插入外鍵列,因為它必須是它指向的那個表中的值之一。

下面的 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)
)

如果在 "Orders" 表已存在的情況下為 "Id_P" 列創建 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

如果需要命名 FOREIGN KEY 約束,以及為多個列定義 FOREIGN KEY 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)

撤銷 FOREIGN KEY 約束

如需撤銷 FOREIGN KEY 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

SQL Server / Oracle / MS Access:

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders

SQL CHECK 約束

SQL CHECK 約束

CHECK 約束用於限制列中的值的範圍。

如果對單個列定義 CHECK 約束,那麽該列只允許特定的值。

如果對一個表定義 CHECK 約束,那麽此約束會在特定的列中對值進行限制。

下面的 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‘)
)

如果在表已存在的情況下為 "Id_P" 列創建 CHECK 約束,請使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 約束,以及為多個列定義 CHECK 約束,請使用下面的 SQL 語法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes‘)

撤銷 CHECK 約束

如需撤銷 CHECK 約束,請使用下面的 SQL:

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person

SQL DEFAULT 約束

SQL DEFAULT 約束

DEFAULT 約束用於向列中插入默認值。

如果沒有規定其他的值,那麽會將默認值添加到所有的新記錄。

下面的 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()
)

如果在表已存在的情況下為 "City" 列創建 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES‘

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT ‘SANDNES‘

撤銷 DEFAULT 約束

如需撤銷 DEFAULT 約束,請使用下面的 SQL:

MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

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)

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

CREATE INDEX Personindex

ON Person (lastname)

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

CREATE INDEX PersonIndex
ON Person (LastName DESC)

引用多列:

CREATE INDEX PersonIndex
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_nam

SQL DROP TABLE 語句

DROP TABLE 語句用於刪除表(表的結構、屬性以及索引也會被刪除):

DROP TABLE 表名稱

SQL DROP DATABASE 語句

DROP DATABASE 語句用於刪除數據庫:

DROP DATABASE 數據庫名稱

SQL TRUNCATE TABLE 語句

僅僅需要除去表內的數據,但並不刪除表本身


TRUNCATE TABLE 表名稱

SQL ALTER TABLE 語句

ALTER TABLE 語句

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" 中添加一個名為 "Birthday" 的新列:

ALTER TABLE Persons
ADD Birthday date

技術分享圖片

改變 "Persons" 表中 "Birthday" 列的數據類型:

ALTER TABLE Persons
ALTER COLUMN Birthday year

刪除 "Person" 表中的 "Birthday" 列:

ALTER TABLE Person
DROP COLUMN Birthday

技術分享圖片

SQL AUTO INCREMENT 字段

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

我們通常希望在每次插入新記錄時,自動地創建主鍵字段的值。

我們可以在表中創建一個 auto-increment 字段。

用於 MySQL 的語法:

把 "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 VIEW(視圖)

SQL CREATE VIEW 語句

什麽是視圖?

在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。

視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。

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

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

註釋:視圖總是顯示最近的數據。每當用戶查詢視圖時,數據庫引擎通過使用 SQL 語句來重建數據。

可以從某個查詢內部、某個存儲過程內部,或者從另一個視圖內部來使用視圖。通過向視圖添加函數、join 等等,我們可以向用戶精確地提交我們希望提交的數據。

樣本數據庫 Northwind 擁有一些被默認安裝的視圖。視圖 "Current Product List" 會從 Products 表列出所有正在使用的產品。這個視圖使用下列 SQL 創建:

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

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

SELECT * FROM [Current Product List]

Northwind 樣本數據庫的另一個視圖會選取 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]

另一個來自 Northwind 數據庫的視圖實例會計算在 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 Syntax
DROP VIEW view_name

SQL Date 函數

SQL 日期

處理日期時,最難的任務是確保所插入的日期的格式,與數據庫中日期列的格式相匹配。

只要數據包含的只是日期部分,運行查詢就不會出問題。但是,如果涉及時間,情況就復雜了。

技術分享圖片

NOW() 函數返回當前的日期和時間。

語法

NOW()

SELECT 語句:

SELECT NOW(),CURDATE(),CURTIME()

技術分享圖片

創建帶有日期時間列 (OrderDate) 的 "Orders" 表:

CREATE TABLE Orders 
(
OrderId int NOT NULL,
ProductName varchar(50) NOT NULL,
OrderDate datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (OrderId)
)

OrderDate 列規定 NOW() 作為默認值。作為結果,當您向表中插入行時,當前日期和時間自動插入列中。

現在,我們希望在 "Orders" 表中插入一條新記錄:

INSERT INTO Orders (ProductName) VALUES (‘Computer‘)

技術分享圖片

技術分享圖片

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 日期處理

如果不涉及時間部分,那麽我們可以輕松地比較兩個日期!

技術分享圖片

從上表中選取 OrderDate 為 "2008-12-26" 的記錄:

SELECT * FROM Orders WHERE OrderDate=‘2008-12-26‘

技術分享圖片

技術分享圖片

如果我們使用上面的 SELECT 語句:

SELECT * FROM Orders WHERE OrderDate=‘2008-12-26‘

那麽我們得不到結果。這是由於該查詢不含有時間部分的日期。

如果您希望使查詢簡單且更易維護,那麽請不要在日期中使用時間部分!

SQL NULL 值

NULL 值是遺漏的未知數據。

默認地,表的列可以存放 NULL 值。

如果表中的某個列是可選的,那麽我們可以在不向該列添加值的情況下插入新記錄或更新已有的記錄。這意味著該字段將以 NULL 值保存。

NULL 值的處理方式與其他值不同。

NULL 用作未知的或不適用的值的占位符。

註釋:無法比較 NULL 和 0;它們是不等價的。

SQL 的 NULL 值處理

技術分享圖片

如何測試 NULL 值呢?

無法使用比較運算符來測試 NULL 值,比如 =, <, 或者 <>。

我們必須使用 IS NULL 和 IS NOT NULL 操作符。

SQL IS NULL

我們如何僅僅選取在 "Address" 列中帶有 NULL 值的記錄呢?

我們必須使用 IS NULL 操作符:

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

技術分享圖片

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

SQL IS NOT NULL

我們如何選取在 "Address" 列中不帶有 NULL 值的記錄呢?

我們必須使用 IS NOT NULL 操作符:

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

技術分享圖片

SQL NULL 函數

技術分享圖片

假如 "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 數據類型

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

SQL 服務器 - RDBMS

DBMS - 數據庫管理系統(Database Management System)

數據庫管理系統是一種可以訪問數據庫中數據的計算機程序。

DBMS 使我們有能力在數據庫中提取、修改或者存貯信息。

不同的 DBMS 提供不同的函數供查詢、提交以及修改數據。

RDBMS - 關系數據庫管理系統(Relational Database Management System)

關系數據庫管理系統 (RDBMS) 也是一種數據庫管理系統,其數據庫是根據數據間的關系來組織和訪問數據的。

20 世紀 70 年代初,IBM 公司發明了 RDBMS。

RDBMS 是 SQL 的基礎,也是所有現代數據庫系統諸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基礎。




SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函數






































SQL高級教程2