目錄
- 📚 前言
- 🌴 SQL 介紹
- 🌼 什么是 SQL
- 🌀 SQL 的型別
- 🌵 學習 SQL 的作用
- 🍄 資料庫是什么
- 🐥 SQL 基礎語言學習
- 🐤 CREATE TABLE – 創建表
- 🐑 INSERT – 插入資料
- 🐼 SELECT – 查詢資料
- 🐫 DISTINCT – 去除重復值
- 🐸 WHERE – 條件過濾
- 🐹 AND & OR – 運算子
- 🐰 ORDER BY – 排序
- 🐱 UPDATE – 更新資料
- 🐨 DELETE – 洗掉資料
- 🐵 TRUNCATE TABLE – 清除表資料
- 🐯 DROP TABLE – 洗掉表
- 🚀 SQL 高級言語學習
- 🚢 LIKE – 查找類似值
- 🚤 IN – 鎖定多個值
- ?? BETWEEN – 選取區間資料
- 🚂 AS – 別名
- 🚁 JOIN – 多表關聯
- 🚜 UNION – 合并結果集
- 🚌 NOT NULL – 非空
- 🚐 VIEW – 視圖
- 🎯 SQL 常用函式學習
- 🍔 AVG – 平均值
- 🍕 COUNT – 匯總行數
- 🍘 MAX – 最大值
- 🍢 MIN – 最小值
- 🍰 SUM – 求和
- 🍪 GROUP BY – 分組
- 🍭 HAVING – 句尾連接
- 🍷 UCASE/UPPER – 大寫
- 🍶 LCASE/LOWER – 小寫
- 👛 LEN/LENGTH – 獲取長度
- 🍗 ROUND – 數值取舍
- 🍞 NOW/SYSDATE – 當前時間
- 🍺 寫在最后
- ?? 粉絲專屬福利
📚 前言

文章結尾有 SQL 小測驗哦!看看你能得幾分?
?? 點我跳轉到 SQL 測驗!
🌴 SQL 介紹
🌼 什么是 SQL
SQL 是用于訪問和處理資料庫的標準的計算機語言,
- SQL 指結構化查詢語言
- SQL 使我們有能力訪問資料庫
- SQL 是一種 ANSI 的標準計算機語言

SQL 可與資料庫程式協同作業,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統,但是由于各種各樣的資料庫出現,導致很多不同版本的 SQL 語言,為了與 ANSI 標準相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等),這些就是我們要學習的SQL基礎,
🌀 SQL 的型別
可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL),
- 資料查詢語言(DQL: Data Query Language)
- 資料操縱語言(DML:Data Manipulation Language)
🌵 學習 SQL 的作用
SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作資料庫系統,SQL 陳述句用于取回和更新資料庫中的資料,
- SQL 面向資料庫執行查詢
- SQL 可從資料庫取回資料
- SQL 可在資料庫中插入新的記錄
- SQL 可更新資料庫中的資料
- SQL 可從資料庫洗掉記錄
- SQL 可創建新資料庫
- SQL 可在資料庫中創建新表
- SQL 可在資料庫中創建存盤程序
- SQL 可在資料庫中創建視圖
- SQL 可以設定表、存盤程序和視圖的權限
🍄 資料庫是什么
顧名思義,你可以理解為資料庫是用來存放資料的一個容器,
打個比方,每個人家里都會有冰箱,冰箱是用來干什么的?冰箱是用來存放食物的地方,

同樣的,資料庫是存放資料的地方,正是因為有了資料庫后,我們可以直接查找資料,例如你每天使用余額寶查看自己的賬戶收益,就是從資料庫讀取資料后給你的,
最常見的資料庫型別是關系型資料庫管理系統(RDBMS):
RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access等等,

