精华内容
下载资源
问答
  • SQL中 子查询中运算符之间的关系、

    千次阅读 2011-10-04 23:52:14
    SQL的子查询中,如果子查询返回多个行时,我们知道可以使用IN关键字来查找字段值属某一组值的行,同样,可以在查询中使用EXISTS、 ALL、 ANY (或some)等运算符。  其中,in()后面的子查询是返回结果集的,...


           在SQL的子查询中,如果子查询返回多个行时,我们知道可以使用IN关键字来查找字段值属某一组值的行,同样,可以在查询中使用EXISTS、 ALL、 ANY (或some)等运算符。

           其中,in()后面的子查询是返回结果集的,换句话说执行次序和exists()不一样,子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。如:有一张bbc表,需要找出各个地区人口最大的国家:

    select name,region,population from bbc
                                                             where population in (select max(population) from bbc group by region )   order by population     

             exists()后面总是个跟一个子查询(相关的或非相关的都行),EXISTS的左边不用接列名,用来测试子查询是否返回任何结果, 他只要子查询返回了行,EXISTS的值就为真,其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出。如:有两张表为studentexam表和student表,需要查询返回任何一次考试中分数低于40分的学生的studentid和姓名: 

    select  studentid ,name from student s 

                                                 where exists (select studentid from studentexam e where mark <40 and e.studentid=s.studentid)

           但是,通常情况下采用exists要比in效率高。

             而 ALL、 ANY (或some)需要配合关系运算符来使用,他们的左边要联接列名,右边是子查询。All对所有数据都满足条件,整个条件才成立 ;.Any只要有任一条数据满足条件,整个条件就成立;Some和Any一样表示的限制相同。

          一般情况下:

    (1)=ANY 运算符与 IN 等效。如:在BBC表中,要查找出和india(印度)、iran(伊朗)所在地区的所有国家的所有信息:

    select * from bbc
    where region = any (select region from bbc where name='india'or name='iran')   

     select *  from bbc 

               where regionin (select region from bbc where name='india'or name='iran')   

    (2)>any运算符与>min等效。

    (3)<any运算符与<max等效。如在两张表enrollment表和studentexam表中,要找出总分小于任何一次考试的分数的一半的学生的studentid和总分:

    select studentid,grade from enrollment e

                           where grade< any(select mark/2 from studentexam s where s.studentid=e.studentid)

    select studentid,grade from enrollment e

                           where grade< (select max(mark/2 )from studentexam s where s.studentid=e.studentid)

    (4)>all运算符和>max等效。如BBC表中,要查找出gdp比任何欧洲国家都多的国家:

    select name from bbc
                where gdp>(selectmax(gdp) from bbc where region='Europe') 

    select name from bbc
                where gdp
    >all (select gdp from bbc where region='Europe')  

    (5)<all运算符和<min等效。



    展开全文
  • ALL运算符要求比较的值需要匹配子查询中的所有值。ALL运算符不能单独使用,必须和比较运算符共同使用。 如:检索所有会员入会之前出版的图书: SELECT * FROM T_Book WHERE FYearPublished<ALL(SELECT ...

    ALL运算符

    ALL运算符要求比较的值需要匹配子查询中的所有值。ALL运算符不能单独使用,必须和比较运算符共同使用。

    如:检索在所有会员入会之前出版的图书:

    SELECT * FROM T_Book WHERE FYearPublished<ALL(SELECT FYearOfJoin FROM T_Reader)

    执行结果:

    FId FName FYearPublished FCategoryId
    6 History of China 1982 2
    7 History of England 1860 2
    8 History of America 1700 2
    10 Atom 1930 3
    11 RELATIVITY 1945 3
    12 Computer 1970 3
    13 Astronomy 1971 3
    14 How To Singing 1771 5

    与ANY 运算符相同,ALL 运算符同样不能与固定的集合相匹配,如:下面的SQL语句是错误的:

    SELECT * FROM T_Book WHERE FYearPublished<ALL(2001,2003,2005)

    不过这个限制并不会妨碍功能的实现,因为没有对固定的集合进行ALL匹配的必要,因为待匹配的集合是固定的,所以上面的SQL语句完全可以用下面的SQL语句来代替:

    SELECT * FROM T_Book WHERE *FYearPublished<2001

    注意:当使用ALL运算符时,若带匹配的集合为空,即子查询没有返回任何数据时,不论与什么比较运算符搭配使用,ALL的返回值将永远是true。
    如:检索在所有江苏省会员入会之前出版的图书:

    SELECT * FROM T_Book WHERE FYearPublished<ALL(SELECT FYearOfJoin FROM T_Reader WHERE FProvince = "JiangSu")

    执行结果:

    FId FName FYearPublished FCategoryId
    1 About J2EE 2005 4
    2 Learning Hibernate 2003 4
    3 Two Cites 1999 1
    4 Jane Eyre 2001 1
    5 Oliver Twist 2002 1
    6 History of China 1982 2
    7 History of England 1860 2
    8 History of America 1700 2
    9 History of TheWorld 2008 2
    10 Atom 1930 3
    11 RELATIVITY 1945 3
    12 Computer 1970 3
    13 Astronomy 1971 3
    14 How To Singing 1771 5
    15 DaoDeJing 2001 6
    16 Obedience toAuthority 1995 6

    这个查询结果将所有的会员都检索出来了,可是根本没有江苏省的会员,应该是返回空结果才对的。看起来这是错误的,其实这完全符合ALL 运算符的语义,因为没有江苏省的会员,所以每本书的出版年份就在所有的江苏省的会员之前,所以每一本书都符合匹配条件。在使用ALL运算符的时候,这一个问题很容易在系统中造成BUG,因此使用时必须注意。

    展开全文
  • sql server 2005新增了apply运算符, 它能简化原来用join或子查询解决问题的方式。   示例, 系统有两个表, 一个文章表和一个文章评论表, 一对多的关系。 创建表结构代码   SQL code if object_...
    
    关系数据库中涉及多表操作会使查询变复杂。 多个表的查询,常用的操作方法就是使用表联接(join)或子查询。在sql server 2005中新增了apply运算符, 它能简化原来用join或子查询解决问题的方式。

       

    示例, 系统有两个表, 一个文章表和一个文章评论表, 一对多的关系。
    创建表结构代码
           

    SQL code

    if object_id(N'article_comment') is not null
    drop table article_comment;
    
    if object_id(N'article') is not null
    drop table article;
    
    create table article(
     id int primary key,
     title nvarchar(200) not null,
     content nvarchar(max) not null
    );
    
    create table article_comment(
     id int identity primary key,
     content nvarchar(1000) not null,
     article_id int not null,
     add_date datetime not null
    );
                 
    插入测试数据
         

    SQL code

    insert into article ( id, title, content )
    select 1, 'title1', 'content1' union
    select 2, 'title2', 'content2' union
    select 3, 'title3', 'content3' union
    select 4, 'title4', 'content4' union
    select 5, 'title5', 'content5' union
    select 6, 'title6', 'content6' union
    select 7, 'title7', 'content7'
    
    insert into article_comment ( content, article_id, add_date )
    select 'comment1', 1, '2014-11-11' union all
    select 'comment2', 1, '2014-11-12' union all
    select 'comment3', 1, '2014-11-13' union all
    select 'comment1', 2, '2014-11-14' union all
    select 'comment1', 3, '2014-11-15' union all
    select 'comment2', 3, '2014-11-16' union all
    select 'comment3', 3, '2014-11-17' union all
    select 'comment1', 4, '2014-11-18' union all
    select 'comment2', 4, '2014-11-19' union all
    select 'comment1', 5, '2014-11-20' union all
    select 'comment2', 5, '2014-11-21' union all
    select 'comment3', 5, '2014-11-22' union all
    select 'comment5', 5, '2014-11-23' union all
    select 'comment6', 5, '2014-11-24' union all
    select 'comment7', 5, '2014-11-25' ;
    
          
    现在要通过查询得到文章表的全部字段加上文章的评论数和最新的评论日期。
                   
    第一种方案通过子查询来实现
         

    SQL code

    select id, title, content,
      (select COUNT(*) from article_comment where a.id = article_id ) as comment_count,
      (select MAX( add_date ) from article_comment where a.id = article_id ) as max_comment_date
     from article as a ;
     
      
    这个查询中有两个字查询, 分别要查两次article_comment(文章评论) 表, 这是低效的做法
       
    第二种方案通过联接(join)实现
         

    SQL code

    select id, title, content,
      b.comment_count,
      b.max_comment_date
     from article as a
      left join ( select COUNT(*) as comment_count,
            MAX( add_date ) as max_comment_date,
            article_id
            from article_comment
            group by article_id
       ) as b on a.id = b.article_id
      
    这种方案比上一种方案要好, 但显的过于复杂, 在联接查询中还嵌套了一层group by 聚合。

    第三种方案能过apply运算符实现
       

    SQL code

    select id, title, content, t.comment_count, t.max_comment_date
     from article as a outer apply (
      select COUNT(*) as comment_count,
          MAX( add_date ) as max_comment_date
       from article_comment as ac
       where a.id = ac.article_id
     ) as t;
        
        这种方案的执行计划与第二种相似, 但从查询复杂性来讲, 要比第二种更清晰, 至少少了一个group by 子句。 apply和join的区别在于, join所运算的左右两部份是先执行迪卡尔乘积(交叉联接)生成结果后再进行条件筛选, 而apply可以在执行迪卡尔乘积之前事先进行条件筛选并且还可以对结果集进行处理, 这样在某些需要运算而得到结果再进行合并的情况下会比较方便。在这个查询中使用了outer apply, 其实把outer apply换成 cross apply也同样可行, 因为在这个查询中无法体现outer apply和cross apply的区别。
    展开全文
  • ALL必须接一个比较运算符的后面,表示与子查询返回的所有值比较都为 TRUE则返回TRUE。 table1表数据: col1 2 10 table2表数据: col2 5 12 20 举个例子: SELECT.

    时间煮雨
    @R星校长

    相关知识

    由于列子查询返回的结果集是 N行一列,因此不能直接使用=><>=<=<>这些比较标量结果的操作符。在列子查询中可以使用ALLANYSOMEIN关键字操作符。

    ALL关键字

    ALL必须接在一个比较运算符的后面,表示与子查询返回的所有值比较都为 TRUE则返回TRUE

    table1表数据:

    col1
    2
    10

    table2表数据:

    col2
    5
    12
    20

    举个例子:

    SELECT col1 FROM table1 
    WHERE col1 > ALL (SELECT col2 FROM table2);
    

    该查询语句不会返回任何结果,因为col1中没有比col2所有值都大的值。

    在这里插入图片描述

    ANYSOME关键字

    ANY与比较操作符联合使用,表示与子查询返回的任何值比较为TRUE,则返回TRUE
    SOMEANY的别名,一般用的比较少。

    仍使用上面二张表的数据:
    在这里插入图片描述
    在子查询中,返回的是table2的所有col2列的结果(5,12,20),然后将table1col1的值与之进行比较,只要大于col2的任何值则为TRUE,因此查询结果为10

    IN关键字
    • IN的意思就是指定的一个值是否在这个集合中,如果在就返回TRUE;否则就返回FALSE了,同IN(项1,项2,…);
    • IN= ANY 的别名,二者相同,但 NOT IN 的别名却不是 <> ANY 而是 <> SOME
    编程要求

    我们为你提供了如下数据表:
    tb_salary表数据:

    id position salary
    1 Java 8000
    2 Java 8400
    3 Java 9000
    4 Python 6500
    5 Python 10000

    根据提供的数据,在右侧编辑器中补充代码:

    1. 查询薪资表中比Java最高工资高的所有员工职位名称和薪资;
    2. 查询薪资表中比Java最低工资高的所有员工职位名称和薪资;
    3. 查询薪资表中职位为Java的所有员工职位名称和薪资。

    预期输出:

    1. position salary
    2. Python 10000
    3. position salary
    4. Java 8400
    5. Java 9000
    6. Python 10000
    7. position salary
    8. Java 8000
    9. Java 8400
    10. Java 9000

    开始你的任务吧,祝你成功!
    大老婆

    答案:

    USE Company;
    

    #1.使用ALL关键进行查询

    select position, salary
    from tb_salary
    where salary > ALL (
    select salary 
    from tb_salary 
    where position='Java');
    
    #select salary from tb_salary where position='Java';
    

    #2.使用 ANY关键字进行查询

    select position, salary
    from tb_salary
    where salary > ANY (select salary 
    from tb_salary where position='Java');
    

    #3.使用 IN 关键字进行查询

    select position, salary
    from tb_salary
    where salary IN (select salary 
    from tb_salary where position='Java');
    
    展开全文
  • 使用IN运算符可以用来匹配一个固定集合的某一项。 如:检索2001、2003和2005年出版的所有图书: SELECT * FROM T_Book WHERE FYearPublished IN(2001,2003,2005) 执行结果: FId FName FYearPublished ...
  • 和IN运算符不同,ANY必须和其他的比较运算符共同使用,而且必须将比较运算符放在ANY 关键字之前,所比较的值需要匹配子查询中的任意一个值,这也就是ANY英文中所表示的意义。 首先看一个ANY 运算符和等于运算符(=)...
  • oracle 使用IN运算符

    千次阅读 2016-10-04 17:25:16
    多行子句查询中使用IN运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。 例子: select * from cldjxx where hphm in (select hphm from cljbxx ...
  • 前言 1.将一个查询块嵌套另一个查询块的where子句或having短语的条件的查询称为嵌套查询 ...3.子查询的select语句不能使用order by子句,order by子句永远只能对最终(或外)查询结果排序 4.嵌套查询的求解方...
  • SQL+MySQL数据库 软件技术专业教学资源库 主讲人邵丹 DB 1子查询的语法 子查询是一个嵌套 SELECTINSERTUPDATE 或 DELETE 语句或其他子查询中的查询 子查询WHERE语句中的一般用法 子查询和比较运算符联合使用必须...
  • 使用子查询

    2017-09-27 10:01:00
    一、语法 SELECT SELECT_LIST FROM TABLE WHERE EXPR OPERATOR (SELECT SELECT_LIST FROM TABLE);子查询(内查询)主查询(外查询)...WHERE子句中使用单行子查询时,可以使用单行比较运算符(=,>,>=,<...
  • 子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,并可使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。 以下是子查询必须遵循的几个规则: 子查询必须用括号括起来。 子查询在 ...
  • 使用子查询-1

    2020-05-20 10:50:52
    使用子查询 ================== 子查询通常称为嵌套SELECT,Sub-SELECT或内部SELECT语句。 子查询在主查询之前执行一次。 子查询的结果由主查询(外部查询)使用。...运算符之间不能在子查询中使用。 ...
  • 子查询 IN 允许我们 WHERE 子句过滤某个字段的多个值,语法如下: SELECT column_nam FROM table_name WHERE column_name IN (value1,value2,..,valueN) 如果运算符 in 后面的值来源于某个查询结果,并非是指定...
  • (十六) SQL子查询

    2019-07-31 19:38:03
    文章目录子查询子查询介绍什么是子查询子查询语法注意事项使用子查询使用子查询的原则子查询的类型单行子查询在子查询中使用组函数带子查询的HAVING字句多行子查询在多行子查询中使用IN运算符在多行子查询中使用ANY...
  • 子查询in、exists的使用 子查询in 我们已经知道运算符in,它允许我们WHERE子句过滤某个字段的多个值。...子查询又称为内部查询或嵌套查询,即SQL查询的WHERE子句嵌入查询语句。 子查询in语法 select column_n
  • MySQL子查询

    2019-07-28 17:12:51
    MySQL子查询 什么是子查询 子查询是指一个查询语句嵌套另一个查询语句的内部,将select语句的结果作为另外一个...子查询的作为条件可以使用比较运算符。 体验子查询 create table tb1 ( num tinyint ...
  • 数据库子查询

    千次阅读 2013-03-08 15:15:48
    使用子查询执行操作时,需要遵循下面的一些原则: l子查询必须使用括号括起来,否则无法判断子查询语句的开始和结束。 ...l在子查询中可以使用两种比较运算符:单行运算符和多行运算符。 子查
  • 之前已经知道了运算符IN,它允许我们WHERE子句过滤某个字段的 多个值。 where子句使用in语法 select column_name from table_name where column_name in (value1,value2) 如果运算符IN后面的值是来源于某个查询...
  • Oracle All运算符

    2018-03-19 15:09:00
    本教程,您将学习如何使用Oracle ALL运算符将值与列表或子查询进行比较。 Oracle ALL操作符简介 Oracle ALL操作符用于将值与子查询返回的值列表或结果集进行比较。 以下显示了与列表或子查询一起使用的ALL...
  • 简单子查询

    2018-12-26 21:50:37
    子查询是一个嵌套SELECT,INSERT,UPDATE或DELETE语句或其他子查询中的查询 子查询WHERE语句中的一般用法 语法:SELECT...FROM表1WHERE字段1 比较运算符(子查询) 注意:先执行子查询,返回所有来自子查询的...
  • 子查询

    2019-04-03 16:44:25
    任务描述 创建于使用单值子查询 创建于使用多值子查询 创建于使用相关子查询 ...如果子查询返回单个值结果,则为单值子查询,可以查询中对其使用相应的单行记录比较运算符;如果子查询返回多个结果,则为...
  • 子查询和分组查询

    2018-11-15 22:47:58
    #其中,查询过程,先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。   注意:将子查询和比较运算符联合使用时,必须保证子查询返回的值只有一个,否则比较...
  • MySQL笔记 8 子查询

    2021-01-02 10:09:11
    SQL学习指南 笔记 1 什么是子查询 2 子查询类型 3 非关联查询 3.1 多行单列子查询 in和not in运算符 ... 除了用于过滤条件中, 标量子查询还能用表达式可以出现的任何位置, 其中包括查询中的 se
  • 子查询in 之前的课程,我们已经学习过运算符 IN,它允许我们 WHERE 子句过滤某个字段的多个值。...子查询又称为内部查询或嵌套查询,即 SQL 查询的 WHERE 子句嵌入查询语句。 #子查询in语法 SELECT co
  • 一、语法 SELECT SELECT_LIST FROM TABLE WHERE EXPR OPERATOR (SELECT SELECT_LIST FROM TABLE);...WHERE子句中使用单行子查询时,可以使用单行比较运算符(=,>,>=,<,<=,<>),将...
  • IN 可以 WHERE 子句过滤某个字段的多个值 #where子句使用in语法 SELECT column_name FROM table_name WHERE column_name IN(value1, value2, ...子查询又称为内部查询或嵌套查询,即 SQL 查询的 WHERE 子句...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 494
精华内容 197
关键字:

在子查询中使用运算符