标量子查询不仅可以用在SELECT 语句的列表中,它还可以用在WHERE 子句中,而且实际应用中子查询很多的时候都是用在WHERE子句中的。

先来看一个简单的例子,我们要检索喜欢“Story”的读者主键列表,那么这可以使用连接来完成,不过这里我们将使用子查询来完成。

使用子查询的实现思路也比使用连接简单。首先肯定要到T_Category 表中查找FName等于“Story”的记录的FId字段值:


SELECT FId FROM T_Category WHERE FName=" Story "

因为这个查询的返回值是单列且单行的,所以可以当作标量子查询使用。将这个子查询结果来构造外部查询:


SELECT FReaderId FROM T_ReaderFavorite WHERE FCategoryId=(SELECT FId FROM T_Category WHERE FName="Story")

执行这个SQL语句则会得到下面的执行结果:


FReaderId 1 6 7 12 3

下面来看一个稍微复杂一点的例子。假设需要检索每一种书籍类别中出版年份最早的书籍的名称,如果有两本或者多本书籍在同一年出版,则均显示它们的名字。要求检索结果中显示出类型的名字、书的名字和它的出版年份。

检索每种类型图书中出版时间最早的图书非常简单,只要使用GROUP BY 子句以及聚合函数就可以轻松完成这个任务,SQL语句如下:


SELECT T_Category.FId,MIN(T_Book.FYearPublished) FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId

执行完毕我们就能在输出结果中看到下面的执行结果:


FId 1 1999 2 1700 3 1930 4 2003 5 1771 6 1995

查询结果是正确的,不过这个查询结果没有提供书名,只提供了类型主键和出版时间最早的图书的出版年份。尝试将图书的名字加入到SELECT语句中,如下:


SELECT T_Category.FId, T_Book. FName,MIN(T_Book.FYearPublished) FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId

在数据库系统中执行这个SQL语句会报出如下的错误信息:

  • 选择列表中的列"T_Book.FName" 无效,因为该列没有包含在聚合函数或GROUP BY子句中。

出现这个错误的原因是所有在SELECT列表中的字段如果没有包含在聚合函数中,则必须放到GROUP BY 子句中,所以将T_Book. FName加入到GROUP BY 子句中,修改后的SQL语句如下:


SELECT T_Category.FId, T_Book. FName,MIN(T_Book.FYearPublished) FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId, T_Book. FName

执行完毕我们就能在输出结果中看到下面的执行结果:


FId FName 1 Jane Eyre 2001 1 Oliver Twist 2002 1 Two Cites 1999 2 History of America 1700 2 History of China 1982 2 History of England 1860 2 History of TheWorld 2008 3 Astronomy 1971 3 Atom 1930 3 Computer 1970 3 RELATIVITY 1945 4 About J2EE 2005 4 Learning Hibernate 2003 5 How To Singing 1771 6 DaoDeJing 2001 6 Obedience to Authority 1995

这个执行结果显然是错误的,因为它们是根据T_Category.FId和T_Book.FName这两个字段进行的分组,所以MIN(T_Book.FYearPublished)返回值不是一个特定书籍类型的最早出版年份,而是每本图书中的最早出版年份。而真正需要的是查询每种书籍类型中的最早出版的书籍,可以使用子查询来轻松完成这个任务。在SQL查询中,需要将一本书籍的出版年份与该类型的所有书籍的出版年份进行比较,并且仅仅在它们匹配时,才返回一个记录,实现SQL语句如下:


SELECT T_Category.FId, T_Book. FName,T_Book.FYearPublished FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId WHERE T_Book.FYearPublished=(SELECT MIN(T_Book.FYearPublished) FROM T_Book WHERE T_Book.FCategoryId=T_Category.FId)

在这个SQL语句中,T_Category表和T_Book表首先进行内部连接,然后使用WHERE子句中使用子查询来进行数据的过滤。这个子查询是一个相关子查询,它返回外部查询中当前图书类别中的图书的最早出版年份。在外部查询的WHERE子句中,T_Book的FYearPublished与子查询的返回值进行比较,这样就可以得到每种书籍类型中的出版最早的书籍了。

