《SQL高級應用和數據倉庫基礎(MySQL版)》學習筆記 ·007【簡單查詢】

一、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判斷要比較的值是否在範圍[A,B][\text{A}, \text{B}]


注意:

  • A>B\text{A} > \text{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).邏輯運算符

邏輯運算符包括notandor

注意:

  • not常常和其他運算符組合使用,如not innot betweennot likeis 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;
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章