SQL 是用于訪問和處理數(shù)據(jù)庫的標準的計算機語言,使用 SQL 訪問和處理數(shù)據(jù)系統(tǒng)中的數(shù)據(jù),這類數(shù)據(jù)庫包括:Oracle, Sybase, SQL Server, DB2, Access 等等。
SQL 能做什么?
SQL 面向數(shù)據(jù)庫執(zhí)行查詢
SQL 可從數(shù)據(jù)庫取回數(shù)據(jù)
SQL 可在數(shù)據(jù)庫中插入新的記錄
SQL 可更新數(shù)據(jù)庫中的數(shù)據(jù)
SQL 可從數(shù)據(jù)庫刪除記錄
SQL 可創(chuàng)建新數(shù)據(jù)庫
SQL 可在數(shù)據(jù)庫中創(chuàng)建新表
SQL 可在數(shù)據(jù)庫中創(chuàng)建存儲過程
SQL 可在數(shù)據(jù)庫中創(chuàng)建視圖
SQL 可以設置表、存儲過程和視圖的權限
數(shù)據(jù)庫表
一個數(shù)據(jù)庫通常包含一個或多個表。每個表由一個名字標識(例如“客戶”或者“訂單”)。表包含帶有數(shù)據(jù)的記錄(行)。
SQL 語句
您需要在數(shù)據(jù)庫上執(zhí)行的大部分工作都由 SQL 語句完成。
SQL DML 和 DDL
可以把 SQL 分為兩個部分:數(shù)據(jù)操作語言 (DML) 和 數(shù)據(jù)定義語言 (DDL)。
SQL (結(jié)構(gòu)化查詢語言)是用于執(zhí)行查詢的語法。但是 SQL 語言也包含用于更新、插入和刪除記錄的語法。
查詢和更新指令構(gòu)成了 SQL 的 DML 部分:
SELECT?- 從數(shù)據(jù)庫表中獲取數(shù)據(jù)
UPDATE?- 更新數(shù)據(jù)庫表中的數(shù)據(jù)
DELETE?- 從數(shù)據(jù)庫表中刪除數(shù)據(jù)
INSERT INTO?- 向數(shù)據(jù)庫表中插入數(shù)據(jù)
SQL 的數(shù)據(jù)定義語言 (DDL) 部分使我們有能力創(chuàng)建或刪除表格。我們也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。
SQL 中最重要的 DDL 語句:
CREATE DATABASE?- 創(chuàng)建新數(shù)據(jù)庫
ALTER DATABASE?- 修改數(shù)據(jù)庫
CREATE TABLE?- 創(chuàng)建新表
ALTER TABLE?- 變更(改變)數(shù)據(jù)庫表
DROP TABLE?- 刪除表
CREATE INDEX?- 創(chuàng)建索引(搜索鍵)
DROP INDEX?- 刪除索引
QL SELECT 語句
SELECT 語句用于從表中選取數(shù)據(jù)。
結(jié)果被存儲在一個結(jié)果表中(稱為結(jié)果集)。
SQL SELECT 語法
SELECT 列名稱 FROM 表名稱
以及:
SELECT * FROM 表名稱
注釋:SQL 語句對大小寫不敏感。SELECT 等效于 select。?星號(*)是選取所有列的快捷方式。
SQL SELECT DISTINCT 語句
在表中,可能會包含重復值。這并不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。
關鍵詞 DISTINCT 用于返回唯一不同的值。
語法:
SELECT DISTINCT 列名稱 FROM 表名稱
WHERE 子句用于規(guī)定選擇的標準。
WHERE 子句
如需有條件地從表中選取數(shù)據(jù),可將 WHERE 子句添加到 SELECT 語句。
語法
SELECT 列名稱 FROM 表名稱 WHERE 列 運算符 值
下面的運算符可在 WHERE 子句中使用:
操作符描述
=等于
<>不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某個范圍內(nèi)
LIKE搜索某種模式
注釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
引號的使用
請注意,我們在例子中的條件值周圍使用的是單引號。
SQL 使用單引號來環(huán)繞文本值(大部分數(shù)據(jù)庫系統(tǒng)也接受雙引號)。如果是數(shù)值,請不要使用引號。
AND 和 OR 運算符用于基于一個以上的條件對記錄進行過濾。
AND 和 OR 運算符
AND 和 OR 可在 WHERE 子語句中把兩個或多個條件結(jié)合起來。
如果第一個條件和第二個條件都成立,則 AND 運算符顯示一條記錄。
如果第一個條件和第二個條件中只要有一個成立,則 OR 運算符顯示一條記錄。
結(jié)合 AND 和 OR 運算符
我們也可以把 AND 和 OR 結(jié)合起來(使用圓括號來組成復雜的表達式):
SELECT * FROM Persons WHERE(FirstName='Thomas'ORFirstName='William')ANDLastName='Carter'
ORDER BY 語句用于對結(jié)果集進行排序。
ORDER BY 語句
ORDER BY 語句用于根據(jù)指定的列對結(jié)果集進行排序。
ORDER BY 語句默認按照升序?qū)τ涗涍M行排序。
如果您希望按照降序?qū)τ涗涍M行排序,可以使用 DESC 關鍵字。
列如:SELECT Company, OrderNumber FROM Orders?ORDER BY Company DESC, OrderNumber ASC
INSERT INTO 語句
INSERT INTO 語句用于向表格中插入新的行。
語法
INSERT INTO 表名稱 VALUES (值1, 值2,....)
我們也可以指定所要插入數(shù)據(jù)的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
Update 語句
Update 語句用于修改表中的數(shù)據(jù)。
語法:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
DELETE 語句
DELETE 語句用于刪除表中的行。
語法
DELETE FROM 表名稱 WHERE 列名稱 = 值
刪除所有行
可以在不刪除表的情況下刪除所有的行。這意味著表的結(jié)構(gòu)、屬性和索引都是完整的:
DELETE FROM table_name? 或者:DELETE * FROM table_name
TOP 子句
TOP 子句用于規(guī)定要返回的記錄的數(shù)目。
對于擁有數(shù)千條記錄的大型表來說,TOP 子句是非常有用的。
注釋:并非所有的數(shù)據(jù)庫系統(tǒng)都支持 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
SQL TOP PERCENT 實例
現(xiàn)在,我們希望從上面的 "Persons" 表中選取 50% 的記錄。
我們可以使用下面的 SELECT 語句:
SELECTTOP 50 PERCENT* FROM Persons
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
SQL LIKE 操作符語法
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern
例子:SELECT * FROM Persons WHERE City LIKE 'N%'
提示:"%" 可用于定義通配符(模式中缺少的字母)。
SQL 通配符
在搜索數(shù)據(jù)庫中的數(shù)據(jù)時,SQL 通配符可以替代一個或多個字符。
SQL 通配符必須與 LIKE 運算符一起使用。
在 SQL 中,可使用以下通配符:
通配符描述
%替代一個或多個字符
_僅替代一個字符
[charlist]字符列中的任何單一字符
[^charlist]
或者
[!charlist]
不在字符列中的任何單一字符
使用 % 通配符
例子 1
現(xiàn)在,我們希望從上面的 "Persons" 表中選取居住在以 "Ne" 開始的城市里的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons
WHERE City LIKE 'Ne%'
例子 2
接下來,我們希望從 "Persons" 表中選取居住在包含 "lond" 的城市里的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons
WHERE City LIKE '%lond%'
使用 _ 通配符
例子 1
現(xiàn)在,我們希望從上面的 "Persons" 表中選取名字的第一個字符之后是 "eorge" 的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons
WHERE FirstName LIKE '_eorge'
使用 [charlist] 通配符
例子 1
現(xiàn)在,我們希望從上面的 "Persons" 表中選取居住的城市以 "A" 或 "L" 或 "N" 開頭的人:
我們可以使用下面的 SELECT 語句:
SELECT * FROM Persons WHERE City LIKE '[ALN]%'
IN 操作符
IN 操作符允許我們在 WHERE 子句中規(guī)定多個值。
SQL IN 語法
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
例子
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
BETWEEN 操作符
操作符 BETWEEN ... AND 會選取介于兩個值之間的數(shù)據(jù)范圍。這些值可以是數(shù)值、文本或者日期。
SQL BETWEEN 語法
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
重要事項:不同的數(shù)據(jù)庫對 BETWEEN...AND 操作符的處理方式是有差異的。某些數(shù)據(jù)庫會列出介于 "Adams" 和 "Carter" 之間的人,但不包括 "Adams" 和 "Carter" ;某些數(shù)據(jù)庫會列出介于 "Adams" 和 "Carter" 之間并包括 "Adams" 和 "Carter" 的人;而另一些數(shù)據(jù)庫會列出介于 "Adams" 和 "Carter" 之間的人,包括 "Adams" ,但不包括 "Carter" 。
所以,請檢查你的數(shù)據(jù)庫是如何處理 BETWEEN....AND 操作符的!
SQL Alias
可以為列名稱和表名稱指定別名(Alias)
表的 SQL Alias 語法
SELECT column_name(s) FROM table_name AS alias_name
列的 SQL Alias 語法
SELECT column_name AS alias_name FROM table_name
SQL JOIN
JOIN: 如果表中有至少一個匹配,則返回行
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN: 只要其中一個表中存在匹配,就返回行
SQL UNION 操作符
UNION 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集。
請注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時,每條 SELECT 語句中的列的順序必須相同。
SQL UNION 語法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注釋:默認地,UNION 操作符選取不同的值。如果允許重復的值,請使用 UNION ALL。
SQL UNION ALL 語法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 結(jié)果集中的列名總是等于 UNION 中第一個 SELECT 語句中的列名。
SELECT INTO 語句
SELECT INTO 語句從一個表中選取數(shù)據(jù),然后把數(shù)據(jù)插入另一個表中。
SELECT INTO 語句常用于創(chuàng)建表的備份復件或者用于對記錄進行存檔。
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
CREATE DATABASE 語句
CREATE DATABASE 用于創(chuàng)建數(shù)據(jù)庫。
SQL CREATE DATABASE 語法
CREATE DATABASE database_name
CREATE TABLE 語句
CREATE TABLE 語句用于創(chuàng)建數(shù)據(jù)庫中的表。
SQL CREATE TABLE 語法
CREATE TABLE 表名稱
(
列名稱1 數(shù)據(jù)類型,
列名稱2 數(shù)據(jù)類型,
列名稱3 數(shù)據(jù)類型,
....
)
數(shù)據(jù)類型(data_type)規(guī)定了列可容納何種數(shù)據(jù)類型。下面的表格包含了SQL中最常用的數(shù)據(jù)類型:
數(shù)據(jù)類型描述
integer(size)
int(size)
smallint(size)
tinyint(size)
僅容納整數(shù)。在括號內(nèi)規(guī)定數(shù)字的最大位數(shù)。
decimal(size,d)
numeric(size,d)
容納帶有小數(shù)的數(shù)字。
"size" 規(guī)定數(shù)字的最大位數(shù)。"d" 規(guī)定小數(shù)點右側(cè)的最大位數(shù)。
char(size)容納固定長度的字符串(可容納字母、數(shù)字以及特殊字符)。
在括號中規(guī)定字符串的長度。
varchar(size)容納可變長度的字符串(可容納字母、數(shù)字以及特殊的字符)。
在括號中規(guī)定字符串的最大長度。
date(yyyymmdd)容納日期。
SQL 約束
約束用于限制加入表的數(shù)據(jù)的類型。
可以在創(chuàng)建表時規(guī)定約束(通過 CREATE TABLE 語句),或者在表創(chuàng)建之后也可以(通過 ALTER TABLE 語句)。
主要以下幾種約束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
SQL NOT NULL 約束
NOT NULL 約束強制列不接受 NULL 值。
NOT NULL 約束強制字段始終包含值。這意味著,如果不向字段添加值,就無法插入新記錄或者更新記錄。
SQL UNIQUE 約束
UNIQUE 約束唯一標識數(shù)據(jù)庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
SQL PRIMARY KEY 約束
PRIMARY KEY 約束唯一標識數(shù)據(jù)庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,并且每個表只能有一個主鍵。
SQL FOREIGN KEY 約束
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
CREATE INDEX 語句用于在表中創(chuàng)建索引。
在不讀取整個表的情況下,索引使數(shù)據(jù)庫應用程序可以更快地查找數(shù)據(jù)。
索引
您可以在表中創(chuàng)建索引,以便更加快速高效地查詢數(shù)據(jù)。
用戶無法看到索引,它們只能被用來加速搜索/查詢。
注釋:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由于索引本身也需要更新。因此,理想的做法是僅僅在常常被搜索的列(以及表)上面創(chuàng)建索引。
SQL CREATE INDEX 語法
在表上創(chuàng)建一個簡單的索引。允許使用重復的值:
CREATE INDEX index_name
ON table_name (column_name)
注釋:"column_name" 規(guī)定需要索引的列。
SQL CREATE UNIQUE INDEX 語法
在表上創(chuàng)建一個唯一的索引。唯一的索引意味著兩個行不能擁有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
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 語句用于刪除表(表的結(jié)構(gòu)、屬性以及索引也會被刪除):
DROP TABLE 表名稱
SQL DROP DATABASE 語句
DROP DATABASE 語句用于刪除數(shù)據(jù)庫:
DROP DATABASE 數(shù)據(jù)庫名稱
SQL TRUNCATE TABLE 語句
如果我們僅僅需要除去表內(nèi)的數(shù)據(jù),但并不刪除表本身,那么我們該如何做呢?
請使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數(shù)據(jù)):
TRUNCATE TABLE 表名稱
ALTER TABLE 語句
ALTER TABLE 語句用于在已有的表中添加、修改或刪除列。
SQL ALTER TABLE 語法
如需在表中添加列,請使用下列語法:
ALTER TABLE table_name ADD column_name datatype
要刪除表中的列,請使用下列語法:
ALTER TABLE table_name DROP COLUMN column_name
注釋:某些數(shù)據(jù)庫系統(tǒng)不允許這種在數(shù)據(jù)庫表中刪除列的方式 (DROP COLUMN column_name)。
要改變表中列的數(shù)據(jù)類型,請使用下列語法:
ALTER TABLE table_name ALTER COLUMN column_name datatype
DROP COLUMN 實例
ALTER TABLE Person DROP COLUMN Birthday