mysql四-1:單表查詢

來源:互聯網
上載者:User

標籤:單表查詢

一、單表查詢的文法

SELECT 欄位1,欄位2... FROM 表名

                  WHERE 條件

                  GROUP BY field

                  HAVING 篩選

                  ORDER BY field

                  LIMIT 限制條數


二、關鍵字的執行優先順序(重點)

關鍵字的執行優先順序  重點中的重點!!!

from--->where--->group by--->having--->select--->distinct--->order by--->limit

1.找到表:from

2.拿著where指定的約束條件,去檔案/表中取出一條條記錄

3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組

4.將分組的結果進行having過濾

5.執行select

6.去重

7.將結果按條件排序:order by

8.限制結果的顯示條

三、簡單查詢

1、造表

建立表

mysql> create table employee(

    id int not null unique auto_increment,

    name varchar(20) not null,

    sex enum('male','female') not null default 'male', #大部分是男的

    age int(3) unsigned not null default 28,

    hire_date date not null,

    post varchar(50),

    post_comment varchar(100),

    salary double(15,2),

    office int, #一個部門一個屋子

    depart_id int

    );

查看錶結構

mysql> desc employee;

插入記錄(三個部門:教學,銷售,運營)

mysql> insert into employee(name,sex,age,hire_date,post,salary,office,depart_id) values

    ('egon','male',18,'20170301','老男孩駐沙河辦事處外交大使',7300.33,401,1), #以下是教學部

    ('alex','male',78,'20150302','teacher',1000000.31,401,1),

    ('wupeiqi','male',81,'20130305','teacher',8300,401,1),

    ('yuanhao','male',73,'20140701','teacher',3500,401,1),

    ('liwenzhou','male',28,'20121101','teacher',2100,401,1),

    ('jingliyang','female',18,'20110211','teacher',9000,401,1),

    ('jinxin','male',18,'19000301','teacher',30000,401,1),

    ('成龍','male',48,'20101111','teacher',10000,401,1),

    ('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是銷售部門

    ('丫丫','female',38,'20101101','sale',2000.35,402,2),

    ('丁丁','female',18,'20110312','sale',1000.37,402,2),

    ('星星','female',18,'20160513','sale',3000.29,402,2),

    ('格格','female',28,'20170127','sale',4000.33,402,2),

    ('張野','male',28,'20160311','operation',10000.13,403,3), #以下是運營部門

    ('程咬金','male',18,'19970312','operation',20000,403,3),

    ('程咬銀','female',18,'20130311','operation',19000,403,3),

    ('程咬銅','male',18,'20150411','operation',18000,403,3),

    ('程咬鐵','female',18,'20140512','operation',17000,403,3)

    ;

2、查詢

簡單查詢

    SELECT id,name,sex,age,hire_date,post,post_comment,salary,office,depart_id FROM employee;

    SELECT * FROM employee;

    SELECT name,salary FROM employee;

避免重複DISTINCT

    SELECT DISTINCT post FROM employee;  #distinct意思是輸出後面 列 去重後的內容;  

通過四則運算查詢

    SELECT name, salary*12 FROM employee;

    SELECT name, salary*12 AS Annual_salary FROM employee;

    SELECT name, salary*12 Annual_salary FROM employee;

定義顯示格式

   #CONCAT() 函數用於連接字串

   SELECT CONCAT('姓名: ',name,'  年薪: ', salary*12)  AS Annual_salary FROM employee;

   #CONCAT_WS() 第一個參數為分隔字元

   SELECT CONCAT_WS(':',name,salary*12)  AS Annual_salary FROM employee;

   結合CASE語句:

   SELECT

       (

           CASE

           WHEN NAME = 'egon' THEN

               NAME

           WHEN NAME = 'alex' THEN

               CONCAT(name,'_BIGSB')

           ELSE

               concat(NAME, 'SB')

           END

       ) as new_name

   FROM employee;

3、小練習

1)查出所有員工的名字,薪資,格式為

    <名字:egon>    <薪資:3000>

   SELECT CONCAT('<名字:',name,'>  ','<年薪:',salary*12,'>') AS annual_year FROM employee; 

2)查出所有的崗位(去掉重複)

    SELECT DISTINCT depart_id FROM employee;

3)查出所有員工名字,以及他們的年薪,年薪的欄位名為annual_year

    SELECT name, salary*12 AS annual_year FROM employee;


四、WHERE約束

