基本查詢
MySQL 數據庫使用SELECT語句來查詢數據。
查詢字段
- 以下為在MySQL數據庫中查詢數據通用的 SELECT 語法:
SELECT 字段名,字段名... FROM 表名;
- 選擇全部列
SELECT * FROM emp; -- 查詢所有字段
一般情況下,除非需要使用表中所有的字段數據,最好不要使用通配符‘*’。使用通配符雖然可以節省輸入查詢語句的時間,但是獲取不需要的列數據通常會降低查詢和所使用的應用程序的效率。
- 選擇指定的列
SELECT empno,ename,job FROM emp;
列(字段)別名
在很多情況下為了方便查看結果或者簡化字段名,會對查詢的字段取別名。
- 語法:
SELECT 字段1 [AS 別名],字段2 [AS 別名]... FROM 表名;
- 舉例一:
通過直接在選擇的列或表后面提供別名
SELECT empno 員工編號,ename 員工姓名,job 工作 FROM emp;
- 舉例二:
使用AS
關鍵字為查詢結果的列或表取別名
SELECT empno AS 員工編號,ename AS 員工姓名,job AS 工作 FROM emp;
- 舉例三:
還可以用單引號或雙引號把別名包裹起來。
SELECT empno AS "員工編號",ename AS "員工姓名",job AS "工作" FROM emp; -- 用雙引號包裹別名SELECT empno AS '員工編號',ename AS '員工姓名',job AS '工作' FROM emp; -- 用單引號包裹別名
當別名中包含空格時,必須用單引號或雙引號進行包裹!如下:
SELECT empno AS 員工 編號 FROM emp;
會直接報錯:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '編號 FROM emp' at line 1
SELECT empno AS "員工 編號" FROM emp;
DISTINCT去重
從表中查詢數據時,可能會收到重復的行記錄。為了刪除這些重復行,可以在SELECT
語句中使用DISTINCT
子句。
- 語法
SELECT DISTINCT 字段列表 FROM 表名;
單列中使用 DISTINCT
查詢員工表(emp)中所有員工的崗位(job)有哪些。
SELECT job FROM emp;
執行SQL語句,得到如下結果:
可看到上面結果中,有些結果是重復的,比如:SALESMAN
,MANAGER
為了做到相同的結果只顯示一個就要刪除重復的記錄,將DISTINCT
子句添加到SELECT
語句中即可
SELECT DISTINCT job FROM emp;
查詢到的結果如下:
可以看到,當使用DISTINCT
子句時,重復的job被消除了。
多列中使用 DISTINCT
- 舉例二:查詢員工表(emp)中,job對應的部門(deptno),去掉重復記錄
SELECT DISTINCT job,deptno FROM emp;
這里會發現job或者deptno中會有重復,但是這個并沒有問題DISTINCT
是刪除重復的行,這里并沒有哪一行是重復的。
注意DISTNCT關鍵字必須寫在所有字段之前
空值參與運算
先來一個查詢案例,查詢員工年薪,即 (sal+comm)* 12。
SELECT ename,(sal + comm)*12 AS '年薪' FROM emp;
查詢結果集如下:
發現有很多員工的年薪竟然是NULL,白干一年!這是為啥呢,emp表中每個員工都是有薪資的,只不過不是所有員工都有獎金,有的是NULL。當NULL值參與運算時,計算的結果一定是NULL,所以要對NULL進行處理!
SELECT ename,sal + IFNULL(comm,0)*12 AS '年薪' FROM emp;
IFNULL(expr, value_if_null)
是一個處理NULL值的函數expr
是要處理的表達式,而value_if_null是表達式為NULL時的值,這樣就不會出現被公司白嫖一年的情況了。
注意:空值不等于任何值,甚至不等于NULL。
要想判斷是不是NULL值,必須使用IS NULL
。
SELECT NULL IS NULL;
查詢常數
在使用MySQL進行數據查詢時,經常需要加入一列常數來進行特定的計算或篩選。通過在SELECT語句中使用常數值和別名,可以方便地在查詢結果中添加一列常數。
比如,我們想對emp表中的員工姓名進行查詢,同時增加一列字段corporation
,這個字段固定為“XX公司”,可以這樣寫:
SELECT 'XX公司' AS 'corporation',ename FROM emp;
條件查詢
從 MySQL 表中使用 SELECT 語句來查詢數據,如需有條件地從表中選取數據,可將 WHERE 子句添加到 SELECT 語句中。
語法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
在條件中,可以使用以下基本的比較操作符進行比較也可以用下面的邏輯運算符連接多個條件
運算符表
關系運算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<=> | 安全等于 |
<> 或 != | 不等于 |
邏輯運算符 | 功能 |
---|---|
AND 或 && | 并且(多個條件同時成立) |
OR 或 || | 或者(多個條件任意成立一個) |
NOT 或 ! | 非,不是 |
XOR | 邏輯異或 (一真一假才為真) |
其他 | 功能 |
---|---|
BETWEEN…AND… | 在某個范圍之間(含最小、最大值) |
[NOT] IN(…) | 在in之后的列表中的值,多選一 |
LIKE | 模糊匹配(_匹配單個字符,%匹配任意個字符) |
IS [NOT] NULL | 是 NULL |
REGEXP | 正則表達式運算符 |
RLIKE | 正則表達式運算符 |
LEAST | 最小值運算符 |
GREATEST | 最大值運算符 |
查詢需求
- 查詢工資等于3000的員工
SELECT * FROM emp WHERE emp.sal<3000;
- 查詢沒有獎金的員工
SELECT * FROM emp WHERE emp.comm IS NULL;
- 查詢工資在1200到1800之間的員工(包含1200和1800歲)
SELECT * FROM emp WHERE emp.sal BETWEEN 1200 AND 1800;
- 查詢職位為推銷員,且工資小于1500的員工
SELECT * FROM emp WHERE emp.sal BETWEEN 1200 AND 1800 && emp.job='SALESMAN';
- 查詢姓名為四個字的員工
SELECT * FROM emp WHERE emp.ename LIKE '____';
#'____'是四個連續的下劃線,注意下劃線之間不要有空格
- 查詢姓名最后一位是S的員工
SELECT * FROM emp WHERE emp.ename LIKE '%S';
排序查詢
通過條件查詢語句可以查詢到符合用戶需求的數據,但是查詢到的數據一般都是按照數據最初被添加到表中的順序來顯示。為了使查詢結果的順序滿足用戶的要求,在 MySQL 中,你可以使用 ORDER BY 子句對查詢結果進行排序。ORDER BY 允許你按照一個或多個列的值對結果進行升序(ASC)或降序(DESC)排序。
語法
SELECT 字段名 FROM 表名 ... ORDER BY 排序字段名 [ASC|DESC],[排序字段名 [ASC|DESC]];
語法說明:
- 排序字段名:表示需要排序的字段名稱,多個字段時用逗號隔開。
- ASC|DESC:
ASC
表示字段按升序排序;DESC
表示字段按降序排序。其中ASC
為默認值。
特點
- ORDER BY子句一般放到查詢語句的最后面,LIMIT字句除外。
- 當排序的字段中存在空值時,ORDER BY 會將該空值作為最小值來對待。在語句后加上
NULLS LAST
空值會最后出現。 - ORDER BY 指定多個字段進行排序時,MySQL 會按照字段的順序從左到右依次進行排序。
- 注意:在對多個字段進行排序時,排序的第一個字段必須有相同的值,才會對第二個字段進行排序。如果第一個字段數據中所有的值都是唯一的,MySQL 將不再對第二個字段進行排序。
查詢需求
- 根據姓名對員工進行排序(升序)
SELECT * FROM emp ORDER BY emp.ename ASC;
- 查詢入職時間大于1981年6月6日的員工信息,并按照入職時間升序排列
SELECT * FROM emp WHERE emp.hiredate>'1981-6-6' ORDER BY emp.hiredate ASC;
- 根據工作職位,進行升序排列,職位相同的情況下,再根據入職時間降序排列
SELECT * FROM emp ORDER BY emp.job ASC , emp.hiredate DESC;
分頁查詢
對于比較多的數據,如果在一個頁面全部顯示,查看起來會眼花繚亂。
進行分頁查詢有兩種寫法,如下所示:
LIMIT
SELECT 字段名 FROM 表名 LIMIT 起始索引,查詢記錄數;
SELECT column1, column2, ...
FROM table_name
LIMIT 20 OFFSET 10;
#這將返回從第 21 條記錄開始的下 10 條記錄
LIMIT OFFSET
SELECT 字段名 FROM 表名 LIMIT 查詢記錄數 OFFSET 起始索引;
User
SELECT column1, column2, ...
FROM table_name
LIMIT 20 offset 10;
#這將返回從第11條記錄開始的后續20條記錄