基本查詢語句及方法

基本查詢語句及方法

查詢的出的表至關於Excel中刷選操做,刷選出的是虛擬的表,展現出來mysql

一、查詢語句的基本操做

  • select
  • from
  • where
  • group by
  • having
  • distinct
  • order by
  • limit
  • 聚合函數:count,max,min,avg,sum

二、單表查詢

select * from emp; # 若數據比較多,比較凌亂,能夠在表後面+ \Gsql

select * from emp \G編程

寫SQL語句必須遵循兩點:windows

書寫順序:函數

​ selectpost

​ from編碼

​ wherecode

執行順序:regexp

​ from排序

​ where

​ select

一、where :約束條件

# 建立一張部門表
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;

二、group by

書寫順序: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:過濾

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;

四、distinct:去重

書寫順序:

​ 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沒有重複的,因此都不會去重

五、order by :排序

書寫順序:

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

六、limit :限制查詢記錄的數量

書寫順序:

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

七、regexp:正則(編程中凡是看到reg開頭,基本都是與正則有關)

查詢名字中以程開頭,金銀銅鐵結尾的名字全部信息

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='人力資源');

​ 二、查詢每一個部門最新入職的員工

  1. 先子查詢獲取emp表中 部門名稱與最新入職的時間字段值,生成一張虛擬表
  2. 拼接emp表和剛生成的部門名與最新入職的時間字段值
  3. 判斷兩張表的時間相等的
  4. 查詢出所需的全部信息
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;
相關文章
相關標籤/搜索