大聊MySQL的查詢(1)
學習MySQL有一段時間了,寫下這篇部落格,一來為了總結筆記方便以後查閱,二來希望和大家交流,有不對的地方希望各位批評指正。(本文中用到的資料庫下載:https://download.csdn.net/my)
#######################################################################################################
首先我想說一下這張表,這是power node 那個老師講的,真的對初學者很有用(表:以上改為以下)
1、簡單的查詢
a) 單欄位
b) 多欄位 select 欄位名,欄位名 ,... from 表名; select empno, ename from emp;
c) 查詢全部欄位 select * from 表名; select * from emp;
2、條件查詢(稍微複雜一點點)
select 欄位名 from 表名 where 條件;
翻譯:從某表中在某條件下,查詢某些內容;
where後面可以有哪些操作呢?如下:
運算子 |
說明 |
= |
等於 |
<>或!= |
不等於 |
< |
小於 |
<= |
小於等於 |
> |
大於 |
>= |
大於等於 |
between … and …. |
兩個值之間,等同於 >= and <= |
is null |
為null(is not null 不為空) |
and |
並且 and的優先順序比or高 |
or |
或者 |
in |
包含,相當於多個or(not in不在這個範圍中) |
not |
not可以取非,主要用在is 或in中 |
like |
like稱為模糊查詢,支援%或下劃線匹配 %匹配任意個字元 下劃線,一個下劃線只匹配一個字元 |
上表中的操作,挑幾個說說:
a) MySQL中如果一個欄位為字元型,那麼對其操作時需要加單引號或雙引號:
select empno, ename from emp where job=’manager’; 或
select empno, ename from emp where job="manager";
b) 說一下 between ... and ..... # 格式 between 小 and 大
查詢薪水為1600到3000的員工
select empno, ename, sal from emp where sal >= 1600 and sal <= 3000;
select empno, ename, sal from emp where sal between 1600 and 3000;
c) is null
Null為空,但不是空串,為null可以設定這個欄位不填值,如果查詢為null的欄位,採用is null
查詢津貼為空的員工
select * from emp where comm is null;
錯誤寫法:select * from emp where comm=null;
總結:也就是說判斷是否為null必須用 is 不能用 = 。
d) in 比較重要,來聊聊
比較普通的用法,in後面接具體的內容:
查詢出job為manager或者job為salesman的員工
select * from emp where job in ('manager','salesman');
查詢出薪水包含1600和薪水包含3000的員工
select * from emp where sal in(1600, 3000);
稍微有點意思的用法,in後面接查詢語句
找出學過1號課程的且學過2號課程的學生
select
s.sname
from
s join sc on s.sno = sc.sno
where
sc.cno = 1 and s.sname in ( select s.sname from s join sc on s.sno = sc.sno where sc.cno = 2);
你看看這裡,in後面接的是什麼? 其實後面接的是一個表。
e) not 沒有太多好說的
not in select * from emp where sal not in (1600, 3000);
is not null select * from emp where comm is not null;
f) 最後說一下 like
Like可以實現模糊查詢,like支援%和下劃線 _ 匹配
查詢姓名以M開頭所有的員工; select * from emp where ename like 'M%';
查詢姓名中包含O的所有的員工; select * from emp where ename like '%O%';
查詢姓名中第二個字元為A的所有員工; select * from emp where ename like '_A%';
總結:
第一條:Like 中的表示式必須放到單引號中偶or雙引號中;
第二條:%表示匹配任意個數字元;
第三條:下劃線 _ 表示只匹配一個字元;
3、分組查詢
分組查詢主要涉:group by . . . having . . . ; 按照 。。。分組,如果分組後還不滿意加having 後面接限制條件
a) 分組查詢及多欄位分組查詢
取得每個工作崗位的工資合計,要求顯示崗位名稱和工資合計
select job, sum(sal) from emp group by job;
按照工作崗位和部門編碼分組,取得的工資合計
select job,deptno, sum(sal) from emp group by job,deptno;
注意:從這個語句中你能看出啥?
i1) group by 後面能跟多個欄位,這樣接的含義表示,將表emp按照job分組,分完之後在每個job組裡面再按照 deptno分組;
i2) 如果使用了order by,order by必須放到group by後面;
即: select job, sum(sal) from emp group by job order by job ;
b) 分組查詢後不滿意+having
使用場景 :如果需要對分組資料再進行過濾需要使用having子句
找出崗位的平均工資大於2000的崗位
select job, avg(sal) from emp group by job having avg(sal) >2000;
c) 說到分組查詢後,不得不說的一個東西——分組函式(或者叫聚合函式、多行處理函式)
來來來,說分組函式前先看一個例子:
emp group by job(當然這個寫法是錯的,我這裡只是想表示,對emp表按照job分組,分組結果示意圖如下)
從上圖可以看出,分組後每一種工作都有一個新的表了(只是這樣理解) ;
如果我們不做任何處理,直接顯示全部的分組結果會是怎樣的呢?
select * from emp group by job;
從上圖中可以看出,它只是顯示了每個組中的第一條記錄;
所以說我們在分組後,是不能完全的顯示出每組的所有記錄的(也許有隻是我不知道),但是可以用分組函式,去求得每組的一些特徵,其實我個人感覺,分組的一個很重要的目的就是使用分組函式,去獲得每組的一些特徵。
好好好,現在說說分組函式:
count |
取得記錄數 |
sum |
求和 |
avg |
取平均 |
max |
取最大的數 |
min |
取最小的數 |
注意:
a) 分組函式自動忽略空值,不需要手動的加where條件排除空值。
select count(comm) from emp; comm這個欄位中不為空的元素總數。
b) 分組函式不能直接使用在where關鍵字後面; 其實就是說一般用在select和having後面
select avg(sal) from emp; #### select max(sal) from emp; ##### select min(sal) from emp;
組合分組函式 select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;
說白了,其實分組函式就是對一個欄位多個數據進行處理。