精华内容
下载资源
问答
  • 2021-05-03 07:48:35

    --什么是单行子查询?

    --从子查询中返回一行结果的查询

    select e.employee_id,e.last_name,e.salary

    from employees e

    where e.department_id=( select e.department_id from employees e where e.employee_id=105);

    --总结:以上语句解决了这些问题:查到雇员号为105的人所在部门的所有雇员的信息。

    -----------------------------------------------------------------------------------------

    select e.employee_id,e.last_name,e.salary

    from employees e

    where e.department_id = (select e.department_id from employees e where e.employee_id = 105) and e.salary>5000;

    --总结:以上语句解决了这些问题:查到雇员号为105的人所在部门的所有雇员 中工资高于5000的人员的信息。

    -----------------------------------------------------------------------------------------

    select e.employee_id,e.last_name,e.salary

    from employees e

    where e.department_id = (select e.department_id from employees e where e.employee_id = 105) and e.salary>=(select AVG(e.salary) from employees e);

    --总结:以上查询解决了问题:查询出来雇员号为105的雇员所在部门中薪资大于所有人平均工资的雇员信息。

    -----------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------

    --多行子查询

    --什么是多行子查询

    --子查询返回多行称为子查询

    -- IN运算符

    select e.employee_id,e.last_name,e.salary,e.department_id

    from employees e

    where e.salary IN(select e.salary from employees e where e.department_id =60);

    --总结:以上查询中IN的作用:in(里面包含多个符号条件的数据)

    --查询select e.salary from employees e where e.department_id =60得到:(9000,6000,4800,4800,4200)

    --以上等价于:

    select e.employee_id,e.last_name,e.salary,e.department_id

    from employees e

    where e.salary IN(9000,6000,4800,4800,4200);

    --ANY运算符(同SOME运算符)

    select e.last_name

    from employees e

    where e.salary < ANY (select e.salary from employees e where e.department_id = 60);

    --总结:ANY 一条数值>= 每一条(多个数值集合)中的任何一个

    select e.last_name

    from employees e

    where e.salary < (select MAX(e.salary) from employees e where e.department_id = 60);

    --总结:使用MAX( )函数可以直接找到多行函数的数值的最大值。

    更多相关内容
  • 在单行子查询中使用单行运算符,在多行子查询中用多行运算符。 单行运算符:子查询结果只有一个:< > = <= >= != 多行子查询:子查询结果是单列多行:in , any,all 多列子查询:子查询为列,一定要...

    #子查询

    子查询使用规则:

    • 子查询放在圆括号中
    • 子查询放在比较条件右边(非强制)
    • 子查询中不需要ORDER BY 子句
    • 在单行子查询中使用单行运算符,在多行子查询中用多行运算符。

    单行运算符:子查询结果只有一个:< > = <= >= !=
    多行子查询:子查询结果是单列多行:in , any,all
    多列子查询:子查询为多列,一定要在FROM后作为表,且一定要取别名,否则无法访问这张表中的字段。

    #创建初始表

    CREATE TABLE tbl1 (num1 INT NOT NULL);
    CREATE TABLE tbl2 (num2 INT NOT NULL);
    INSERT INTO tbl1 VALUES(1),(5),(13),(27);
    INSERT INTO tbl2 VALUES(6),(14),(11),(20);
    

    #ANY SOME 关键字的子查询
    #返回tbl2的所有num2列,将tbl1中的num值与之进行比较,只要大于num2的任意一值,即为符合条件的结果。

    SELECT num1 FROM tbl1 
    WHERE num1 > SOME(SELECT num2 FROM tbl2);
    
    SELECT num1 FROM tbl1 
    WHERE num1 > ANY (SELECT num2 FROM tbl2);
    

    #ALL 关键字

    SELECT num1 FROM tbl1 
    WHERE num1 > ALL (SELECT num2 FROM tbl2);
    

    #新建一个orderitems表

    CREATE TABLE orderitems(
    o_num INT NOT NULL,
    o_item INT NOT NULL,
    f_id CHAR(10) NOT NULL,
    quantity INT NOT NULL,
    item_price DECIMAL(8,2) NOT NULL,
    PRIMARY KEY(o_num,o_item)
    );
    

    #填入数据

    INSERT INTO orderitems(o_num,o_item,f_id,quantity,item_price)
    VALUES(3001,1,'a1',10,5.2),
    (3001,2,'b2',3,7.6),
    (3001,3,'bs1',5,11.2),
    (3001,4,'bs2',15,9.2),
    (3002,1,'b3',2,20.0),
    (3003,1,'c0',100,10),
    (3004,1,'o2',50,2.50),
    (3005,1,'c0',5,10),
    (3005,2,'b1',10,8.99),
    (3005,3,'a2',10,2.2),
    (3005,4,'m1',5,14.99);
    

    带 IN 关键字 的子查询

    #在orderitem表中查询f_id为c0 的订单号,并根据订单号查询具有订单号的客户c_id,SQL语句如下:

    SELECT c_id FROM orders
    WHERE o_num IN
    (SELECT o_num FROM orderitems WHERE f_id = 'c0');
    

    在这里插入图片描述

    NOT IN

    SELECT c_id FROM orders
    WHERE o_num NOT IN
    (SELECT o_num FROM orderitems WHERE f_id = 'c0');
    

    在这里插入图片描述
    #连接查询(也可以解决这个问题,但有空值,但子查询更容易阅读和编写)

    SELECT c_id 
    FROM orderitems left JOIN orders
    ON orders.o_num = orderitems.o_num 
    AND orderitems.f_id = 'c0';
    

    在这里插入图片描述
    多列子查询

    在 orderitems 表中查询 f_id 为 c0 的订单号的所有信息,并根据订单号查询具有订单号的客户的所有信息,SQL语句如下:

    SELECT * FROM orders ord ,
    (SELECT * FROM orderitems AS o WHERE f_id='c0') ite 
    WHERE ord.o_num=ite.o_num ;
    

    在这里插入图片描述
    *注意:子查询结果为多列,一定在FROM后做为表,且一定要取别名,否则无法访问这张表中的字段。

    带比较运算符的子查询

    #在suppliers表中查询s_city等于‘tianjin’的供应商s_id,然后在fruits表中,查询所有非该供应商供应的水果种类名称。

    SELECT s_id,f_name FROM fruits f
    WHERE f.s_id !=
    (SELECT s1.s_id 
    FROM suppliers AS s1 WHERE s1.s_city = 'tianjin');
    

    带EXISTS 关键字的子查询

    EXISTS关键字后是任意一个子查询:

    • 若至少返回一行,则结果为True,此时外层将进行查询。
    • 若没有返回任何行,则返回的结果为false,此时外层语句将不进行查询。
      NOT EXISTSEXISTS 的使用方法相同,返回的结果相反。
      查询suppliers中是否存在s_id 的供应商,若存在,则查询fruits表中所有记录:
    SELECT * FROM fruits 
    WHERE EXISTS 
    (SELECT s.s_id FROM suppliers AS  s WHERE s.s_id = 107);
    

    返回结果:
    在这里插入图片描述
    EXISTS也可以和条件表达式一起使用

    例:查询suppliers中是否存在s_id 的供应商,若存在,则查询fruits表中f_price>10.20的记录:

    SELECT * FROM fruits 
    WHERE f_price >10.20 AND EXISTS
     (SELECT s.s_id FROM suppliers AS  s WHERE s.s_id = 107);
    

    在这里插入图片描述

    展开全文
  • 多行子查询 返回多行。 使用多行比较操作符。 操作符 含义 IN/NOT IN 等于列表中的任意一个 ANY|SOME 子查询返回的某一个值比较 ALL 子查询返回的所有值比较 案例1:返回location_id是1400...

    多行子查询
    返回多行。
    使用多行比较操作符。
    操作符 含义
    IN/NOT IN 等于列表中的任意一个
    ANY|SOME 和子查询返回的某一个值比较
    ALL 和子查询返回的所有值比较
    案例1:返回location_id是1400或1700的部门中的所有员工姓名
    1.查询location_id是1400或1700的部门编号

    SELECT DISTINCT department_id
    FROM departments
    WHERE location_id IN(1400,1700) ;
    

    2.查询员工姓名,要求部门号是1. 列表中的某一个

    SELECT last_name
    FROM employees
    WHERE department_id IN(
    						SELECT DISTINCT department_id
    						FROM departments
    						WHERE location_id IN(1400,1700) ;
    						);SELECT last_name
    FROM employees
    WHERE department_id =ANY(
    						SELECT DISTINCT department_id
    						FROM departments
    						WHERE location_id IN(1400,1700) ;
    						);
    不是1. 中的某一个
    SELECT last_name
    FROM employees
    WHERE department_id NOT IN(
    						SELECT DISTINCT department_id
    						FROM departments
    						WHERE location_id IN(1400,1700) ;
    						);SELECT last_name
    FROM employees
    WHERE department_id <>ALL(
    						SELECT DISTINCT department_id
    						FROM departments
    						WHERE location_id IN(1400,1700) ;
    						);
    

    案例2:返回其它工种中比job_id为’IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
    1.查询出job_id为’IT_PROG’部门的员工的工资

    SELECT DISTINCT salary
    FROM employees
    WHERE job_id = 'IT_PROG';
    

    2.查询员工的工号、姓名、job_id 以及salary,要求是salary比1. 低

    SELECT employee_id,last_name,job_id,salary
    FROM employees
    WHERE salary < ANY(
    					SELECT DISTINCT salary
    					FROM employees
    					WHERE job_id = 'IT_PROG';
    					)
    		AND job_id<>'IT_PROG';
    

    案例3:返回其它部门中比job_id为’IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id以及salary

    SELECT employee_id,last_name,job_id,salary
    FROM employees
    WHERE salary < ALL(
    					SELECT DISTINCT salary
    					FROM employees
    					WHERE job_id = 'IT_PROG';
    					)
    		AND job_id<>'IT_PROG';SELECT employee_id,last_name,job_id,salary
    FROM employees
    WHERE salary < (
    					SELECT MIN(salary)
    					FROM employees
    					WHERE job_id = 'IT_PROG';
    					)
    		AND job_id<>'IT_PROG';
    
    展开全文
  • 2、根据返回值的记录多少分为单行子查询和多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接; 3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面; 4、...

    1、查询部分分为主查询和子查询;

    2、根据返回值的记录多少分为单行子查询多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接;

    3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面;

    4、完整的SELECT语句可以拥有GROUP BYHAVING子句,也可以使用组函数;也可以从多个表中查询;

    5、子查询的内容必须用小括号来界定;

    6、例子1:子查询(子句)在FROM后面的:

    SELECT first_name,last_name
    FROM 
    (SELECT first_name,last_name
    FROM s_emp
    WHERE 1=1
    AND first_name='国藩'
    )
    WHERE 1=1
    AND last_name='曾';

    精简一下就是:

    SELECT first_name,last_name
    FROM 
    (子查询)
    WHERE 1=1
    AND last_name='曾';

    这里就像是一个定语从句,这里的(子查询)就替换成了另一个select语句;这里要注意,子查询语句里没有表示结束的分号;并且主查询的范围必须小于子查询,否则会因查不到数据而报错;

    7、例子2:子查询(子句)在WHERE后面的

    SELECT first_name,last_name 
    FROM s_emp
    WHERE dept_id=
    (
    SELECT dept_id
    FROM s_emp
    WHERE last_name='曾'
    );

    这里查询的是姓是和‘曾’的所在的部门ID相同(只有一个姓曾)的所有人的姓名;

    这里,有人问了,如果有好几个姓曾的人怎么办,我要把所有姓曾人所在部门的人的姓名都查出来怎么办,这里就是多行子查询;把等号换成in即可;


    Oracle数据库SQL开发之 子查询——子查询的类型

    子查询有两种基本的类型:

    单行子查询:不向外部的SQL语句返回结果,或者只返回一行。

    多行子查询:向外部的SQL语句返回一行或多行。

    还有3种子类型,可以返回一行或多行:

    多列子查询:向外部的SQL语句返回多列

    关联子查询:引用外部的SQL语句中的一列或多列。通过相同的列与外部的SQL语句相关联。

    嵌套子查询:位于另外一个自查中。子查询最多可以嵌套255层。


    子查询的分类

    子查询可以返回的数据类型一共分以下4种:

    单行单列:返回的是一个具体列的内容,可以理解为一个单值数据。

    单行多列:返回一行数据中多个列的内容。

    多行单列:返回多行记录中同一列的内容,相当于给出一个操作范围。

    多行多列:查询返回的结果是一张临时表。

    子查询几乎可以出现在一条查询语句的任意位置上,不过在from、where、having子句中出现较多,而且在子查中一定要使用“()”声明。

    子查询返回的结果:

    where子句:此时子查询返回的结果一般都是单行单列、单行多列、多行单列(即不是一张表)。

    having子句:此时子查询返回的都是单行单列数据(即一个数据),同时为了使用统计函数操作。

    from子句:此时子查询返回的结果一般都是多行多列,可以按照一张数据表(即临时表)的形式操作。

    展开全文
  • 多行子查询返回的也是多行 比较操作符 IN/NOT IN 等于列表的任意一个 ANY/SOME 子查询返回的某一个值比较 ALL 子查询返回的所有值比较 体会anyALL的区别 case1 列子查询,查询location_id 是12001400...
  • 1查询工资比scott高的员工信息 A第一步:查询出scott这个员工的工资 select sal from emp where... 总结: 子查询的本质:个select语句的嵌套 2:子查询的知识体1查询工资比scott高的员工信息A第一步:查询出s...
  • 现在我们一起来学习子查询中的多行子查询。所谓多行子查询,是指执行查询语句获得的结果集中返回了多行数据的子查询。在子查询中可以使用in关键字、exists关键字比较运算符来连接表。1.in关键...
  • MySQL是开源免费功能多面的小型数据库,MySQL...本教程将通过个sql数据库管理操作小示例,让大家直观了解mysql开发步骤实现过程,并在实际操作中逐步学习mysql语法规则脚本开发的一些重要知识点及技巧。课程...
  • 2.列子查询(多行子查询) 3.行子查询(列多行) 特点: ①子查询放在小括号内 ②子查询一般放在条件的右侧 ③标量子查询,一般搭配着当行操作符使用 > < <= >= <> ④列子查询,一般搭配着多行...
  • 条子查询返回的结果可以是一条数据,因而单行子查询也是多行子查询的一种特殊情况,所以单行子查询的“=”比较符可以替换为多行子查询的“in”比较符。但不能将多行子查询的“in”比较符替换为单行子查询的“=”...
  • 文章目录1、需求分析与问题解决2、单行子查询3、多行子查询4、相关子查询5、抛一个思考题 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。SQL 中子查询的使用大大增强了 ...
  • 子查询多行多

    2022-01-18 11:00:25
    子查询多行多列 既然查询的结果是多行多列,那就把它看作一张表。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,137
精华内容 2,054
关键字:

多列子查询和多行子查询