精华内容
下载资源
问答
  • SQL嵌套查询

    2017-08-10 17:06:45
    SQL嵌套查询利用自查询进行行过滤(in) 作为计算字段使用子查询

    SQL嵌套查询

    利用自查询进行行过滤(in)

    订单表orders

    orders订单表

    顾客表 customers

    customers顾客表

    订单商品表orderitems

    orderitems订单商品表

    #列出订购物品RGAN01的所有顾客
    select cust_name,cust_contact from customers where cust_id 
            in ( select cust_id from orders where order_num in 
                  ( select order_num from orderitems where prod_id='RGAN01'));

    -作为自查询的SELECT语句只能查询单个列

    作为计算字段使用子查询

    显示customers表中每个顾客的订单总数

    select cust_name,cust_contact,(select count(*) from orders where orders.cust_id = customers.cust_id)as orders from customers;

    执行结果
    执行结果

    如何理解orders表中子查询where orders.cust_id= customers.cust_id?

    1. orders表中的cust_id 字段为
      orders.cust_id
    2. customers表中的cust_id字段为
      customers.cust_id

    3. 自查询中的select列表为count(*)

    4. 其含义为对customers表(上一级查询中的表)中cust_id列的所有项(1000000001、1000000002、1000000003、1000000004、1000000005)按照orders表(子查询的表)中cust_id列出现的次数进行计数

    5.该子查询对检索出来的每个顾客执行一次, 得到结果
    cust_id
    1000000001 2
    1000000002 0
    1000000003 1
    1000000004 1
    1000000005 1

    展开全文
  • sql嵌套查询

    千次阅读 2017-03-27 09:06:39
    1、sql嵌套查询:一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。嵌套查询的工作方式是:先处理...

    1、sql嵌套查询:一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,主查询。内层查询也称子查询,从查询。嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用。还可以用于insert、update、delete语句或其他子查询中。

    2、子查询到组成:

    a、包含标准选择列表组件的标准select查询。

       b、包含一个或多个表或者视图名称的标准from子句。

       c、可选的where子句。

       d、可选的group by子句。

       e、可选的having子句。

    3、子查询语法规则

      a、子查询的select查询总是使用圆括号括起来。

      b、不能包括compute或for.browse子句。

      c、如果同时指定top子句,则可能只包括order by子句。

      d、子查询最多可以嵌套到32层。个别查询可能会不支持32层嵌套。

      e、任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

      f、如果某个表只出现在子查询中二不出现在外部查询中,那么该表的列就无法包含在输出中。

    4、简单子查询实例

    select name,age from person 
    where age > 
    (
        select age from person 
        where name = '孙权'
    )
    5、in嵌套查询
     in关键字用于where子句中用来判断查询的表达式是否在多个值的列表中。返回满足in列表中的满足条件的记录。
    
    select name from person 
    where countryid in 
    (
        select countryid from country
        where countryname = '魏国'
    )
    6、all嵌套查询
     all是sql中的逻辑运算符好,如果一系列的比较都为true,那么结果才能为true。
    
    select name from person 
    where countryid > all   --当countryid大于以下返回的所有id,此结果才为True,此结果才返回
    (
        select countryid from country
        where countryname = '魏国'
    )
    7、some嵌套查询
    some在sql中的逻辑运算符号,如果在一系列比较中,有些值为True,那么结果就为True。some的语法是:
    
    select name from person 
    where countryid = some       --用等号和以下查询到的值比较,如果与其中一个相等,就返回
    (
        select countryid from country
        where countryname = '魏国'
    )
    8、exists嵌套查询
    exists是sql中的逻辑运算符号。如果子查询有结果集返回,那么就为True。exists代表“存在”的意义,它只查找满足条件的那些记录。一旦找到第一个匹配的记录后,就马上停止查找。
    
    其中子查询是一个首先的select语句,不允许有compute子句和into关键字。
    
    SELECT * FROM Person
    WHERE exists
    (
        SELECT 1      --SELECT 0  SELECT NULL 返回结果都一样,因为这三个子查询都有结果集返回,因此总是True  SELECT * FROM Person照常执行
    )
    但是如果子查询中因为加了条件而没有结果集返回,则主语句就不执行了:
    SELECT * FROM Person
    WHERE exists
    (
        SELECT * FROM Person 
        WHERE Person_Id = 100    --如果不存在Person_Id的记录,则子查询没有结果集返回,主语句不执行
    )



    展开全文
  • 【3.60】查询所有选修了1号课程的学生姓名。 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1'); 带有EXIST谓词的子查询。带IN谓词,ANY和ALL 谓词的子...
  • 下午上次课学到了嵌套查询-3 今天我们来看一下 带有EXISTS谓词的子查询 3/20 15:30 EXISTS谓词: 存在量词 ∃ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。 若内层查询结果...
  • 查询学生的选修课程情况 首先引入知识点:连接查询其实就是对于多个表进行笛卡尔积。 select Student.*,Sc.* from TEST.Student,TEST.SC where Student.Sno=Sc.Sno 上面的例子是等值查询,where的条件是‘=’ ,也...
  • sql嵌套查询——优化方案

    千次阅读 2019-03-05 18:00:00
    嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入...

    工作需要写一个查询:

    最开始写了最原始的嵌套查询:

    select * from realservice where realservname in (select realservname from groupmember where groupname in (select groupname from v_group where vname in (select vname from vservice where vip = '10.181.65.185')));

    发现很慢,查了一下用时4min 22.74sec。

    然后考虑如何优化,自然想到了连接,然后优化后代码如下:

    select * from realservice as a join groupmember as b where a.realservname=b.realservname and b.groupname in (select a.groupname from v_group as a join vservice as b where a.vname=b.vname and b.vip = '10.181.65.185');

    用时0.03sec,已经很快了,但是出于好奇,想知道把in和=的区别,继续改进:

    select * from realservice as a join groupmember as b where a.realservname=b.realservname and b.groupname=(select a.groupname from v_group as a join vservice as b where a.vname=b.vname and b.vip = '10.181.65.185');

    用时0.00sec!!!!

     

    所以先来了解下in和=的区别:

    等号:确切知道所要查找的内容,且为单一值时,可以使用等号运算符来进行数据比较。等号运算符中可以使用字符串、日期或数字。

    in:当确切知道所要查找的内容,且为多个值时,可以使用 IN 子句来进行数据比较。IN 子句中也可以使用数字、字符串或日期。

    这里子查询出来的groupname只有一个,是单一值,所以可以使用等号,但如果groupname查询出来的结果是多个,再使用等号就会出错,此时只能使用in来查询了。

    由于groupname有可能会出现有多个值的情况,所以为了保证查询的正确,这里应该使用in而不是等号。

     

    然后看一下为什么直接使用多层嵌套查询会很慢?我们先看一下select查询的本质:

    分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
    WHERE关键字后面的是条件表达式。如果学过C语言等编程语言就会知道,条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。

    分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。

    这是一个SQL语句的嵌套使用,但和上面说的SQL语句的执行过程也是相同的。嵌套的意思也就是说当分析主SQL语句(外面的那个SELECT)到WHERE关键字的时候,又进入了另一个SQL语句中。那么也就是说,分析器先找到表Student并装入内存,一个指针(例如p1)指向Student表中的第一条记录。然后进入WHERE里分析里面的SQL语句,再把SC表装入内存,另一个指针(例如p2)指向SC表中的第一条记录,分析WHERE后面的条件表达式,依次进行分析,最后分析出一个虚表2。

     如果虚表为空表,EXISTS 虚表2 也就为false,不返回到SELECT,而p1指向下一条记录。如果虚表2不为空也就是有记录,那么EXISTS 虚表2 为true同,返回到SELECT并把p1指向的记录添加到主SQL语句的虚表1当中。(这也是为什么嵌套的SQL语句SELECT 后面为一般为*的原因,因为它EXISTS返回的只是真或假,字段的名没有意义,用*就行,当然用别的也不会错。 )

    注意,这里虽然嵌套的SQL语句分析完了,但主SQL语句只执行了一遍,也就是说p1指向Student的第一条记录,p1还要再指向Student表的下一条记录并分析,这样又进入了嵌套中的SQL语句,同上面说的一样分析。当p1也到了Student表的结尾,整个SQL语句结束。返回虚表1Sname这一列。

    所以,才说嵌套查询的复杂度是M*N次查询,因为每一条数据都要和一次子查询的查询结果进行比对,同时,每次查询分析到from的时候都会把表装进一次内存,创建一次临时表,M*N次的存入内存也是很大的消耗。

    参考链接:

    https://blog.csdn.net/jiankunking/article/details/23590239

    https://blog.csdn.net/MTbaby/article/details/79860796

    转载于:https://my.oschina.net/u/3636678/blog/3018311

    展开全文
  • 学习了连接查询嵌套查询。 今天启动SQL server,显示无法连接到服务器,重新打开软件还是一样,后来通过搜索重新启动了SQL server的服务,就可以了。 此电脑右键-管理-展开服务与应用程序,点击服务,右侧找到SQL ...
  • SQL嵌套查询和链接查询

    千次阅读 2010-06-07 10:49:00
    SQL嵌套查询和链接查询

    SQL嵌套查询和链接查询
    我们经常会做一些SQl嵌套和链接查询,有时候用他们2个都可以实现我们的需求,那么我们应该如何去选择了?
    来看看2个Sql语句
    SELECT  a.*
    FROM    Products a
    WHERE   a.CategoryID IN ( SELECT    CategoryID
                              FROM      dbo.Categories )

    SELECT  a.*
    FROM    Products a
            INNER JOIN Categories b ON a.CategoryID = b.CategoryID

     

     


    结果显示在有聚集索引的情况下采用嵌套查询性能更高。其他情况大家自己研究哦
    呵呵。

    展开全文
  • SQLselect嵌套查询例子

    千次阅读 2013-11-21 21:19:51
    原文摘自:http://leezk.com/sql-select.html --单行子查询  select ename,sal,deptno from emp where deptno=(select deptno from emp where ename='SCOTT')  select ename,sal,deptno from emp w
  • 一、连接查询 连接查询:同时涉及两个... SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno = SC.Sno; 相当于对比关系代数中的等值连接,通过学生学号将Student表与SC表连接起来。 [例 3.50] 对
  • sql查询 嵌套SELECT语句

    千次阅读 2015-04-02 13:15:23
    sql查询/嵌套SELECT语句 嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够...
  • 第7讲 sql嵌套查询;教学任务发布;7.4 在Having子句中使用子查询;7.5 在Select子名中使用子查询;7.6 子查询的另外一种分类;7.6 子查询的另外一种分类;7.6 子查询的另外一种分类;拓展补充;拓展补充;拓展补充;拓展补充;...
  • 嵌套查询语法格式带有IN谓词...1.SQL允许多层嵌套查询 2.子查询中不能使用ORDER BY子句(但可以使用GROUP BY等分组查询) 带有IN谓词的子查询 带有IN谓词的子查询指父查询与子查询之间用IN进行连接,判断某个属性列值是
  • 嵌套查询 1.带有IN谓语的子查询 3.带有比较运算符的子查询 3.带有ANY(SOME)或ALL谓语的子查询 总结: 连接查询   若一个查询同时涉及两个以上的表,则称之为链接查询。 链接查询是关系数据库中最主
  • sql嵌套查询优化

    千次阅读 2018-01-04 23:36:44
    1.嵌套查询优化 优化前 SELECT q.id, q.title, q.question, q.person_name, q.department_name, r.response, r.create_time response_time FROM tb_ent_question q LEFT JOIN tb_ent_res
  • 数据查询2—连接查询:同时涉及两个以上的表的查询 连接条件:用来连接两个表的条件 [.] [.] 连接字段:连接条件中的列名称(注意:连接字段类型必须是可比的,但名字不必相同) 连接查询—(1)等值与非等值连接查询:...
  • select 嵌套查询

    千次阅读 2019-09-27 17:18:15
    看见很多人在写嵌套查询的时候,基本都只是在where条件中查询 而我的需求是在select嵌套,如下 select stock.id, select count(*) from orderdetail) as takedfrom stock 结果: 嗯,完美。 最后再来一个...
  • SQL查询嵌套查询

    2012-05-14 20:51:48
    SQL查询嵌套查询
  • ②:嵌套查询—-高级 相关子查询 不相关子查询 1.带有IN谓词的子查询 2.带有比较运算符的子查询 3.带有ANY(SOME)或ALL谓词的子查询 4.带有EXISTS谓词的子查询(重点、难点) ①:连接查询—-中级 1.等值与非等值...
  • SQL数据库嵌套查询

    千次阅读 2017-10-31 08:37:51
    嵌套查询 保存查询结果 从查询结果创建一个永久表: select 字段列表 into 新表名 from 原表名 where 查询条件嵌套查询 一个 select……from……where语句称为一个查询块。 将一个查询嵌套在另一个查询块的where...
  • SQL 嵌套查询问题

    千次阅读 2013-03-20 21:44:48
    今天纠结了好长时间 , 才解决的一个问题 , 问题原因是 求得多条数据中, 时间和日期是...Select * from tableName where date=(select max(date) from TableName) and time =(select max(time) from TableName)
  • SQL语句嵌套查询

    2013-02-03 14:50:09
    基于SQL2005的嵌套查询,包括返回一个值的子查询、返回一组值的子查询(使用ANY谓词查询、使用IN谓词查询、使用ALL谓词查询使用EXISTS查询)。附有详细的表信息。
  • SELECT Sno, Cno FROM SC, (SELECT Sno, Avg(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade) WHERE SC.Sno = Avg_sc.avg_sno AND SC.Grade >=Avg_sc.avg_grade

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,557
精华内容 39,422
关键字:

selectsql嵌套查询慢