RDBMS 中的資料存盤在被稱為表(tables)的資料庫物件中,表 是相關的資料項的集合,它由列和行組成,
由于本文主要講解 SQL 基礎,因此對資料庫不做過多解釋,只需要大概了解即可,咱們直接開始學習SQL!
🐥 SQL 基礎語言學習
在了解 SQL 基礎陳述句使用之前,我們先講一下 表 是什么?
一個資料庫通常包含一個或多個表,每個表由一個名字標識(例如“客戶”或者“訂單”),表包含帶有資料的記錄(行),
下面的例子是一個名為 “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 |
上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市),
有表才能查詢,那么如何創建這樣一個表?
🐤 CREATE TABLE – 創建表
CREATE TABLE 陳述句用于創建資料庫中的表,
語法:
CREATE TABLE 表名稱
(
列名稱1 資料型別,
列名稱2 資料型別,
列名稱3 資料型別,
....
);
資料型別(data_type)規定了列可容納何種資料型別,下面的表格包含了SQL中最常用的資料型別:
| 資料型別 | 描述 |
|---|---|
| integer(size),int(size),smallint(size),tinyint(size) | 僅容納整數、在括號內規定數字的最大位數 |
| decimal(size,d),numeric(size,d) | 容納帶有小數的數字、“size” 規定數字的最大位數、“d” 規定小數點右側的最大位數 |
| char(size) | 容納固定長度的字串(可容納字母、數字以及特殊字符)、在括號中規定字串的長度 |
| varchar(size) | 容納可變長度的字串(可容納字母、數字以及特殊的字符)、在括號中規定字串的最大長度 |
| date(yyyymmdd) | 容納日期 |
實體:
本例演示如何創建名為 “Persons” 的表,
該表包含 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 陳述句向空表寫入資料,
🐑 INSERT – 插入資料
INSERT INTO 陳述句用于向表格中插入新的行,
語法:
INSERT INTO 表名稱 VALUES (值1, 值2,....);
我們也可以指定所要插入資料的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);
實體:
本例演示 “Persons” 表插入記錄的兩種方式:
1、插入新的行
INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
2、在指定的列中插入資料
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');

插入成功后,資料如下:

這個資料插入之后,是通過 SELECT 陳述句進行查詢出來的,別急馬上講!
🐼 SELECT – 查詢資料
SELECT 陳述句用于從表中選取資料,結果被存盤在一個結果表中(稱為結果集),
語法:
SELECT * FROM 表名稱;
我們也可以指定所要查詢資料的列:
SELECT 列名稱 FROM 表名稱;
📢 注意: SQL 陳述句對大小寫不敏感,SELECT 等效于 select,
實體:
SQL SELECT * 實體:
SELECT * FROM Persons;

📢 注意: 星號(*)是選取所有列的快捷方式,
如需獲取名為 “LastName” 和 “FirstName” 的列的內容(從名為 “Persons” 的資料庫表),請使用類似這樣的 SELECT 陳述句:
SELECT LastName,FirstName FROM Persons;

🐫 DISTINCT – 去除重復值
如果一張表中有多行重復資料,如何去重顯示呢?可以了解下 DISTINCT ,
語法:
SELECT DISTINCT 列名稱 FROM 表名稱;
實體:
如果要從 “LASTNAME” 列中選取所有的值,我們需要使用 SELECT 陳述句:
SELECT LASTNAME FROM Persons;

可以發現,在結果集中,Wilson 被列出了多次,
如需從 “LASTNAME” 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 陳述句:
SELECT DISTINCT LASTNAME FROM Persons;

通過上述查詢,結果集中只顯示了一列 Wilson,顯然已經去除了重復列,
🐸 WHERE – 條件過濾
如果需要從表中選取指定的資料,可將 WHERE 子句添加到 SELECT 陳述句,
語法:
SELECT 列名稱 FROM 表名稱 WHERE 列 運算子 值;
下面的運算子可在 WHERE 子句中使用:
| 運算子 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某個范圍內 |
| LIKE | 搜索某種模式 |
📢 注意: 在某些版本的 SQL 中,運算子 <> 可以寫為 !=,
實體:
如果只希望選取居住在城市 “Beijing” 中的人,我們需要向 SELECT 陳述句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing';

📢 注意: SQL 使用單引號來環繞文本值(大部分資料庫系統也接受雙引號),如果是數值,請不要使用引號,
🐹 AND & OR – 運算子
AND 和 OR 可在 WHERE 子陳述句中把兩個或多個條件結合起來,
- 如果第一個條件和第二個條件都成立,則 AND 運算子顯示一條記錄,
- 如果第一個條件和第二個條件中只要有一個成立,則 OR 運算子顯示一條記錄,
語法:
AND 運算子實體:
SELECT * FROM 表名稱 WHERE 列 運算子 值 AND 列 運算子 值;
OR 運算子實體:
SELECT * FROM 表名稱 WHERE 列 運算子 值 OR 列 運算子 值;
實體:
由于 Persons 表資料太少,因此增加幾條記錄:
INSERT INTO Persons VALUES (2, 'Adams', 'John', 'Oxford Street', 'London');
INSERT INTO Persons VALUES (3, 'Bush', 'George', 'Fifth Avenue', 'New York');
INSERT INTO Persons VALUES (4, 'Carter', 'Thomas', 'Changan Street', 'Beijing');
INSERT INTO Persons VALUES (5, 'Carter', 'William', 'Xuanwumen 10', 'Beijing');
SELECT * FROM Persons;

