數據庫常用操作語句總結
- 一、基礎
- 二、高級
- 三、SQL 函數
一、基礎
1.select 語句
SELECT 語句用於從表中選取數據。
結果被存儲在一個結果表中(稱爲結果集)。
select 列名稱 from 表名稱
select * from 表名稱
在結果集(result-set)中導航:
由 SQL 查詢程序獲得的結果被存放在一個結果集中。大多數數據庫軟件系統都被允許使用編程函數在結果集中進行導航,比如:Move-To-First=Record、Get-Record-Content、Move-To-Next-Record 等等。
2.select distinct 語句
在表中,可能會包含重複值,關鍵詞 DISTINCT 用於返回唯一不同值。
SELECT DISTINCT 列名稱 FROM 表名稱
3.where 子句
如需要有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句。
SELECT * FROM 表名稱
where 列 運算符 值
運算符:大於、等於、小於、between、like…
SQL 使用單引號來環繞文本值。如果是數值,請不要使用引號。
4.and 和 or 運算符
AND 和 OR 可以在 WHERE 子句中把兩個或多個條件結合起來。
5.order by 語句
ORDER BY 語句用於根據指定的列對結果集進行排序。
ORDER BY 語句默認按照升序(ASC)進行排序,DESC 降序。
6.insert into 語句
INSERT INTO 語句用於向表格中插入新的行。
INSERT INTO 表名稱 VALUES(值1,值2,...)
我們也可以指定所要插入數據的列:
INSERT INTO table_name(列1,列2,...) VALUES(值1,值2,...)
7.update 語句
UPDATE 語句用於修改表中的數據。
UPDATE 表名稱 set 列名稱 = 新值
WHERE 列名稱 = 某值
8.delete 語句
DELETE 語句用於刪除表中的行。
DELETE FROM 表名稱 WHERE 列名稱 = 值
可以在不刪除表的情況下刪除所有行,這意味着表結構、屬性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name
二、高級
1.top 子句
TOP 子句用於規定要返回的記錄的數目。
對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。
SELECT TOP number|percent column_name(s)
FROM table_name
例如:選擇前兩個記錄
SELECT TOP 2 * FROM persons
選擇前50%的記錄
SELECT TOP 50 PERCENT * FROM persons
2.like 操作符
LIKE 操作符用於在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s)
FROM table_name
WHERE culumn_name LIKE pattern
例如:從 “ Persons ” 表中選取居住在帶 “ N ” 的城市裏的人
SELECT * FROM Persons
WHERE city LIKE '%N%'
’ % ’ 可以用於定義通配符(模式中缺少的字母)可爲空。
'%g'、'%lon%' 均可
通過使用 NOT 關鍵字,可以從 “ Persons ” 表中選取居住在不包含 “ lon ” 的城市裏的人:
SELECT * FROM Persons
WHERE city NOT LIKE '%lon%'
3.SQL 通配符
直接上例子:
使用%通配符
從 “ Persons ” 表中選取居住在包含 “ lond ” 的城市裏的人:
SELECT * FROM Persons
WHERE city LIKE '%lond%'
使用_通配符
從 “ Persons ” 表中選取名字的第一個字符之後是 “ eorge ” 的人:
SELECT * FROM Persons
WHERE firstName LIKE '_eorge'
從 “ Persons ” 表中選取的這條記錄的姓氏以 “ C ” 開頭,然後是任意一個字符,然後是 “ r ”,然後是任意字符,然後是 “ er ” 的人:
SELECT * FROM Persons
WHERE lastName LIKE 'C_r_er'
使用 [charlist] 通配符
從 “ Persons ” 表中選取居住的城市以 “A” 或 “L” 或 “N” 開頭的人:
SELECT * FROM Persons
WHERE city LIKE '[ALN]%'
從 “ Persons ” 表中選取居住的城市不以 “A” 或 “L” 或 “N” 開頭的人:
SELECT * FROM Persons
WHERE city LIKE '[!ALN]%'
4.in 操作符
IN 操作符允許我們在 WHERE 子句中規定多個值。
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
例如:從 “ Persons ” 表中選取名字是 “ Adams ” 和 “ Carter ” 的人
SELECT * FROM Persons
WHERE lastName IN ('Adams','Carter')
5.between 操作符
操作符 BETWEEN…AND 會選取介於兩個值之間的數據範圍。這些值可以是數值、文本或日期。
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
如需選擇範圍之外的,請使用 NOT 操作符,加在 between 前面。
6.as 別名
爲列名稱和表名稱指定別名(Alias)
SELECT column_name AS cn
FROM table_name AS tn
7.join 表關聯
有時爲了得到完整的結果,我們需要從兩個或更多的表中獲取結果,我們就需要執行join。
SELECT Persons.lastName, Persons.firstName, Orders.orderNo
FROM Persons INNER JOIN Orders
ON Persons.id_p = Orders.id_p
ORDER BY Persons.lastName
下面列出了幾種 JOIN 類型,以及它們之間的差異:
- inner join:如果表中有至少一個匹配,則返回該行。
- left join:左外連接,即使右表中沒有匹配,也從左表返回所有行。
- right join:右外連接,即使左表沒有匹配,也從右表返回所有行。
- full join:只要其中一個表中存在匹配,就返回所有行。
8.sql union 操作符
UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
SELECT column_name(s) FROM table_name1
UNION (ALL)
SELECT column_name(s) FROM table_name2
註釋:默認的,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。另外,UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。
例如:列出所有在中國和美國的不同的僱員名:
SELECT E_name FROM Employees_Chaina
UNION
SELECT E_name FROM Employees_USA
9.select into 語句
SELECT INTO 語句從一個表中選取數據,然後把數據插入另一個表中。
SELECT INTO 語句常用於創建表單備份復件或者用於對記錄存檔。
我們可以把所有的列插入新表:
SELECT *
INTO new_table_name [IN exeternaldatebase]
FROM old_tablename
或者只把希望的列插入新表:
SELECT column_name(s)
INTO new_table_name [IN externaldatebase]
FROM old_tablename
下面的例子會製作 “ Persons ” 表的備份復件:
SELECT *
INTO Persons_backup
FROM Persons
IN 子句可用於向另一個數據庫中拷貝表:
SELECT *
INTO Persons
IN 'Backup.mdb'
FROM Persons
上面的操作,可以在最後添加 where 子句,也能使用 join 從一個以上的表中選取數據。
10.create database 語句
CREATE DATABASE 用於創建數據庫。
CREATE DATABASE database_naem
11.create table 語句
CREATE TABLE 語句用於創建數據庫中的表。
CREATE TABLE 表名稱
(
列名稱1 數據類型,
列名稱2 數據類型,
列名稱3 數據類型,
...
)
12.sql 約束
約束用於限制加入表的數據類型。
可以在創建表時規定約束(通過 CREATE TABLE 語句),或者在創建之後(通過 ALTER TABLE 語句)。
主要有以下幾種約束:
- not null
- unique
- primary key
- foreign key
- check
- default
sql not null 約束
NOT NULL 約束強制列不接受 NULL 值。
NOT 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 約束
UNIQUE 約束唯一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均爲列或者列集合提供了唯一性的保證。
PRIMARY KEY 擁有自動定義的 UNIQUE 約束。
注意:每個表可以有多個 UNIQE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
例如:在 " Persons " 表創建時對 " id_P " 列進行 UNIQUE 約束
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)
)
或:
CREATE TABLE Persons
(
id_P int NOT NULL UNIQUE,
lastName varchar(255) NOT NULL,
firstName varchar(255),
address varchar(255),
city varchar(255)
)
如果需要命名 UNIQUE 約束,以及約束多個列:
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)
)
當表已被創建時,如需再 “ id_P ” 列創建 UNIQUE 約束:
ALTER TABLE Persons
ADD UNIQUE (id_P)
如果需要命名 UNIQUE 約束,並定義多個列的 UNIQUE 約束:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (id_P,lastName)
如果需要撤銷 UNIQUE 約束:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
sql primary key 約束
PRIMARY KEY 約束唯一標識數據庫表中的每條記錄。
主鍵必須包含唯一的值。
主鍵列不能包含 NULL 值。
每個表都應該有一個主鍵,並且每個表只能有一個主鍵。
列如:在 " Persons " 表創建時對 " id_P " 列創建 PRIMARY KEY 約束:
CREATE TABLE Persons
(
id_p int NOT NULL,
lastName varchar(255) NOT NULL,
firstName varcar(255),
address varchar(255),
city varchar(255),
PRIMARY KEY (id_P)
)
或
CREATE TABLE Persons
(
id_p int NOT NULL PRIMARY KEY,
lastName varchar(255) NOT NULL,
firstName varcar(255),
address varchar(255),
city varchar(255)
)
如果需要命名約束,以及多個列定義約束、表已存在的情況下創建或命名、撤銷約束,語法和上述 UNIQUE 相同。
sql foreign key 約束
一個表中的 FOREIGN KEY 指向另一個表中的 PRIMARY KEY。
PRIMARY KEY 約束用於預防破壞表之連接的動作。
PRIMARY KEY 約束也能防止非法數據插入外鍵列,因爲它必須是它指向的那個表中的值之一。
例如:在 “ Orders ” 表創建時爲 “ id_P ” 列創建 PRIMARY KEY :
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)
)
或
CREATE TABLE Orders
(
id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
id_P int FOREIGN KEY REFERENCES Persons(id_P)
)
如果需要命名約束,以及爲多個列定義約束、表已存在的情況下創建或命名、撤銷約束。語法和上述 UNIQUE 相同。
sql check 約束
check 約束用於限制列中的值的範圍。
如果對單個列定義 check 約束,那麼該列只允許特定的值。
如果對一個表定義 check 約束,那麼此約束會在特定的列中對值進行限制。
下面的 SQL 在 “Persons” 表創建時爲 “id_P” 列創建 check 約束。規定 “id_P” 列必須只包含大於 0 的整數。
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)
)
或者
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)
)
如果需要命名約束,以及爲多個列定義約束、表已存在的情況下創建或命名、撤銷約束。語法和上述 UNIQUE 相同。
sql default 約束
default 約束用於向列中插入默認值。
如果沒有規定其他的值,那麼會將默認值添加到所有的新紀錄。
下面的 SQL 在 “Persons” 表創建時爲 “City” 列創建 default 約束:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT '杭州'
)
通過使用類似 getdate() 這樣的函數,default 約束也可以用於插圖系統值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)
如果在表已存在的情況下爲 “City” 列創建 default 約束,請使用下面的 SQL:
ALTER TABLE Persons
ALTER (COLUMN) City SET DEFAULT '杭州'
如果撤銷 default 約束,請使用下面的 SQL:
ALTER TABLE Persons
ALTER (COLUMN) City DROP DEFAULT
13.create index 語句(索引)
用於在表中創建索引。
在不讀取整個表的情況下,索引使數據庫應用程序可以更快地查找數據。
理想做法是僅僅在常用的列(以及表)上面創建索引。
sql create index 語法
在表上創建一個簡單的索引。允許使用重複的值:
CREATE INDEX index_name
ON table_name (column_name)
註釋:“column_name” 規定需要索引的列
在表上創建一個唯一的索引。唯一的索引意味着兩個不能擁有相同的索引值。
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
本例會創建一個簡單的索引,名爲 “PersonIndex”,在 Person 表的 Last Name 列:
CREATE INDEX PersongIndex
ON Person (LastName)
可以索引不止一個列,在括號中列出這些列的名稱,用逗號隔開。
14.drop 語句
通過使用 drop 語句,可以輕鬆的刪除索引、表和數據庫。
刪除索引:
DROP INDEX index_name ON table_name
drop table 語句用於刪除表(表的結構、屬性以及索引也會被刪除):
DROP TABLE 表名稱
drop database 語句用於刪除數據庫:
DROP DATABASE 數據庫名稱
如果我們僅僅需要除去表內的數據,但並不刪除表本身,那麼我們該如何做呢?
使用 TRUNCATE TABLE 命令(僅僅刪除表格中的數據):
TRUNCATE TABLE 表名稱
15.alter table 語句
alter table 語句用於在已有的表中添加、修改或刪除列
如需要在表中添加列,請使用下列語法:
ALTER TABLE table_name
ADD column_name datatype
要刪除表中的列,請使用下列語法:
ALTER TABLE table_name
DROP COLUM column_name
16.auto increment 字段(自增)
我們通常希望在每次插入新紀錄時,自動的創建主鍵字段的值。
我們可以在表中創建一個 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)
)
默認的,AUTO_INCREMENT 的開始值是 1,每條新紀錄遞增 1。
要讓 AUTO_INCREMENT 序列以其他的值起始,請使用下列 SQL 語法:
ALTER TABLE Persons AUTO_INCREMENT = 100
要在 “Persons” 表中插入新紀錄,我們不必爲 “p_id” 列規定值(會自動添加一個唯一的值)
17.sql create view 語句(視圖)
什麼是視圖?
在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、where 以及 join 語句,我們也可以提交數據,就像這些來自於某個單一的表。
CREATE VIEW viewe_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
可以從某個查詢內部、某個存儲過程內部,或者從另一個試圖內部來使用視圖。通過向視圖添加函數、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)
我們可以使用下面的語法來更新視圖:
CREATE OR REPLACE VIEW view_name AW
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
我們可以通過 DROP VIEW 命令來刪除視圖。
DROP VIEW view_name
18.sql 日期
MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:
- DATE - 格式 YYYY-MM-DD
- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
- YEAR - 格式 YYYY 或 YY
如果不涉及時間部分,那麼我們可以輕鬆地比較兩個日期!
如果我們希望使查詢簡單且更易維護,那麼就不要在日期中使用時間部分!
19.sql null 值
如果表中的某個列是可選的,那麼我們可以在不向該列添加值的情況下插入新記錄或更新已又的記錄。這意味着該字段將以 NULL 值保存。
NULL 值的處理方式與其他值不同。
NULL 用作未知的或不適用的值的佔位符。
無法使用比較運算符來測試 NULL 值,比如 =,<,<>。
我們必須使用 IS NULL 和 IS NOT NULL 操作符。
切記始終使用 IS NULL 來查找 NULL 值。
Oracle 沒有 ISNULL() 函數。不過,我們可以使用 NVL() 函數
【語法】NVL (expr1, expr2)
【功能】若expr1爲NULL,返回expr2;expr1不爲NULL,返回expr1。
注意兩者的類型要一致
三、SQL 函數
SQL 擁有很多可以用於計數和計算的內建函數。
內建 SQL 函數的語法是:
SELECT function(列) FROM 表
1.SQL AVG() – 平均值
AVG 函數返回數值列的平均值。NULL 值不包括在計算中。
SQL AVG() 語法
SELECT AVG(column_name) FROM table_name
2.SQL COUNT() – 行數
COUNT() 函數返回匹配指定條件的行數。
SQL COUNT() 語法
SQL COUNT(column_name) 語法
COUNT(column_name) 函數返回指定列的值的數目(NULL 不計入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(DISTINCT column_name) 語法
COUNT(DISTINCT column_name) 函數返回指定列的不同值的數目:
SELECT COUNT(DISTINCT column_name) FROM table_name
3.FIRST() – 第一個值
FIRST() 函數返回指定字段中第一個記錄的值。
(提示:可以使用 ORDER BY 語句對記錄進行排序)
SELECT FIRST(column_name) FROM table_name
4.LAST() – 最後一個值
LAST() 函數返回指定的字段中最後一個記錄的值。
(提示:可以使用 ORDER BY 語句對記錄進行排序)
SELECT LAST(column_name) FROM table_name
5.MAX() – 最大值
MAX 函數返回一列中的最大值。NULL 值不包括在計算中。
SELECT MAX(column_name) FROM table_name
6.MIN() – 最小值
MIN 函數返回一列中的最小值。NULL 值不包括在計算中。
SELECT MIN(column_name) FROM table_name
7.SUM() – 總數
SUM 函數返回數值列的總數(總額)。
SELECT SUM(column_name) FROM table_name
8.GROUP BY – 分組
GROUP BY 語句用於結合合計函數,根據一個或多個列對結果集進行分組。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
例子:
希望查找每個客戶的總金額(總訂單)。(每個客戶有多個訂單)
我們想要使用 GROUP BY 語句對客戶進行組合。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
原表
結果:
9.HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函數一起使用。
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
現在,我們希望查找訂單總金額少於 2000 的客戶。
我們使用如下 SQL 語句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
10.UCASE() – 轉爲大寫
UCASE 函數把字段的值轉換爲大寫。
SELECT UCASE(column_name) FROM table_name
11.LCASE() – 轉爲小寫
LCASE 函數把字段的值轉換爲小寫。
SELECT LCASE(column_name) FROM table_name
12.MID() – 提取字符
MID 函數用於從文本字段中提取字符。
SELECT MID(column_name,start[,length]) FROM table_name
column_name | 必需。要提取字符的字段。 |
---|---|
start | 必需。規定開始位置(起始值是 1)。 |
length | 可選。要返回的字符數。如果省略,則 MID() 函數返回剩餘文本。 |
現在,我們希望從 “City” 列中提取前 3 個字符。
SELECT MID(City,1,3) as SmallCity FROM Persons
13.LEN() – 長度
LEN 函數返回文本字段中值的長度。
SELECT LEN(column_name) FROM table_name
14.ROUND() – 指定位數
ROUND 函數用於把數值字段舍入爲指定的小數位數。
SELECT ROUND(column_name,decimals) FROM table_name
15.NOW() – 當前的日期和時間
NOW 函數返回當前的日期和時間。
SELECT NOW() FROM table_name
16.FORMAT() – 格式化
FORMAT 函數用於對字段的顯示進行格式化。
SELECT FORMAT(column_name,format) FROM table_name
參數 | 描述 |
---|---|
column_name | 必需。要格式化的字段。 |
format | 必需。規定格式。 |
現在,我們希望顯示每天日期所對應的名稱和價格(日期的顯示格式是 “YYYY-MM-DD”)。
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD') as PerDate
FROM Products
好事定律:每件事最後都會是好事,如果不是好事,說明還沒到最後。