MySQL 之 数据查询

数据查询

数据查询一直是我们使用数据库的重头戏,很多人其实大部分时候都用不上数据库的增删改,但是查一定是会用得到的,能够熟练的写出查询语句都会让自己的工作效率大幅度提升。

先来创建一个用户表,作为我们练习查询操作的对象,当然这个表和实际项目中的表还是有一定的区别的。

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
('亚瑟','male',24,'20170301','HR',7300.33,401,1), 
('典韦','male',28,'20150302','teacher',100000.31,401,1),
('鲁班七号','female',1,'20130305','HR',8300,401,1),
('兰陵王','male',33,'20140701','teacher',3500,401,1),
('刘禅','male',28,'20121101','teacher',2100,401,1),
('张飞','male',18,'20110211','teacher',9000,401,1),
('雅典娜','female',18,'19000301','teacher',30000,401,1),
('荆轲','female',24,'20101111','teacher',10000,401,1),
('露娜','female',48,'20150311','sale',3000.13,402,2),
('李白','male',28,'20101101','sale',2000.35,402,2),
('花木兰','female',19,'20110312','sale',1000.37,402,2),
('张良','male',20,'20160513','sale',3000.29,402,2),
('安琪拉','female',28,'20170127','sale',4000.33,402,2),
('貂蝉','female',28,'20160311','operation',10000.13,403,3),
('程咬金','male',48,'19970312','operation',20000,403,3),
('武则天','male',38,'20130311','operation',19000,403,3),
('姜子牙','male',58,'20150411','operation',18000,403,3),
('后羿','male',28,'20140512','operation',17000,403,3)
;

ps:如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk

单表查询

刚开始查询表,一定要按照最基本的步骤,先确定是哪张表,再确定查这张表也没有限制条件,再确定是否需要分类,最后再确定需要什么字段对应的信息

书写顺序

select distinct * from '表名' where '限制条件'  group by '分组依据' 
having '过滤条件' order by '排序依据' limit '限制条件'

执行顺序


fromwheregroup byhavingorder bylimitdistinctselect

where约束条件

1.查询id大于等于3小于等于6的数据
select id,name from emp where id >= 3 and id <= 6;
select *  from emp where id between 3 and 6; 

mysql> select *  from emp where id between 3 and 6;
+----+--------------+--------+-----+------------+---------+--------------+---------+--------+-----------+
| id | name         | sex    | age | hire_date  | post    | post_comment | salary  | office | depart_id |
+----+--------------+--------+-----+------------+---------+--------------+---------+--------+-----------+
|  3 | 鲁班七号     | female |   1 | 2013-03-05 | HR      | NULL         | 8300.00 |    401 |         1 |
|  4 | 兰陵王       | male   |  33 | 2014-07-01 | teacher | NULL         | 3500.00 |    401 |         1 |
|  5 | 刘禅         | male   |  28 | 2012-11-01 | teacher | NULL         | 2100.00 |    401 |         1 |
|  6 | 张飞         | male   |  18 | 2011-02-11 | teacher | NULL         | 9000.00 |    401 |         1 |
+----+--------------+--------+-----+------------+---------+--------------+---------+--------+-----------+

2.查询薪资是20000或者18000或者17000的数据
select * from emp where salary = 20000 or salary = 18000 or salary = 17000;
select * from emp where salary in (20000,18000,17000); 

mysql> select * from emp where salary in (20000,18000,17000);
+----+-----------+------+-----+------------+-----------+--------------+----------+--------+-----------+
| id | name      | sex  | age | hire_date  | post      | post_comment | salary   | office | depart_id |
+----+-----------+------+-----+------------+-----------+--------------+----------+--------+-----------+
| 15 | 程咬金    | male |  48 | 1997-03-12 | operation | NULL         | 20000.00 |    403 |         3 |
| 17 | 姜子牙    | male |  58 | 2015-04-11 | operation | NULL         | 18000.00 |    403 |         3 |
| 18 | 后羿      | male |  28 | 2014-05-12 | operation | NULL         | 17000.00 |    403 |         3 |
+----+-----------+------+-----+------------+-----------+--------------+----------+--------+-----------+

3.查询薪资不在200001800017000范围的数据
select * from emp where salary not in (20000,18000,17000);


