当前位置:网站首页>多表查询——案例练习
多表查询——案例练习
2022-07-17 00:27:00 【塔塔开!!!】
文章目录
多表查询——案例练习
环境准备:
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
DROP TABLE IF EXISTS job;
DROP TABLE IF EXISTS salarygrade;
-- 部门表
CREATE TABLE dept (
id INT PRIMARY KEY PRIMARY KEY, -- 部门id
dname VARCHAR(50), -- 部门名称
loc VARCHAR(50) -- 部门所在地
);
-- 职务表,职务名称,职务描述
CREATE TABLE job (
id INT PRIMARY KEY,
jname VARCHAR(20),
description VARCHAR(50)
);
-- 员工表
CREATE TABLE emp (
id INT PRIMARY KEY, -- 员工id
ename VARCHAR(50), -- 员工姓名
job_id INT, -- 职务id
mgr INT , -- 上级领导
joindate DATE, -- 入职日期
salary DECIMAL(7,2), -- 工资
bonus DECIMAL(7,2), -- 奖金
dept_id INT, -- 所在部门编号
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
-- 工资等级表
CREATE TABLE salarygrade (
grade INT PRIMARY KEY, -- 级别
losalary INT, -- 最低工资
hisalary INT -- 最高工资
);
-- 添加4个部门
INSERT INTO dept(id,dname,loc) VALUES
(10,'教研部','北京'),
(20,'学工部','上海'),
(30,'销售部','广州'),
(40,'财务部','深圳');
-- 添加4个职务
INSERT INTO job (id, jname, description) VALUES
(1, '董事长', '管理整个公司,接单'),
(2, '经理', '管理部门员工'),
(3, '销售员', '向客人推销产品'),
(4, '文员', '使用办公软件');
-- 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES
(1001,'孙悟空',4,1004,'2000-12-17','8000.00',NULL,20),
(1002,'卢俊义',3,1006,'2001-02-20','16000.00','3000.00',30),
(1003,'林冲',3,1006,'2001-02-22','12500.00','5000.00',30),
(1004,'唐僧',2,1009,'2001-04-02','29750.00',NULL,20),
(1005,'李逵',4,1006,'2001-09-28','12500.00','14000.00',30),
(1006,'宋江',2,1009,'2001-05-01','28500.00',NULL,30),
(1007,'刘备',2,1009,'2001-09-01','24500.00',NULL,10),
(1008,'猪八戒',4,1004,'2007-04-19','30000.00',NULL,20),
(1009,'罗贯中',1,NULL,'2001-11-17','50000.00',NULL,10),
(1010,'吴用',3,1006,'2001-09-08','15000.00','0.00',30),
(1011,'沙僧',4,1004,'2007-05-23','11000.00',NULL,20),
(1012,'李逵',4,1006,'2001-12-03','9500.00',NULL,30),
(1013,'小白龙',4,1004,'2001-12-03','30000.00',NULL,20),
(1014,'关羽',4,1007,'2002-01-23','13000.00',NULL,10);
-- 添加5个工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990);
-- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
-- 3.查询员工姓名,工资,工资等级
-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
-- 5.查询出部门编号、部门名称、部门位置、部门人数
表关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XS2kxpA-1657338411931)(C:\Users\10307\Desktop\md图片\2.png)]
练习:
1、
--查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
-- 分析:员工编号,员工姓名,工资在emp中
-- 分析:职务名称,职务描述在job中
-- job和emp是一对多的关系!(两表要连接(内连接))
-- 方式一 :隐式内连接
SELECT
emp.id,
emp.ename,
emp.salary,
job.jname,
job.description
FROM
emp,
job
WHERE
emp.job_id = job.id;
-- 方式二 :显式内连接
SELECT
emp.id,
emp.ename,
emp.salary,
job.jname,
job.description
FROM
emp
INNER JOIN job ON emp.job_id = job.id;
2、
-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
-- 分析:员工编号,员工姓名,工资在emp中
-- 分析:职务名称,职务描述在job中
-- 分析:部门名称,部门位置在dept中
-- job和emp是一对多的关系!(两表要连接(内连接))emp.job_id = job.id
-- dept和emp是一对多的关系!(两表要连接(内连接))dept.id = emp.dept_id
-- 三表连接
-- 方式一 :隐式内连接
SELECT
emp.id,
emp.ename,
emp.salary,
job.jname,
job.description,
dept.dname,
dept.loc
FROM
emp,
job,
dept
WHERE
emp.job_id = job.id
AND emp.dept_id = dept.id;
-- 方式二 :显式内连接
SELECT
emp.id,
emp.ename,
emp.salary,
job.jname,
job.description,
dept.dname,
dept.loc
FROM
emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id;
3、
-- 3.查询员工姓名,工资,工资等级
-- 分析:员工姓名,工资在emp中
-- 分析:工资等级 信息在 salarygrade 工资等级表中
-- 怎么确定等级:emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
-- 两表连接
SELECT
emp.ename,
emp.salary,
t2.*
FROM
emp,
salarygrade t2
WHERE
emp.salary >= t2.losalary
AND emp.salary <= t2.hisalary;
----
SELECT emp.ename, emp.salary, t2.* FROM emp INNER JOIN salarygrade t2 ON emp.salary >= t2.losalary
AND emp.salary <= t2.hisalary;
4、
-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
-- 分析:员工编号,员工姓名,工资在emp中
-- 分析:职务名称,职务描述在job中
-- 分析:部门名称,部门位置在dept中
-- 分析:工资等级 信息在 salarygrade 工资等级表中
-- job和emp是一对多的关系!(两表要连接(内连接))emp.job_id = job.id
-- dept和emp是一对多的关系!(两表要连接(内连接))dept.id = emp.dept_id
-- 怎么确定等级:emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
-- 四表连接
SELECT
emp.id,
emp.ename,
emp.salary,
job.jname,
job.description,
dept.dname,
dept.loc,
t2.*
FROM
emp
INNER JOIN job ON emp.job_id = job.id
INNER JOIN dept ON emp.dept_id = dept.id
INNER JOIN salarygrade t2 ON emp.salary >= t2.losalary
AND emp.salary <= t2.hisalary;
5、
---- 5.查询出部门编号、部门名称、部门位置、部门人数
-- 分析:部门编号、部门名称、部门位置在dept表中
-- 分析:部门人数怎么确定——-(多个部门有着对应的人数,不难想到用分组,然后统计)
-- 部门人数:在emp员工表中,根据dept_id进行分组,然后count(*)计数
-- 根据部门id分组查询每一个部门id和员工数,子查询
-- select dept_id, count(*) from emp GROUP BY dept_id; 一张多行多列的虚表
SELECT
dept.id,
dept.dname,
dept.loc,
t1.count
FROM
( SELECT dept_id, count(*) count FROM emp GROUP BY dept_id ) t1
INNER JOIN dept ON dept.id = t1.dept_id;
边栏推荐
- A practical case of redisson's implementation of distributed locks - lock single key - lock multiple keys - watchdog
- 一文搞懂JVM垃圾收集
- yolov6 学习初篇
- 【NoSQL】redis高可用和持久化
- ncnn 线程
- 【单片机仿真】(十五)指令系统位操作类指令 — 位运算指令、位条件转移指令
- Yum warehouse service and PXE automatic deployment system
- Elk log analysis system
- GFS分布式文件系统
- 工具及方法 - Excel插件XLTools
猜你喜欢

3. Asynctool framework principle source code analysis

ENSP static routing experiment

From the perspective of MySQL architecture, how does an SQL statement execute?

【PHP】tp6多表连接查询

What happens when you get stuck compiling and installing MySQL database in Linux system?

Learning network foundation

Squid agent service deployment

1. Introduction, analysis and implementation of asynctool framework

Redis' simple dynamic string SDS

GFS distributed file system
随机推荐
PyTorch最佳实践和代码模板
Learning network foundation
MySQL主从复制+读写分离
MySQL数据库中的事务和存储引擎
Redis之简单动态字符串SDS
HCIA_ Rip experiment
5. Is the asynctool framework flawed?
备份kubernetes 备份etcd数据
快照:数据快照(数据兜底方式)
【PHP】tp6多表连接查询
RHCE Study Guide Chapter 5 VIM editor
HCIA_ Nat experiment
Comprehensive experiment of static routing
HCIA summary
【单片机仿真】(二十一)DB(Define Byte)— 定义字节
一文搞懂JVM内存结构
MySQL日志管理和完全备份增量备份与恢复
ENSP static routing experiment
一个优酷VIP会员帐号可以几个人用的设备同时登录如何共享多人使用优酷会员账号?
HCIA_ OSPF experiment