1. 程式人生 > >mysql 單表查詢

mysql 單表查詢

concat_ws 之前 max 其它 white lin sql_mod class arch

一 、單表查詢的語法

SELECT 字段1,字段2... FROM 表名
                  WHERE 條件
                  GROUP BY field
                  HAVING 篩選
                  ORDER BY field
                  LIMIT 限制條數

二、關鍵字的執行優先級

重點中的重點:關鍵字的執行優先級
1、from        先找表
2、where       拿著約束條件做篩選
3、group by    將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組
4、having 將分組結果進行過濾 5、select 執行select 6、distinct 去重 7、order by 將結果排序 8、limit 限制顯示條數

三、簡單查詢

技術分享圖片
company.employee
    員工id      id                  int             
    姓名        emp_name            varchar
    性別        sex                 enum
    年齡        age                 int
    入職日期     hire_date           date
    崗位        post                varchar
    職位描述     post_comment        varchar
    薪水        salary              double
    辦公室       office              int
    部門編號     depart_id           int



#創建表 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; +--------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+-----------------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | sex | enum(male,female) | NO | | male | | | age | int(3) unsigned | NO | | 28 | | | hire_date | date | NO | | NULL | | | post | varchar(50) | YES | | NULL | | | post_comment | varchar(100) | YES | | NULL | | | salary | double(15,2) | YES | | NULL | | | office | int(11) | YES | | NULL | | | depart_id | int(11) | YES | | NULL | | +--------------+-----------------------+------+-----+---------+----------------+ #插入記錄 #三個部門:教學,銷售,運營 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) ; #ps:如果在windows系統中,插入中文字符,select的結果為空白,可以將所有字符編碼統一設置成gbk
準備表

技術分享圖片

1、定義顯示格式

concat()函數用於連接字符串 用法:數據庫遷移(拷貝)
CONCAT() 函數用於連接字符串
SELECT CONCAT(姓名: ,name,  年薪: , salary*12)  
AS Annual_salary FROM employee; CONCAT_WS() 第一個參數為分隔符 SELECT CONCAT_WS(
:,name,salary*12) AS Annual_salary FROM employee;

技術分享圖片

高級版
 select concat(naem:,name) as name,concat(annual_salary:,salary*12)
as annual_salary from emp2;
技術分享圖片

2、

普通版: 
select id,concat(name,‘:‘,sex,‘:‘,salary) as info from emp2;

技術分享圖片

# 進化版
select id,concat_ws(:,name,sex,salary) as info from emp2;

技術分享圖片

技術分享圖片

2、distinct 去重

技術分享圖片

as顯示效果的區別:

技術分享圖片

3、where約束

where字句中可以使用:

    1. 比較運算符:> < >= <= <> !=
    2. between 80 and 100 值在80到100之間,包括80和100
    3. in(80,90,100) 值是80或90或100
    4. like egon%
        pattern可以是%或_,
        %表示任意多字符
        _表示任意一個字符 
    5. 邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not
#1:單條件查詢
    SELECT name FROM employee
        WHERE post=sale;
        
#2:多條件查詢
    SELECT name,salary FROM employee
        WHERE post=teacher AND salary>10000;

#3:關鍵字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;
    
#4:關鍵字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
    ps:
        執行
        update employee set post_comment=‘‘ where id=2;
        再用上條查看,就會有結果了

#5:關鍵字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) ;

#6:關鍵字LIKE模糊查詢
    通配符’%’
    SELECT * FROM employee 
            WHERE name LIKE eg%;

    通配符’_’
    SELECT * FROM employee 
            WHERE name LIKE al__;

4、分組 group by

  註意:使用分組只能查看分組的依據和聚合函數,若是查看其它信息,則默認是該組的第一條信息,這其實是沒有意義的。如下:

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

#2、分組指的是:將所有記錄按照某個相同字段進行歸類,比如針對員工信息表的職位分組,
或者按照性別進行分組等
#3、為何要分組呢? 取每個部門的最高工資 取每個部門的員工數 取男人數和女人數 小竅門:‘每’這個字後面的字段,就是我們分組的依據 #4、大前提: 可以按照任意字段分組,但是分組完畢後,比如group by post,只能查看post字段,
如果想查看組內信息,需要借助於聚合函數

二 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
;

三 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;
#按照崗位分組,並查看每個組有多少人

強調:

如果我們用unique的字段作為分組的依據,則每一條記錄自成一組,這種分組沒有意義
多條記錄之間的某個字段值相同,該字段通常用來作為分組的依據

四 聚合函數

#強調:聚合函數聚合的是組的內容,若是沒有分組,則默認一組
示例:
    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;

五、having 過濾

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

#!!!執行優先級從高到低:where > group by > having 
#1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。

#2. Having發生在分組group by之後,因而Having中可以使用分組的字段,
無法直接取到其他字段,可以使用聚合函數

六、查詢排序: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;

七、限制顯示數據: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條

八、使用正則表達式查詢

技術分享圖片
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$;
View Code

mysql 單表查詢