1.子查询知识体系,单行子查询,多行子查询



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

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

select sal from emp

where ename = ‘SCOTT‘;

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

select * fromemp

where sal >3000;

总结:

子查询的本质:多个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);



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


select last_name,job_id,salary

FROM employees

WHERE salary =

(SELECT MIN(salary)

FROM employees);



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);



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


方法1:子查询


SELECT *

FROM emp

WHERE DEPTNO = (SELECT deptno

FROM dept

WHERE dname = ‘SALES‘);



方法2:多表查询


SELECT e.*

FROM emp e,dept d

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



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

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

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


错误案例:


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



正确案例:


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


6
查询员工的姓名和薪水


select *

from (select ename,sal

from emp);


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‘);



操作符


含义


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‘;


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‘



Eg:
比30号部门
任意一个员工薪高的员工信息 
大于集合中的最小值 any


select *

from emp

where sal > all(select sal

from emp

where deptno = 30);



等价于:


select *

from emp

where sal > (select max(sal)

from emp

where deptno = 30);



查询是经理的员工信息


分析:

SELECT *

FROM emp

WHERE empno in(经理的集合);


实际:

select *

from emp

where empno in

(

select mgr from emp

);



select *

from emp

where empno not in

(

select mgr

from emp

where mgr is not null

);


时间: 2024-10-12 06:22:09

1.子查询知识体系,单行子查询,多行子查询的相关文章

单行拆转多行的查询

原始数据:要求将ASSETUNITID拆成多行展示,r_id是主键 展示效果:将ASSETUNITID拆成多行,别名取为assid 实现的sql: selectr_id,INSTANCEID,o_name,o_code,o_type,d_flag,imp_date,pipe_id,src_r_id,fundid,b.assid ,accountid,PRODUCTID,usedate,name,sxrqfrom   STRUCTURE_INFOa left join ( SELECT disti

sql的基础语句-单行函数,dual,数字函数,日期函数,表连接,集合运算,分组报表,单行子查询,多行子查询

3. 单行函数 3.1 转换函数 select ascii('A'),chr(65) from dual; select to_char(1243123),1231451 from dual;靠左边的就是字符串,靠右边的就是数字 select to_char(123512a121) from dual;   --错误的写法,没有引号表示数字,但是数字里面包含了字母,不合法的输入值 select to_number('123141211') from dual; select to_number(

MySQL 行子查询优化

1.什么是行子查询: select t1.*,(select vn from t2 where t2.c.1=t1.c3 limit 1) where t1.cn='xxx' .... 类似每行通过一个子查询来查询获的结果,都是行子查询. 2.案例: MySQL 版本:MySQL-5.6.16-log 原sql: # Query_time: 20.769287  Lock_time: 0.000152 Rows_sent: 10  Rows_examined: 11665408 SET time

sqlserver查询数据的所有表名和行数

原文:sqlserver查询数据的所有表名和行数 //查询所有表明select name from sysobjects where xtype='u' select * from sys.tables //查询数据库中所有的表名及行数 SELECT a.name AS [TABLE NAME] , b.rows AS [RECORD COUNT] FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE ( a.t

Oracle-28-子查询之多行子查询&amp;子查询之多列子查询

一.子查询的基本类型之多行子查询 (1)使用IN操作符进行多行子查询.(总结:IN操作符后可用多行子查询) 比如:查询各个职位中工资最高的员工信息. SQL>select ename, job, sal from emp where salin (select max(sal) from emp group by job);--单列子查询 或 SQL>select ename, job, sal from emp where (sal,job)in (select max(sal), job

LINQ查询知识总结:案例分

案例:汽车表car,系列表brand,厂商表productor private MyCarDataContext  _Context = new MyCarDataContext(); (1)查询全部汽车信息 var list = _Context.Car; LINQ语法:var list = from p in _Context.Car select p; (2)简单筛选行:查询车系代号是 b002的所有车 关键点:"==" var list = _Context.Car.Where

LINQ查询知识总结

-------适合自己的才是最好的!!! LINQ查询知识总结:案例分析 案例:汽车表car,系列表brand,厂商表productor private MyCarDataContext  _Context = new MyCarDataContext(); (1)查询全部汽车信息 var list = _Context.Car; LINQ语法:var list = from p in _Context.Car select p; (2)简单筛选行:查询车系代号是 b002的所有车 关键点:“=

一、数据表查询知识

1.普通查询select code,name from info #查询某几列 select * from info #查询所有内容 2.条件查询select *from info where nation='n001'; select * from info where nation='n001' and sex=true;#条件之间并的关系select * from info where sex = false or nation ='n002' 3.模糊查询 select * from 列

Web 前端知识体系精简

Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者很难理清楚整个体系的脉络结构.本文将对Web前端知识体系进行简单的梳理,对应的每个知识点点到为止,不作详细介绍.目的是帮助大家审查自己的知识结构是否完善,如有遗漏或不正确的地方,希望共勉. JAVASCRIPT 篇 0.基础语法 Javascript基础语法包括:变量定义.数据类