精华内容
下载资源
问答
  • 在单行子查询中使用单行运算符,在多行子查询中用多行运算符。 单行运算符:子查询结果只有一个:< > = <= >= != 多行子查询:子查询结果是单列多行: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);
    

    在这里插入图片描述

    展开全文
  • 多行子查询1.in和not ininnot in2.exists和not existsexistsnot exists3.all和some、anyallsome、any 表sheet1 t1 表sheet2 t2 1.in和not in in和not in 其实就是判断外层查询得到的集合和子查询得到的集合进行...

    表sheet1 t1
    在这里插入图片描述

    表sheet2 t2
    在这里插入图片描述

    1.in和not in

    in和not in 其实就是判断外层查询得到的集合和子查询得到的集合进行交集运算和差集运算。

    in

    外层查询和子查询交集运算,输出结果可以是0个值,也可以是多个值。
    语法:
    select 字段1,字段2… from table1
    where 字段1 in
    (
    select table2.字段1
    from table2
    where table1.字段1=table2.字段1
    )

    举例:

    SELECT * from sheet1 t1
    where  性别 IN (SELECT t2.性别 from sheet2 t2 where t1.性别=t2.性别);
    

    得到结果
    在这里插入图片描述

    由结果表是字段book_sort既能在表t1找到也在表t2中找到对应的值。

    not in

    外层查询和子查询差集运算,输出结果可以是0个值,也可以是多个值。
    语法:
    select 字段1,字段2… from table1
    where 字段1 not in
    (
    select table2.字段1
    from table2
    where table1.字段1=table2.字段1
    )

    举例:

    SELECT * from sheet1 t1
    where  性别 NOT IN (SELECT t2.性别 from sheet2 t2 where t1.性别=t2.性别);
    

    得到结果
    在这里插入图片描述

    由结果表是字段book_sort只能在表t1找到值且不能再在表t2中找到对应的值。

    2.exists和not exists

    exists和in,no exists和not in实现的功能都是一样的,他们的差别主要就是在语法结构的差别上。
    关键字exists 和no exists的语法结构特点:
    1.一般位于外层查询WHERE后面,前面没有列名,常量或者表达式。
    2.由关键字exists(或no exists)引入的子查询的select查询的列表清单可以直接写"*"而不用写列名。

    exists

    语法:
    *select 字段1,字段2… from table1
    where exists
    (
    select (或者table2.字段1 )
    from table2
    where table1.字段1=table2.字段1
    )

    上面用in的写的查询,换成exists可以用以下代码 都可以实现相同的结果
    举例:

    SELECT * from sheet1 t1
    where  EXISTS  (SELECT t2.性别 from sheet2 t2 where t1.性别=t2.性别);
    

    或者

    SELECT * from sheet1 t1
    where  EXISTS  (SELECT * from sheet2 t2 where t1.性别=t2.性别);
    

    输出结果
    在这里插入图片描述

    not exists

    语法:
    *select 字段1,字段2… from table1
    where not exists
    (
    select (或者table2.字段1 )
    from table2
    where table1.字段1=table2.字段1
    )

    上面用in的写的查询,换成exists可以用以下代码 都可以实现相同的结果
    举例:

    SELECT * from sheet1 t1
    where  NOt EXISTS  (SELECT t2.性别 from sheet2 t2 where t1.性别=t2.性别);
    

    或者

    SELECT * from sheet1 t1
    where  NOt EXISTS  (SELECT * from sheet2 t2 where t1.性别=t2.性别);
    

    输出结果
    在这里插入图片描述
    结果同 not in的结果

    3.all和some、any

    我们先来看看子查询出来是什么内容

    SELECT avg(销售价) 均价 from sheet1 group by 性别;
    

    得到结果
    在这里插入图片描述

    all

    分别有哪些这三条查询

    select * from sheet1 where 销售价 <ALL(SELECT avg(销售价) from sheet1 group by 性别);
    select * from sheet1 where 销售价 =ALL(SELECT avg(销售价) from sheet1 group by 性别);
    select * from sheet1 where 销售价 >ALL(SELECT avg(销售价) from sheet1 group by 性别);
    

    得到的结果依次是
    结果小于子查询结果的最小值(269)
    在这里插入图片描述
    结果没有完全等于子查询结果的值,所有返回的是空值
    在这里插入图片描述
    结果大于子查询结果的最大值
    在这里插入图片描述
    由以上三个结果,可以看出,使用all的时候,只有外层查询(父查询)全部满足子查询的每一条记录,才为真,满足的结果才会被返回。

    some、any

    select * from sheet1 where 销售价 <ANY(SELECT avg(销售价) from sheet1 group by 性别);
    select * from sheet1 where 销售价 <SOME(SELECT avg(销售价) from sheet1 group by 性别);
    

    得到结果:
    在这里插入图片描述
    两条代码都是返回的相同的结果,由结果可以看出,小于子查询结果的最大值(3646.78)

    select * from sheet1 where 销售价 =ANY(SELECT avg(销售价) from sheet1 group by 性别);
    select * from sheet1 where 销售价 =SOME(SELECT avg(销售价) from sheet1 group by 性别);
    

    得到结果:
    在这里插入图片描述
    两条代码都是返回的相同的结果,由结果可以看出,只要等于子查询结果的值就会被返回,和使用in是一样的结果

    select * from sheet1 where 销售价 >ANY(SELECT avg(销售价) from sheet1 group by 性别);
    select * from sheet1 where 销售价 >SOME(SELECT avg(销售价) from sheet1 group by 性别);
    

    得到结果

    在这里插入图片描述
    两条代码都是返回的相同的结果,由结果可以看出,大于子查询结果的最大值(269)

    由以上三个结果,可以看出,使用some或any的时候,只要外层查询(父查询)只要任一满足子查询的一条记录,则为真,满足的结果即会被返回

    展开全文
  • 多行子查询返回的也是多行 比较操作符 IN/NOT IN 等于列表的任意一个 ANY/SOME 和子查询返回的某一个值比较 ALL 和子查询返回的所有值比较 体会any和ALL的区别 case1 列子查询,查询location_id 是1200和1400...

    多行子查询返回的也是多行

    比较操作符

    • IN/NOT IN 等于列表的任意一个
    • ANY/SOME 和子查询返回的某一个值比较
    • ALL 和子查询返回的所有值比较

    体会any和ALL的区别

    case1 列子查询,查询location_id 是1200和1400的部门中的所有员工姓名

    #拿到题目先思考限定条件,我们需要查询的限定条件是location_id的区域。
    #1.查询location_id 在1200-1400的部门id信息
    SELECT DISTICT department_id
    FROM departments
    WHERE location_id IN(1200,1400);
    
    #2.查询员工姓名。要求部门号是1列表的某一个
    SELECT last_name
    FROM employeers
    WHERE department_id IN(
        SELECT DISTICT department_id
        FROM departments
        WHERE location_id IN(1200,1400)
    );

    case 2 返回其他部门中比job_id为‘IT-PROG’部门任一工资低的员工的员工号、姓名、job_id以及salary

    #1.思考限定条件为 job_id 为‘it -prog’部门员工工资
    SELECT DISTICT salary
    FROM employeers
    WHERE job_id = ÍT-PROG;
    
    #2.上面返回的是一个一列多行的列子查询,所以需要我们加上自己的内容。
    SELECT employeer_id,last_name,job_id,salary
    FROM employeers
    WHERE salary < ANY(
        SELECT salary
        FROM employeers
        WHERE job_id = ÍT-PROG;
    ) AND job_id <> 'IT-PROG';

    3.行子查询

    case 1 查询员工编号最小并且工资最高的员工信息

    这个不是独有的查询方法,平时用的会比较少一点,一般都可以用列子查询替代,先看下列子查询怎么做这题

    #1.先查询员工编号最小的员工编号是什么
    SELECT MIN(job_id)
    FROM employees;
    
    #2.在查询工资最高的工资是多少
    SELECT max(salary)
    FROM employees;
    
    #3.将这两个限定条件放在一起
    SELECT *
    FROM employeers
    WHERE job_id =(
        SELECT MIN(job_id)
        FROM employees
    ) AND salary = (
        SELECT max(salary)
        FROM employees
    ):

    其实也逻辑 也是十分清楚的,然后,用行查询就多一个特定的语句

    #就直接将两个进行整合
    SELECT *
    FROM employees
    WHERE (employee_id.salary) = (
        SELECT miN(employee_id),MAX(job_id)
        FROM employees
    );
    #在条件匹配的时候,要一一对应。

    # 子查询还可以放在select后面

    #查询每个部门的员工个数
    #以前的做法是
    SELECT department_id 部门,count(*) 员工个数
    FROM employees e
    INNER JOIN departments d
    WHERE e.department_id = d.department_id
    ORDER BY department_id ASC;
    
    
    #现在的话,可以用select后面加的标量子查询进行查询,标量子查询返回的是一行一列的内容
    SELECT d.*,(
        SELECT count(*)
        FROM employees e 
        WHERE e.department_id = d.department_id
        );
    

    #子查询还可以放在from 后面,作为一个子集查询

    case 查询每个部门的平均工资的等级,相当于自己设计一个新的表作为一个子表与另外一个表进行比对,类似于非等值查询。

    #思考,首先查询一下每个部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id;
    
    #查找一个关于等级的表,跟成绩分级差不多
    假设其中有高工资和低工资的区分进行排等级。
    SELECT ag_dep.*,j.grade_level
    FROM (
        SELECT AVG(salary),department_id
        FROM employees
        GROUP BY department_id
    ) ag_dep
    INNER JOIN job_grades g
    ON ag_dep.ag between lowest_sal AND highest_sal;

    将子查询的结果充当成一个表,要求必须加别名

    还可以放在EXISTS 后面

    SELECT EXISTS(SELECT employees_id FROM employees WHERE salary = 120000)
    EXIETS 是一个布尔类型,称为是否存在的查询。

    展开全文
  • 第十章:SQL Server2019数据库之多行子查询

    千次阅读 多人点赞 2021-04-26 19:26:00
  • 六、子查询——多行子查询 1.什么是多行子查询 子查询结果为一列值,主查询与子查询之间使用in、not in、any、all等连接。 2.多行子查询实例 (1)示例1 查询有成绩的同学的基本信息 <1>从成绩表中查询...
  • 1 子查询知识体系,单行子查询,多行子查询
  • 什么是子查询? 使用子查询解决问题:谁的工资比SCOTT高? 子查询的语法 子查询(内查询)在主查询之间一次执行完成。\color{red}{子查询(内查询)在主查询之间一次执行完成。}子查询(内查询)在主查询...
  • 零基础带你学习MySQL—多行子查询(二十二) 一、什么是子查询? 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询 二、什么是单行子查询? 单行子查询是指只返回一行数据的子查询语句 三、什么是多行...
  • sql 单行和多行子查询

    2019-09-20 22:22:44
    单行和多行子查询 单行和多行子查询 --子查询(单行子查询,多行子查询) --查询比"CLARK"工资高的员工的信息? --[1]'CLARK'的工资是多少? SELECT SAL FROM EMP WHERE ENAME ='CLARK'; --2450 --[2...
  • oracle中多行子查询与多行操作符 1、多行子查询:子查询返回多条数据 2、多行操作符: in : 取在集合中的元素 any : 和集合中任意一条数据比较 all : 和集合中所有数据比较 例: 查出工资比部门2任意员工高的人员...
  • 方式一: 第一步线查出Abel共 第二部进行过滤 SELECT salary FROM employees WHERE last_name = 'Abel'; SELECT first_name,last_name,salary FROM employees WHERE salary>11000 方式二: 自连接 SELECT...
  • 单行子查询 只返回一行数据的子查询的语句,使用单行比较操作符=,>,>=,<,<=,<>等 举例: 1显示与JAMES同部门的所有其他的员工姓名、工资、部门号 Select ename,sal,deptno From emp Where ...
  • 多条子查询返回的结果可以是一条数据,因而单行子查询也是多行子查询的一种特殊情况,所以单行子查询的“=”比较符可以替换为多行子查询的“in”比较符。但不能将多行子查询的“in”比较符替换为单行子查询的“=”...
  • Oracle语法中子查询的多行子查询

    千次阅读 2019-04-18 09:11:49
    子查询(内查询)在主查询之前一次执行完成,子查询的结果被主查询(外查询)使用,子查询要包含在括号内,将子查询放在比较条件的右侧,多行操作符对应多行子查询。 /查询所有选修“计算机导论”课程的成绩表/ ...
  • 2、根据返回值的记录多少分为单行子查询和多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接; 3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面; 4、完整的...
  • oracle查询:多行子查询返回多个行 1.子查询 查询嵌套,一个查询作为另一个查询的条件、表。 多行子查询通常作为另一个查询的表使用;单行子查询可以作为另一个查询的条件使用。 SELECT decode( ( SELECT nvl( a....
  • 1.连接基本语法select columns_list from table_1 innner join table_2on join_condition;eg:select e.empno,e.ename,d.dname from emp e...单行子查询 返回一行数据的子查询语句eg:在emp表中,查询出既不是最高工资...
  • Oracle多行子查询IN、ANY、ALL的使用

    千次阅读 2019-04-08 08:23:00
    1、返回多行; 2、使用多行比较操作符 例:1、查询“c001”课程学生的信息 SELECT * FROM SC WHERE CNO = 'c001' 输出结果: 2、查询“c001”课程学生的信息 SELECT * FROM SC WHERE CNO = 'c002...
  •  1查询工资比scott高的员工信息 A 第一步:查询出scott这个员工的工资 select sal from emp where ename = 'SCOTT'; B 第二步:查询出工资比scott高的员工信息  ...
  • 子查询 1.不相关子查询:()里的查询可以独立运行,先执行子查询,在执行外查询 单行子查询:因为子查询的结果是单行单列 – 查询比sallen的薪水高的员工 select ename,sal from emp where sal>(select sal from ...
  • 一、子查询的基本类型之多行子查询 (1)使用IN操作符进行多行子查询。(总结:IN操作符后可用多行子查询) 比如:查询各个职位中工资最高的员工信息。 SQL>select ename, job, sal from emp where sal in (select...
  • 多行子查询

    2010-09-07 18:29:42
    多行子查询返回多行记录 对多行子查询只能使用多行记录比较运算符 运算符 含义 IN 等于列表中的任何一个 ANY 和子查询返回的任意一个值比较 ALL 和子查询返回的所有值比较 举例: select * from emp where sal...
  • 2、根据返回值的记录多少分为单行子查询和多行子查询;单行子查询用单行比较符=连接;多行子查询用多行比较符in连接; 3、子查询的内容可以放在FROM后面,也可以放在WHERE后面,也可以放在HAVING后面; 4、...
  • 多行子查询 是子查询的多重嵌套,是查询语句的综合应用,可见,多行子查询运用熟练将是mysql水平上质的飞跃。下面举得几个例子: #例1:返回location_id是1400或1700的部门中的所有员工姓名 #①查询location_id是...
  • Oracle多行子查询

    2019-04-18 09:43:28
    使用多行操作符: 操作符 含义 IN 等于列表中的某任意一个 ANY ...(1)IN操作符使用:从多行子查询返回不止一行的子查询称为多行子查询。使用多...
  • 在操作表查询时,发现一个问题,进行子查询时使用NOT IN 的查询结果不存在: 如下的操作:  查询不是老板的员工:  select * from emp where   empno not in(select mager from emp );  这条语句执行的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,927
精华内容 21,970
关键字:

多行子查询