zoukankan      html  css  js  c++  java
  • 单表查询、多表查询、虚拟表连接查询

      单表查询,以下面这个表为例:
    +----+------------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+
    | 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 3 and 6; # id>=3 and id<=6
    not between 3 and 6 #可以取反

    2.in
    <select * from emp where salary =20000 or salary = 18000 or salary=17000;>
    select * from emp where salary in(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 name like '____'

    要求:查询员工职位描述post_comment为空姓名与职位: (判断NULL只能用is,不能用=)
    select name,post from emp where post_comment is NULL;
    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*12 as 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 emp order 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 |
    +-----+------+----+-----------+------+-----+--------+

    只查技术部的人名:
    select emp.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 |
    +----+--------+--------+-----+------------+----------------------------+--------------+------------+--------+-----------+

  • 相关阅读:
    verilog parameter 位宽问题
    quartus prime 16.0 报警告 inferring latch
    Quartus prime16.0 组合逻辑always块中敏感向量表不全
    centos6.8下安装matlab2009(图片转帖)
    centos6.8下普通用户下quartus编程识别不到用户开发板
    centos6.8下安装破解quartus prime16.0以及modelsim ae安装
    PHP TP 生成二维码
    模态框MODAL的一些事件捕捉
    iOS微信第三方登录实现
    PHP ini 配置无效的坑给自己记录
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9356894.html
Copyright © 2011-2022 走看看