`
eminem
  • 浏览: 138309 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用SQL子选择来合并查询

    博客分类:
  • SQL
SQL 
阅读更多
 在一个结果组中搜索
  
  子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应用软件代码中。
  
  使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我的一个数据库有两个表格,Album和Lyric。我可以很容易地通过下面的子查询声明来找到每一个Metallica的歌曲中包含“justice”的歌名:
  
  SELECT song_name FROM Album
  WHERE band_name = ‘Metallica’
  AND song_name IN
  (SELECT song_name FROM Lyric
  WHERE song_lyric LIKE ‘%justice%’);
  
  这个例子是很简单的,我从Album表格中选择了所有Metallica的歌曲,接着,我在lyric表格中选择所有包含“justice”的歌曲,最后,我使用IN关键字来从Lyric表格结果组中显示的Album表格中返回歌曲名称。
  
  我使用Lyric表格结果组来给Album表格中的结果做限定。WHERE子句中的子选择部分是完全自包含的,因此我不需要使用例如 Album.song_name和Lyric.song_name等完整的专栏名称。我没有从最终结果组的Lyric表格中返回任何值,如果我需要歌曲的 Lyric,我会使用一个JOIN声明。
  
  使用NOT IN排除结果
  你可以使用NOT IN关键字来获得明确地不被包含在另一个结果组中的结果。例如,我想要通过下面的代码来返回Metallica在“And Justice for All”专辑中不包含单词“justice”的歌曲:
  
  SELECT song_name FROM Album
  WHERE album_name = ‘And Justice for All’
  AND band_name = ‘Metallica’
  AND song_name NOT IN
  (SELECT song_name FROM Lyric
  WHERE song_lyric LIKE ‘%justice%’);
  
  在前面的SQL代码中,我选择了Metallica的“And Justice for All,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在Lyric结果组中没有出现的Album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。
  
  使用EXISTS来相关结果
  有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索Album表格来得到 Metallica的歌曲列表,可是,我也可以从我的Cover表格中得到由Damage, Inc表演的Metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。
  
  SELECT Album.song_name FROM Album
  WHERE Album.band_name = ‘Metallica’
  AND EXISTS
  (SELECT Cover.song_name FROM Cover
  WHERE Cover.band_name = ‘Damage, Inc.’
  AND Cover.song_name = Album.song_name);
  
  在SQL代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用。我并不从Cover表格中返回结果。一些数据库支持NOT EXISTS关键字来确保你并没有匹配。
  使用合计函数来比较
  除了使用子选择在相关的表格中检查数据,你还可以在一个WHERE子选择中使用合计函数来确定主结果组。例如,我想要核实每一个Metallica歌曲在Album表格中的条目。而且,我还想返回缺少歌曲的专辑的名称。很方便地,AlbumInfo表格包含的一个专栏(album_tracks)给出了应该有多少首歌曲方面的信息。
  
  SELECT AlbumInfo.album_name FROM AlbumInfo
  WHERE AlbumInfo.band_name = ‘Metallica’
  AND album_tracks <>
  (SELECT COUNT(*) FROM Album
  WHERE Album.album_name = AlbumInfo.album_name);
  
  现在我已经成功地返回了所有Metallica的专辑中,应有的曲目数量与Album表格中实际的歌曲条目数量不符的专辑名称。
  
  返回子选择结果
  如果我还是关心每一张专辑的曲目数量并需要得到一个比较报告怎么办?你可以将一个子选择的结果作为最终结果组的一部分来返回。这个功能经常被合计函数所使用。通常地,对其他表格的访问可以作为你的查询的一部分。下一个例子将返回每一张Metallica的专辑,应该包括的曲目数量和在Album表格中包括的条目数量:
  
  SELECT AlbumInfo.album_name, album_tracks,
  (SELECT COUNT(*) FROM Album
  WHERE Album.album_name = AlbumInfo.album_name)
  FROM AlbumInfo
  WHERE AlbumInfo.band_name = ‘Metallica’;
  
  另一个强有力的例子涉及了在AlbumInfo表格中将album_tracks值改变为在Album表格中实际的条目数量:
  
  UPDATE AlbumInfo SET album_tracks =
  SELECT COUNT(*) FROM Album
  WHERE AlbumInfo.album_name = Album.album_name)
  WHERE AlbumInfo.band_name = ‘Metallica’;
  
  在上两个例子中的子选择声明被看作一个自包含单位来执行。
  
  子选择比较关键字(ALL, SOME, ANY)
  除了使用标准查询功能,还有三个关键字可以使你将一个表达式值和一个单栏子选择声明结果组作比较,这些关键字返回TRUE或FALSE的Boolean 值。ALL关键字要求子选择中所有值都遵守比较运算符。SOME和ANY关键字则要求至少一对。这里是ALL关键字的一个简单实例。
  
  SELECT * FROM AlbumSales
  WHERE album_gross >
  ALL (SELECT album_costs FROM AlbumProduction);
  
  上面的例子将从AlbumSales表格返回在AlbumProduction表格里面付出总额大于成本而生产最昂贵的专辑的所有记录。如果用ANY替代ALL,声明将返回所有付出总额大于最低专辑成本的专辑记录。声明= ANY与IN关键字意义是相同的。声明<> ALL与NOT IN关键字是对等的。关键字ANY和SOME也是等同的。数据库生产商中对这些关键字的支持情况是不同的,因此在出现问题时要相信查阅生产商方面的资料。
分享到:
评论

相关推荐

    数据库实验报告 SQL查询 ,子查询组合

    在这个实验中,你将学习如何使用SQL Server 2000的系统工具,如企业管理器和查询分析器来执行各种数据库操作。 1. **SQL Server 2000的系统工具和交互式建库建表** - **创建数据库和表**:通过企业管理器,你可以...

    SQL语句基础学习 子选择如何来合并查询

    SQL子查询,也称为子选择,是SQL语言中一种强大的工具,它允许在查询中嵌套其他查询,以此实现更复杂的检索逻辑。子查询能够帮助我们处理多表间的复杂关联,以及对数据进行条件筛选,使得数据库服务器在单次查询中...

    SQL合并查询用法之探讨.pdf

    总结来说,SQL合并查询提供了灵活且强大的数据检索能力,通过子查询,我们可以在单个查询中实现复杂的数据检索和处理。使用子查询可以大大简化代码,提高查询效率,并能够有效地处理复杂的数据关系。 在实际操作中...

    如何使用SQL Server嵌套子查询

    嵌套子查询的应用场景非常广泛,例如,在电子商务系统中,可以使用嵌套子查询来查询用户的购买记录和订单信息。在人力资源管理系统中,可以使用嵌套子查询来查询员工的个人信息和工作经历。在销售系统中,可以使用嵌...

    SQL子查询、内连接和外连接查询

    【SQL子查询、内连接和外连接查询】 在SQL中,子查询、内连接和外连接是进行复杂数据检索的关键工具。这些概念的理解和熟练应用对于数据库管理与数据分析至关重要。 **子查询** 是一个嵌套在其他SQL语句中的查询,...

    SQL各种查询方法

    6. **子查询**:在SQL中,一个查询可以嵌套在另一个查询的`WHERE`或`FROM`子句中,这样的查询称为子查询。例如,`SELECT * FROM 表1 WHERE 列1 IN (SELECT 列2 FROM 表2)`。 7. **连接查询**:当需要从两个或更多表...

    SQL合并一列

    实现“SQL合并一列”的主要方法有两种:使用`GROUP_CONCAT`函数(MySQL特有)或`STRING_AGG`函数(SQL Server 2017及以上版本),以及使用`FOR XML PATH`来构建字符串。这里我们将重点介绍第二种方法,即利用`FOR ...

    sql 多行合并某一列字符串拼接的示例

    2. **构建子查询**:使用子查询来获取需要拼接的字符串值。子查询应返回一个逗号分隔的字符串列表,其中每个元素都是一个需要合并的值。 3. **应用`STUFF()`函数**:使用`STUFF()`函数来去除第一个逗号(或其他分隔...

    使用sql语言查询大数据

    总结,使用SQL查询大数据时,我们需要关注查询优化、索引设计、并行计算、JOIN优化等方面。同时,理解并利用好如SSH这样的工具,以及使用自由查询系统可以提升工作效率。在实际操作中,结合具体的数据库系统(如...

    SQL查询语句使用

    ### SQL查询语句使用 #### 一、基本概念与结构 在进行数据库操作时,**SQL(Structured Query Language)**是一种极为重要的语言工具,用于管理关系型数据库管理系统中的数据。SQL不仅能够帮助我们检索数据,还能...

    SQL实现两张无关联表的数据列合并在一张结果集中

    具体来说,它从`tab1`表中选择所有的`username`字段,并且对于每一行,使用子查询来获取对应行号(`rowIndex`)的`tab2`表中的`username`字段。最终结果集中的每一行包含了来自`tab1`的用户名以及一个额外的`name2`列...

    sql server 2005 技术内幕t-sql查询源码

    3. **集合操作**:可能涉及到并集(UNION)、交集(INTERSECT)和差集(EXCEPT)等集合运算符的使用,以及如何通过这些运算符来合并或比较多个查询结果。 4. **T-SQL流程控制**:讲述如何使用IF...ELSE、WHILE、...

    使用案例加深对MySQL SQL查询理解

    在本文中,我们将通过实际的使用案例来深入理解MySQL SQL查询,特别是聚焦于查询优化,这对于提高数据库性能至关重要。 首先,基础的SQL查询语句包括SELECT、INSERT、UPDATE、DELETE四大命令。SELECT用于获取数据,...

    SQL 高级查询课件

    在“查询基础2.ppt”中,你可能会学习到SELECT语句的基本结构,如何选择特定列、如何使用WHERE子句过滤数据、如何对结果进行排序(ORDER BY)和分组(GROUP BY),以及如何使用聚合函数(如COUNT、SUM、AVG、MAX和...

    使用SQL管理和查询数据.doc

    本篇文章将详细阐述如何使用SQL进行数据的管理和查询。 一、数据库系统概述 1. 微软SQL数据库:作为网络数据库服务的重要组成部分,SQL Server在电子商务领域有广泛应用,提供高效、安全的数据存储和处理能力。 2. ...

    SQL查询语句大全SQL查询语

    - 子查询可以在主查询中嵌套,用于执行独立的查询并返回结果供外部查询使用。 - 例如:`SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE condition);` 5. **集合运算符** - **UNION**...

    sql数据库子查询.zip

    本压缩包文件“sql数据库子查询.zip”很可能包含了一些关于如何使用子查询的示例和教程,旨在帮助用户深入理解和应用这一技术。 子查询可以在SELECT、FROM、WHERE、HAVING以及JOIN子句中使用。在WHERE或HAVING子句...

    SQL.rar_SQL查询网页_sql查询_查询网页_网页上查询sql

    更复杂的查询可能涉及JOIN操作,用于合并多个表的数据,GROUP BY和HAVING用于数据分组和过滤,ORDER BY用于排序结果,子查询则可以在主查询中嵌套,以执行更复杂的逻辑。 在"SQL语句网页查询"这个文件中,可能会...

    SQL组合查询和ACCESS查询模块源码

    Access支持多种查询类型,包括选择查询、参数查询、联合查询、分组查询、子查询和动作查询(如更新、删除和追加查询)。这些查询可以用来过滤数据、合并表、计算字段值或修改数据库内容。 对于开发者来说,源码是...

    SQL数据库查询技术

    子查询是嵌套在其他SQL语句中的查询,可以作为表达式的一部分,用于在主查询中筛选数据,如`SELECT * FROM table WHERE column IN (SELECT column FROM another_table)`。 八、视图 视图是虚拟表,由SQL查询定义,...

Global site tag (gtag.js) - Google Analytics