多表查询练习
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`;
以上是关于多表查询练习的主要内容,如果未能解决你的问题,请参考以下文章