多表查询练习

Posted 房廷飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表查询练习相关的知识,希望对你有一定的参考价值。

  1 -- 新建一个数据库
  2 CREATE DATABASE db2;
  3 
  4 -- 部门表
  5 CREATE TABLE dept(
  6 id INT PRIMARY KEY ,  -- 部门id
  7 dname VARCHAR(10),
  8 loc VARCHAR(10)
  9 );
 10 -- 添加四个部门
 11 INSERT INTO dept(id,dname,loc)VALUES
 12 (10,教研部,北京),
 13 (20,学工部,上海),
 14 (30,销售部,广州),
 15 (40,财务部,深圳);
 16 -- 职务表
 17 CREATE TABLE job(
 18 id INT PRIMARY KEY,
 19 jname VARCHAR(20),
 20 description VARCHAR(50)
 21 );
 22 -- 添加四个职务
 23 INSERT INTO job()VALUES
 24 (1,董事长,管理整个公司,接单),
 25 (2,经理,管理部门员工),
 26 (3,销售员,向客户推销产品),
 27 (4,文员,使用办公软件);
 28 
 29 
 30 
 31 -- 员工表
 32 CREATE TABLE emp(
 33 id INT PRIMARY KEY,
 34 ename VARCHAR(10),
 35 job_id INT,
 36 mgr INT,-- 上级领导
 37 joindate DATE,
 38 salary DECIMAL(7,2),
 39 bonus DECIMAL(7,2),
 40 dept_id INT,
 41 CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job(id),-- 添加两个外键
 42 CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept(id)
 43 );
 44 
 45 -- 添加员工信息
 46 INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id)VALUES
 47 (1001,孙悟空,4,1004,2000-12-17,8000.00,NULL,20),
 48 (1002,卢俊义,3,1006,2001-02-18,16000.00,3000.00,30),
 49 (1003,林冲,3,1006,2001-02-17,12500.00,5000,30),
 50 (1004,唐僧,2,1009,2001-04-02,19750.00,NULL,20),
 51 (1005,李逵,4,1006,2001-09-28,12500.00,14000.00,30),
 52 (1006,宋江,2,1009,2001-05-01,28500.00,NULL,30),
 53 (1007,刘备,2,1009,2001-09-01,14500.00,NULL,10),
 54 (1018,猪八戒,4,1004,2007-04-19,30000.00,NULL,20),
 55 (1009,罗贯中,1,NULL,2001-12-17,50000.00,NULL,10),
 56 (1010,吴用,3,1006,2001-09-08,15000.00,0.00,30),
 57 (1011,沙僧,4,1004,2007-05-25,11000.00,NULL,20),
 58 (1012,李逵,4,1006,2001-12-17,9500.00,NULL,30),
 59 (1013,小白龙,4,1004,2001-12-17,30000.00,NULL,20),
 60 (1014,关羽,4,1007,2002-12-17,13000.00,NULL,10);
 61 
 62 -- 工资等级表
 63 CREATE TABLE salarygrade(
 64 grade INT PRIMARY KEY,
 65 losalary INT,
 66 hisalary INT
 67 );
 68 
 69 -- 添加5个工资等级
 70 INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
 71 (1,7000,12000),
 72 (2,12000,14000),
 73 (3,14000,20000),
 74 (4,20000,30000),
 75 (5,30000,99999);
 76 
 77 
 78 
 79 -- 要求一:查询所有员工信息
 80 SELECT * FROM emp,job WHERE emp.`job_id`=job.`id`;
 81 -- 要求二:查询所有员工编号,员工姓名,工资,职务名称,职务描述   规范化即:
 82 SELECT 
 83     t1.`id`,  -- 挨个备注是什么
 84     t1.`ename`,
 85     t2.`jname`,
 86     t2.`description`,
 87     t1.`salary`
 88 FROM 
 89     emp t1,job t2
 90 WHERE 
 91     t1.`job_id`=t2.`id`;
 92     
 93     
 94 
 95 -- 要求三:查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
 96 SELECT 
 97     t1.`id`,  -- 挨个备注是什么
 98     t1.`ename`,
 99     t2.`jname`,
100     t2.`description`,
101     t1.`salary`,
102     t3.`dname`,
103     t3.`loc`
104 FROM 
105     emp t1,job t2,dept t3
106 WHERE 
107     t1.`job_id`=t2.`id` AND t1.`dept_id`=t3.`id`;  -- 注意是用and连接
108     
109     
110 
111 
112 -- 要求四:查询员工的姓名,工资和工资等级
113 
114 SELECT 
115     t1.`ename`,
116     t1.`salary`,
117     t2.`grade`
118 
119 FROM emp t1,salarygrade t2
120 WHERE t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
121 
122 -- 要求五 :查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
123 SELECT 
124     t1.`ename`,
125     t1.`salary`,
126     t4.`jname`,
127     t4.`description`,
128     t3.`dname`,
129     t3.`loc`,
130     t2.`grade`
131 FROM emp t1,salarygrade t2,dept t3,job t4
132 
133 WHERE 
134     t1.`job_id`=t4.`id`
135     AND t1.`dept_id`=t3.`id`
136     AND t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
137 
138 
139 -- 要求六:查询部门编号,部门名称,部门位置,部门人数
140     -- 1.部门编号,部门名称,部门位置在dept表,部门人数enp表
141     -- 2.使用分组查询,按照emp.dept_id完成分组,查询count(id)
142     -- 3.使用子查询将第2步的查询结果的demp表进行关联查询
143     
144 -- 完成第2小步    ,将得到的表作为虚拟表进行子查询
145 SELECT dept_id,COUNT(id) total -- total给起别名
146 FROM
147     emp
148 GROUP BY dept_id
149 
150 -- 完成要求
151 SELECT t1.id,t1.dname,t1.loc,t2.total
152 FROM dept t1,
153     (SELECT dept_id,COUNT(id) total
154     FROM
155         emp
156     GROUP BY dept_id) t2
157 WHERE t1.id=t2.dept_id;
158 
159 -- 要求七:查询所有员工及其直接上级的姓名及其直接上级的姓名,没有上级的员工也要查询
160     -- 1,姓名 emp   直接上级的姓名 emp
161         -- emp表的id和mgr是自关联
162     -- 2,条件emp.id=emp.mgr
163     -- 3,查询左表的所有数据,和交集数据
164         -- 使用左外连接查询
165 
166 -- 查询所有员工及其直接上级的姓名及其直接上级的姓名
167 SELECT 
168     t1.`ename`,
169     t1.`mgr`,
170     t2.`id`,
171     t2.`ename`
172 
173 FROM emp t1,emp t2
174 WHERE t1.`mgr`=t2.`id`;
175 
176 -- 没有上级的员工也要查询  使用左外连接查询
177 
178 SELECT 
179     t1.`ename`,
180     t1.`mgr`,
181     t2.`id`,
182     t2.`ename`
183 FROM emp t1 LEFT JOIN emp t2
184 ON t1.`mgr`=t2.`id`;

 

以上是关于多表查询练习的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库语法-多表查询练习一

主外键多表查询demo

数据库---多表查询练习

多表查询-练习

MySql-多表查询练习

MySQL从入门到精通:多表查询实战案例_03