执行完毕我们就能在输出结果中看到下面的执行结果:


FId FName FYearPublished 1 Two Cites 1999 2 History of America 1700 3 Atom 1930 4 Learning Hibernate 2003 5 How To Singing 1771 6 Obedience to Authority 1995

WHERE 子句中的标量子查询的更多相关文章

  1. SELECT列表中的标量子查询

    发现了一种表连接新的写法,以前还没有这样写过或者见别人写过.跟同学聊天他们公司却很多人这样写,看来真的要学学sql了 表 CREATE TABLE `t_book` ( `FId` ) NOT NUL ...

  2. 在MySQL中使用子查询和标量子查询的基本用法

    一.MySQL 子查询 子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用.MySQL 支持 SQL 标准要求的所有子查询格式和操作,也扩展了特有的几种特性.子查询没 ...

  3. SELECT中常用的子查询操作

    MySQL中的子查询 是在MySQL中经常使用到的一个操作,不仅仅是用在DQL语句中,在DDL语句.DML语句中也都会常用到子查询. 子查询的定义: 子查询是将一个查询语句嵌套在另一个查询语句中: 在 ...

  4. 标量子查询调优SQL

    fxnjbmhkk4pp4 select /*+ leading (wb,sb,qw) */ 'blocker('||wb.holding_session||':'||sb.username||')- ...

  5. 优化有标量子查询的SQL

    数据库环境:SQL SERVER 2008R2 今天在数据库中抓出一条比较耗费资源的SQL,只返回904条数据,居然跑了40多分钟.SQL及对应的数据量如下图: SELECT saft04.cur_y ...

  6. Oracle sql优化之分析函数优化标量子查询

    待优化语句如下 select a.code as code, a.m_code as m_code,a.stktype as f_stype,a.e_year as e_year, b.sname a ...

  7. SQL Server的优化器会缓存标量子查询结果集吗

    在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...

  8. [20180626]函数与标量子查询14.txt

    [20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...

  9. 标量子查询中有ROWNUM=1怎么改?

    碰到标量子查询中有ROWNUM=1怎么改? select to_date(o.postdate,'yyyymmdd'), (select cur.c_code from cur_tbl cur whe ...

随机推荐

  1. 删除windows上特定目录下以*.rar后缀名的python脚本

    import os,fnmatch,datetime,time def all_files(root,pattern='*',single_level=False,yield_folders=Fals ...

  2. Idea Ant 打开发包

    简介: http://ju.outofmemory.cn/entry/19239 语法: https://wenku.baidu.com/view/a0e00315866fb84ae45c8d9d.h ...

  3. 基于html5的动画库,非svg和canvas

    基于html5的动画库,非svg和canvas https://greensock.com/docs/#/HTML5/GSAP/TweenLite/

  4. 【BZOJ2288】生日礼物 [贪心]

    生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 18岁生日的时候, ...

  5. 【BZOJ】1031 [JSOI2007]字符加密Cipher

    [算法]后缀数组 [题解]把数组复制一遍然后SA处理即可. 后缀数组 #include<cstdio> #include<algorithm> #include<cstr ...

  6. [Leetcode Week17]Copy List with Random Pointer

    Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ...

  7. [Leetcode Week14]Path Sum II

    Path Sum II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/path-sum-ii/description/ Description Giv ...

  8. CiteSeer统计的计算机领域的期刊和会议的影响因子(2005)

    产生自CiterSeer 2005数据库,实际的影响因子可能更高.仅供参考使用.真实的IF还需去官网查看 . OSDI: 3.31 (top 0.08%) . USENIX Symposium on ...

  9. 更新T1表,要添加一个条件A,但T1表没有A字段

    可以这样 如果T2表有A字段,T1.T2表有共同字段B,可以通过T2表A字段为条件查得B字段 再用B字段为条件去更新T1表 update T1 set C = '1' where B in(selec ...

  10. 2015多校第9场 HDU 5405 Sometimes Naive 树链剖分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5405 题意: 给你一棵n个节点的树,有点权.        要求支持两种操作: 操作1:更改某个节点的 ...