MySQL多表查询练习
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;
+------+------+
| name | age|
+------+------+
| 荣七 | 64 |
+------+------+
1 row in set (0.00 sec) 2.求财务部分最低工资的员工姓名
mysql> select name from emp_new e join dept d on e.dept2=d.dept1 where d.dept_name='财务' order by incoming limit 1;
+------+
| name |
+------+
| 王五 |
+------+
1 row in set (0.00 sec) 3. 列出每个部分收入总和高于 9000 的部分名称
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;
+-----------+
| dept_name |
+-----------+
| 财务 |
| 销售 |
+-----------+
2 rows in set (0.00 sec) 4. 求工资在 7500 到 8500 元之间,年龄最大的人的姓名及部分
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;
+------+-----------+
| name | dept_name |
+------+-----------+
| 赵六 | 销售 |
+------+-----------+
1 row in set (0.00 sec) 5.找出销售部分收入最低的员工入职时间
mysql> select worktime_start '入职时间' from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='销售' order by incoming limit 1;
+------------+
| 入职时间 |
+------------+
| 1970-10-11 |
+------------+
1 row in set (0.00 sec)
6.财务部分收入凌驾2000元的员工姓名
mysql> select name from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='财务' and incoming > 2000;
+------+
| name |
+------+
| 张三 |
| 李四 |
+------+
7.列出每个部分的平均收入及部分名称
mysql> select dept_name,avg(emp_new.incoming) '平均收入' from emp_new join dept on emp_new.dept2=dept.dept1 group by dept.dept_name;
+-----------+-----------+
| dept_name | 平均收入|
+-----------+-----------+
| 财务 | 3166.6667 |
| 销售 | 8000.0000 |
| 运维 | 7300.0000 |
+-----------+-----------+
3 rows in set (0.00 sec)
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;
+-----------+----------+
| dept_name | 平均收入 |
+-----------+----------+
| 财务 |3166.67 |
| 销售 |8000.00 |
| 运维 |7300.00 |
+-----------+----------+
3 rows in set (0.00 sec)
8.运维部入职员工的员工号
mysql> select sid '员工号' from emp_new join dept on emp_new.dept2=dept.dept1where dept.dept_name ='运维';
+--------+
| 员工号 |
+--------+
| 1879 |
+--------+
1 row in set (0.00 sec)
9.财务部分的收入总和;
mysql> select sum(incoming) '总收入' from emp_new join dept on emp_new.dept2=dept.dept1 where dept.dept_name ='财务';
+--------+
| 总收入 |
+--------+
| 9500 |
+--------+
1 row in set (0.00 sec)
10.先按部分号大小排序,再依据入职时间由早到晚排序员工信息表
mysql> select * from emp_new join dept on emp_new.dept2=dept.dept1 order by emp_new.dept2,emp_new.worktime_start;
+------+------+------+----------------+----------+-------+-------+-----------+
| sid| name | age| worktime_start | incoming | dept2 | dept1 | dept_name |
+------+------+------+----------------+----------+-------+-------+-----------+
| 1789 | 张三 | 35 | 1980-01-01 | 4000 | 101 | 101 | 财务 |
| 1674 | 李四 | 32 | 1983-04-01 | 3500 | 101 | 101 | 财务 |
| 1776 | 王五 | 24 | 1990-07-01 | 2000 | 101 | 101 | 财务 |
| 1564 | 荣七 | 64 | 1963-10-11 | 8500 | 102 | 102 | 销售 |
| 1568 | 赵六 | 57 | 1970-10-11 | 7500 | 102 | 102 | 销售 |
| 1879 | 牛八 | 55 | 1971-10-20 | 7300 | 103 | 103 | 运维 |
+------+------+------+----------------+----------+-------+-------+-----------+
6 rows in set (0.00 sec)
11.找出哪个部分还没有员工入职;
mysql> select dept.dept_name from dept left join emp_new on emp_new.dept2=dept.dept1 where emp_new.dept2 is null;
+-----------+
| dept_name |
+-----------+
| 行政 |
+-----------+
1 row in set (0.00 sec)
12.列出部分员工收入大于7000的部分编号,部分名称;
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;
+-------+-----------+
| dept1 | dept_name |
+-------+-----------+
| 102 | 销售 |
| 103 | 运维 |
+-------+-----------+
2 rows in set (0.00 sec)
13.列出每一个部分的员工总收入及部分名称;
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;
+----------+------------+
| 部门名称 | 员工总收入 |
+----------+------------+
| 财务 | 9500 |
| 销售 | 16000 |
| 运维 | 7300 |
+----------+------------+
3 rows in set (0.00 sec)
14.列出每一个部分中年纪最大的员工姓名,部分名称;
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);
+------+-----------+
| name | dept_name |
+------+-----------+
| 张三 | 财务 |
| 荣七 | 销售 |
| 牛八 | 运维 |
+------+-----------+
3 rows in set (0.00 sec)
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;
+------+----------+
| 姓名 | 部门名称 |
+------+----------+
| 张三 | 财务 |
| 荣七 | 销售 |
| 牛八 | 运维 |
+------+----------+
3 rows in set (0.00 sec)
15.求李四的收入及部分名称
mysql> select e.incoming,d.dept_name from emp_new e join dept d on e.dept2=d.dept1 where e.name='李四';
+----------+-----------+
| incoming | dept_name |
+----------+-----------+
| 3500 | 财务 |
+----------+-----------+
1 row in set (0.00 sec)
16.列出部分员工数大于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;
+-----------+
| dept_name |
+-----------+
| 财务 |
| 销售 |
+-----------+
2 rows in set (0.00 sec) 小结
毗连方式
依业务需求选毗连类型。内毗连取匹配行;外毗连(左、右、全外)保留一侧或两侧表所有行;交叉毗连得笛卡尔积,非特定需求慎用。
理解差别毗连对结果集影响,如左毗连以左表为主,即便右表无匹配也有左表记载。
毗连条件
精准设置毗连条件,基于关联字段创建条件,保证结果正确。
防止遗漏毗连条件致笛卡尔积,使结果集巨大且无意义。
性能优化
仅选必要字段,不消`SELECT *`,降低数据传输与处理开销。
为毗连字段建索引,加快表毗连时数据匹配。
大数据量时,避免复杂嵌套子查询,可优化为毗连查询提升性能。
字段与别名
多表有同名字段,用表名.字段名明白所属,防肴杂。
公道用表与字段别名,让查询易读,别名简洁故意义。
数据完备性
多表更新删除操作,用事务确保原子性,保证数据一致性。
操作遵循外键约束,避免破坏数据关联关系。
子查询与联合查询
子查询注意实行顺序与结果集大小,避免结果集过大拖慢查询。
联合查询归并结果集,各部分列数与数据类型须一致。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]