4.查询员工姓名中包含o字母的员工姓名和薪资
select name,salary from emp where name like '%子%';

mysql> select name,salary from emp where name like '%子%';
+-----------+----------+
| name      | salary   |
+-----------+----------+
| 姜子牙    | 18000.00 |
+-----------+----------+

5.查询员工姓名是由四个字符组成的员工姓名与其薪资
select name,salary from emp where name like '____';
select name,salary from emp where char_length(name) = 4;
mysql> select name,salary from emp where char_length(name) = 4;
+--------------+---------+
| name         | salary  |
+--------------+---------+
| 鲁班七号     | 8300.00 |
+--------------+---------+

7.查询岗位描述为空的员工名与岗位名  针对null不能用等号,只能用is
select name,post from emp where post_comment = NULL;
mysql> select name,post from emp where post_comment = NULL;
Empty set (0.00 sec)  查询为空!

select name,post from emp where post_comment is NULL;

group by

1.按部门分组
select * from emp group by post;    分组后取出的是每个组的第一条数据
select id,name,sex from emp group by post;    验证

设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据,
不应该在去取组里面的单个元素的值,那样的话分组就没有意义了,因为不分组就是对单个元素信息的随意获取

set global sql_mode="strict_trans_tables,only_full_group_by";
重新链接客户端
select * from emp group by post;    报错
select id,name,sex from emp group by post;    报错
select post from emp group by post;    获取部门信息
强调:只要分组了,就不能够再“直接”查找到单个数据信息了,只能获取到组名
2.获取每个部门的最高工资  
以组为单位统计组内数据>>>聚合查询(聚集到一起合成为一个结果)
每个部门的最高工资
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;

3.查询分组之后的部门名称和每个部门下所有的学生姓名
group_concat(分组之后用)不仅可以用来显示除分组外字段还有拼接字符串的作用

select post,group_concat(name) from emp group by post;
mysql> select post,group_concat(name) from emp group by post;
+-----------+-------------------------------------------------+
| post      | group_concat(name)                              |
+-----------+-------------------------------------------------+
| HR        | 亚瑟,鲁班七号                                   |
| operation | 貂蝉,程咬金,武则天,姜子牙,后羿                  |
| sale      | 露娜,李白,花木兰,张良,安琪拉                    |
| teacher   | 典韦,兰陵王,刘禅,张飞,雅典娜,荆轲               |
+-----------+-------------------------------------------------+

select post,group_concat(name,"英雄") from emp group by post;
mysql> select post,group_concat(name,"英雄") from emp group by post;
+-----------+-------------------------------------------------------------------------------------+
| post      | group_concat(name,"英雄")                                                           |
+-----------+-------------------------------------------------------------------------------------+
| HR        | 亚瑟英雄,鲁班七号英雄                                                               |
| operation | 貂蝉英雄,程咬金英雄,武则天英雄,姜子牙英雄,后羿英雄                                  |
| sale      | 露娜英雄,李白英雄,花木兰英雄,张良英雄,安琪拉英雄                                    |
| teacher   | 典韦英雄,兰陵王英雄,刘禅英雄,张飞英雄,雅典娜英雄,荆轲英雄                           |
+-----------+-------------------------------------------------------------------------------------+

select post,group_concat(name,": ",salary) from emp group by post;
mysql> select post,group_concat(name,": ",salary) from emp group by post;
+-----------+-----------------------------------------------------------------------------------------------------------+
| post      | group_concat(name,": ",salary)                                                                            |
+-----------+-----------------------------------------------------------------------------------------------------------+
| HR        | 亚瑟: 7300.33,鲁班七号: 8300.00                                                                           |
| operation | 貂蝉: 10000.13,程咬金: 20000.00,武则天: 19000.00,姜子牙: 18000.00,后羿: 17000.00                          |
| sale      | 露娜: 3000.13,李白: 2000.35,花木兰: 1000.37,张良: 3000.29,安琪拉: 4000.33                                 |
| teacher   | 典韦: 100000.31,兰陵王: 3500.00,刘禅: 2100.00,张飞: 9000.00,雅典娜: 30000.00,荆轲: 10000.00               |
+-----------+-----------------------------------------------------------------------------------------------------------+

