**SQL TOP 子句
TOP
子句用于規(guī)定要返回的記錄的數(shù)目技健。
對(duì)于擁有數(shù)千條記錄的大型表來(lái)說(shuō),TOP
子句是非常有用的沮榜。
注意:并非所有的數(shù)據(jù)庫(kù)系統(tǒng)都支持 TOP
子句坎吻。
SQL Server 的語(yǔ)法:
SELECT TOP number|percent column_name(s)
FROM table_name
MySQL 和 Oracle 中的 SQL SELECT TOP 是等價(jià)的
MySQL 語(yǔ)法
SELECT column_name(s)
FROM table_name
LIMIT number
例子
SELECT *
FROM Persons
LIMIT 5
Oracle 語(yǔ)法
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
例子
SELECT *
FROM Persons
WHERE ROWNUM <= 5
現(xiàn)在,我們希望從 "Persons" 表中選取頭兩條
記錄晓铆。
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT TOP 2 * FROM Persons
SQL TOP PERCENT 實(shí)例
"Persons" 表中選取 50% 的記錄。
SELECT TOP 50 PERCENT * FROM Persons
SQL LIKE 操作符
LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式绰播。
SQL LIKE 操作符語(yǔ)法
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
LIKE 操作符實(shí)例
現(xiàn)在骄噪,我們希望從上面的 "Persons" 表中選取居住在以 "N" 開(kāi)始的城市里的人:
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定義通配符(模式中缺少的字母)。
接下來(lái)幅垮,我們希望從 "Persons" 表中選取居住在以 "g" 結(jié)尾的城市里的人:
我們可以使用下面的 SELECT
語(yǔ)句:
SELECT * FROM Persons
WHERE City LIKE '%g'
接下來(lái)腰池,我們希望從 "Persons" 表中選取居住在包含 "lon" 的城市里的人:
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT * FROM Persons
WHERE City LIKE '%lon%'
![~$AFAR7DLUE%QDKWL%LC.png
注意:SQL是大小寫不敏感尾组。 '%lon%'
中也不區(qū)分大小寫忙芒。
SQL 通配符
在搜索數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)示弓,您可以使用 SQL 通配符。
SQL 通配符
在搜索數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)呵萨,SQL 通配符可以替代一個(gè)或多個(gè)字符奏属。
SQL 通配符必須與 LIKE
運(yùn)算符一起使用。
使用 [charlist] 通配符
例子 1
現(xiàn)在潮峦,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開(kāi)頭的人:
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT * FROM Persons
WHERE City LIKE '[ALN]%'
例子 2
現(xiàn)在囱皿,我們希望從上面的 "Persons" 表中選取居住的城市不以 "A" 或 "L" 或 "N" 開(kāi)頭的人:
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT * FROM Persons
WHERE City LIKE '[!ALN]%'
![%MNRL}YZWP]OGCJ$1AQT~%3.png](http://upload-images.jianshu.io/upload_images/1197462-6edcdc0464960afd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
SQL IN 操作符
IN 操作符允許我們?cè)?WHERE 子句中規(guī)定多個(gè)值。
SQL IN 語(yǔ)法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
IN 操作符實(shí)例
現(xiàn)在忱嘹,我們希望從上表中選取姓氏為 Adams 和 Carter 的人:
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
SQL BETWEEN 操作符
BETWEEN 操作符在 WHERE 子句中使用嘱腥,作用是選取介于兩個(gè)值之間的數(shù)據(jù)范圍。
BETWEEN 操作符
操作符 BETWEEN ... AND
會(huì)選取介于兩個(gè)值之間的數(shù)據(jù)范圍拘悦。這些值可以是數(shù)值齿兔、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
BETWEEN 操作符實(shí)例
如需以字母順序顯示介于 "Adams"(包括)和 "Carter"(不包括)之間的人础米,請(qǐng)使用下面的 SQL:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
SQL Alias(別名)
通過(guò)使用 SQL分苇,可以為列名稱和表名稱指定別名(Alias
)。
表的 SQL Alias 語(yǔ)法
SELECT column_name(s)
FROM table_name
AS alias_name
列的 SQL Alias 語(yǔ)法
SELECT column_name AS alias_name
FROM table_name
Alias 實(shí)例:
使用表名稱別名
假設(shè)我們有兩個(gè)表分別是:"Persons" 和 "Product_Orders"屁桑。我們分別為它們指定別名 "p" 和 "po"医寿。
現(xiàn)在,我們希望列出 "John Adams" 的所有定單蘑斧。
我們可以使用下面的 SELECT 語(yǔ)句:
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
不使用別名的 SELECT 語(yǔ)句:
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
從上面兩條 SELECT 語(yǔ)句您可以看到靖秩,別名使查詢程序更易閱讀和書寫。
Alias 實(shí)例: 使用一個(gè)列名別名
SQL:
SELECT LastName AS Family, FirstName AS Name
FROM Persons
SQL JOIN
SQL join
用于根據(jù)兩個(gè)或多個(gè)表中的列之間的關(guān)系竖瘾,從這些表中查詢數(shù)據(jù)沟突。
Join 和 Key
有時(shí)為了得到完整的結(jié)果,我們需要從兩個(gè)或更多的表中獲取結(jié)果准浴。我們就需要執(zhí)行 join
事扭。
數(shù)據(jù)庫(kù)中的表可通過(guò)鍵將彼此聯(lián)系起來(lái)。主鍵(Primary Key
)是一個(gè)列乐横,在這個(gè)列中的每一行的值都是唯一的求橄。在表中,每個(gè)主鍵的值都是唯一的葡公。這樣做的目的是在不重復(fù)每個(gè)表中的所有數(shù)據(jù)的情況下罐农,把表間的數(shù)據(jù)交叉捆綁在一起。
引用兩個(gè)表
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
SQL JOIN - 使用 Join
除了上面的方法催什,我們也可以使用關(guān)鍵詞 JOIN 來(lái)從兩個(gè)表中獲取數(shù)據(jù)涵亏。
如果我們希望列出所有人的定購(gòu),可以使用下面的 SELECT 語(yǔ)句:
除了上面的方法,我們也可以使用關(guān)鍵詞 JOIN 來(lái)從兩個(gè)表中獲取數(shù)據(jù)气筋。
如果我們希望列出所有人的定購(gòu)拆内,可以使用下面的 SELECT 語(yǔ)句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
不同的 SQL JOIN
除了我們?cè)谏厦娴睦又惺褂玫?INNER JOIN(內(nèi)連接),我們還可以使用其他幾種連接宠默。
下面列出了您可以使用的 JOIN 類型麸恍,以及它們之間的差異。
JOIN: 如果表中有至少一個(gè)匹配搀矫,則返回行
LEFT JOIN: 即使右表中沒(méi)有匹配抹沪,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒(méi)有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個(gè)表中存在匹配瓤球,就返回行
SQL INNER JOIN 關(guān)鍵字
在表中存在至少一個(gè)匹配時(shí)融欧,INNER JOIN
關(guān)鍵字返回行。
INNER JOIN 關(guān)鍵字語(yǔ)法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
內(nèi)連接(INNER JOIN)實(shí)例
現(xiàn)在卦羡,我們希望列出所有人的定購(gòu)噪馏。
您可以使用下面的 SELECT 語(yǔ)句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
SQL LEFT JOIN 關(guān)鍵字
LEFT JOIN 關(guān)鍵字會(huì)從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒(méi)有匹配的行虹茶。
LEFT JOIN 關(guān)鍵字語(yǔ)法
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注釋:在某些數(shù)據(jù)庫(kù)中逝薪, LEFT JOIN 稱為 LEFT OUTER JOIN。
![A${KPSJ0]K5_C_@XI088AZ3.png](http://upload-images.jianshu.io/upload_images/1197462-be70c0c3525a0888.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
現(xiàn)在蝴罪,我們希望列出所有的人董济,以及他們的定購(gòu) - 如果有的話。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
LEFT JOIN
關(guān)鍵字會(huì)從左表 (Persons) 那里返回所有的行要门,即使在右表 (Orders) 中沒(méi)有匹配的行虏肾。
SQL RIGHT JOIN 關(guān)鍵字
RIGHT JOIN 關(guān)鍵字會(huì)右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒(méi)有匹配的行欢搜。
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
在某些數(shù)據(jù)庫(kù)中封豪,RIGHT JOIN
稱為RIGHT OUTER JOIN
。
右連接(RIGHT JOIN)實(shí)例
現(xiàn)在炒瘟,我們希望列出所有的定單吹埠,以及定購(gòu)它們的人 - 如果有的話。
您可以使用下面的 SELECT 語(yǔ)句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
RIGHT JOIN 關(guān)鍵字會(huì)從右表 (Orders) 那里返回所有的行疮装,即使在左表 (Persons) 中沒(méi)有匹配的行缘琅。
SQL FULL JOIN 關(guān)鍵字
只要其中某個(gè)表存在匹配,FULL JOIN
關(guān)鍵字就會(huì)返回行廓推。
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注釋:在某些數(shù)據(jù)庫(kù)中刷袍, FULL JOIN 稱為 FULL OUTER JOIN。
全連接(FULL JOIN)實(shí)例
現(xiàn)在樊展,我們希望列出所有的人呻纹,以及他們的定單堆生,以及所有的定單,以及定購(gòu)它們的人雷酪。
您可以使用下面的 SELECT 語(yǔ)句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
![52RB]4{EH}DPF%BRD5_WVHO.png](http://upload-images.jianshu.io/upload_images/1197462-33b508a6c83eacb7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
SQL UNION 和 UNION ALL 操作符
SQL UNION 操作符
UNION
操作符用于合并兩個(gè)或多個(gè) SELECT
語(yǔ)句的結(jié)果集淑仆。
請(qǐng)注意,UNION 內(nèi)部的 SELECT 語(yǔ)句必須擁有相同數(shù)量的列太闺。列也必須擁有相似的數(shù)據(jù)類型糯景。同時(shí)嘁圈,每條 SELECT 語(yǔ)句中的列的順序必須相同省骂。
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
注釋:這個(gè)命令無(wú)法列出在中國(guó)和美國(guó)的所有雇員。在上面的例子中最住,我們有兩個(gè)名字相同的雇員钞澳,他們當(dāng)中只有一個(gè)人被列出來(lái)了。UNION 命令只會(huì)選取不同的值涨缚。
UNION ALL
UNION ALL 命令和 UNION 命令幾乎是等效的轧粟,不過(guò) UNION ALL 命令會(huì)列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2
SQL SELECT INTO 語(yǔ)句
SQL SELECT INTO
語(yǔ)句可用于創(chuàng)建表的備份復(fù)件脓魏。
SELECT INTO 語(yǔ)句
SELECT INTO 語(yǔ)句從一個(gè)表中選取數(shù)據(jù)兰吟,然后把數(shù)據(jù)插入另一個(gè)表中。
SELECT INTO 語(yǔ)句常用于創(chuàng)建表的備份復(fù)件或者用于對(duì)記錄進(jìn)行存檔茂翔。
SQL SELECT INTO 語(yǔ)法
您可以把所有的列插入新表:
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 實(shí)例 - 制作備份復(fù)件
下面的例子會(huì)制作 "Persons" 表的備份復(fù)件:
SELECT *
INTO Persons_backup
FROM Persons
IN后面可以加數(shù)據(jù)庫(kù)
.
SELECT *
INTO Persons IN 'Backup.mdb'
FROM Persons
如果我們希望拷貝某些域混蔼,可以在 SELECT 語(yǔ)句后列出這些域:
就是某些字段:
SELECT LastName,FirstName
INTO Persons_backup
FROM Persons
SQL SELECT INTO 實(shí)例 - 帶有 WHERE 子句:
SELECT LastName,Firstname
INTO Persons_backup
FROM Persons
WHERE City='Beijing'
SQL SELECT INTO 實(shí)例 - 被連接的表
從一個(gè)以上的表中選取數(shù)據(jù)也是可以做到的。
下面的例子會(huì)創(chuàng)建一個(gè)名為 "Persons_Order_Backup" 的新表珊燎,其中包含了從 Persons 和 Orders 兩個(gè)表中取得的信息:
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
SQL CREATE DATABASE 語(yǔ)句
CREATE DATABASE database_name
SQL CREATE TABLE 語(yǔ)句
CREATE TABLE 表名稱
(
列名稱1 數(shù)據(jù)類型,
列名稱2 數(shù)據(jù)類型,
列名稱3 數(shù)據(jù)類型,
....
)
數(shù)據(jù)類型(data_type
)規(guī)定了列可容納何種數(shù)據(jù)類型惭嚣。下面的表格包含了SQL
中最常用的數(shù)據(jù)類型:
SQL 約束 (Constraints)
約束用于限制加入表的數(shù)據(jù)的類型。
可以在創(chuàng)建表時(shí)規(guī)定約束(通過(guò)CREATE TABLE
語(yǔ)句)悔政,或者在表創(chuàng)建之后也可以(通過(guò) ALTER TABLE
語(yǔ)句)晚吞。
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
SQL NOT NULL 約束:
NOT NULL 約束強(qiáng)制列不接受 NULL 值。
NOT NULL 約束強(qiáng)制字段始終包含值谋国。這意味著槽地,如果不向字段添加值,就無(wú)法插入新記錄或者更新記錄芦瘾。SQL UNIQUE 約束:
UNIQUE
約束唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄捌蚊。
UNIQUE
和 PRIMARY KEY
約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY
擁有自動(dòng)定義的UNIQUE
約束旅急。
請(qǐng)注意逢勾,每個(gè)表可以有多個(gè) UNIQUE
約束,但是每個(gè)表只能有一個(gè) PRIMARY KEY
約束藐吮。
SQL UNIQUE Constraint on ALTER TABLE
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (Id_P)
如需命名 UNIQUE 約束溺拱,并定義多個(gè)列的 UNIQUE 約束逃贝,請(qǐng)使用下面的 SQL 語(yǔ)法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤銷 UNIQUE 約束
如需撤銷 UNIQUE 約束,請(qǐng)使用下面的 SQL:
MySQL:
ALTER TABLE Persons
DROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
- SQL PRIMARY KEY 約束
PRIMARY KEY
約束唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)表中的每條記錄迫摔。
主鍵必須包含唯一的值沐扳。
主鍵列不能包含 NULL
值。
每個(gè)表都應(yīng)該有一個(gè)主鍵句占,并且每個(gè)表只能有一個(gè)主鍵沪摄。
SQL PRIMARY KEY Constraint on CREATE TABLE
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 約束,以及為多個(gè)列定義 PRIMARY KEY 約束纱烘,請(qǐng)使用下面的 SQL 語(yǔ)法:
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 FOREIGN KEY 約束
一個(gè)表中的FOREIGN KEY
指向另一個(gè)表中的 PRIMARY KEY
杨拐。
FOREIGN KEY
約束用于預(yù)防破壞表之間連接的動(dòng)作。
FOREIGN KEY
約束也能防止非法數(shù)據(jù)插入外鍵列擂啥,因?yàn)樗仨毷撬赶虻哪莻€(gè)表中的值之一哄陶。
SQL FOREIGN KEY Constraint on CREATE TABLE
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)
)
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 CHECK 約束
CHECK
約束用于限制列中的值的范圍。
如果對(duì)單個(gè)列定義 CHECK
約束哺壶,那么該列只允許特定的值屋吨。
如果對(duì)一個(gè)表定義 CHECK
約束,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制山宾。
SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "Id_P" 列創(chuàng)建 CHECK 約束至扰。CHECK 約束規(guī)定 "Id_P" 列必須只包含大于 0 的整數(shù)。
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 約束资锰,以及為多個(gè)列定義 CHECK 約束敢课,請(qǐng)使用下面的 SQL 語(yǔ)法:
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
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
- SQL DEFAULT 約束
DEFAULT
約束用于向列中插入默認(rèn)值。
如果沒(méi)有規(guī)定其他的值台妆,那么會(huì)將默認(rèn)值添加到所有的新記錄翎猛。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表創(chuàng)建時(shí)為 "City" 列創(chuàng)建 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'
)
通過(guò)使用類似 GETDATE() 這樣的函數(shù),DEFAULT 約束也可以用于插入系統(tǒng)值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
MySQL:
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
SQL CREATE INDEX 語(yǔ)句
CREATE INDEX 語(yǔ)句用于在表中創(chuàng)建索引接剩。
在不讀取整個(gè)表的情況下切厘,索引使數(shù)據(jù)庫(kù)應(yīng)用程序可以更快地查找數(shù)據(jù)。
索引
可以在表中創(chuàng)建索引懊缺,以便更加快速高效
地查詢數(shù)據(jù)疫稿。
用戶無(wú)法看到索引,它們只能被用來(lái)加速
搜索/查詢鹃两。
注釋:更新一個(gè)包含索引的表需要比更新一個(gè)沒(méi)有索引的表更多的時(shí)間遗座,這是由于索引
本身也需要更新。因此俊扳,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引途蒋。
SQL CREATE INDEX 語(yǔ)法
在表上創(chuàng)建一個(gè)簡(jiǎn)單的索引。允許使用重復(fù)的值:
CREATE INDEX index_name
ON table_name (column_name)
注釋:"column_name" 規(guī)定需要索引的列馋记。
SQL CREATE UNIQUE INDEX 語(yǔ)法
在表上創(chuàng)建一個(gè)唯一的索引号坡。唯一的索引意味著兩個(gè)行不能擁有相同的索引值懊烤。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
CREATE INDEX 實(shí)例
本例會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的索引,名為 "PersonIndex"宽堆,在 Person 表的 LastName 列:
CREATE INDEX PersonIndex
ON Person (LastName)
如果您希望以降序索引某個(gè)列中的值腌紧,您可以在列名稱之后添加保留字 DESC:
CREATE INDEX PersonIndex
ON Person (LastName DESC)
假如您希望索引不止一個(gè)列,您可以在括號(hào)中列出這些列的名稱畜隶,用逗號(hào)隔開(kāi):
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
SQL 撤銷索引壁肋、表以及數(shù)據(jù)庫(kù)
通過(guò)使用 DROP
語(yǔ)句,可以輕松地刪除索引籽慢、表和數(shù)據(jù)庫(kù)浸遗。
SQL DROP INDEX 語(yǔ)句
我們可以使用 DROP INDEX 命令刪除表格中的索引。
用于 Microsoft SQLJet (以及 Microsoft Access) 的語(yǔ)法:
DROP INDEX index_name ON table_name
用于 MS SQL Server 的語(yǔ)法:
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 語(yǔ)法:
DROP INDEX index_name
用于 MySQL 的語(yǔ)法:
ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 語(yǔ)句
DROP TABLE 語(yǔ)句用于刪除表(表的結(jié)構(gòu)嗡综、屬性以及索引也會(huì)被刪除):
DROP TABLE 表名稱
SQL DROP DATABASE 語(yǔ)句
DROP DATABASE 語(yǔ)句用于刪除數(shù)據(jù)庫(kù):
DROP DATABASE 數(shù)據(jù)庫(kù)名稱
SQL TRUNCATE TABLE 語(yǔ)句
如果我們僅僅需要除去表內(nèi)的數(shù)據(jù)乙帮,但并不刪除表本身,那么我們?cè)撊绾巫瞿兀?br>
請(qǐng)使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數(shù)據(jù)):
TRUNCATE TABLE 表名稱
SQL ALTER TABLE 語(yǔ)句
ALTER TABLE 語(yǔ)句
ALTER TABLE 語(yǔ)句用于在已有的表中添加极景、修改或刪除列。
SQL ALTER TABLE 語(yǔ)法
如需在表中添加列驾茴,請(qǐng)使用下列語(yǔ)法:.
ALTER TABLE table_name
ADD column_name datatype
要?jiǎng)h除表中的列盼樟,請(qǐng)使用下列語(yǔ)法:
ALTER TABLE table_name
DROP COLUMN column_name
注釋:某些數(shù)據(jù)庫(kù)系統(tǒng)不允許這種在數(shù)據(jù)庫(kù)表中刪除列的方式 (DROP COLUMN column_name)。
要改變表中列的數(shù)據(jù)類型锈至,請(qǐng)使用下列語(yǔ)法:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
DROP COLUMN 實(shí)例
接下來(lái)晨缴,我們刪除 "Person" 表中的 "Birthday" 列:
ALTER TABLE Person
DROP COLUMN Birthday
SQL AUTO INCREMENT 字段
auto_increment 會(huì)在新記錄插入表中時(shí)生成一個(gè)唯一的數(shù)字。
AUTO INCREMENT 字段
我們通常希望在每次插入新記錄時(shí)峡捡,自動(dòng)地創(chuàng)建主鍵字段的值击碗。
我們可以在表中創(chuàng)建一個(gè) auto_increment 字段。
用于 MySQL 的語(yǔ)法
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 關(guān)鍵字來(lái)執(zhí)行 auto-increment 任務(wù)们拙。
默認(rèn)地稍途,AUTO_INCREMENT 的開(kāi)始值是 1,每條新記錄遞增 1砚婆。
要讓 AUTO_INCREMENT 序列以其他的值起始械拍,請(qǐng)使用下列 SQL 語(yǔ)法:
ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新記錄,我們不必為 "P_Id" 列規(guī)定值(會(huì)自動(dòng)添加一個(gè)唯一的值):
INSERT INTO Persons (FirstName,LastName)
VALUES ('Bill','Gates')
SQL VIEW(視圖)
視圖是可視化的表装盯。
本章講解如何創(chuàng)建坷虑、更新和刪除視圖。
SQL CREATE VIEW 語(yǔ)句
什么是視圖埂奈?
在 SQL 中迄损,視圖
是基于 SQL 語(yǔ)句的結(jié)果集的可視化的表
。
視圖包含行和列账磺,就像一個(gè)真實(shí)的表芹敌。視圖中的字段就是來(lái)自一個(gè)或多個(gè)數(shù)據(jù)庫(kù)中的真實(shí)的表中的字段共屈。我們可以向視圖
添加 SQL 函數(shù)
、WHERE
以及 JOIN 語(yǔ)句
党窜,我們也可以提交數(shù)據(jù)拗引,就像這些來(lái)自于某個(gè)單一的表。
注釋:數(shù)據(jù)庫(kù)的設(shè)計(jì)和結(jié)構(gòu)不會(huì)受到視圖中的函數(shù)
幌衣、where
或 join
語(yǔ)句的影響矾削。
SQL CREATE VIEW 語(yǔ)法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
視圖總是顯示最近的數(shù)據(jù)。每當(dāng)用戶查詢視圖時(shí)豁护,數(shù)據(jù)庫(kù)引擎通過(guò)使用 SQL
語(yǔ)句來(lái)重建數(shù)據(jù)哼凯。
SQL CREATE VIEW 實(shí)例
可以從某個(gè)查詢內(nèi)部、某個(gè)存儲(chǔ)過(guò)程內(nèi)部楚里,或者從另一個(gè)視圖內(nèi)部來(lái)使用視圖断部。通過(guò)向視圖添加函數(shù)
、join
等等班缎,我們可以向用戶精確地提交我們希望提交的數(shù)據(jù)蝴光。
樣本數(shù)據(jù)庫(kù) Northwind 擁有一些被默認(rèn)安裝的視圖。視圖 "Current Product List" 會(huì)從 Products 表列出所有正在使用的產(chǎn)品达址。這個(gè)視圖使用下列 SQL 創(chuàng)建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我們可以查詢上面這個(gè)視圖:
SELECT * FROM [Current Product List]
SQL Date 函數(shù)
SQL 日期
NOW()
返回當(dāng)前的日期和時(shí)間
CURDATE()
返回當(dāng)前的日期
CURTIME()
返回當(dāng)前的時(shí)間
DATE()
提取日期或日期/時(shí)間表達(dá)式的日期部分
EXTRACT()
返回日期/時(shí)間按的單獨(dú)部分
DATE_ADD()
給日期添加指定的時(shí)間間隔
DATE_SUB()
從日期減去指定的時(shí)間間隔
DATEDIFF()
返回兩個(gè)日期之間的天數(shù)
DATE_FORMAT()
用不同的格式顯示日期/時(shí)間
SQL Date 數(shù)據(jù)類型
MySQL 使用下列數(shù)據(jù)類型在數(shù)據(jù)庫(kù)中存儲(chǔ)日期或日期/時(shí)間值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
SQL Server 使用下列數(shù)據(jù)類型在數(shù)據(jù)庫(kù)中存儲(chǔ)日期或日期/時(shí)間值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: 唯一的數(shù)字
SQL 日期處理
如果不涉及時(shí)間部分蔑祟,那么我們可以輕松地比較兩個(gè)日期!
我們使用如下 SELECT 語(yǔ)句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
SQL NULL 值
NULL
值是遺漏的未知數(shù)據(jù)沉唠。
默認(rèn)地疆虚,表的列可以存放 NULL
值。
本章講解 IS NULL
和 IS NOT NULL
操作符满葛。
SQL NULL 值
如果表中的某個(gè)列是可選的径簿,那么我們可以在不向該列添加值的情況下插入新記錄或更新已有的記錄。這意味著該字段將以 NULL
值保存嘀韧。
NULL
值的處理方式與其他值不同篇亭。
NULL
用作未知的或不適用的值的占位符。
注釋:無(wú)法比較 NULL
和 0
乳蛾;它們是不等價(jià)的暗赶。
SQL IS NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
SQL NULL 函數(shù)
SQL ISNULL()、NVL()肃叶、IFNULL() 和 COALESCE() 函數(shù)
假如 "UnitsOnOrder" 是可選的蹂随,而且可以包含 NULL 值。
我們使用如下 SELECT 語(yǔ)句:
SELECT ProductName,UnitPrice(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中因惭,如果有 "UnitsOnOrder" 值是 NULL岳锁,那么結(jié)果是 NULL。
微軟的 ISNULL() 函數(shù)用于規(guī)定如何處理 NULL 值蹦魔。
NVL(), IFNULL() 和 COALESCE() 函數(shù)也可以達(dá)到相同的結(jié)果激率。
在這里咳燕,我們希望 NULL 值為 0。
下面乒躺,如果 "UnitsOnOrder" 是 NULL招盲,則不利于計(jì)算,因此如果值是 NULL 則 ISNULL() 返回 0嘉冒。
SQL Server / MS Access
SELECT ProductName,UnitPrice(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
Oracle 沒(méi)有 ISNULL() 函數(shù)曹货。不過(guò),我們可以使用 NVL() 函數(shù)達(dá)到相同的結(jié)果:
SELECT ProductName,UnitPrice(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
MySQL
MySQL 也擁有類似 ISNULL() 的函數(shù)讳推。不過(guò)它的工作方式與微軟的 ISNULL() 函數(shù)有點(diǎn)不同顶籽。
在 MySQL 中,我們可以使用 IFNULL() 函數(shù)银觅,就像這樣:
SELECT ProductName,UnitPrice(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或者我們可以使用 COALESCE() 函數(shù)礼饱,就像這樣:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
SQL 數(shù)據(jù)類型
這里只講MySQL的數(shù)據(jù)類型:
在 MySQL 中,有三種主要的類型:文本
究驴、數(shù)字
和日期/時(shí)間
類型镊绪。
![Upload 圖片.png failed. Please try again.]
SQL 服務(wù)器 - RDBMS
現(xiàn)代的 SQL 服務(wù)器構(gòu)建在 RDBMS 之上。
DBMS - 數(shù)據(jù)庫(kù)管理系統(tǒng)(Database Management System)
數(shù)據(jù)庫(kù)管理系統(tǒng)是一種可以訪問(wèn)數(shù)據(jù)庫(kù)中數(shù)據(jù)的計(jì)算機(jī)程序纳胧。
DBMS
使我們有能力在數(shù)據(jù)庫(kù)中提取镰吆、修改或者存貯信息。
不同的 DBMS
提供不同的函數(shù)供查詢跑慕、提交以及修改數(shù)據(jù)。
RDBMS - 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(Relational Database Management System)
關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng) (RDBMS) 也是一種數(shù)據(jù)庫(kù)管理系統(tǒng)摧找,其數(shù)據(jù)庫(kù)是根據(jù)數(shù)據(jù)間的關(guān)系來(lái)組織和訪問(wèn)數(shù)據(jù)的核行。
20 世紀(jì) 70 年代初,IBM 公司發(fā)明了 RDBMS蹬耘。
RDBMS 是 SQL 的基礎(chǔ)芝雪,也是所有現(xiàn)代數(shù)據(jù)庫(kù)系統(tǒng)諸如 Oracle、SQL Server综苔、IBM DB2惩系、Sybase、MySQL 以及 Microsoft Access 的基礎(chǔ)如筛。
SQL 函數(shù)
SQL 擁有很多可用于計(jì)數(shù)和計(jì)算的內(nèi)建函數(shù)堡牡。
函數(shù)的語(yǔ)法
內(nèi)建 SQL 函數(shù)的語(yǔ)法是:
SELECT function(列) FROM 表
函數(shù)的類型
在 SQL 中,基本的函數(shù)類型和種類有若干種杨刨。函數(shù)的基本類型是:
Aggregate 函數(shù)
Scalar 函數(shù)
aggregate:集合晤柄;合計(jì)
scalar: 標(biāo)量;數(shù)量
1)合計(jì)函數(shù)(Aggregate functions)
Aggregate 函數(shù)的操作面向一系列的值妖胀,并返回一個(gè)單一的值芥颈。
注釋:如果在 SELECT 語(yǔ)句的項(xiàng)目列表中的眾多其它表達(dá)式中使用 SELECT 語(yǔ)句惠勒,則這個(gè) SELECT 必須使用 GROUP BY
語(yǔ)句!
- Scalar 函數(shù)
Scalar 函數(shù)的操作面向某個(gè)單一的值爬坑,并返回基于輸入值的一個(gè)單一的值纠屋。
SQL AVG 函數(shù)
AVG 函數(shù)返回?cái)?shù)值列的平均值。NULL 值不包括在計(jì)算中盾计。
SELECT AVG(column_name) FROM table_name
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
現(xiàn)在售担,我們希望找到 OrderPrice 值高于 OrderPrice 平均值的客戶。
我們使用如下 SQL 語(yǔ)句:
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
SQL COUNT() 函數(shù)
COUNT()
函數(shù)返回匹配指定條件的行數(shù)闯估。
SQL COUNT() 語(yǔ)法
SQL COUNT(column_name) 語(yǔ)法
COUNT(column_name) 函數(shù)返回指定列的值的數(shù)目(NULL 不計(jì)入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT() 語(yǔ)法
COUNT() 函數(shù)返回表中的記錄數(shù):
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 實(shí)例
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
SQL FIRST() 函數(shù)
FIRST() 函數(shù)
FIRST()
函數(shù)返回指定的字段中第一個(gè)記錄的值贰锁。
SELECT FIRST(column_name) FROM table_name
SQL LAST() 函數(shù)
LAST() 函數(shù)返回指定的字段中最后一個(gè)記錄的值烦租。
提示:可使用 ORDER BY 語(yǔ)句對(duì)記錄進(jìn)行排序。
SELECT LAST(column_name) FROM table_name
SQL MAX() 函數(shù),SQL MIN() 函數(shù)
MAX
函數(shù)返回一列中的最大值。NULL
值不包括在計(jì)算中郑叠。
SELECT MAX(column_name) FROM table_name
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
SQL SUM() 函數(shù)
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
SQL GROUP BY 語(yǔ)句
合計(jì)函數(shù) (比如 SUM
) 常常需要添加 GROUP BY
語(yǔ)句。
GROUP BY
語(yǔ)句用于結(jié)合合計(jì)函數(shù)钥屈,根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組涛贯。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
現(xiàn)在,我們希望查找每個(gè)客戶的總金額(總訂單)侠姑。
我們想要使用 GROUP BY 語(yǔ)句對(duì)客戶進(jìn)行組合创橄。
我們使用下列 SQL 語(yǔ)句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
讓我們看一下如果省略 GROUP BY 會(huì)出現(xiàn)什么情況:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY 一個(gè)以上的列
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
SQL HAVING 子句
在 SQL 中增加 HAVING
子句原因是,WHERE
關(guān)鍵字無(wú)法與合計(jì)函數(shù)一起使用莽红。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
注意:WHERE 關(guān)鍵字無(wú)法與合計(jì)函數(shù)一起使用妥畏。
我們希望查找訂單總金額少于 2000 的客戶。
我們使用如下 SQL 語(yǔ)句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
SQL UCASE() 函數(shù), SQL LCASE() 函數(shù)
UCASE 函數(shù)把字段的值轉(zhuǎn)換為大寫安吁。
SQL LCASE() 函數(shù) 轉(zhuǎn)小寫醉蚁。
SQL UCASE() 語(yǔ)法
SELECT UCASE(column_name) FROM table_name
現(xiàn)在,我們希望選取 "LastName" 和 "FirstName" 列的內(nèi)容鬼店,然后把 "LastName" 列轉(zhuǎn)換為大寫网棍。
我們使用如下 SQL 語(yǔ)句:
SELECT UCASE(LastName) as LastName,FirstName FROM Persons
SQL MID() 函數(shù)
MID 函數(shù)用于從文本字段中提取字符。
Oracle是substr(xxx,0,10) 這樣
SELECT MID(column_name,start[,length]) FROM table_name
參數(shù) 描述
column_name 必需妇智。要提取字符的字段滥玷。
start 必需。規(guī)定開(kāi)始位置(起始值是 1)巍棱。
length 可選惑畴。要返回的字符數(shù)。如果省略拉盾,則 MID() 函數(shù)返回剩余文本桨菜。
現(xiàn)在,我們希望從 "City" 列中提取前 3 個(gè)字符。(從第一個(gè)字符開(kāi)始)
SELECT MID(City,1,3) as SmallCity FROM Persons
SQL LEN() 函數(shù)
LEN 函數(shù)返回文本字段中值的長(zhǎng)度倒得。
SELECT LEN(column_name) FROM table_name
SQL ROUND() 函數(shù)
ROUND 函數(shù)用于把數(shù)值字段舍入為指定的小數(shù)位數(shù)泻红。
SELECT ROUND(column_name,decimals) FROM table_name
column_name 必需。要舍入的字段霞掺。
decimals 必需谊路。規(guī)定要返回的小數(shù)位數(shù)。
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
SQL NOW() 函數(shù)
NOW 函數(shù)返回當(dāng)前的日期和時(shí)間菩彬。
如果您在使用 Sql Server 數(shù)據(jù)庫(kù)缠劝,請(qǐng)使用 getdate() 函數(shù)來(lái)獲得當(dāng)前的日期時(shí)間。
SELECT NOW() FROM table_name
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
SQL FORMAT() 函數(shù)
FORMAT 函數(shù)用于對(duì)字段的顯示進(jìn)行格式化骗灶。
SELECT FORMAT(column_name,format) FROM table_name
column_name 必需惨恭。要格式化的字段。
format 必需耙旦。規(guī)定格式脱羡。
SQL FORMAT() 實(shí)例
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products
·