1. 子查询
a. 单行子查询: 子查询当中只返回了单列,单行的数据
b. 多行子查询: 子查询当中返回了单列多行的数据, 两个表的结果如果不在where后面加上约束条件会形成 "笛卡尔积";
c. 多列子查询: 子查询当中返回多列数据
使用方式: 只需要在where语句后面使用"(a列,b列) = (子查询语句)"将多个列的名称括起来
查询和SMITH的部门和岗位完全相同的所有雇员
1. 先查询部门和岗位
Select deptno, job from where ename=”SMITH”;
+--------+-------+
| deptno | job |
+--------+-------+
| 20 | CLERK |
+--------+-------+ 拿到部门和岗位
2. 再去查询emp中部门号是20的, job是CLERK, 姓名不是SMITH的人
select ename, deptno, job from emp where deptno=20 and job='CLERK' and ename!="SMITH";
+-------+--------+-------+
| ename | deptno | job |
+-------+--------+-------+
| ADAMS | 20 | CLERK |
+-------+--------+-------+
多列子查询:
select ename, deptno, job from emp where (deptno, job)=(select deptno, job from emp where ename='SMITH'); 现在并没有说明检索出来的人中不包含SMITH本人
+-------+--------+-------+
| ename | deptno | job |
+-------+--------+-------+
| SMITH | 20 | CLERK |
| ADAMS | 20 | CLERK |
+-------+--------+-------+
select ename, deptno, job from emp where (deptno, job)=(select deptno, job from emp where ename='SMITH') and ename<> 'SMITH';
+-------+--------+-------+
| ename | deptno | job |
+-------+--------+-------+
| ADAMS | 20 | CLERK |
+-------+--------+-------+
在from语句中使用子查询:
select x1, x2, x3 from [表的名称] [select...](select当做是一个临时表)
问题: 显示属于自己部门平均工资的员工的姓名, 部门, 工资, 平均工资
1. 平均工资
select ename, deptno, sal, avg(sal) from emp;
拿到所有每一个人的姓名, 部门编号, 工资, 部门的平均工资
select avg(sal),deptno from emp group by deptno;
+-------------+--------+
| avg(sal) | deptno |
+-------------+--------+
| 2916.666667 | 10 |
| 2175.000000 | 20 |
| 1566.666667 | 30 |
+-------------+--------+
2. emp表进行分组, 分成不同的部门
select ename, deptno, sal, avg(sal) from emp, 拿到所有每一个人的姓名, 部门编号, 工资, 部门的平均工资
加上判断条件
(select deptno, avg(sal) from emp group by deptno);拿到部门编号, 部门平均工资
比较个人的工资和部门的平均工资
3. 不同的部门
select ename, deptno, sal, avg_sal from emp, (select avg(sal) avg_sal, deptno dt from emp group by deptno) tmp where tmp.dt=emp.deptno and emp.sal > tmp.avg_sal;
+-------+--------+---------+-------------+
| ename | deptno | sal | avg_sal |
+-------+--------+---------+-------------+
| ALLEN | 30 | 1600.00 | 1566.666667 |
| JONES | 20 | 2975.00 | 2175.000000 |
| BLAKE | 30 | 2850.00 | 1566.666667 |
| SCOTT | 20 | 3000.00 | 2175.000000 |
| KING | 10 | 5000.00 | 2916.666667 |
| FORD | 20 | 3000.00 | 2175.000000 |
+-------+--------+---------+-------------+
合并查询:
union: 作用是将两个查询的结果集进行合并, 会自动去除结果当中重复的行,
union all: 作用是将两个查询的结果集进行查询, 不会自动去除结果集当中重复的行
将工资大于2500或职位是MANAGER的人找出来
select ename, sal, job from emp where sal > 2500 or job >=2500 union;
select ename, sal, job from emp where sal > 2500;
+-------+---------+-----------+
| ename | sal | job |
+-------+---------+-----------+
| JONES | 2975.00 | MANAGER |
| BLAKE | 2850.00 | MANAGER
子查询,多列查询,合并查询,内外连接,索引,事务管理,用户管理
最新推荐文章于 2023-11-09 20:42:51 发布
本文深入探讨了MySQL中的子查询技术,详细介绍了如何在多列数据中进行有效查询。同时,结合合并查询和内外连接操作,展示了如何高效整合不同数据源的信息。此外,文章还重点讨论了索引优化对查询性能的影响,并且讲解了事务管理和用户管理的基础知识,为数据库管理和性能提升提供了实用指南。
摘要由CSDN通过智能技术生成