select post,group_concat(salary) from emp group by post;
mysql> select post,group_concat(salary) from emp group by post;
+-----------+-----------------------------------------------------+
| post      | group_concat(salary)                                |
+-----------+-----------------------------------------------------+
| HR        | 7300.33,8300.00                                     |
| operation | 10000.13,20000.00,19000.00,18000.00,17000.00        |
| sale      | 3000.13,2000.35,1000.37,3000.29,4000.33             |
| teacher   | 100000.31,3500.00,2100.00,9000.00,30000.00,10000.00 |
+-----------+-----------------------------------------------------+

4. concat(不分组时用)拼接字符串达到更好的显示效果 as语法使用
select name as 姓名,salary as 薪资 from emp;
select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as 薪资 from emp;
mysql> select concat("NAME: ",name) as 姓名,concat("SAL: ",salary) as 薪资 from emp where post='HR';
+--------------------+--------------+
| 姓名               | 薪资         |
+--------------------+--------------+
| NAME: 亚瑟         | SAL: 7300.33 |
| NAME: 鲁班七号     | SAL: 8300.00 |
+--------------------+--------------+

5.as语法 即可以给字段起别名也可以给表起
select emp.id,emp.name from emp as t1; # 报错  因为表名已经被你改成了t1
select t1.id,t1.name from emp as t1;

6.查询四则运算
查询每个人的年薪
select name,salary*12 as annual_salary from emp;
select name,salary*12 annual_salary from emp;    as可以省略

7、统计各部门年龄在30岁以上的员工平均工资
select post,avg(salary) from emp where age > 30 group by post; 
mysql> select post,avg(salary) from emp where age > 30 group by post;
+-----------+--------------+
| post      | avg(salary)  |
+-----------+--------------+
| teacher   |  3500.000000 |
| sale      |  3000.130000 |
| operation | 19000.000000 |
+-----------+--------------+where过滤出来的虚拟表进行一个分组

having

having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以!

1、统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
select post,avg(salary) from emp
        where age >= 30
        group by post
        having avg(salary) > 10000;
mysql> select post,avg(salary) from emp
    ->         where age >= 30
    ->         group by post
    ->         having avg(salary) > 10000;
+-----------+--------------+
| post      | avg(salary)  |
+-----------+--------------+
| operation | 19000.000000 |
+-----------+--------------+

#强调:having必须在group by后面使用
select * from emp having avg(salary) > 10000;  # 报错

distinct

对有重复的展示数据进行去重操作
select distinct post from emp;
mysql> select distinct post from emp;
+-----------+
| post      |
+-----------+
| HR        |
| teacher   |
| sale      |
| operation |
+-----------+

order by

select * from emp order by salary asc; #默认升序排
select * from emp order by salary desc; #降序排

select * from emp order by age desc; #降序排

先按照age降序排,在年轻相同的情况下再按照薪资升序排
select * from emp order by age desc,salary asc; 

统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
select post,avg(salary) from emp
    where age > 10
    group by post
    having avg(salary) > 1000
    order by avg(salary)
    ;

limit

限制展示条数
select * from emp limit 3;
查询工资最高的人的详细信息
select * from emp order by salary desc limit 1;

分页显示
select * from emp limit 0,5;  # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置
select * from emp limit 5,5;

正则

用 regexp 来表示后面的语法是正则语法。

select id,name,age,post from emp where name regexp '.*娜$';
mysql> select id,name,age,post from emp where name regexp '.*娜$';
+----+-----------+-----+---------+
| id | name      | age | post    |
+----+-----------+-----+---------+
|  7 | 雅典娜    |  18 | teacher |
|  9 | 露娜      |  48 | sale    |
+----+-----------+-----+---------+

总结:
关键字where ,group by同时出现的情况下,group by必须在where之后

where先对整张表进行一次筛选,如何group by再对筛选过后的表进行分组

如何验证where是在group by之前执行而不是之后 利用聚合函数 因为聚合函数只能在分组之后才能使用

select id,name,age from emp where max(salary) > 3000;   报错!

select max(salary) from emp;  

正常运行,不分组意味着每一个人都是一组,等运行到max(salary)的时候已经经过where,group by操作了,只不过我们都没有写这些条件

多表查询

#建表
create table dep(
id int,
name varchar(20) 
);

create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
hire_date date not null,
dep_id int
);