AND 運算子實體:
使用 AND 來顯示所有姓為 “Carter” 并且名為 “Thomas” 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';

OR 運算子實體:
使用 OR 來顯示所有姓為 “Carter” 或者名為 “Thomas” 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter';

結合 AND 和 OR 運算子:
我們也可以把 AND 和 OR 結合起來(使用圓括號來組成復雜的運算式):
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter';

🐰 ORDER BY – 排序
ORDER BY 陳述句用于根據指定的列對結果集進行排序,默認按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字,
語法:
SELECT * FROM 表名稱 ORDER BY 列1,列2 DESC;
默認排序為 ASC 升序,DESC 代表降序,
實體:
以字母順序顯示 LASTNAME 名稱:
SELECT * FROM Persons ORDER BY LASTNAME;

空值(NULL)默認排序在有值行之后,
以數字順序顯示ID_P,并以字母順序顯示 LASTNAME 名稱:
SELECT * FROM Persons ORDER BY ID_P,LASTNAME;

以數字降序顯示ID_P:
SELECT * FROM Persons ORDER BY ID_P DESC;

📢 注意: 在第一列中有相同的值時,第二列是以升序排列的,如果第一列中有些值為 null 時,情況也是這樣的,
🐱 UPDATE – 更新資料
Update 陳述句用于修改表中的資料,
語法:
UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值;
實體:
更新某一行中的一個列:
目前 Persons 表有很多欄位為 null 的資料,可以通過 UPDATE 為 LASTNAME 是 “Wilson” 的人添加FIRSTNAME:
UPDATE Persons SET FirstName = 'Fred' WHERE LastName = 'Wilson';

更新某一行中的若干列:
UPDATE Persons SET ID_P = 6,city= 'London' WHERE LastName = 'Wilson';

🐨 DELETE – 洗掉資料
DELETE 陳述句用于洗掉表中的行,
語法:
DELETE FROM 表名稱 WHERE 列名稱 = 值;
實體:
洗掉某行:
洗掉 Persons 表中 LastName 為 “Fred Wilson” 的行:
DELETE FROM Persons WHERE LastName = 'Wilson';

洗掉所有行:
可以在不洗掉表的情況下洗掉所有的行,這意味著表的結構、屬性和索引都是完整的:
DELETE FROM table_name;

🐵 TRUNCATE TABLE – 清除表資料
如果我們僅僅需要除去表內的資料,但并不洗掉表本身,那么我們該如何做呢?
可以使用 TRUNCATE TABLE 命令(僅僅洗掉表格中的資料):
語法:
TRUNCATE TABLE 表名稱;
實體:
本例演示如何洗掉名為 “Persons” 的表,
TRUNCATE TABLE persons;
🐯 DROP TABLE – 洗掉表
DROP TABLE 陳述句用于洗掉表(表的結構、屬性以及索引也會被洗掉),
語法:
DROP TABLE 表名稱;
實體:
本例演示如何洗掉名為 “Persons” 的表,
drop table persons;

從上圖可以看出,第一次執行洗掉時,成功洗掉了表 persons,第二次執行洗掉時,報錯找不到表 persons,說明表已經被洗掉了,
🚀 SQL 高級言語學習
🚢 LIKE – 查找類似值
LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式,
語法:
SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 LIKE 值;
實體:
Persons 表插入資料:
INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
INSERT INTO Persons VALUES (2, 'Adams', 'John', 'Oxford Street', 'London');
INSERT INTO Persons VALUES (3, 'Bush', 'George', 'Fifth Avenue', 'New York');
INSERT INTO Persons VALUES (4, 'Carter', 'Thomas', 'Changan Street', 'Beijing');
INSERT INTO Persons VALUES (5, 'Carter', 'William', 'Xuanwumen 10', 'Beijing');
select * from persons;

1、現在,我們希望從上面的 “Persons” 表中選取居住在以 “N” 開頭的城市里的人:
SELECT * FROM Persons WHERE City LIKE 'N%';

2、接下來,我們希望從 “Persons” 表中選取居住在以 “g” 結尾的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%g';

3、接下來,我們希望從 “Persons” 表中選取居住在包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City LIKE '%on%';

