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 行号