文章目錄
一、select語句
1、作用
select語句具備以下功能:
- 選擇
- 投影
- 連接
2、語法
select語句格式如下:
select [distinct] * from 表名;
select [distinct] 列名列表 from 表名;
select [distinct] 表達式 [from 表名];
注:select * from 表名
和select 所有列 from 表名
結果雖然一樣,但是從性能上講select * from 表名
的性能要差一點。因此在數據量很大的時候,如果要查詢所有值,還是建議用select 所有列 from 表名
進行查詢
3、空值處理
任何直接包含null
值的算術表達式運算後的結果仍然爲空值
select null + 100; -- 結果仍爲null
ifnull(表達式1, 表達式2)
在計算時對null
值進行替換處理:當表達式1爲null
時,整個式子值爲表達式1,否則值爲表達式2
注:MySQL中的ifnull
函數,可以相當於Oracle中的nvl
函數
select ifnull(1, 2); -- 結果爲1
select ifnull(null, 2); -- 結果爲2
4、反引號、單引號、雙引號
反引號
反引號用於區分保留字、關鍵字與其他內容,通常用於列名或者表名。
select `name` from `use`;
單引號
表達某個字符串的值。
select * from emp where ename = 'smith';
如果值中包含單引號,可以在單引號字符串內用兩個單引號轉義,也可以用在雙引號字符串內直接用一個單引號(推薦用法)
select * from emp where ename = 'smi''th';
select * from emp where ename = "smi'th"; -- 推薦寫法
雙引號
通常用於列的別名,也可以用於表達字符串的值
select * from emp where ename = "smith";
如果值中包含雙引號,可以在雙引號字符串內用兩個雙引號轉義,也可以用在單引號字符串內直接用一個雙引號(推薦用法)
select * from emp where ename = "smi""th";
select * from emp where ename = 'smi"th'; -- 推薦寫法
5、列和表的別名
列的別名
-
用法
列名 新列名 -- 寫法1 列名 as 新列名 -- 寫法2
-
注意事項
當新列名中包含空格、大小寫、特殊字符時,新列名可以使用反引號、單引號、雙引號
-
英文轉中文的常用場景
- 查詢中SQL語句別名
- 視圖中SQL語句別名
- 前端頁面展示頁面處理 -
使用示例
select ename as 姓名, sal as 工資 from emp; select enmae as `NAME`, sal*12 as "年 薪" from emp;
6、distinct去重
使用distinct
關鍵字消除查詢結果的重複行
select job from emp;
select distinct job from emp;
7、查詢表結構
使用desc
關鍵字查詢表結構
desc 表名;
8、條件查詢
(1).限定條件
使用where
子句增加查詢限定條件
select [distinct] 列名列表
from 表名
where 條件表達式;
(2).常用比較運算符
運算符 | 含義 |
---|---|
= | 等於 |
> | 大於 |
>= | 大於等於 |
< | 小於 |
<= | 小於等於 |
<> | 不等於 |
注意:日期一般不建議使用比較運算符,統一使用日期函數
(3).特殊比較運算符
between ... and ...
between A and B
判斷要比較的值是否在範圍內
注意:
- 若,則
between A and B
表達式值爲false
- 也可以用於日期的範圍
in
in
的功能類似於or
,判斷某個/某些字段是否落在某個集合中
注意:
in
支持多列同時判斷,但是僅支持子查詢
使用示例:
-- 單列判斷 select from emp where mgr in(7902, 7566); -- 多列同時判斷 select from emp where (job, mgr) in ('CLERK', 7902); -- 錯誤寫法 select from emp where (job, mgr) in (select 'CLERK', 7902); -- 正確寫法
like
like
運算符用於模糊查詢。
注意:
- 支持通配符——
%
匹配任意個字符、_
匹配單個字符- 通常與函數
concat(str1, str2, ...)
配合使用,這一點主要是便於配合後端程序的使用,比如Java- SQL Server中大量存在類似正則表達式書寫方式來表示範圍的
[]
運算符,但是MySQL不支持。
使用示例:
-- 查詢姓名以S開頭的員工 select * from emp where ename like 'S%'; -- 查詢姓名包含S的員工 select * from emp where ename like '%S%'; select * from emp where ename like concat('%', 'S', '%'); -- Java中寫法
is null
is null
用於空值判斷,與其相反的是is not null
(4).邏輯運算符
邏輯運算符包括not
、and
、or
注意:
-
not
常常和其他運算符組合使用,如not in
、not between
、not like
、is not null
-
使用邏輯運算符要勤加括號,避免優先級問題
9、order by 子句
使用order by
子句對查詢結果進行排序
- 在日常使用中,所有語句都應該提供order by
- 排序規則:
數值(大小)、字符串(字典序)、日期(越近越大)、空值null(最小) - 升序/降序:
升序:asc
(默認)
降序:desc
- 排序方式:
可以根據列名、列別名、列的順序編號進行排序
可以設置多列排序,效果就相當於第一關鍵字、第二關鍵字…… - 注意:
order by
的列,建議使用列索引提高查詢效率
對於計算列、函數表達式……不建議使用order by
- 使用示例
/* 根據某列進行排序 */ select empno, ename, sal * 12 salOfYear from emp order by sal * 12; select empno, ename, sal * 12 salOfYear from emp order by salOfYear; select empno, ename, sal * 12 salOfYear from emp order by 3; /* 根據多列進行排序 */ select empno, ename, hiredate, sal * 12 salOfYear from emp order by hiredate asc, salOfYear asc;
10、limit
使用limit
關鍵字對查詢結果進行分頁
- 格式
select 字段列表 from 表名 limit [start_val, ]length; -- 從第start_val條記錄開始,
- 注意:
start_val從0開始標記,可以缺省、默認值也爲0
分頁時,多次查詢的數據可能不一致,所以在使用limit
的時候一定要使用order by
- 使用示例
-- 查詢年薪(不帶獎金)前三的相關員工信息 select empno, ename, hiredate, sal*12 salOfYear from emp order by salOfYear desc limit 0, 3;