查詢的出的表至關於Excel中刷選操做,刷選出的是虛擬的表,展現出來mysql
select * from emp; # 若數據比較多,比較凌亂,能夠在表後面+ \Gsql
select * from emp \G編程
寫SQL語句必須遵循兩點:windows
書寫順序:函數
selectpost
from編碼
wherecode
執行順序:regexp
from排序
where
select
# 建立一張部門表 create table emp( 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 ); # 插入記錄 # 三個部門:教學,銷售,運營 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values ('Mr沈','male',17,'20170301','admin',7300.33,401,1), # 如下是教學部 ('jerry','female',18,'20110211','teacher',9000,401,1), ('tank','male',18,'19000301','teacher',30000,401,1), ('sean','male',48,'20101111','teacher',10000,401,1), ('歪歪','female',48,'20150311','sale',7000.13,402,2),# 如下是銷售部門 ('丫丫','female',38,'20101101','sale',5000.35,402,2), ('丁丁','female',18,'20110312','sale',8000.37,402,2), ('星星','female',18,'20160513','sale',6000.29,402,2), ('格格','female',28,'20170127','sale',4000.33,402,2), ('程咬金','male',28,'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
一、查詢id大於等於3,小於等於6的數據(and、between)
select * from emp where id >= 3 and id <= 6; select * from emp where id between 3 and 6;
二、查詢薪資是20000或者18000或者17000的數據(or、in)
select * from emp where salary=20000 or salary=18000 or salary=17000; select * from emp where salary in (20000,18000,17000);
三、查詢員工姓名中包含e字母 的 員工姓名 和 薪資
模糊匹配:like
%:匹配0個或多個任意字符
_:匹配一個任意字符
select name,salary from emp where name like '%e%';
四、查找名字個數爲4個的員工 名字 與 薪資
char_length(name):計算名字的字符長度
select name,salary from emp where name like '____'; select name,salary from emp where char_length(name)=4;
五、查詢id小於3或者大於6的數據(not in)
select * from emp where id not in (3,4,5,6); select * from emp where id not between 3 and 6;
六、查詢崗位描述爲空的 員工名 與 崗位名 post_comment
針對查找null的值須要用is,若是用=會查不到數據
select name,post from emp where post_comment is null;
書寫順序:select - from - where - group by
執行順序:from - where - group by - select
一、根據部門分組
非嚴格模式下能夠獲取分組之外的字段數據,嚴格模式會報錯
select post, salary from emp group by post;
設置嚴格模式:
查看模式:show variables like "%mode%";
全局設置嚴格模式: set global sql_mode="strict_trans_tables,only_full_group_by";
在嚴格模式下,只能獲取分組內 的字段,能夠同聚合函數一塊兒使用,間接獲取其餘字段數據
聚合函數:必須跟在group by 後面(執行順序)
count():計數,括號中能夠填任意非空值
max():最大值
min():最小值
avg():平均值
sum():求和
二、獲取每一個部門的最高工資
as :別名,能夠給字段加一個別名,能夠簡寫不寫as,可是不推薦使用
select post,max(salary) from emp group by post; select post as '部門',max(salary) as '最高薪資' from emp group by post; select post '部門',max(salary) '最高薪資' from emp group by post;
三、獲取每一個部門的最低工資
select post,min(salary) from emp group by post;
四、獲取每一個部門的平均工資
select post,avg(salary) from emp group by post;
五、獲取每一個部門的工資總和
select post,sum(salary) from emp group by post;
六、每一個部門的員工個數
select post,count(id) from emp group by post;
七、查詢 "崗位名" 以及 崗位包含的全部員工名字 一行展現
group_concat(name):能夠將分組後的全部名字獲取並進行拼接,默認以 ,拼接
能夠設置指定以什麼拼接
select post,group_concat(name) from emp group by post; select post,group_concat('名字:',name) from emp group by post;
八、統計各部門年齡在30歲如下的員工平均工資
select post,avg(salary) from emp where age<30 group by post;
having與where的做用是同樣的,having必須跟在group by後面,having後面能夠跟聚合函數,可是where後面不能跟聚合函數
書寫順序:
select - from - where - group by - having
執行順序:
from - where - group by - having - select
統計各部門年齡在30歲以上的員工平均工資,而且保留平均工資大於6000的部門
select post,avg(salary) from emp where age>30 group by post having avg(salary)>6000;
書寫順序:
select - distinct - from - where - group by - having
執行順序:
from - where - group by - having - distinct - select
distinct 後面跟着去重的字段名
注意:去重的字段名,必須是重複的,只要有不重複的字段,後續就沒法去重
將重複的部門數據去重
select distinct post from emp; select distinct post,id from emp; # id沒有重複的,因此都不會去重
書寫順序:
select - from - where - group by - having - order by
執行順序:
from - where - group by - having - select - order by
asc:升序
desc:降序
根據薪資進行降序
select salary from emp order by salary desc;
統計各部門年齡在20歲以上的員工平均工資,而且保留平均工資大於7000的部門,而後對平均工資進行升序
select post,avg(salary) from emp where age>20 group by post having avg(salary)>7000 order by avg(salary) asc;
書寫順序:
select - from - order by - limit
執行順序:
from - select - order by - limit
limit能夠有兩個參數,參數1:是限制的開始位置+1,參數2:是開始位置展現的條數
一、獲取從第一條開始,獲取4條數據
select * from emp limit 4;
二、查詢從第五條開始,獲取4條數據
select * from emp limit 4,4;
三、查詢工資最高的人的詳細信息
select * from emp order by salary desc limit 1;
查詢名字中以程開頭,金銀銅鐵結尾的名字全部信息
select * from emp where name regexp '^程.*(金|銀|銅|鐵)$';
建立表
#建表dep2 create table dep2( id int, name varchar(20) ); #建表emp2 create table emp2( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int ); #插入數據 insert into dep2 values (200,'技術'), (201,'人力資源'), (202,'銷售'), (203,'運營'); insert into emp2(name,sex,age,dep_id) values ('小王','male',17,200), ('小李','female',48,201), ('小張','male',38,201), ('小沈','female',28,202), ('狗蛋','male',18,200), ('丫丫','female',18,204);
上篇講了如何根據表關係對字段進行拆分,目的是爲了更好的管理,表數據都存放在硬盤中,存不是目的,目的是爲了取,因此咱們將數據從硬盤讀到內存中,咱們將其拼接查詢的更加的合理
左表的一條記錄與右表一條記錄都對應,通常稱爲 「 笛卡爾積 」
左右表中的數據基本不可能所有一一對應的,因此咱們能夠提取出有對應關係,合理的數據,咱們所須要的數據便可,就有了將兩張表關聯到一塊兒的方法
一、inner join 內鏈接:只取兩張表有對應關係的記錄
一、查詢員工以及所在部門的信息
select * from emp2 inner join dep2 on emp2.dep_id = dep2.id;
二、查詢部門爲技術部的員工及部門信息
select * from emp2 inner join dep2 on emp2.dep_id = dep2.id and dep2.name='技術';
二、left join 左鏈接:在內鏈接的基礎上保留左表沒有對應關係的記錄
鏈接保留左表中全部的數據,右表沒有與之對應的就會以null補充
select * from emp2 left join dep2 on emp2.dep_id = dep2.id;
三、right join 右鏈接:在內鏈接的基礎上保留右表全部的數據
保留右表全部的數據,左表沒有的數據會以null填充
select * from emp2 right join dep2 on emp2.dep_id = dep2.id;
四、union 全鏈接:在內鏈接的基礎上保留左右倆表全部的數據,沒有與之對應的會以null補充
select * from emp2 left join dep2 on emp2.dep_id = dep2.id union select * from emp2 right join dep2 on emp2.dep_id = dep2.id;
子查詢就是將一個查詢語句的結果用括號括起來,當作另外一個查語句的條件去用
一、查詢部門是技術或者人力資源的員工信息
select * from emp2 where dep_id in (select id from dep2 where name='技術' or name='人力資源');
二、查詢每一個部門最新入職的員工
select t1.* from emp as t1 inner join (select post,max(hire_date) as max_date from emp group by post) as t2 on t1.post = t2.post where t1.hire_date = t2.max_date;