数据库多表查询(新手实用案例)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Huangyuhua068/article/details/82012208
  • 数据准备

   
   
  1. CREATE DATABASE test02;
  2. USE test02;
  3. -- 部门表
  4. CREATE TABLE dept (
  5. id INT PRIMARY KEY, -- 部门id
  6. dname VARCHAR( 50), -- 部门名称
  7. loc VARCHAR( 50) -- 部门所在地
  8. );
  9. -- 添加4个部门
  10. INSERT INTO dept( id,dname,loc) VALUES
  11. ( 10, '教研部', '北京'),
  12. ( 20, '学工部', '上海'),
  13. ( 30, '销售部', '广州'),
  14. ( 40, '财务部', '深圳');
  15. -- 职务表,职务名称,职务描述
  16. CREATE TABLE job (
  17. id INT PRIMARY KEY,
  18. jname VARCHAR( 20),
  19. description VARCHAR( 50)
  20. );
  21. -- 添加4个职务
  22. INSERT INTO job ( id, jname, description) VALUES
  23. ( 1, '董事长', '管理整个公司,接单'),
  24. ( 2, '经理', '管理部门员工'),
  25. ( 3, '销售员', '向客人推销产品'),
  26. ( 4, '文员', '使用办公软件');
  27. -- 员工表
  28. CREATE TABLE emp (
  29. id INT PRIMARY KEY, -- 员工id
  30. ename VARCHAR( 50), -- 员工姓名
  31. job_id INT, -- 职务id
  32. mgr INT , -- 上级领导
  33. joindate DATE, -- 入职日期
  34. salary DECIMAL( 7, 2), -- 工资
  35. bonus DECIMAL( 7, 2), -- 奖金
  36. dept_id INT, -- 所在部门编号
  37. CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job ( id),
  38. CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept ( id)
  39. );
  40. -- 添加员工
  41. INSERT INTO emp( id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
  42. ( 1001, '孙悟空', 4, 1004, '2000-12-17', '8000.00', NULL, 20),
  43. ( 1002, '卢俊义', 3, 1006, '2001-02-20', '16000.00', '3000.00', 30),
  44. ( 1003, '林冲', 3, 1006, '2001-02-22', '12500.00', '5000.00', 30),
  45. ( 1004, '唐僧', 2, 1009, '2001-04-02', '29750.00', NULL, 20),
  46. ( 1005, '李逵', 4, 1006, '2001-09-28', '12500.00', '14000.00', 30),
  47. ( 1006, '宋江', 2, 1009, '2001-05-01', '28500.00', NULL, 30),
  48. ( 1007, '刘备', 2, 1009, '2001-09-01', '24500.00', NULL, 10),
  49. ( 1008, '猪八戒', 4, 1004, '2007-04-19', '30000.00', NULL, 20),
  50. ( 1009, '罗贯中', 1, NULL, '2001-11-17', '50000.00', NULL, 10),
  51. ( 1010, '吴用', 3, 1006, '2001-09-08', '15000.00', '0.00', 30),
  52. ( 1011, '沙僧', 4, 1004, '2007-05-23', '11000.00', NULL, 20),
  53. ( 1012, '李逵', 4, 1006, '2001-12-03', '9500.00', NULL, 30),
  54. ( 1013, '小白龙', 4, 1004, '2001-12-03', '30000.00', NULL, 20),
  55. ( 1014, '关羽', 4, 1007, '2002-01-23', '13000.00', NULL, 10);
  56. -- 工资等级表
  57. CREATE TABLE salarygrade (
  58. grade INT PRIMARY KEY, -- 级别
  59. losalary INT, -- 最低工资
  60. hisalary INT -- 最高工资
  61. );
  62. -- 添加5个工资等级
  63. INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
  64. ( 1, 7000, 12000),
  65. ( 2, 12010, 14000),
  66. ( 3, 14010, 20000),
  67. ( 4, 20010, 30000),
  68. ( 5, 30010, 99990);
  • 需求:查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述。 

 
 
  1. #1.查询出来员工的信息
  2. SELECT e. `id`,e. `ename`,e. `salary` FROM emp e;
  3. #2.联合job表查询对应的职务
  4. SELECT e. `id`,e. `ename`,e. `salary`,j. `jname`,j. `description` FROM emp e, job j WHERE e. `job_id`=j. `id`;

  •  需求:查询所有员工信息。显示员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置

 
 
  1. SELECT e. `id`,e. `ename`,e. `salary`,j. `jname`,j. `description`,d. `dname`,d. `loc`
  2. FROM emp e,job j,dept d WHERE e. `job_id`=j. `id` AND d. `id`=e. `dept_id`;

  •  需求:查询所有员工信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

SELECT e.`id`,e.`ename`,e.`salary`,j.`jname`,j.`description`,d.`dname`,d.`loc`,s.`grade` FROM emp e,job j,dept d,salarygrade s WHERE e.`job_id`=j.`id` AND d.`id`=e.`dept_id`
AND e.`salary` BETWEEN s.`losalary` AND s.`hisalary`; 

  • 需求: 查询经理的信息。显示员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级

SELECT e.`id`,e.`ename`,e.`salary`,j.`jname`,j.`description`,d.`dname`,d.`loc`,s.`grade` FROM emp e,job j,dept d,salarygrade s WHERE e.`job_id`=j.`id` AND d.`id`=e.`dept_id`
AND e.`salary` BETWEEN s.`losalary` AND s.`hisalary` AND j.`jname`='经理';

  • 需求:查询出部门编号、部门名称、部门位置、部门人数

 
 
  1. #1.先对员工表的员工部门进行分组,统计出每组的人数
  2. SELECT dept_id, COUNT(dept_id) FROM emp GROUP BY dept_id;
  3. #2.联合部门表进行查询
  4. SELECT* FROM dept d,( SELECT dept_id, COUNT(dept_id) FROM emp GROUP BY dept_id)e WHERE d. `id`=e.dept_id;

  • 多表查询规律总结:
  1. 不管我们查询几张表,表连接查询会产生笛卡尔积现象,我们需要消除笛卡尔积,拿到正确的数据。我们需要找到表与表之间通过哪个字段关联起来的(通常是外键=主键)
  2. 消除笛卡尔积规律:2张表需要1个条件,3张表需要2个条件,4张表需要3个条件。(条件的数量=表的数量-1),每张表都要参与进来。
  3. 多表查询的步骤:3.1确定要查询哪张表  3.2 确定表连接条件  3.3 确定查询字段

 

更多资料,搜索或扫码关注公众号:数说Cloud

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值