6.3 HQL的嵌套子查询

核心提示:6.3 HQL的嵌套子查询 6.3.1 嵌套子查询的概念 在SQL中,一个select-from-where语句成为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having短语的条件中,这样的查询称为嵌套查询或者子查询。如: from Student s where s.sno in (select sno fr

6.3  HQL的嵌套子查询

6.3.1  嵌套子查询的概念

在SQL中,一个select-from-where语句成为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having短语的条件中,这样的查询称为嵌套查询或者子查询。如:

from Student s

where s.sno in

     (select sno from sc where cno='1')

上面的HQL语句在Hibernate后台生成的SQL语句为:

    select

          student0_.id as id1_,

          student0_.Sno as Sno1_,

          student0_.Sname as Sname1_,

         student0_.Ssex as Ssex1_,

         student0_.Sdept as Sdept1_,

         student0_.Sage as Sage1_,

         student0_.Saddress as Saddress1_

    from

        joblog.student student0_

    where

        student0_.Sno in (

             select

                  sc1_.Sno

             from

                  joblog.sc sc1_

             where

                  sc1_.Cno='1'

        )

在这个例子中,下层查询块select sno from sc where cno='1'是嵌套在上层查询块from Student s where s.sno in的where条件中的。上层查询块又称为外层查询或父查询,下层查询块称为内层查询或者子查询。

嵌套查询的求解方法由里向外处理,每一个子查询在其上一级查询处理之前查询,子查询的结果用于建立父查询的查询条件。

6.3.2  带有IN谓词的子查询

带有IN谓词的子查询指的是父查询与子查询用谓词IN连接,判断某个属性列值是否在子查询的结果中。在嵌套查询中,子查询的结果往往是一个集合。

例如,查询与“李晓梅”在同一个系学习的学生。可以使用如下的方法进行:先查询“李晓梅”所在系,然后查询在这个系里的所有学生。先查询的作为条件是子查询,后查询的是父查询。具体代码如下。

from Student s

where s.sdept in

(select s.sdept from s where s.sname='李晓梅')

6.3.3  比较子查询

如果确切知道子查询返回的是单值,可以用=、>、>=、<、<=、<>比较运算符进行比较子查询。

例:查询与“李晓梅”在同一个系学习的学生。

这个例子与上面的例子一样。“李晓梅”只可能在一个系学习,所以子查询返回单值,可以用比较子查询。

from Student s

where s.sdept=

(select s.sdept from s where s.sname='李晓梅')

6.3.4  带有ANY或ALL的子查询

使用ANY或者ALL谓词时,必须同时使用比较运算符。查询其他系中比计算机系任一学生年龄小的学生名单。

from Student s

where s.sage<ANY(select s.sage from s where s.sdept='计算机系')

and s.sdept<>'计算机系'

*     子查询查询出计算机系学生的所有年龄,然后用“<ANY”关键字进行年龄比较。

*     and后的条件s.sdept<>‘计算机系’是父查询的条件。

带有ANY或ALL的子查询的谓词如下所述。

>ANY,大于子查询结果中的某个值。

<ANY,小于子查询中的某个值。

>=ANY,大于等于子查询中的某个值。

<=ANY,小于等于子查询中的某个值。

=ANY,等于子查询中的某个值。

!=ANY或者<>ANY,不等于子查询中的某个值。

>ALL,大于子查询中的所有值。

<ALL,小于子查询中的所有值。

>=ALL,大于等于子查询中的所有值。

<=ALL,小于等于子查询中的所有值。

=ALL,等于子查询中的所有值。

!=ALL或者<>ALL,不等于子查询中的任何一个值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值