当前位置:  数据库>sqlserver

sql合并查询实例 sql子查询教程

    来源: 互联网  发布时间:2014-08-29

    本文导语:  sql合并查询实例教程 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声明。(www. 脚本学堂)

二,使用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也是等同的。
数据库生产商中对这些关键字的支持情况是不同的,因此在出现问题时要相信查阅生产商方面的资料。

您可能感兴趣的文章:
  • 带关联子查询Update语句更新数据的例子
  • sql中update子查询的实例解析
  • T-SQL实例 子查询结果中使用比较操作符
  • sql2005 子查询和表链接简介
  • 一个sql子查询的例子

    
 
 

您可能感兴趣的文章:

  • mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  • sql中count或sum为条件的查询示例(sql查询count)
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • SQL查询分析工具 SQL Workbench/J
  • mysqli多查询特性 实现多条sql语句查询
  • sql server简单查询的例子(sql入门)
  • 根据时间范围条件查询数据sql语句
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名
  • shell中关于sql查询结果的判断?
  • SQL查询工具 SuperQuaiL
  • HBase上使用SQL查询 Phoniex
  • sql 查询所有数据库、表名、表字段的代码
  • 查询SQL Server中所有数据库的数据文件位置的sql脚本
  • 在SQL Server中查询资料库的TABLE数量与名称的sql语句
  • 在线等待!一个简单的SQL查询问题?
  • SQL SERVER 查询正在实行的SQL语句
  • SQLServer中用T—SQL命令查询一个数据库中有哪些表的sql语句
  • SQL查询问题
  • SQL日期查询与比较方法
  • SQL Server日志过大会影响查询结果
  • 将string数组转化为sql的in条件用sql查询
  • Sql Server多行合并一行 sql分组统计
  • 经典sql代码--合并多行的某一列值
  • SQL 合并多行记录的方法总汇
  • SQL 合并多行记录的相同字段值
  • sql server 中合并某个字段值的实例
  • Sql function 多行中的列合并为一行一列的方法
  • sql 查询结果合并union all用法_数据库技巧
  • 深入SQL SERVER合并相关操作Union,Except,Intersect的详解
  • sql server中合并多行记录的方法总汇
  • mssql 两表合并sql语句
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sql语句实例 取得日志条目的sql语句
  • SQL分组排序去除重复实例
  • php防止sql注入代码实例
  • T-SQL实例 函数结果设置为列别名
  • 怎样不执行SELECT SQL语句即可获得ResultSetMetaData实例????
  • sql语句实例 统计一个特定页面中的相关链接
  • SQL分组排序去重复的小实例
  • sql语句实例 统计页面链接的sql语句
  • 教你怎么使用sql游标实例分享
  • mysqli多条sql语句查询实例
  • MSSQL中递归SQL查询语句实例说明-
  • sql语句not and or执行顺序(实例解析)
  • Sql Server中存储过程中输入和输出参数(简单实例 一看就懂)
  • SQL语句练习实例之七 剔除不需要的记录行
  • SQL cursor用法实例
  • sql server 触发器实例(判断是插入、删除,还是修改)
  • sql中获取分组排序后数据方法实例
  • sql条件查询语句的简单实例
  • sql server 触发器实例:特定字段更新时触发Update触发器
  • sql语句like多个条件的写法实例
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL Server统计SQL语句执行时间的脚本
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3