where字句中可以使用:

    1. 比較子:> < >= <= <> !=

    2. between 80 and 100 值在10到20之間

    3. in(80,90,100) 值是10或20或30

    4. like 'egon%'

        pattern可以是%或_(%表示任意多字元,_表示一個字元) 

    5. 邏輯運算子:在多個條件直接可以使用邏輯運算子 and or not

單條件查詢:

    SELECT name FROM employee WHERE post='sale';

多條件查詢:

    SELECT name,salary FROM employee WHERE post='teacher' AND salary>10000;

關鍵字BETWEEN AND:

    SELECT name,salary FROM employee WHERE salary BETWEEN 10000 AND 20000;

    SELECT name,salary FROM employee WHERE salary NOT BETWEEN 10000 AND 20000;

關鍵字IS NULL(判斷某個欄位是否為NULL不能用等號,需要用IS):

    SELECT name,post_comment FROM employee WHERE post_comment IS NULL;

    SELECT name,post_comment FROM employee WHERE post_comment IS NOT NULL;    

    SELECT name,post_comment FROM employee WHERE post_comment=''; 注意''是Null 字元串,不是null

ps:

    執行update employee set post_comment='' where id=2;再用上條查看,就會有結果了

關鍵字IN集合查詢:

    SELECT name,salary FROM employee WHERE salary=3000 OR salary=3500 OR salary=4000 OR salary=9000 ;

    SELECT name,salary FROM employee WHERE salary IN (3000,3500,4000,9000) ;

    SELECT name,salary FROM employee WHERE salary NOT IN (3000,3500,4000,9000) ;

關鍵字LIKE模糊查詢:

    萬用字元’%’:SELECT * FROM employee WHERE name LIKE 'eg%';

    萬用字元’_’:SELECT * FROM employee WHERE name LIKE 'al__';

小練習:

1. 查看崗位是teacher的員工姓名、年齡

    SELECT name,age FROM employee WHERE post='teacher';

2. 查看崗位是teacher且年齡大於30歲的員工姓名、年齡

    SELECT name,age FROM employee WHERE post='teacher' AND age>30;

3. 查看崗位是teacher且薪資在9000-1000範圍內的員工姓名、年齡、薪資

    SELECT name,age,salary FROM employee WHERE post='teacher' AND salary between 9000 and 10000;

4. 查看崗位描述不為NULL的員工資訊

    select * from employee where post_comment is not null;

5. 查看崗位是teacher且薪資是10000或9000或30000的員工姓名、年齡、薪資

    SELECT name,age,salary FROM employee WHERE post='teacher' AND salary in (10000,9000,30000);

6. 查看崗位是teacher且薪資不是10000或9000或30000的員工姓名、年齡、薪資

    SELECT name,age,salary FROM employee WHERE post='teacher' AND salary not in (10000,9000,30000);

7. 查看崗位是teacher且名字是jin開頭的員工姓名、年薪

    SELECT name,salary FROM employee WHERE post='teacher' AND age like 'jin%';


五、分組查詢:GROUP BY

1、什麼是分組?為什麼要分組?

1)首先明確一點:分組發生在where之後,即分組是基於where之後得到的記錄而進行的

2)分組指的是:將所有記錄按照某個相同欄位進行歸類,比如針對員工資訊表的職位分組,或者按照性別進行分組等

3)為何要分組呢?

    取每個部門的最高工資

    取每個部門的員工數

    取男人數和女人數

小竅門:‘每’這個字後面的欄位,就是我們分組的依據

4)大前提:

    可以按照任意欄位分組,但是分組完畢後,比如group by post,只能查看post欄位,如果想查看組內資訊,需要藉助於彙總函式

2、ONLY_FULL_GROUP_BY

查看MySQL 5.7預設的sql_mode如下:

    mysql> select @@global.sql_mode;

 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

!!!注意

    ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在ONLY_FULL_GROUP_BY模式下,target list中的值要麼是來自於聚集合函式的結果,要麼是來自於group by list中的運算式的值。

設定sql_mole如下操作(我們可以去掉ONLY_FULL_GROUP_BY模式):

    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

3、GROUP BY

單獨使用GROUP BY關鍵字分組

    SELECT post FROM employee GROUP BY post;

注意:我們按照post欄位分組,那麼select查詢的欄位只能是post,想要擷取組內的其他相關資訊,需要藉助函數

GROUP BY關鍵字和GROUP_CONCAT()函數一起使用

    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;#按照崗位分組,並查看組內成員名

    SELECT post,GROUP_CONCAT(name) as emp_members FROM employee GROUP BY post;