4、通過使用 NOT 關鍵字,我們可以從 “Persons” 表中選取居住在不包含 “lon” 的城市里的人:
SELECT * FROM Persons WHERE City NOT LIKE '%on%';

📢注意: “%” 可用于定義通配符(模式中缺少的字母),
🚤 IN – 鎖定多個值
IN 運算子允許我們在 WHERE 子句中規定多個值,
語法:
SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 IN (值1,值2,值3);
實體:
現在,我們希望從 Persons 表中選取姓氏為 Adams 和 Carter 的人:
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter');

?? BETWEEN – 選取區間資料
運算子 BETWEEN … AND 會選取介于兩個值之間的資料范圍,這些值可以是數值、文本或者日期,
語法:
SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 BETWEEN 值1 AND 值2;
實體:
1、查詢以字母順序顯示介于 “Adams”(包括)和 “Carter”(不包括)之間的人:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter';

2、查詢上述結果相反的結果,可以使用 NOT:
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter';

📢 注意: 不同的資料庫對 BETWEEN…AND 運算子的處理方式是有差異的,
某些資料庫會列出介于 “Adams” 和 “Carter” 之間的人,但不包括 “Adams” 和 “Carter” ;某些資料庫會列出介于 “Adams” 和 “Carter” 之間并包括 “Adams” 和 “Carter” 的人;而另一些資料庫會列出介于 “Adams” 和 “Carter” 之間的人,包括 “Adams” ,但不包括 “Carter” ,
所以,請檢查你的資料庫是如何處理 BETWEEN…AND 運算子的!
🚂 AS – 別名
通過使用 SQL,可以為列名稱和表名稱指定別名(Alias),別名使查詢程式更易閱讀和書寫,
語法:
表別名:
SELECT 列名稱/(*) FROM 表名稱 AS 別名;
列別名:
SELECT 列名稱 as 別名 FROM 表名稱;
實體:
使用表名稱別名:
SELECT p.LastName, p.FirstName
FROM Persons p
WHERE p.LastName='Adams' AND p.FirstName='John';

使用列名別名:
SELECT LastName "Family", FirstName "Name" FROM Persons;

📢 注意: 實際應用時,這個 AS 可以省略,但是列別名需要加上 " ",
🚁 JOIN – 多表關聯
JOIN 用于根據兩個或多個表中的列之間的關系,從這些表中查詢資料,
有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果,我們就需要執行 join,
資料庫中的表可通過鍵將彼此聯系起來,主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的,在表中,每個主鍵的值都是唯一的,這樣做的目的是在不重復每個表中的所有資料的情況下,把表間的資料交叉捆綁在一起,

如圖,“Id_P” 列是 Persons 表中的的主鍵,這意味著沒有兩行能夠擁有相同的 Id_P,即使兩個人的姓名完全相同,Id_P 也可以區分他們,
?? 為了下面實驗的繼續,我們需要再創建一個表:Orders,
create table orders (id_o number,orderno number,id_p number);
insert into orders values(1,11111,1);
insert into orders values(2,22222,2);
insert into orders values(3,33333,3);
insert into orders values(4,44444,4);
insert into orders values(6,66666,6);
select * from orders;

如圖,“Id_O” 列是 Orders 表中的的主鍵,同時,“Orders” 表中的 “Id_P” 列用于參考 “Persons” 表中的人,而無需使用他們的確切姓名,
select * from persons p,orders o where p.id_p=o.id_p;

可以看到,“Id_P” 列把上面的兩個表聯系了起來,
語法:
select 列名
from 表A
INNER|LEFT|RIGHT|FULL JOIN 表B
ON 表A主鍵列 = 表B外鍵列;
不同的 SQL JOIN:
下面列出了您可以使用的 JOIN 型別,以及它們之間的差異,
- JOIN: 如果表中有至少一個匹配,則回傳行
- INNER JOIN: 內部連接,回傳兩表中匹配的行
- LEFT JOIN: 即使右表中沒有匹配,也從左表回傳所有的行
- RIGHT JOIN: 即使左表中沒有匹配,也從右表回傳所有的行
- FULL JOIN: 只要其中一個表中存在匹配,就回傳行
實體:
如果我們希望列出所有人的定購,可以使用下面的 SELECT 陳述句:
SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
INNER JOIN Orders o
ON p.Id_P = o.Id_P
ORDER BY p.LastName DESC;

