多表查询练习

  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`;

 

转载于:https://www.cnblogs.com/fangtingfei/p/11317914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值