1. 程式人生 > >大聊MySQL的查詢(1)

大聊MySQL的查詢(1)

學習MySQL有一段時間了,寫下這篇部落格,一來為了總結筆記方便以後查閱,二來希望和大家交流,有不對的地方希望各位批評指正。(本文中用到的資料庫下載:https://download.csdn.net/my

#######################################################################################################

首先我想說一下這張表,這是power node 那個老師講的,真的對初學者很有用(表:以上改為以下)

1、簡單的查詢

        a)  單欄位       

           select 欄位名 from  表名;                       select ename from emp;

        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;

                 

說白了,其實分組函式就是對一個欄位多個數據進行處理。