Mysql多表查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Mysql多表查询

前言


最近复习了下Mysql,感觉写好SQL语句不是一件容易的事,还是要多进行练习才能写好SQL语句 于是在网上看了视频,跟着写了下来~ 流程和思路都写在源码中


练习


表的结构


image.png


表的内容


emp表

image.png

dept表image.png

salarygrade表

image.png


job表

image.png


源码


-- 多表查询练习
-- 部门表
create TABLE dept (
  id INT PRIMARY KEY,
  dname VARCHAR(255),
  loc VARCHAR(255)
);
-- 添加四个部门
INSERT INTO dept VALUES
(10,"教研部","北京"),
(20,"学工部","上海"),
(30,"销售部","广州"),
(40,"财务部","深圳");  
-- 职务表
CREATE TABLE job (
  id INT PRIMARY KEY,
  jname VARCHAR(25),
  description VARCHAR(90)
)
-- 添加4个职务
INSERT INTO job (id,jname,description) VALUES 
(1,"董事长","管理公司,接单"),
(2,"经理","管理部门员工"),
(3,"销售员","向客人推销产品"),
(4,"文员","使用office")
--员工表
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)
);
-- 添加员工
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),
(100,"林冲",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);
-- 工资等级表
CREATE TABLE salarygrade (
  grade int PRIMARY KEY,
  losalary INT,
  hisalary INT
);
-- 添加5个工资等级
INSERT INTO salarygrade VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),
(5,30010,99990)
-- 需求:
-- 1.查询所有员工信息。查询员工编号,员工姓名,工资,职务名称,职务描述
/*
  1.查询两张表
  2.条件是emp.job_id = job.id
*/
SELECT
  t1.id,-- 员工编号
  t1.ename,-- 员工姓名
  t1.salary,-- 工资
  t2.jname,-- 职务名称
  t2.description -- 植物描述
FROM
  emp t1,
  job t2 
WHERE
  t1.job_id = t2.id
-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/*
  1.查询三张表
  2.条件是emp.job_id = job.id and emp.dept_id = dept.id
*/
SELECT
  t1.id,-- 员工编号
  t1.ename,-- 员工姓名
  t1.salary,-- 工资
  t2.jname,-- 职务名称
  t2.description,-- 植物描述
  t3.dname,-- 部门名称
  t3.loc -- 部门位置
FROM
  emp t1,
  job t2,
  dept t3 
WHERE
  t1.job_id = t2.id 
  AND t1.dept_id = t3.id
-- 3.查询员工姓名,工资,工资等级
/*
  1.查询两张表emp表和salarygrade
  2.条件是emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary(表之间没有关联不能用等值来进行判断了)
  3.简化上一步emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
  t1.ename,
  t1.salary,
  t2.grade
FROM
  emp t1,
  salarygrade t2 
WHERE
  t1.salary BETWEEN t2.losalary 
  AND t2.hisalary
-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
/*
  1.员工名称,工资emp,职务名称,职务描述job,部门名称,部门位置dept,工资等级salarygrade
  2.条件emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary
*/
SELECT
  t1.ename,
  t1.salary,
  t2.jname,
  t2.description,
  t3.dname,
  t3.loc,
  t4.grade 
FROM
  emp t1,
  job t2,
  dept t3,
  salarygrade t4 
WHERE
  t1.job_id = t2.id 
  AND t1.dept_id = t3.id 
  AND t1.salary BETWEEN t4.losalary 
  AND t4.hisalary
-- 5.查询出部门编号、部门名称、部门位置、部门人数
/*
  1.部门编号、部门名称、部门位置dept,部门人数 emp表
  2.使用分组查询,按照emp.dept_id完成分组,查询count(id)
  3.使用子查询将第二部的查询结果和dept表进行关联查询
*/
SELECT
  t1.id,
  t1.dname,
  t1.loc,
  t2.total
FROM
  dept t1,
  ( SELECT dept_id, COUNT( id ) total FROM emp GROUP BY dept_id ) t2 
WHERE
  t1.id = t2.dept_id
-- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
/*
  1.姓名 emp,直接上级的姓名 emp
    * emp的id和mgr是自关联的
  2.条件 emp.id = emp.mgr
  3.查询左表的所有数据,和交集数据
    *使用左外连接查询
*/
SELECT
  t1.ename,
  t1.mgr,
  t2.id,
  t2.ename 
FROM
  emp t1
  LEFT JOIN emp t2 ON t1.mgr = t2.id
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
164 0
|
6月前
|
关系型数据库 MySQL
3. Mysql 如何实现多表查询
MySQL多表查询主要包括内连接和外连接。内连接有隐式和显式:隐式是通过`From 表A, 表B where 连接条件`,显式是`From 表A inner join 表B on 连接条件`。外连接包括左外连接(`left join`)、右外连接(`right join`)和全外连接(较少使用)。此外,还有交叉连接(`cross join`),但也较少使用。
67 0
|
5月前
|
关系型数据库 MySQL 数据库
关系型数据库MySQL开发要点之多表查询2024详解
关系型数据库MySQL开发要点之多表查询2024详解
34 2
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
47 1
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
47 5
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
154 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
272 1
|
5月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
40 1
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询
下一篇
无影云桌面