#插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营');

insert into emp(name,sex,age,hire_date,dep_id) values
('狄仁杰','male',18,'20170301',200),
(' 女娲   ','female',48,'20140701',201),
('成吉思汗','male',38,'19000301',201),
('虞姬','female',28,'20101111',202),
('扁鹊','male',18,'20150311',200),
('小乔','female',18,'20160513',204)
;

表查询

将所有的数据都对应了一遍,虽然不合理但是其中有合理的数据,现在我们需要做的就是找出合理的数据

select * from emp,dep;  # 左表一条记录与右表所有记录都对应一遍>>>笛卡尔积
mysql> select * from emp,dep;  # 左表一条记录与右表所有记录都对应一遍>>>笛卡尔积
+----+--------------+--------+------+------------+--------+------+--------------+
| id | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+----+--------------+--------+------+------------+--------+------+--------------+
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  201 | 人力资源     |
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  202 | 销售         |
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  203 | 运营         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  200 | 技术         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  202 | 销售         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  203 | 运营         |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  200 | 技术         |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  202 | 销售         |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  203 | 运营         |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  200 | 技术         |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  201 | 人力资源     |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  203 | 运营         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  201 | 人力资源     |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  202 | 销售         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  203 | 运营         |
|  6 | 小乔         | female |   18 | 2016-05-13 |    204 |  200 | 技术         |
|  6 | 小乔         | female |   18 | 2016-05-13 |    204 |  201 | 人力资源     |
|  6 | 小乔         | female |   18 | 2016-05-13 |    204 |  202 | 销售         |
|  6 | 小乔         | female |   18 | 2016-05-13 |    204 |  203 | 运营         |
+----+--------------+--------+------+------------+--------+------+--------------+

查询员工及所在部门的信息
select * from emp,dep where emp.dep_id = dep.id;
mysql> select * from emp,dep where emp.dep_id = dep.id;
+----+--------------+--------+------+------------+--------+------+--------------+
| id | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+----+--------------+--------+------+------------+--------+------+--------------+
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
+----+--------------+--------+------+------------+--------+------+--------------+

查询部门为技术部的员工及部门信息
select * from emp,dep where emp.dep_id = dep.id and dep.name = '技术';
mysql> select * from emp,dep where emp.dep_id = dep.id and dep.name = '技术';
+----+-----------+------+------+------------+--------+------+--------+
| id | name      | sex  | age  | hire_date  | dep_id | id   | name   |
+----+-----------+------+------+------------+--------+------+--------+
|  1 | 狄仁杰    | male |   18 | 2017-03-01 |    200 |  200 | 技术   |
|  5 | 扁鹊      | male |   18 | 2015-03-11 |    200 |  200 | 技术   |
+----+-----------+------+------+------------+--------+------+--------+

将两张表关联到一起的操作,有专门对应的方法
1、内连接:只取两张表有对应关系的记录
select * from emp inner join dep on emp.dep_id = dep.id;
select * from emp inner join dep on emp.dep_id = dep.id
                            where dep.name = "技术";
mysql> select * from emp inner join dep on emp.dep_id = dep.idwhere dep.name = "技术";
+----+-----------+------+------+------------+--------+------+--------+
| id | name      | sex  | age  | hire_date  | dep_id | id   | name   |
+----+-----------+------+------+------------+--------+------+--------+
|  1 | 狄仁杰    | male |   18 | 2017-03-01 |    200 |  200 | 技术   |
|  5 | 扁鹊      | male |   18 | 2015-03-11 |    200 |  200 | 技术   |
+----+-----------+------+------+------------+--------+------+--------+

2、左连接: 在内连接的基础上保留左表没有对应关系的记录
select * from emp left join dep on emp.dep_id = dep.id;
mysql> select * from emp left join dep on emp.dep_id = dep.id;
+----+--------------+--------+------+------------+--------+------+--------------+
| id | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+----+--------------+--------+------+------------+--------+------+--------------+
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|  6 | 小乔         | female |   18 | 2016-05-13 |    204 | NULL | NULL         |
+----+--------------+--------+------+------------+--------+------+--------------+

