Mysql多表查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
308 0
|
关系型数据库 MySQL
3. Mysql 如何实现多表查询
MySQL多表查询主要包括内连接和外连接。内连接有隐式和显式:隐式是通过`From 表A, 表B where 连接条件`,显式是`From 表A inner join 表B on 连接条件`。外连接包括左外连接(`left join`)、右外连接(`right join`)和全外连接(较少使用)。此外,还有交叉连接(`cross join`),但也较少使用。
192 0
|
关系型数据库 MySQL 数据库
关系型数据库MySQL开发要点之多表查询2024详解
关系型数据库MySQL开发要点之多表查询2024详解
113 2
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
111 1
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
SQL 关系型数据库 MySQL
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
MySQL数据库——基础篇总结(概述、SQL、函数、约束、多表查询、事务)一
133 5
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(4)-实例练习、多表查询总结
MySQL数据库——多表查询(4)-实例练习、多表查询总结
532 1
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
1249 1
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(2)-内连接、外连接
MySQL数据库——多表查询(2)-内连接、外连接
196 1
|
SQL 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】MySQL之多表查询
【MySQL进阶之路 | 基础篇】MySQL之多表查询

推荐镜像

更多
下一篇
开通oss服务