mysql 子查询单行单列怎么理解_1.子查询知识体系,单行子查询,多行子查询

1查询工资比scott高的员工信息 A第一步:查询出scott这个员工的工资 select sal from emp where ename = 'SCOTT'; B第二步:查询出工资比scott高的员工信息 select * fromemp where sal 3000; 总结: 子查询的本质:多个select语句的嵌套 2:子查询的知识体



1查询工资比scott高的员工信息

A

第一步:查询出scott这个员工的工资

select sal from emp

where ename = 'SCOTT';

e8894fa771067be24ee37a6d4c596cd4.png

B

第二步:查询出工资比scott高的员工信息

select * fromemp

where sal >3000;

7a646e8e0c444dd9ae4d947ff13e435a.png

总结:

子查询的本质:多个select语句的嵌套

2:子查询的知识体系搭建

A

合理的书写风格

B

子查询外面()不要忘记

C

子查询和主查询可以查询的是同一张表,也可以不是同一张表

只要子查询返回的结果,主查询可以用即可。

D

在什么地方可以防止子查询

select a,b,c

---OK,只能存放单行子查询,不能使多行子查询

from tab1

---OK 可以有子查询

where col in(em1,em2)

---可以有子查询

col between a1 and a2

col > 222

col > ()

group by …

---不可以有子查询

having ….

---可以有子查询

order by …

---不可以有子查询

E

子查询的分类

1.单行操作符对应单行子查询,多行操作符对应多行子查询。

2.按照子查询返回的条目数,分为:单行子查询和多行子查询

3.单行子查询只能使用单行比较操作符(=

> >=

< <= <>)

4.多行子查询只能使用多行比较操作符(int any all)

3

单行子查询

Eg:查询员工信息和141号工种一样的,薪水比143号员工工资高的员工

SQL> conn hr/123456

已连接。

SQL> select last_name,job_id,salary

2 FROM employees

3 WHERE job_id =

4 (SELECT job_id

5 FROM employees

6 WHERE employee_id = 141);

bf66035955c45da8f2d42883a1c2aa7e.png

Eg:查询工资最低的员工信息

select last_name,job_id,salary

FROM employees

WHERE salary =

(SELECT MIN(salary)

FROM employees);

806e11db79a2b12541cd41f9f5b1d660.png

Eg:求各个部门编号和部门的最低工资(这个最低工资要比50号部门的最低工资要高)

思路分析:看子查询

看group by

和 having条件检索

看检索对象

//子查询:求50号部门的最低工资

à检索

各部门的最低工资

比50号部门的最低工资

大的部门号和部门最小工资

SELECT department_id,MIN(salary)

FROM employees

GROUP By department_id

HAVING MIN(salary) >

(SELECT MIN(salary)

FROM employees

WHERE department_id = 50);

7a0a4921edec4db6f19f1c5daa46c445.png

4

查询部门名称是SALES的员工信息(2中方式)

方法1:子查询

SELECT *

FROM emp

WHERE DEPTNO = (SELECT deptno

FROM dept

WHERE dname = 'SALES');

172a5618c97a9acc8f5539c637c5d8c9.png

方法2:多表查询

SELECT e.*

FROM emp e,dept d

WHERE e.deptno = d.deptno and d.dname = 'SALES';

e26fba949b5de89547933a126d5c39bc.png

注意:第二种(多表查询的执行速度比子查询的执行速度快,因为多表查询是一次将数据读到内存中进行读取,消耗内存而加快速度)

第一种(子查询要进行两次连接数据库的操作,连接数据库的操作是一个耗时操作,减低了速度)。

5 select后面要查询的列中可以是单行子查询,不可以是多行子查询

错误案例:

select ename,empno,(select deptno from emp) AA from emp;

201399054515f3a8b547603f4e083939.png

正确案例:

select ename,empno,(select deptno from emp where EMPNO = 7369) AA from emp;

dabea925fdb0e4c9a4e168b4671e140c.pngvcuuPC9wPgoKPHRhYmxlIGJvcmRlcj0="1" cellspacing="0" cellpadding="0">select *

from (select ename,sal

from emp);

6f0dab4a5958ce2957f2229dae5bdd7e.png

7

多行子查询

多行子查询只能使用多行比较操作符(in any all)

--eg

查询部门名称是*(不是)SALES

和 ACCOUNTING

的员工信息

2种方法

--eg 查询薪水

比30号部门

任意一个员工薪高的员工信息

-eg 查询薪水

比30号部门

所有员工

高的员工信息

查询部门名称是*(不是)SALES

和 ACCOUNTING

的员工信息

2种方法

select *

from emp

where deptno in

(select deptno

from dept

where dname = 'SALES' or dname = 'ACCOUNTING');

9441a7ce357cbb5bfaeb2c3132a4d3c2.png

操作符

含义

IN

等于列表中的任何一个

ANY

和子查询返回的任意一个值比较

ALL

和子查询返回的所有值比较

ANY

SELECT employee_id,last_name,job_id,salary

FROM employees

WHERE salary < ANY

(SELECT salary

FROM employees

WHERE job_id = 'IT_PROG')

AND job_id <> 'IT_PROC';

25f01a8db3b12680308f84be12964ac4.png

ALL

SELECT employee_id,last_name,job_id,salary

FROM employees

WHERE salary < ALL

(SELECT salary

FROM employees

WHERE job_id = 'IT_PROG')

AND job_id <> 'IT_PROC'

8d8ab6a72dbfd3f380c5f0652d7baf5e.png

Eg:

比30号部门

任意一个员工薪高的员工信息

大于集合中的最小值 any

select *

from emp

where sal > all(select sal

from emp

where deptno = 30);

4ed7eb51ed7a7eb5ceb2d4b2443549de.png

等价于:

select *

from emp

where sal > (select max(sal)

from emp

where deptno = 30);

7f9dbbd6ed15900227364cc481f9e54b.png

查询是经理的员工信息

分析:

SELECT *

FROM emp

WHERE empno in(经理的集合);

实际:

select *

from emp

where empno in

(

select mgr from emp

);

baf6cb12679aec56f72fc17781479e0f.png

select *

from emp

where empno not in

(

select mgr

from emp

where mgr is not null

);

75d224aebc78c62651c8f46caad85fd5.png

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值