🚜 UNION – 合并結果集
UNION 運算子用于合并兩個或多個 SELECT 陳述句的結果集,
UNION 語法:
SELECT 列名 FROM 表A
UNION
SELECT 列名 FROM 表B;
📢注意: UNION 運算子默認為選取不同的值,如果查詢結果需要顯示重復的值,請使用 UNION ALL,
UNION ALL 語法:
SELECT 列名 FROM 表A
UNION ALL
SELECT 列名 FROM 表B;
另外,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 陳述句中的列名,
為了實驗所需,創建 Person_b 表:
CREATE TABLE Persons_b
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
INSERT INTO Persons_b VALUES (1, 'Bill', 'Gates', 'Xuanwumen 10', 'Londo');
INSERT INTO Persons_b VALUES (2, 'John', 'Adams', 'Oxford Street', 'nBeijing');
INSERT INTO Persons_b VALUES (3, 'George', 'Bush', 'Fifth Avenue', 'Beijing');
INSERT INTO Persons_b VALUES (4, 'Thomas', 'Carter', 'Changan Street', 'New York');
INSERT INTO Persons_b VALUES (5, 'William', 'Carter', 'Xuanwumen 10', 'Beijing');
select * from persons_b;

實體:
使用 UNION 命令:
列出 persons 和 persons_b 中不同的人:
select * from persons
UNION
select * from persons_b;

📢注意: UNION 內部的 SELECT 陳述句必須擁有相同數量的列,列也必須擁有相似的資料型別,同時,每條 SELECT 陳述句中的列的順序必須相同,
🚌 NOT NULL – 非空
NOT NULL 約束強制列不接受 NULL 值,
NOT NULL 約束強制欄位始終包含值,這意味著,如果不向欄位添加值,就無法插入新記錄或者更新記錄,
語法:
CREATE TABLE 表
(
列 int NOT NULL
);
如上,創建一個表,設定列值不能為空,
實體:
create table lucifer (id number not null);
insert into lucifer values (NULL);

📢 注意: 如果插入 NULL 值,則會報錯 ORA-01400 提示無法插入!
?? 拓展小知識:NOT NULL 也可以用于查詢條件:
select * from persons where FirstName is not null;

同理,NULL 也可:
select * from persons where FirstName is null;
感興趣的朋友,可以自己嘗試一下!
🚐 VIEW – 視圖
在 SQL 中,視圖是基于 SQL 陳述句的結果集的可視化的表,
視圖包含行和列,就像一個真實的表,視圖中的欄位就是來自一個或多個資料庫中的真實的表中的欄位,我們可以向視圖添加 SQL 函式、WHERE 以及 JOIN 陳述句,我們也可以提交資料,就像這些來自于某個單一的表,
語法:
CREATE VIEW 視圖名 AS
SELECT 列名
FROM 表名
WHERE 查詢條件;
📢 注意: 視圖總是顯示最近的資料,每當用戶查詢視圖時,資料庫引擎通過使用 SQL 陳述句來重建資料,
實體:
下面,我們將 Persons 表中住在 Beijing 的人篩選出來創建視圖:
create view persons_beijing as
select * from persons where city='Beijing';

查詢上面這個視圖:

如果需要更新視圖中的列或者其他資訊,無需洗掉,使用 CREATE OR REPLACE VIEW 選項:
CREATE OR REPLACE VIEW 視圖名 AS
SELECT 列名
FROM 表名
WHERE 查詢條件;
實體:
現在需要篩選出,LASTNAME 為 Gates 的記錄:
create or replace view persons_beijing as
select * from persons where lastname='Gates';


洗掉視圖就比較簡單,跟表差不多,使用 DROP 即可:
drop view persons_beijing;

?? 本章要講的高級語言就先到此為止,不宜一次性介紹太多~
🎯 SQL 常用函式學習
SQL 擁有很多可用于計數和計算的內建函式,
函式的使用語法:
SELECT function(列) FROM 表;
?? 下面就來看看有哪些常用的函式!
🍔 AVG – 平均值
AVG 函式回傳數值列的平均值,NULL 值不包括在計算中,
語法:
SELECT AVG(列名) FROM 表名;
實體:
計算 “orderno” 欄位的平均值,
select avg(orderno) from orders;

當然,也可以用在查詢條件中,例如查詢低于平均值的記錄:
select * from orders where orderno < (select avg(orderno) from orders);

