1. 程式人生 > 資料庫 >MySQL排序查詢,常見函式,分組查詢,連線查詢

MySQL排序查詢,常見函式,分組查詢,連線查詢

MySQL排序查詢,常見函式,分組查詢,連線查詢


2020-12-1

排序查詢
常見函式
分組查詢
連線查詢

排序查詢

1. 語法

select 查詢列表
from 表
where 篩選條件
order by 排序列表 【asc升序/desc降序】

2. 特點

  1. asc :升序,如果不寫預設升序
    desc:降序
  2. 排序列表 支援 單個欄位、多個欄位、函式、表示式、別名
  3. order by的位置一般放在查詢語句的最後(除limit語句之外)

常見函式

1. 概述

功能:類似於java中的方法
好處:提高重用性和隱藏實現細節
呼叫:select 函式名(實參列表);

2. 單行函式

  1. 字元函式
    concat:連線
    substr:擷取子串
    upper:變大寫
    lower:變小寫
    replace:替換
    length:獲取位元組長度
    trim:去前後空格
    lpad:左填充
    rpad:右填充
    instr:獲取子串第一次出現的索引
  2. 數學函式
    ceil:向上取整
    round:四捨五入
    mod:取模
    floor:向下取整
    truncate:截斷
    rand:獲取隨機數,返回0-1之間的小數
  3. 日期函式
    now:返回當前日期+時間
    curdate:返回當前日期
    curtime:返回當前時間
    year:返回年
    month:返回月
    monthname:以英文形式返回月
    day:返回日
    hour
    :返回小時
    minute:返回分鐘
    second:返回秒
    date_format:將日期轉換成字元
    str_to_date:將字元轉換成日期
    datediff:返回兩個日期相差的天數
  4. 其他函式
    version : 當前資料庫伺服器的版本
    database : 當前開啟的資料庫
    user : 當前使用者
    password('字元'):返回該字元的密碼形式
    md5('字元') : 返回該字元的md5加密形式
  5. 流程控制函式
    if(條件表示式,表示式1,表示式2):如果條件表示式成立,返回表示式1,否則返回表示式2
#case 情況1
#--------------------------
case 變數或表示式或欄位
when 常量1 then 值1
when 常量2 then 值2
...
else 值n
end
#--------------------------
#case 情況2
#--------------------------
case 
when 條件1 then 值1
when 條件2 then 值2
...
else 值n
end

3. 分組函式

  1. 分類
    max: 最大值
    min: 最小值
    sum: 和
    avg: 平均值
    count: 計算個數
  2. 特點
    ①語法
    select max(欄位) from 表名;
    
    ②支援的型別
    sumavg一般用於處理數值型
    maxmincount可以處理任何資料型別
    ③以上分組函式都忽略null
    ④都可以搭配distinct使用,實現去重的統計
    select sum(distinct 欄位) from 表;
    
    ⑤count函式
    count(欄位):統計該欄位非空值的個數
    count(*):統計結果集的行數
    效率上:
    MyISAM儲存引擎,count(*)最高
    InnoDB儲存引擎,count(*)count(1)效率高於count(欄位)
    ⑥ 和分組函式一同查詢的欄位,要求是group by後出現的欄位

分組查詢

1. 語法

select 分組函式,分組後的欄位
from 表
【where 篩選條件】
group by 分組的欄位
【having 分組後的篩選】
【order by 排序列表】

(【】)表示可選

2. 特點

使用關鍵字篩選的表位置
分組前篩選where原始表group by的前面
分組後篩選having分組後的結果group by 的後面

連線查詢

1. 含義

當查詢中涉及到了多個表的欄位,需要使用多表連線

select 欄位1,欄位2
from 表1,表2,...;

笛卡爾乘積:當查詢多個表時,沒有新增有效的連線條件,導致多個表所有行實現完全連線
如何解決:新增有效的連線條件

2. 分類

按年代分類:
sql92:

等值
非等值
自連線
也支援一部分外連線(用於oracle、sqlserver,mysql不支援)

sql99【推薦使用】

  • 內連線

等值
非等值
自連線

  • 外連線

左外
右外
全外(mysql不支援)

  • 交叉連線

3. SQL92語法

1. 等值連線

語法:

select 查詢列表
from 表1 別名,表2 別名
where 表1.key=表2.key
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】

特點:

① 一般為表起別名
②多表的順序可以調換
③n表連線至少需要n-1個連線條件
④等值連線的結果是多表的交集部分

2. 非等值連線

語法:

select 查詢列表
from 表1 別名,表2 別名
where 非等值的連線條件
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】

3. 自連線

語法:

select 查詢列表
from 表 別名1,表 別名2
where 等值的連線條件
【and 篩選條件】
【group by 分組欄位】
【having 分組後的篩選】
【order by 排序欄位】

4. SQL99語法

1.內連線

語法:

select 查詢列表
from 表1 別名
【inner】 join 表2 別名 on 連線條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;

特點:

①表的順序可以調換
②內連線的結果=多表的交集
③n表連線至少需要n-1個連線條件

分類:

等值連線
非等值連線
自連線

2.外連線

語法:

select 查詢列表
from 表1 別名
left|right|full【outer】 join 表2 別名 on 連線條件
where 篩選條件
group by 分組列表
having 分組後的篩選
order by 排序列表
limit 子句;

特點:

①查詢的結果=主表中所有的行,如果從表和它匹配的將顯示匹配行,如果從表沒有匹配的則顯示null
②left join 左邊的就是主表,right join 右邊的就是主表
full join 兩邊都是主表
③一般用於查詢除了交集部分的剩餘的不匹配的行

3.交叉連線

語法:

select 查詢列表
from 表1 別名
cross join 表2 別名;

特點:

類似於笛卡爾乘積