mysql虚拟表查询_单表查询、多表查询、虚拟表连接查询

单表查询,以下面这个表为例:

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |

| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |

| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300 | 401 | 1 |

| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500 | 401 | 1 |

| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100 | 401 | 1 |

| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000 | 401 | 1 |

| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000 | 401 | 1 |

| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000 | 401 | 1 |

| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |

| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |

| 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |

| 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |

| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |

| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |

| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000 | 403 | 3 |

| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000 | 403 | 3 |

| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000 | 403 | 3 |

| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000 | 403 | 3 |

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

select distinct 字段1,字段2,字段3,... from 库名.表名 #distinct 去重复功能

where约束条件

group by 按照分组依据,分组查询

having 分组后的过滤条件(针对组级别的过滤)

order by 排序依据

limit n; 限制显示的条目

语法:

1.注意先切换路径use db8,找到文件、打开文件、for循环可能是多读多行才发送给服务端,这样会减少IO

select * from db8.emp

from db8.emp

2.优先级顺序

from打开文件(把表从硬盘读入内存) ——>where条件过滤——>group by分组

执行顺序——————>————————>

group by:聚合函数(avg、sum、max、min等)只能在分完组之后才能使用

如果不写,其实默认是有where、group by分组的

例如:

select max(salary) from emp;

+-------------+

| max(salary) |

+-------------+

| 1000000.31 |

+-------------+

distinct:去的是记录的重复

select distinct sex from emp; 去除筛选的重复的sex

+--------+

| sex |

+--------+

| male |

| female |

+--------+

where 过滤:

1.between..and (包含=两边的)

select id,name from emp where id between 3and6; # id>=3 and id<=6

not between 3 and 6 #可以取反

2.in

select * from emp where salaryin(17000,18000,20000); #最终版(取代连续or的条件)

not in #可以取反

3.like: _代表任意单个字符 %:代表任意无穷个字符

要求:查找emp里面含有‘i’字母的员工姓名与其薪资

select name,salary from emp where name like '%i%';

要求:查询员工姓名由四个字符组成的员工姓名与其薪资

select name,salary from emp where namelike '____';

要求:查询员工职位描述post_comment为空姓名与职位: (判断NULL只能用is,不能用=)

select name,post from emp where post_comment isNULL;

is not NULL #取反

group by分组: 聚合函数(avg、sum、max、min等)只能在分完组之后才能使用

什么是分组:找重复度高的,即有大量重复的字段去使用(id、name重复度太低,不能使用group by)

为何要分组:当我们要以组为单位进行统计时就必须分组

补充:#设置sql_mode为only_full_group_by,一位着以后分组,只能取分组的依据

查看sql_mode:

1.show variables like 'sql_mode';

+---------------+---------------------+

| Variable_name | Value |

+---------------+---------------------+

| sql_mode | STRICT_TRANS_TABLES |

+---------------+---------------------+

2.set global sql_mode='strict_trans_tables,only_full_group_by' ; 这个严格模式设置完之后以后就只能取组名,单 单独分组后的内容是看不到的

即只能取:select post from emp group by post; (name,id。。等都取不到),说明分组是为了整体来用,把数据聚集在一起,不是为 了单独取某条数据

3.select @@sql_mode #查看是否更改成功