🍕 COUNT – 匯總行數
COUNT() 函式回傳匹配指定條件的行數,
語法:
count() 中可以有不同的語法:
- COUNT(*) :回傳表中的記錄數,
- COUNT(DISTINCT 列名) :回傳指定列的不同值的數目,
- COUNT(列名) :回傳指定列的值的數目(NULL 不計入),
SELECT COUNT(*) FROM 表名;
SELECT COUNT(DISTINCT 列名) FROM 表名;
SELECT COUNT(列名) FROM 表名;
實體:
COUNT(*) :
select count(*) from persons;

COUNT(DISTINCT 列名) :
select count(distinct city) from persons;

COUNT(列名) :
select count(city) from persons;

🍘 MAX – 最大值
MAX 函式回傳一列中的最大值,NULL 值不包括在計算中,
語法:
SELECT MAX(列名) FROM 表名;
MIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值,
實體:
select max(orderno) from orders;

🍢 MIN – 最小值
MIN 函式回傳一列中的最小值,NULL 值不包括在計算中,
語法:
SELECT MIN(列名) FROM 表名;
實體:
select min(orderno) from orders;

🍰 SUM – 求和
SUM 函式回傳數值列的總數(總額),
語法:
SELECT SUM(列名) FROM 表名;
實體:
select sum(orderno) from orders;

🍪 GROUP BY – 分組
GROUP BY 陳述句用于結合合計函式,根據一個或多個列對結果集進行分組,
語法:
SELECT 列名A, 統計函式(列名B)
FROM 表名
WHERE 查詢條件
GROUP BY 列名A;
實體:
獲取 Persons 表中住在北京的總人數,根據 LASTNAME 分組:
select lastname,count(city) from persons
where city='Beijing'
group by lastname;

如果不加 GROUP BY 則會報錯:

也就是常見的 ORA-00937 不是單組分組函式的錯誤,
🍭 HAVING – 句尾連接
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用,
語法:
SELECT 列名A, 統計函式(列名B)
FROM table_name
WHERE 查詢條件
GROUP BY 列名A
HAVING 統計函式(列名B) 查詢條件;
實體:
獲取 Persons 表中住在北京的總人數大于1的 LASTNAME,根據 LASTNAME 分組:
select lastname,count(city) from persons
where city='Beijing'
group by lastname
having count(city) > 1;

🍷 UCASE/UPPER – 大寫
UCASE/UPPER 函式把欄位的值轉換為大寫,
語法:
select upper(列名) from 表名;
實體:
選取 “LastName” 和 “FirstName” 列的內容,然后把 “LastName” 列轉換為大寫:
select upper(lastname),firstname from persons;

🍶 LCASE/LOWER – 小寫
LCASE/LOWER 函式把欄位的值轉換為小寫,
語法:
select lower(列名) from 表名;
實體:
選取 “LastName” 和 “FirstName” 列的內容,然后把 “LastName” 列轉換為小寫:
select lower(lastname),firstname from persons;

👛 LEN/LENGTH – 獲取長度
LEN/LENGTH 函式回傳文本欄位中值的長度,
語法:
select length(列名) from 表名;
實體:
獲取 LASTNAME 的值字符長度:
select length(lastname),lastname from persons;

🍗 ROUND – 數值取舍
ROUND 函式用于把數值欄位舍入為指定的小數位數,
語法:
select round(列名,精度) from 表名;
實體:
保留2位:
select round(1.1314,2) from dual;
select round(1.1351,2) from dual;


📢 注意:ROUND 取舍是 四舍五入 的!
取整:
select round(1.1351,0) from dual;
select round(1.56,0) from dual;

🍞 NOW/SYSDATE – 當前時間
NOW/SYSDATE 函式回傳當前的日期和時間,
語法:
select sysdate from 表名;
實體:
獲取當前時間:
select sysdate from dual;

📢 注意: 如果您在使用 Sql Server 資料庫,請使用 getdate() 函式來獲得當前的日期時間,
🍺 寫在最后
上述如果都學完了的話,可以來做個小測驗:SQL 測驗,看看掌握的怎么樣!
?? 測驗會被記分:
每道題的分值是 1 分,在您完成全部的20道題之后,系統會為您的測驗打分,并提供您做錯的題目的正確答案,其中,綠色為正確答案,而紅色為錯誤答案,
? 現在就開始測驗! 祝您好運,
?? 將你的得分寫在下方的投票欄吧,讓我看看大家的水平如何???
?? 粉絲專屬福利
玩轉 Linux: 《玩轉 Vagrant 系列》
玩轉 Oracle: 《Oracle 一鍵安裝腳本》
安裝 Oracle: 《Oracle 零基礎安裝》
運維小知識: 《每天一個DBA小知識》
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/313568.html
標籤:其他
