天天看點

最全的資料庫select語句總結 條件查詢 分組查詢 排序 查詢部分行 多表關聯查詢 子查詢 邏輯視圖查詢 文法順序

select

查詢項

select*from 表名 查詢全部列

select distinct 列名 from 表名 查詢指定列,重複項不顯示,經常用于擷取清單,不顯示重複項,一般不适用與兩個列,因為很少有兩個列一樣的,特殊統計

select id,name from 表名 查詢指定列名

select name myname from 表名 指定結果列别名

select 表名.列名 ,。。from 表名 指定列所屬表,多表查詢時使用

select sum(id),count(amount)from 表名 使用聚合函數用于統計

select sum(case name when ‘assss’ then 1 else 0 end)from class

判斷name列是否為 ’asss‘ 值,是=1,否=0,通過sum()擷取統計結果

擷取單列不同狀态的統計

查詢條件

條件

true

select*from 表名 where id=100 基本條件查詢

select*from 表名 别名 where name=‘aa’ and sex=1 複合查詢,表别名

運算符

and or 支援()包含優先

= > < >= <= !=通用判斷

like 模糊查詢 *select from 表名 where 列 like ’%aa_‘

% 代表0至多個字元 _代表1個未知字元

in 包含 select*from calss where id in(1,2,3)

between 範圍查詢 *select from class where id between 1 and 5

is | not is null判斷 隻能 is null 或is not null 不能 is “aaa” 不支援字元串

exists 存在查詢,查詢的是子查詢是否有記錄,傳回布爾值

select*from class where id=1 and exists(select id from aaa)

分組

:group by 目标:便于統計,分組統計為核心

擷取不重複項,可以擷取多列的不重複項

select*from class GROUP BY name;

一般與聚合函數組合使用

select sum(列名) from 表名 group by 列名

select count(1),name from class group by name;

select count(1),name from class group by name,id;

統計判斷:having 和where差別,where是在沒查出來之前限制,having是在查出來之後篩選

having

一般和group by一起使用(類似于做了兩次操作,當很麻煩一次查不出來的時候,可以用這種方法)

擷取組裡面隻有一條記錄的行

select name from calss group by name having count(1)>1;

排序:order by 兩種asc順序(預設值),desc逆序

先按name排序,然後name一樣的再按id倒序

select*from class order by name,id desc

查詢部分行:limit 查詢部分行,用于換頁

select*from class limit 2 ;隻顯示前兩條記錄

select*from class limit 1,3;從第二條開始顯示3條記錄,1是起始行的,3是最大行數(通過組合實作換頁功能,隻需更改起始行)

**多表關聯:**概念

一對一:列的額外擴充

主鍵關聯:必然關聯,不自動編号 例如:學生和學生的保險狀況

外鍵關聯:非必然關聯,有些人有這些記錄,有些人可以沒有,自動編号,不關心主鍵是否一樣

一對多:多方加外鍵,一件事物,多方對一方補充,多方一個不能少,因為一方由多方組成

業務單據–大潤發收據(單據總表和明細表)

多對一:多方加外鍵,兩表沒有必須性依賴

一方對多方的資料補充(學生,班級),多方可以少,少了多方,那一方也能存在,并不是組成關系

多對多:再建立關聯表(三個表),商品和倉庫之間的關系(庫存表)

庫存表結構:商品id,倉庫id,庫存數

多表關系查詢:

外聯:表關聯關系寫在where中,不推薦使用,因為它寫在where中

select u.*,c.name classname from user u,calss c where u.classid=c.id;表别名 列别名,一旦用表别名,就不能寫原來的列

内聯:

inner join

select* from user inner join calss on user.classid=calss.id; //還可以連用

select* from user inner join calss on user.classid=calss.id inner join room on user.roomid=room.id ;//關聯連用,推薦使用

select* from user inner join calss inner join room on user.classid=calss.id user.roomid=room.id ;//這種方式不推薦,容易出錯

left join

使用時小心2個以上表關系連用問題

以左邊表作為主表,可以不滿足關聯條件也可全部顯示,但是要滿足where條件

select* from user left/right join calss on user.classid=calss.id;

right join 同上,以右邊表作為主表

full join 左右全部顯示,mysql不支援

union 行拼接,列類型 數量必須一緻

select id,name from user UNION select id,name from class

子查詢

将另一個查詢的結果作為目前查詢的條件

select *from class where id in (select id from user)

子查詢的結果列數量類型必須符合sql文法

delete ,update 根據其他表删除行

delete from user where classid=(select id from class group by name having count(1)>1 limit 1 )

邏輯視圖查詢

将子查詢結果直接作為資料源,指定表名

select id from (select id from class group by name having count(1)>1 limit 1 ) a where a.id=1

總文法

超重要順序

select [distinct] 列資訊 from 表資訊(關聯) where 條件 group by 列 having 聚合條件 order by 列名 limit 行号