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