3、右连接: 在内连接的基础上保留右表没有对应关系的记录
select * from emp right join dep on emp.dep_id = dep.id;
mysql> select * from emp right join dep on emp.dep_id = dep.id;
+------+--------------+--------+------+------------+--------+------+--------------+
| id   | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+------+--------------+--------+------+------------+--------+------+--------------+
|    1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|    2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|    3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|    4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|    5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
| NULL | NULL         | NULL   | NULL | NULL       |   NULL |  203 | 运营         |
+------+--------------+--------+------+------------+--------+------+--------------+

4、全连接:在内连接的基础上保留左、右面表没有对应关系的的记录
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
mysql> select * from emp left join dep on emp.dep_id = dep.id union select * from emp right join dep on emp.dep_id = dep.id;
+------+--------------+--------+------+------------+--------+------+--------------+
| id   | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+------+--------------+--------+------+------------+--------+------+--------------+
|    1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|    5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
|    2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|    3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|    4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|    6 | 小乔         | female |   18 | 2016-05-13 |    204 | NULL | NULL         |
| NULL | NULL         | NULL   | NULL | NULL       |   NULL |  203 | 运营         |
+------+--------------+--------+------+------------+--------+------+--------------+

子查询

子查询就是将一个查询语句的结果用括号括起来当作另外一个查询语句的条件去用

表的查询结果可以作为其他表的查询条件,也可以通过其别名的方式把它作为一张虚拟表去跟其他表做关联查询

1.查询部门是技术或者人力资源的员工信息
"""
先获取技术部和人力资源部的id号,再去员工表里面根据前面的id筛选出符合要求的员工信息
"""
select * from emp where dep_id in (select id from dep where name = "技术" or name = "人力资源");
mysql> select * from emp where dep_id in (select id from dep where name = "技术" or name = "人力资源");
+----+--------------+--------+------+------------+--------+
| id | name         | sex    | age  | hire_date  | dep_id |
+----+--------------+--------+------+------------+--------+
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |
+----+--------------+--------+------+------------+--------+

2.每个部门最新入职的员工 思路:先查每个部门最新入职的员工,再按部门对应上联表查询
select t1.id,t1.name,t1.hire_date,t1.dep_id,t2.* from emp as t1
inner join
(select dep_id ,max(hire_date) as max_date from emp group by dep_id ) as t2
on t1.dep_id  = t2.dep_id 
where t1.hire_date = t2.max_date
;
mysql> select t1.id,t1.name,t1.hire_date,t1.dep_id,t2.* from emp as t1
    -> inner join
    -> (select dep_id ,max(hire_date) as max_date from emp group by dep_id ) as t2
    -> on t1.dep_id  = t2.dep_id
    -> where t1.hire_date = t2.max_date
    -> ;
+----+------------+------------+--------+--------+------------+
| id | name       | hire_date  | dep_id | dep_id | max_date   |
+----+------------+------------+--------+--------+------------+
|  1 | 狄仁杰     | 2017-03-01 |    200 |    200 | 2017-03-01 |
|  2 |  女娲      | 2014-07-01 |    201 |    201 | 2014-07-01 |
|  4 | 虞姬       | 2010-11-11 |    202 |    202 | 2010-11-11 |
|  6 | 小乔       | 2016-05-13 |    204 |    204 | 2016-05-13 |
+----+------------+------------+--------+--------+------------+

select * from emp inner join dep on emp.dep_id = dep.id;
mysql> select * from emp inner join dep on emp.dep_id = dep.id;
+----+--------------+--------+------+------------+--------+------+--------------+
| id | name         | sex    | age  | hire_date  | dep_id | id   | name         |
+----+--------------+--------+------+------------+--------+------+--------------+
|  1 | 狄仁杰       | male   |   18 | 2017-03-01 |    200 |  200 | 技术         |
|  2 |  女娲        | female |   48 | 2014-07-01 |    201 |  201 | 人力资源     |
|  3 | 成吉思汗     | male   |   38 | 1900-03-01 |    201 |  201 | 人力资源     |
|  4 | 虞姬         | female |   28 | 2010-11-11 |    202 |  202 | 销售         |
|  5 | 扁鹊         | male   |   18 | 2015-03-11 |    200 |  200 | 技术         |
+----+--------------+--------+------+------------+--------+------+--------------+

猜你喜欢

转载自blog.csdn.net/linwow/article/details/90240661