标量子查询不仅可以用在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. 在此位置打开CMD

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\folder\shell\cmd]@="在此位置打开CMD"[HKE ...

  2. Problem B. Harvest of Apples(杭电2018年多校+组合数+逆元+莫队)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6333 题目: 题意:求C(n,0)+C(n,1)+……+C(n,m)的值. 思路:由于t和n数值范围太 ...

  3. 常见网络命令之traceroute命令一起其他常用命令

    备注:任何命令+/?就可以显示命令帮助,比如:ipconfig /?. traceroute命令 traceroute是UNIX系统中的名字,用来跟踪一个分组从源点到终点的路径.在Windows系统中 ...

  4. linux 3389连接工具Rdesktop

    简单使用 工作机换成战斗机了,改用ubuntu,原来的windows7上东西笔记多,还不想重装.用rdesktop来远程连接windows: sudo apt-get install rdesktop ...

  5. C++之编译器与链接器工作原理

    原文来自:http://blog.sina.com.cn/s/blog_5f8817250100i3oz.html 这里并没不是讨论大学课程中所学的<编译原理>,只是写一些我自己对C++编 ...

  6. kernel cmdline

    從 lk 傳送到 kerel 的 cmdline 會放在開機後的 adb /proc/cmdline 開到 android 後,又會被讀出來 /system/core/init/util.cpp 27 ...

  7. 独立服务器远程重装Linux系统

    独立服务器远程重装Linux系统 http://rashost.com/blog/remote-reinstall-linux-dedicated-server 本文介绍怎样在没有console连接, ...

  8. iOS APP程序启动原理

    UIApplication 程序启动原理 一个应用程序运行就必须要有一个进程,一个进程至少要有一个线程,我们把这个线程叫做主线程,主线程开启之后会开启一个主运行循环,如果不开启一个运行循环,程序开启了 ...

  9. Nginx集群配置与redis的session共享策略

    一.什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Ramb ...

  10. django “如何”系列5:如何编写自定义存储系统

    如果你需要提供一个自定义的文件存储-一个常见的例子便是在远程系统上存储文件-你可以通过定义一个自己的存储类来做这件事情,你将通过一下步骤: 你自定义的存储系统一定是django.core.files. ...