MySQL 子查询

Posted wgchen~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 子查询相关的知识,希望对你有一定的参考价值。

阅读目录

mysql子查询

子查询就是嵌套的select语句,可以理解为子查询是一张表。

在where语句中使用子查询,也就是在where语句中加入select语句。

emp 员工信息表

表名称:emp

描述:员工信息表

英文字段名称

中文描述

类型

EMPNO

员工编号

INT (4)

ENAME

员工姓名

VARCHAR(10)

JOB

工作岗位

VARCHAR(9)

MGR

上级领导

INT (4)

HIREDATE

入职日期

DATE

SAL

薪水

DOUBLE(7,2)

COMM

津贴

DOUBLE (7,2)

DEPTNO

部门编号

INT(2)

CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` double(7,2) DEFAULT NULL,
  `COMM` double(7,2) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7369', 'SMITH', 'CLERK', '7902', '1980-12-17', '800.00', NULL, '20');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7499', 'ALLEN', 'SALESMAN', '7698', '1981-02-20', '1600.00', '300.00', '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7521', 'WARD', 'SALESMAN', '7698', '1981-02-22', '1250.00', '500.00', '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7566', 'JONES', 'MANAGER', '7839', '1981-04-02', '2975.00', NULL, '20');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7654', 'MARTIN', 'SALESMAN', '7698', '1981-09-28', '1250.00', '1400.00', '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7698', 'BLAKE', 'MANAGER', '7839', '1981-05-01', '2850.00', NULL, '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7782', 'CLARK', 'MANAGER', '7839', '1981-06-09', '2450.00', NULL, '10');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7788', 'SCOTT', 'ANALYST', '7566', '1987-04-19', '3000.00', NULL, '20');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7839', 'KING', 'PRESIDENT', NULL, '1981-11-17', '5000.00', NULL, '10');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7844', 'TURNER', 'SALESMAN', '7698', '1981-09-08', '1500.00', '0.00', '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7876', 'ADAMS', 'CLERK', '7788', '1987-05-23', '1100.00', NULL, '20');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7900', 'JAMES', 'CLERK', '7698', '1981-12-03', '950.00', NULL, '30');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7902', 'FORD', 'ANALYST', '7566', '1981-12-03', '3000.00', NULL, '20');
INSERT INTO `bjpowernode`.`emp` (`EMPNO`, `ENAME`, `JOB`, `MGR`, `HIREDATE`, `SAL`, `COMM`, `DEPTNO`) VALUES ('7934', 'MILLER', 'CLERK', '7782', '1982-01-23', '1300.00', NULL, '10');

salgrade 薪水等级信息表

表名称:salgrade

描述:薪水等级信息表

英文字段名称

中文描述

类型

GRADE

等级

INT

LOSAL

最低薪水

INT

HISAL

最高薪水

INT

CREATE TABLE `salgrade` (
  `GRADE` int(11) DEFAULT NULL,
  `LOSAL` int(11) DEFAULT NULL,
  `HISAL` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `bjpowernode`.`salgrade` (`GRADE`, `LOSAL`, `HISAL`) VALUES ('1', '700', '1200');
INSERT INTO `bjpowernode`.`salgrade` (`GRADE`, `LOSAL`, `HISAL`) VALUES ('2', '1201', '1400');
INSERT INTO `bjpowernode`.`salgrade` (`GRADE`, `LOSAL`, `HISAL`) VALUES ('3', '1401', '2000');
INSERT INTO `bjpowernode`.`salgrade` (`GRADE`, `LOSAL`, `HISAL`) VALUES ('4', '2001', '3000');
INSERT INTO `bjpowernode`.`salgrade` (`GRADE`, `LOSAL`, `HISAL`) VALUES ('5', '3001', '9999');

dept 部门信息表

表名称:dept

描述:部门信息表

英文字段名称

中文描述

类型

DEPTNO

部门编号

INT(2)

DNAME

部门名称

VARCHAR(14)

LOC

位置

VARCHAR(13)

CREATE TABLE `dept` (
  `DEPTNO` int(2) NOT NULL,
  `DNAME` varchar(14) DEFAULT NULL,
  `LOC` varchar(13) DEFAULT NULL,
  PRIMARY KEY (`DEPTNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `bjpowernode`.`dept` (`DEPTNO`, `DNAME`, `LOC`) VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO `bjpowernode`.`dept` (`DEPTNO`, `DNAME`, `LOC`) VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO `bjpowernode`.`dept` (`DEPTNO`, `DNAME`, `LOC`) VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO `bjpowernode`.`dept` (`DEPTNO`, `DNAME`, `LOC`) VALUES ('40', 'OPERATIONS', 'BOSTON');

查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名

实现思路:

1、首先取得管理者的编号,去除重复的

distinct 去除重复行

select distinct mgr from emp where mgr is not null;

2、查询员工编号包含管理者编号的

select empno, ename from emp 
where empno in(select mgr from emp where mgr is not null);

查询哪些人的薪水高于员工的平均薪水,需要显示员工编号,员工姓名,薪水实现思路

1、取得平均薪水

select avg(sal) from emp;

2、取得大于平均薪水的员工

select empno, ename, sal from emp where sal > (select avg(sal) from emp);

在 from 语句中使用子查询,可以将该子查询看做一张表

查询员工信息,查询哪些人是管理者,要求显示出其员工编号和员工姓名

1、首先取得管理者的编号,去除重复的

select distinct mgr from emp where mgr is not null;

2、将以上查询作为一张表,放到 from 语句的后面

第一种语法

SELECT e.empno, e.ename
FROM emp e, (
		SELECT DISTINCT mgr
		FROM emp
		WHERE mgr IS NOT NULL
	) m
WHERE e.empno = m.mgr;

第二种语法

SELECT e.empno, e.ename
FROM emp e
	JOIN (
		SELECT DISTINCT mgr
		FROM emp
		WHERE mgr IS NOT NULL
	) m
	ON e.empno = m.mgr;

查询各个部门的平均薪水所属等级,需要显示部门编号,平均薪水,等级编号

1、首先取得各个部门的平均薪水

select deptno, avg(sal) avg_sal from emp group by deptno;

2、将部门的平均薪水作为一张表与薪水等级表建立连接,取得等级

select deptno,avg(sal) avg_sal from emp group by deptno;
select * from salgrade;
SELECT a.deptno, a.avg_sal, g.grade
FROM (
	SELECT deptno, avg(sal) AS avg_sal
	FROM emp
	GROUP BY deptno
) a
	JOIN salgrade g ON a.avg_sal BETWEEN g.losal AND hisal;

以上是关于MySQL 子查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 获取最低值的记录 | View 的 SELECT 包含 FROM 子句中的子查询

相关子查询 MySQL

mysql n:m 关系删除查询 1242 子查询返回多于 1 行

Atitit  代理与分销系统  子代理 充值总额功能设计概览 sum() groubpy subagt

mysql 子查询 优化

MySQL子查询有哪五种形式?