1.max求每个部门最高工资(select * 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;

统计每个部门个数:(按照id)

select post,count(id) from emp group by post;

having by:过滤条件,可以用聚合函数,因为是在分组之后

where分组之前做的过滤

having 分组之后专门对聚合的结果做进一步筛选

select age from emp group by age having age > 28;

group_concat字符串拼接:

查看所有部门和对应的员工名字:

select post,group_concat(name) from emp group by post;

+----------------------------+-------------------------------------------------------+

| post | group_concat(name) |

+----------------------------+-------------------------------------------------------+

| operation | 程咬铁,程咬铜,程咬银,程咬金,张野 |

| sale | 格格,星星,丁丁,丫丫,歪歪 |

| teacher | 成龙,jinxin,jingliyang,liwenzhou,yuanhao,wupeiqi,alex |

| 老男孩驻沙河办事处外交大使 | egon |

+----------------------------+-------------------------------------------------------+

select post,group_concat(name,'_perfect') from emp group by post; #实质就是一个字符串的凭借

select post,group_concat(salary) from emp group by post;

select post,group_concat(name,':',salary) from emp group by post;

练习:

1.查询岗位名以及包含的所有员工的名字:

select post,group_concat(name) from emp group by post;

2.查询岗位名已经岗位内包含的员工个数

select post,count(id) from emp group by post;

3.所有男员工、女员工的个数:

select sex,count(id) from emp group by sex;

4.取部门的平均工资:

select post,avg(salary) from emp group by post;

5.查询男员工与女员工的平均薪资

select sex,avg(salary) from emp group by sex;

6.统计各部门年龄在30岁以上的员工平均工资:(分析表的结果包含:部门、平均薪资)

select post,avg(salary) from emp where age >= 30 group by post;

+---------+---------------+

| post | avg(salary) |

+---------+---------------+

| sale | 2500.240000 |

| teacher | 255450.077500 |

+---------+---------------+

补充concat不分组时用

select name as 姓名,salary as 薪资 from emp;

select concat('Name:',name) as 姓名,concat('Sal:',salary) as 薪资 from emp;

+-----------------+----------------+

| 姓名 | 薪资 |

+-----------------+----------------+

|Name:egon |Sal:7300.33 |

| Name:alex | Sal:1000000.31 |

| Name:wupeiqi | Sal:8300.00 |

| Name:yuanhao | Sal:3500.00 |

| Name:liwenzhou | Sal:2100.00 |

| Name:jingliyang | Sal:9000.00 |

| Name:jinxin | Sal:30000.00 |

| Name:成龙 | Sal:10000.00 |

| Name:歪歪 | Sal:3000.13 |

| Name:丫丫 | Sal:2000.35 |

| Name:丁丁 | Sal:1000.37 |

| Name:星星 | Sal:3000.29 |

| Name:格格 | Sal:4000.33 |

| Name:张野 | Sal:10000.13 |

| Name:程咬金 | Sal:20000.00 |

| Name:程咬银 | Sal:19000.00 |

| Name:程咬铜 | Sal:18000.00 |

| Name:程咬铁 | Sal:17000.00 |

+-----------------+----------------+

select concat(name,':',age,':',sex) from emp; #正常情况每个字段间都要输入:

select concat_ws(':',name,age,sex) from emp; #concat_ws就是需要在多个表中间要加‘:’时,只需要在最前面加‘:’就自动会在多个字段加

mysql> select concat_ws(':',name,age,

sex) from emp;

+-----------------------------+

| concat_ws(':',name,age,sex) |

+-----------------------------+

| egon:18:male |

| alex:78:male |

| wupeiqi:81:male |

| yuanhao:73:male |

| liwenzhou:28:male |

| jingliyang:18:female |

| jinxin:18:male |

| 成龙:48:male |

| 歪歪:48:female |

| 丫丫:38:female |

| 丁丁:18:female |

| 星星:18:female |

| 格格:28:female |

| 张野:28:male |

| 程咬金:18:male |

| 程咬银:18:female |

| 程咬铜:18:male |

| 程咬铁:18:female |

+-----------------------------+

四则运算:

计算年薪:

select name,salary*12as annual_salary from emp; #默认可以不写as

+------------+---------------+

| name | annual_salary |

+------------+---------------+

| egon | 87603.96 |

| alex | 12000003.72 |

| wupeiqi | 99600.00 |

| yuanhao | 42000.00 |

| liwenzhou | 25200.00 |

| jingliyang | 108000.00 |

| jinxin | 360000.00 |

| 成龙 | 120000.00 |

| 歪歪 | 36001.56 |

| 丫丫 | 24004.20 |

| 丁丁 | 12004.44 |

| 星星 | 36003.48 |

| 格格 | 48003.96 |

| 张野 | 120001.56 |

| 程咬金 | 240000.00 |

| 程咬银 | 228000.00 |

| 程咬铜 | 216000.00 |

| 程咬铁 | 204000.00 |

+------------+---------------+

select * from emp; #正常情况

select * from emp as t1; #正常情况

select empoyee.* from emp as empoyee; #如果要是表名.* 后面必须就要一致,说明 as empoyee先运行

order by排序:

升序:

select age from emporder by age; #select age from emp order by age asc; 默认是升序后面有asc

降序:

select age from emp order by age desc;

limit限制显示的条件:

select * from emp limit 4; #打印只会显示前面4条信息

+----+---------+------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+---------+------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |

| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |

| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300 | 401 | 1 |

| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500 | 401 | 1 |

+----+---------+------+-----+------------+----------------------------+--------------+------------+--------+-----------+

limit分页显示:

select * from emp limit 0,5; #从0开始(不包含0)往后取5条,会打印1-5

select * from emp limit 5,5; #从5开始往后取5条,会打印6-10

+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+

| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000 | 401 | 1 |

| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000 | 401 | 1 |

| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000 | 401 | 1 |

| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |

| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |

+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+

正则表达式:

select * from emp where name regexp '^jin.*(g|n)$'; #jin开头,.*中间可以是任意字符,g/n结尾的名字

+----+------------+--------+-----+------------+---------+--------------+--------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+------------+--------+-----+------------+---------+--------------+--------+--------+-----------+

| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000 | 401 | 1 |

| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000 | 401 | 1 |

+----+------------+--------+-----+------------+---------+--------------+--------+--------+-----------+

多表查询:

emp:

+-----+----------+ +----+--------

| id | name | sex | age | dep_id |

+----+------------+--------+-----+--------+

| 1 | egon | male | 18 | 200 |

| 2 | alex | female | 48 | 201 |

| 3 | wupeiqi | male | 38 | 201 |

| 4 | yuanhao | female | 28 | 202 |

| 5 | liwenzhou | male | 18 | 200 |

| 6 | jingliyang | female | 18 | 204 |

+----+------------+--------+-----+--------+ +-----+----------+

dep:

| id | name |

+-----+----------+

| 200 | 技术 |

| 201 | 人力资源 |

| 202 | 销售 |

| 203 | 运营 |

select * from emp,dep 同时查询2张表:(本质是一份数据,员工部门表)

原理:左边的一天记录会完整的把右边的记录对应一遍:

+----+------------+--------+-----+--------+-----+----------+

| id | name | sex | age | dep_id | id | name |

+----+------------+--------+-----+--------+-----+----------+

| 1 | egon | male | 18 | 200 | 200 | 技术 | egon完整与部门表对应一次

| 1 | egon | male | 18 | 200 | 201 | 人力资源 |

| 1 | egon | male | 18 | 200 | 202 | 销售 |

| 1 | egon | male | 18 | 200 | 203 | 运营 |

| 2 | alex | female | 48 | 201 | 200 | 技术 | alex完整与部门表对应一次

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 2 | alex | female | 48 | 201 | 202 | 销售 |

| 2 | alex | female | 48 | 201 | 203 | 运营 |

| 3 | wupeiqi | male | 38 | 201 | 200 | 技术 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 202 | 销售 |

| 3 | wupeiqi | male | 38 | 201 | 203 | 运营 |

| 4 | yuanhao | female | 28 | 202 | 200 | 技术 |

| 4 | yuanhao | female | 28 | 202 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 4 | yuanhao | female | 28 | 202 | 203 | 运营 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 201 | 人力资源 |

| 5 | liwenzhou | male | 18 | 200 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 203 | 运营 |

| 6 | jingliyang | female | 18 | 204 | 200 | 技术 |

| 6 | jingliyang | female | 18 | 204 | 201 | 人力资源 |

| 6 | jingliyang | female | 18 | 204 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | 203 | 运营 |

+----+------------+--------+-----+--------+-----+----------+

笛卡尔积

汇总员工表emp里面对应的部门信息:

select * from emp,dep where emp.dep_id = dep.id; (基础写法)

+-----+----------+----+-----------+--------+-----+--------+

| id | name | id | name | sex | age | dep_id |

+-----+----------+----+-----------+--------+-----+--------+

| 200 | 技术 | 1 | egon | male | 18 | 200 |

| 201 | 人力资源 | 2 | alex | female | 48 | 201 |

| 201 | 人力资源 | 3 | wupeiqi | male | 38 | 201 |

| 202 | 销售 | 4 | yuanhao | female | 28 | 202 |

| 200 | 技术 | 5 | liwenzhou | male | 18 | 200 |

+-----+----------+----+-----------+--------+-----+--------+

只打印技术部门的人:

select * from dep,emp where emp.dep_id = dep.id and dep.name='技术';(在基础上再加and的判断语句)

+-----+------+----+-----------+------+-----+--------+

| id | name | id | name | sex | age | dep_id |

+-----+------+----+-----------+------+-----+--------+

| 200 | 技术 | 1 | egon | male | 18 | 200 |

| 200 | 技术 | 5 | liwenzhou | male | 18 | 200 |

+-----+------+----+-----------+------+-----+--------+

只查技术部的人名:

selectemp.name from emp,dep where emp.dep_id = dep.id and dep.name='技术';

3.1、2条件基础上对结果近一步筛选 1.笛卡尔积筛选后的基础表格 2.基于基础添加判断进一步筛选

+-----------+

| name |

+-----------+

| egon |

| liwenzhou |

+-----------+

查egon所在的部门名:

select dep.name from emp,dep where emp.dep_id = dep.id and emp.name='egon';

+------+

| name |

+------+

| 技术 |

+------+

1.内连接:不推荐

select * from emp,dep where emp.dep_id = dep.id;

2.内连接标准写法:inner join...on:只取两张表有对应关系的记录

inner join...on 只取相同部分,与上面原理一样

select * from emp inner join dep on emp.dep_id = dep.id where dep.name='技术';

思考:emp里面没有对应关系的 jingliyang 204没出来,如何做保留

左连接:在内连接的基础上,保留左表没有对应关系的记录

select * from emp left joindep on emp.dep_id = dep.id;

+----+------------+--------+-----+--------+------+----------+

| id | name | sex | age | dep_id | id | name |

+----+------------+--------+-----+--------+------+----------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL|

+----+------------+--------+-----+--------+------+----------+

6 rows in set

右连接:在内连接的基础上,保留右表没有对应关系的记录

select * from emp right join dep on emp.dep_id = dep.id;

+------+-----------+--------+------+--------+-----+----------+

| id | name | sex | age | dep_id | id | name |

+------+-----------+--------+------+--------+-----+----------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

|NULL | NULL | NULL | NULL | NULL |203 | 运营 |

+------+-----------+--------+------+--------+-----+----------+

全连接:在内连接的基础上保留右表没有对应关系的记录

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 | dep_id | id | name |

+------+------------+--------+------+--------+------+----------+

| 1 | egon | male | 18 | 200 | 200 | 技术 |

| 5 | liwenzhou | male | 18 | 200 | 200 | 技术 |

| 2 | alex | female | 48 | 201 | 201 | 人力资源 |

| 3 | wupeiqi | male | 38 | 201 | 201 | 人力资源 |

| 4 | yuanhao | female | 28 | 202 | 202 | 销售 |

| 6 | jingliyang | female | 18 | 204 | NULL | NULL |

| NULL | NULL | NULL | NULL | NULL | 203 | 运营 |

+------+------------+--------+------+--------+------+----------+

工作顺序就是:

1.先实现笛卡尔积

2.再看是数据inner join、left join、 right join

虚拟表连接查询:

环境是只有一个emp员工信息工资表:

t1:表格

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |

| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |

| 3 | wupeiqi | male | 81 | 2013-03-05 | teacher | NULL | 8300 | 401 | 1 |

| 4 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500 | 401 | 1 |

| 5 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100 | 401 | 1 |

| 6 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000 | 401 | 1 |

| 7 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000 | 401 | 1 |

| 8 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000 | 401 | 1 |

| 9 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |

| 10 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |

| 11 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |

| 12 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |

| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |

| 14 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |

| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000 | 403 | 3 |

| 16 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000 | 403 | 3 |

| 17 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000 | 403 | 3 |

| 18 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000 | 403 | 3 |

+----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

t2表格:(虚拟表)

+----------------------------+-------------+

| post | max(salary) |

+----------------------------+-------------+

| operation | 20000 |

| sale | 4000.33 |

| teacher | 1000000.31 |

| 老男孩驻沙河办事处外交大使 | 7300.33 |

+----------------------------+-------------+

实例2:

1.思考怎么实现找到薪资最高的人,首先不能直接在emp这张表上直接实现得到

2.想得到每个部门薪资最高的人,其实就是在t2的基础上做近一步的筛选

3.为了拿到人名,所有将t1与t2合并,从新表里再取提取对应的薪资最高的人

将2张表格 inner join

select t1.id,t1.name,t1.salary,t1.post,t2.post,t2.ms

from emp as t1

inner join

(select post,max(salary)as ms from emp group by post) as t2 #将t2的max(salary)字段变为ms ;as t2是将整个t2表格变为t2

on t1.post = t2.post;

+----+------------+------------+----------------------------+----------------------------+------------+

| id | name | salary | post | post | ms |

+----+------------+------------+----------------------------+----------------------------+------------+

| 1 | egon | 7300.33 | 老男孩驻沙河办事处外交大使 | 老男孩驻沙河办事处外交大使 | 7300.33 |

| 2 | alex | 1000000.31| teacher | teacher | 1000000.31 |

| 3 | wupeiqi | 8300 | teacher | teacher | 1000000.31 | #前面的名字是数据后面部门的,后面的薪资是这个部门的最高工资

| 4 | yuanhao | 3500 | teacher | teacher | 1000000.31 |

| 5 | liwenzhou | 2100 | teacher | teacher | 1000000.31 |

| 6 | jingliyang | 9000 | teacher | teacher | 1000000.31 |

| 7 | jinxin | 30000 | teacher | teacher | 1000000.31 |

| 8 | 成龙 | 10000 | teacher | teacher | 1000000.31 |

| 9 | 歪歪 | 3000.13 | sale | sale | 4000.33 |

| 10 | 丫丫 | 2000.35 | sale | sale | 4000.33 |

| 11 | 丁丁 | 1000.37 | sale | sale | 4000.33 |

| 12 | 星星 | 3000.29 | sale | sale | 4000.33 |

| 13 |格格 | 4000.33| sale |sale | 4000.33|

| 14 | 张野 | 10000.13 | operation | operation | 20000 |

| 15 | 程咬金 | 20000| operation |operation | 20000 |

| 16 | 程咬银 | 19000 | operation | operation | 20000 |

| 17 | 程咬铜 | 18000 | operation | operation | 20000 |

| 18 | 程咬铁 | 17000 | operation | operation | 20000 |

+----+------------+------------+----------------------------+----------------------------+------------+

18 rows in set

连表的目的是:判断员工薪资是不是部门最高工资 t1.salary = t2.ms

select t1.id,t1.name,t1.salary,t1.post,t2.post,t2.ms

from emp as t1

inner join

(select post,max(salary) as ms from emp group by post) as t2

on t1.post = t2.post

where t1.salary=t2.ms;

+----+--------+------------+----------------------------+----------------------------+------------+

| id | name | salary | post | post | ms |

+----+--------+------------+----------------------------+----------------------------+------------+

| 1 | egon | 7300.33 | 老男孩驻沙河办事处外交大使 | 老男孩驻沙河办事处外交大使 | 7300.33 |

| 2 | alex | 1000000.31 | teacher | teacher | 1000000.31 |

| 13 | 格格 | 4000.33 | sale | sale | 4000.33 |

| 15 | 程咬金 | 20000 | operation | operation | 20000 |

+----+--------+------------+----------------------------+----------------------------+------------+

最终版:代码实现拿到薪资最高对应的人

select t1.* #最后要的只是t1表里面的信息,唯一就是筛选出了最高工资对应的人,(t2实质就是中间过度判断的依据)

from emp as t1

inner join

(select post,max(salary) as ms from emp group by post) as t2

on t1.post = t2.post

where t1.salary=t2.ms;

+----+--------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |

+----+--------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

| 1 | egon | male | 18 | 2017-03-01 | 老男孩驻沙河办事处外交大使 | NULL | 7300.33 | 401 | 1 |

| 2 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |

| 13 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |

| 15 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000 | 403 | 3 |

+----+--------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值