MySQL多表查询练习

打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.找出销售部分中年纪最大的员工的姓名

  1. mysql> select name,age from dept a ,emp_new b where a.dept1=b.dept2 and dept_name='销售'order by age desc limit 1;
  2. +------+------+
  3. | name | age  |
  4. +------+------+
  5. | 荣七 |   64 |
  6. +------+------+
  7. 1 row in set (0.00 sec)
复制代码
2.求财务部分最低工资的员工姓名

  1. mysql> select name from emp_new e join dept d on e.dept2=d.dept1 where d.dept_name='财务' order by incoming limit 1;
  2. +------+
  3. | name |
  4. +------+
  5. | 王五 |
  6. +------+
  7. 1 row in set (0.00 sec)
复制代码
3. 列出每个部分收入总和高于 9000 的部分名称

  1. mysql> select dept.dept_name from emp_new join dept on emp_new.dept2=dept.dept1 group by dept.dept_name having sum(emp_new.incoming) > 9000;
  2. +-----------+
  3. | dept_name |
  4. +-----------+
  5. | 财务      |
  6. | 销售      |
  7. +-----------+
  8. 2 rows in set (0.00 sec)
复制代码
 4. 求工资在 7500 到 8500 元之间,年龄最大的人的姓名及部分

  1. mysql> select name,dept_name from emp_new join dept on emp_new.dept2=dept.dept1 where incoming between 7500 and 8500 order by age limit 1;
  2. +------+-----------+
  3. | name | dept_name |
  4. +------+-----------+
  5. | 赵六 | 销售      |
  6. +------+-----------+
  7. 1 row in set (0.00 sec)
复制代码
5.找出销售部分收入最低的员工入职时间

  1. mysql> select worktime_start '入职时间' from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='销售' order by incoming limit 1;
  2. +------------+
  3. | 入职时间   |
  4. +------------+
  5. | 1970-10-11 |
  6. +------------+
  7. 1 row in set (0.00 sec)
复制代码

6.财务部分收入凌驾2000元的员工姓名


  1. mysql> select name from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='财务' and incoming > 2000;
  2. +------+
  3. | name |
  4. +------+
  5. | 张三 |
  6. | 李四 |
  7. +------+
复制代码

7.列出每个部分的平均收入及部分名称


  1. mysql> select dept_name,avg(emp_new.incoming) '平均收入' from emp_new join dept on emp_new.dept2=dept.dept1 group by dept.dept_name;
  2. +-----------+-----------+
  3. | dept_name | 平均收入  |
  4. +-----------+-----------+
  5. | 财务      | 3166.6667 |
  6. | 销售      | 8000.0000 |
  7. | 运维      | 7300.0000 |
  8. +-----------+-----------+
  9. 3 rows in set (0.00 sec)
  10. mysql> select dept_name,round(avg(emp_new.incoming),2) '平均收入' from emp_new join dept on emp_new.dept2=dept.dept1 group by dept.dept_name;
  11. +-----------+----------+
  12. | dept_name | 平均收入 |
  13. +-----------+----------+
  14. | 财务      |  3166.67 |
  15. | 销售      |  8000.00 |
  16. | 运维      |  7300.00 |
  17. +-----------+----------+
  18. 3 rows in set (0.00 sec)
复制代码

8.运维部入职员工的员工号


  1. mysql> select sid '员工号' from emp_new join dept on emp_new.dept2=dept.dept1  where dept.dept_name ='运维';
  2. +--------+
  3. | 员工号 |
  4. +--------+
  5. |   1879 |
  6. +--------+
  7. 1 row in set (0.00 sec)
复制代码

9.财务部分的收入总和;


  1. mysql> select sum(incoming) '总收入' from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='财务';
  2. +--------+
  3. | 总收入 |
  4. +--------+
  5. |   9500 |
  6. +--------+
  7. 1 row in set (0.00 sec)
复制代码

10.先按部分号大小排序,再依据入职时间由早到晚排序员工信息表


  1. mysql> select * from emp_new join dept on emp_new.dept2=dept.dept1 order by emp_new.dept2,emp_new.worktime_start;
  2. +------+------+------+----------------+----------+-------+-------+-----------+
  3. | sid  | name | age  | worktime_start | incoming | dept2 | dept1 | dept_name |
  4. +------+------+------+----------------+----------+-------+-------+-----------+
  5. | 1789 | 张三 |   35 | 1980-01-01     |     4000 |   101 |   101 | 财务      |
  6. | 1674 | 李四 |   32 | 1983-04-01     |     3500 |   101 |   101 | 财务      |
  7. | 1776 | 王五 |   24 | 1990-07-01     |     2000 |   101 |   101 | 财务      |
  8. | 1564 | 荣七 |   64 | 1963-10-11     |     8500 |   102 |   102 | 销售      |
  9. | 1568 | 赵六 |   57 | 1970-10-11     |     7500 |   102 |   102 | 销售      |
  10. | 1879 | 牛八 |   55 | 1971-10-20     |     7300 |   103 |   103 | 运维      |
  11. +------+------+------+----------------+----------+-------+-------+-----------+
  12. 6 rows in set (0.00 sec)