GROUP BY與彙總函式一起使用

    select post,count(id) as count from employee group by post;#按照崗位分組,並查看每個組有多少人

4、彙總函式

強調:彙總函式彙總的是組的內容,若是沒有分組,則預設一組

樣本:

    SELECT COUNT(*) FROM employee;

    SELECT COUNT(*) FROM employee WHERE depart_id=1;

    SELECT MAX(salary) FROM employee;

    SELECT MIN(salary) FROM employee;

    SELECT AVG(salary) FROM employee;

    SELECT SUM(salary) FROM employee;

    SELECT SUM(salary) FROM employee WHERE depart_id=3;

5、小練習:

1)查詢崗位名以及崗位包含的所有員工名字

    SELECT post,GROUP_CONCAT(name) FROM employee GROUP BY post;

2)查詢崗位名以及各崗位內包含的員工個數

    SELECT post,count(id) FROM employee GROUP BY post;

3)查詢公司內男員工和女員工的個數

    SELECT sex,count(id) FROM employee GROUP BY sex;

4)查詢崗位名以及各崗位的平均薪資

    SELECT post,AVG(salary) FROM employee GROUP BY post;

5)查詢崗位名以及各崗位的最高薪資

    SELECT post,MAX(salary) FROM employee GROUP BY post;

6)查詢崗位名以及各崗位的最低薪資

    SELECT post,MIN(salary) FROM employee GROUP BY post;

7)查詢男員工與男員工的平均薪資,女員工與女員工的平均薪資

    SELECT sex,AVG(salary) FROM employee GROUP BY sex;


六、HAVING過濾

HAVING與WHERE不一樣的地方在於!!!!!!

!!!執行優先順序從高到低:where > group by > having 

1. Where 發生在分組group by之前,因而Where中可以有任意欄位,但是絕對不能使用彙總函式。

2. Having發生在分組group by之後,因而Having中可以使用分組的欄位,無法直接取到其他欄位,可以使用彙總函式

小練習:

1. 查詢各崗位內包含的員工個數小於2的崗位名、崗位內包含員工名字、個數

    SELECT post,group_concat(name),count(id) FROM employee GROUP BY post having count(id)<2;

3. 查詢各崗位平均薪資大於10000的崗位名、平均工資

    SELECT post,AVG(salary) FROM employee GROUP BY post having AVG(salary)>10000;

4. 查詢各崗位平均薪資大於10000且小於20000的崗位名、平均工資

    SELECT post,AVG(salary) FROM employee GROUP BY post having AVG(salary)>10000 and AVG(salary)<20000;


七、查詢排序:ORDER BY

按單列排序

    SELECT * FROM employee ORDER BY salary;

    SELECT * FROM employee ORDER BY salary ASC;

    SELECT * FROM employee ORDER BY salary DESC;

按多列排序:先按照age排序,如果年紀相同,則按照薪資排序

    SELECT * from employee ORDER BY age,salary DESC;

小練習:

1. 查詢所有員工資訊,先按照age升序排序,如果age相同則按照hire_date降序排序

    SELECT * from employee ORDER BY age,hire_date DESC;

2. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資升序排列

    SELECT post,avg(salary) from employee group by post having avg(salary)>10000 ORDER BY avg(salary);

3. 查詢各崗位平均薪資大於10000的崗位名、平均工資,結果按平均薪資降序排列

    SELECT post,avg(salary) from employee group by post having avg(salary)>10000 ORDER BY avg(salary) DESC;


八、限制查詢的記錄數:LIMIT

樣本:

    SELECT * FROM employee ORDER BY salary DESC LIMIT 3;   #預設初始位置為0  

    SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5; #從第0開始,即先查詢出第一條,然後包含這一條在內往後查5條

    SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5; #從第5開始,即先查詢出第6條,然後包含這一條在內往後查5條

小練習:

1. 分頁顯示,每頁5條

    SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5;

    SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5;

    SELECT * FROM employee ORDER BY salary DESC LIMIT 10,5;


九、使用Regex查詢

    SELECT * FROM employee WHERE name REGEXP '^ale';

    SELECT * FROM employee WHERE name REGEXP 'on$';

    SELECT * FROM employee WHERE name REGEXP 'm{2}';

小結:對字串匹配的方式

    WHERE name = 'egon';

    WHERE name LIKE 'yua%';

    WHERE name REGEXP 'on$';

小練習:

查看所有員工中名字是jin開頭,n或者g結果的員工資訊

    SELECT * FROM employee WHERE name REGEXP '^jin.*[gn]';


mysql四-1:單表查詢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.