精华内容
下载资源
问答
  • 这是一个带有CASE条件语句的select查询的where子句 . 我写这篇文章是为了满足以下要求:“如果是任何工作日,结果将包含第二天的日期,如果是星期五,结果将包括星期六,星期日和星期一的日期”where DTTM IN ...

    这是一个带有CASE条件语句的select查询的where子句 . 我写这篇文章是为了满足以下要求:“如果是任何工作日,结果将包含第二天的日期,如果是星期五,结果将包括星期六,星期日和星期一的日期”

    where DTTM IN (case

    when to_char(sysdate,'day') <> 'friday ' then to_date(sysdate+1,'DD/MON/YY')

    else (select to_date(sysdate+1,'DD/MM/YYYY') + level - 1 ddate

    from dual

    connect by level <= to_date(sysdate+4,'DD/MM/YYYY') - to_date(sysdate+1,'DD/MM/YYYY')

    )

    end)

    我也使用了 IN ,但是我收到了一个错误

    ORA-01427:单行子查询返回多行00000 - “单行子查询返回多行”

    请帮我解决这个错误 .

    以下是供您参考的完整查询:

    select * from orders

    where DTTM IN (case

    when to_char(sysdate,'day') <> 'friday ' then to_date(sysdate+1,'DD/MON/YY')

    else (select to_date(sysdate+1,'DD/MM/YYYY') + level - 1 ddate

    from dual

    connect by level <= to_date(sysdate+4,'DD/MM/YYYY') - to_date(sysdate+1,'DD/MM/YYYY')

    )

    end)

    order by DTTM;

    展开全文
  • 单行子查询返回多行

    2012-02-13 21:20:01
    今天这个sql语句报了一个单行子查询返回多行的错误 select t.*, (select t_evolve_weekevolve from t_mk_mission where t_evolve_id = t.t_plan_id and t_evolve_week = t.t_plan_week and t_sys_...
  • 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

    );

     

               

    浏览人工智能教程

    展开全文
  • 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 , 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 四、子查询当做临时表使用 查询ecshop中各个类别中价格最高的商品 结果如下: ...
  • select rownum, empno, ename, sal from (select * from emp order by sal desc) where rownum <= 3;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,969
精华内容 5,987
关键字:

sql单行子查询返回多行