复制代码

11.找出哪个部分还没有员工入职;


  1. mysql> select dept.dept_name from dept left join emp_new on emp_new.dept2=dept.dept1 where emp_new.dept2 is null;
  2. +-----------+
  3. | dept_name |
  4. +-----------+
  5. | 行政      |
  6. +-----------+
  7. 1 row in set (0.00 sec)
复制代码

12.列出部分员工收入大于7000的部分编号,部分名称;


  1. mysql> select dept.dept1,dept.dept_name from emp_new join dept on emp_new.dept2=dept.dept1 where emp_new.incoming > 7000 group by dept.dept1,dept.dept_name;
  2. +-------+-----------+
  3. | dept1 | dept_name |
  4. +-------+-----------+
  5. |   102 | 销售      |
  6. |   103 | 运维      |
  7. +-------+-----------+
  8. 2 rows in set (0.00 sec)
复制代码

13.列出每一个部分的员工总收入及部分名称;


  1. mysql> select dept.dept_name '部门名称',sum(emp_new.incoming) '员工总收入'  from emp_new join dept on emp_new.dept2=dept.dept1 group by dept.dept_name;
  2. +----------+------------+
  3. | 部门名称 | 员工总收入 |
  4. +----------+------------+
  5. | 财务     |       9500 |
  6. | 销售     |      16000 |
  7. | 运维     |       7300 |
  8. +----------+------------+
  9. 3 rows in set (0.00 sec)
复制代码

14.列出每一个部分中年纪最大的员工姓名,部分名称;


  1. mysql> select emp_new.name,dept.dept_name from emp_new join dept on emp_new.dept2=dept.dept1 where(emp_new.dept2,emp_new.age) in (select dept2,max(age) from emp_new group by dept2);
  2. +------+-----------+
  3. | name | dept_name |
  4. +------+-----------+
  5. | 张三 | 财务      |
  6. | 荣七 | 销售      |
  7. | 牛八 | 运维      |
  8. +------+-----------+
  9. 3 rows in set (0.00 sec)
  10. mysql> select name as "姓名", dept_name as "部门名称" from dept,(select max(age) age,dept2 from emp_new group by dept2) em, emp_new where dept.dept1=em.dept2 and em.age=emp_new.age;
  11. +------+----------+
  12. | 姓名 | 部门名称 |
  13. +------+----------+
  14. | 张三 | 财务     |
  15. | 荣七 | 销售     |
  16. | 牛八 | 运维     |
  17. +------+----------+
  18. 3 rows in set (0.00 sec)
复制代码

15.求李四的收入及部分名称


  1. mysql> select e.incoming,d.dept_name from emp_new e join dept d on e.dept2=d.dept1 where e.name='李四';
  2. +----------+-----------+
  3. | incoming | dept_name |
  4. +----------+-----------+
  5. |     3500 | 财务      |
  6. +----------+-----------+
  7. 1 row in set (0.00 sec)
复制代码

16.列出部分员工数大于1个的部分名称


  1. mysql> select d.dept_name from emp_new e join dept d on e.dept2=d.dept1 group by d.dept_name having count(e.sid) > 1;
  2. +-----------+
  3. | dept_name |
  4. +-----------+
  5. | 财务      |
  6. | 销售      |
  7. +-----------+
  8. 2 rows in set (0.00 sec)
复制代码
小结

毗连方式

        依业务需求选毗连类型。内毗连取匹配行;外毗连(左、右、全外)保留一侧或两侧表所有行;交叉毗连得笛卡尔积,非特定需求慎用。
        理解差别毗连对结果集影响,如左毗连以左表为主,即便右表无匹配也有左表记载。
毗连条件

        精准设置毗连条件,基于关联字段创建条件,保证结果正确。
        防止遗漏毗连条件致笛卡尔积,使结果集巨大且无意义。
性能优化

        仅选必要字段,不消`SELECT *`,降低数据传输与处理开销。
        为毗连字段建索引,加快表毗连时数据匹配。  
        大数据量时,避免复杂嵌套子查询,可优化为毗连查询提升性能。
字段与别名

        多表有同名字段,用表名.字段名明白所属,防肴杂。  
        公道用表与字段别名,让查询易读,别名简洁故意义。
数据完备性

        多表更新删除操作,用事务确保原子性,保证数据一致性。
        操作遵循外键约束,避免破坏数据关联关系。
子查询与联合查询

        子查询注意实行顺序与结果集大小,避免结果集过大拖慢查询。
        联合查询归并结果集,各部分列数与数据类型须一致。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表