MSSQL之五 连接查询与子查询

简介: MSSQL之五 连接查询与子查询

在一个高级的数据库中,被浏览的数据可以被存储在多个表中。当你需要从相关的表中浏览数据的时候,你可以通过将公用的属性连接表查询数据。你可以使用子查询,这里一个查询的结果被用作另一个查询的条件的输入。


本章讨论如何通过应用各种类型的连接,例如内连接,外连接,交叉连接,等值连接或自连接,来从夺标中查询数据。进一步,它解释如何使用子查询

 

重点

Ø        使用连接查询数据

Ø        使用子查询查询数据

预习功课

Ø           连接查询的几种方式

Ø           子查询的使用方法

使用连接查询数据

数据表之间的联系是通过表的字段值来体现的,这种字段称为连接字段。连接操作的目的就是通过加在连接字段的条件将多个表连接起来,以便从多个表中查询数据。前面的查询都是针对一个表进行的,当查询同时涉及两个以上的表时,称为连接查询。连接查询主要分为如下几种格式:


             1.    内连接


             2.    外连接


             3.    交叉连接


4.  自身连接


      5. 等值连接与非等值连接


Ø     内连接


内连接在公共的列上使用比较操作符从多表中抽取数据。当内连接被使用的时候,仅满足公共列中的连接条件的值的列被显示。两个表中不满足连接条件的行不显示。


语法:


      select 表名.列名[….., 表名.列名] from 表名1 join 表名2 on表名1.ref_表名2.列名 比较操作符 表名1.ref_表名2.列名


例如[5-1]


Select studentInfo.SName, studentInfo.SSex,grade.gradefrom studentInfo [inner] join grade on studentInfo.SID=grade.SID


内连接输出结果:

Ø     外连接

外连接显示包含来自一个表中所有行和来自另一个表中匹配行的结果集。

外连接有三种类型:

            1.左连接


            2.右连接


            3.完全连接


左连接返回 left outer join 关键字左侧指定表的所有行和右侧指定的表的匹配的行。对于来自左侧的表中的行,在右侧指定的表中没有发现匹配的行,那么在来自右侧指定的表中获得数据的列中将显示null值。右连接也是如此。


完全连接是左连接和右连接的组合。这个连接返回来自两个表的所有匹配和非匹配行。但是,匹配记录仅被显示一次。在非匹配行的情况下,对于数据不可用的列将显示null值。


语法:


select 表名.列名, 表名.列名[,…. 表名.列名] from表名1[ left |right |full ] out join表名2 on表名1.引用列名 连接操作符 表名2.引用列名


例如:  selectkecheng.cmame AS 课程,grade.grade as 成绩from kecheng left outer join grade on grade.CID=kecheng.CID


外键连接输出:

Ø       交叉连接

     交叉连接,也被称为笛卡尔积,在两个表中将一个表中的每一行与另一个表中的每一行连接,结果集中行的数量是第一个表中行的数量与第二个表中行的数量的的乘积。这表示如果表A中有10行,表B中有5行,那么表A中的10行与表B中的5行连接。结果集将包含50行。


语法:         selectA.列名,B.列名 from Across join B


例如:在查询窗口写入:


selectW.tid,W.tname,P.CID,P.cmame as '课程名',P.cperiod


FROM TEACHERS W cross joinkecheng P

Ø       自身连接

当一个表与其自已进行连接操作时,称为表的自身连接。要查询的内容是在一个表中的一行与同一个表中的另一行,为了区别同一表的两个实例可以将表分别取两个别名,一个是X,一个是Y。将X, Y中满足查询条件的行连接起来。这实际上是同一表的自身连接。


语法:select X.列名,X.列名[as 别名],Y.列名,Y.列名[as 别名] from 表名 X,表名 Y[where x.列名=y.列名]


注释:“[]“内的内容是可选的


例如:查询studentInfo 表中学生的ID、姓名、QQ、电话


             select x.SID,x.SName as 姓名,y.SQQ,y.SPhone as 电话from studentxinxi x,studentxinxi y

Ø       等值连接与非等值连接

语法:


[<表名1>.] <列名1><比较运算符> [<表名2>.]<列名2>


其中,比较运算符主要有:=、>、<、>=、<=、!=。当比较运算符为“=”时,称为等值连接,其他情况为非等值连接。


注释:等值连接和外连接一样,使用外键连接表。但是,被用于显示两个或多个表的所有列。所有连接的表的公共列被显示出来。


例如:


             select *from studentInfo a join grade b on a.SID=b.SID join kecheng k on k.CID=b.CID

在WHERE子句中包含一个形如SELECT-FROM-WHERE的查询块,此查询块称为子查询或嵌套查询,包含子查询的语句称为父查询或外部查询。


重点:


1.    返回一个值的子查询


2.    返回一个组的子查询


Ø      返回一个值的子查询


当子查询的返回值只有一个值时,可以使用比较运算符(=, >, <, >=, <=, !=)将父查询和子查询连接起来。


例如:在查询窗口写入以下代码:


select SID,SName,SAddress from studentxinxi where


      SID=(selectSID from studentxinxi where SName='李连杰')

Ø       返回一个组的子查询

如果子查询的返回值不止一个,而是一个集合时,则不能直接使用比较运算符,可以在比较运算符和子查询之间插入ANY或ALL。


1. 使用IN


2. 使用EXISTS


3. 使用ALL


4. 使用ANY


使用IN


语法:


    select 列名[….列名] from 表名 where 列名 [not] in


(select 列名 from 表名 [where 条件表达式])


说明:可以使用IN代替“=ANY”。


例如在查询窗口写入以下代码:


select CID,grade from grade where SID in


(select SID from studentxinxi where SID='niit0806')


输出结果如下:

使用EXISTS

             EXISTS表示存在量词,带有EXISTS的子查询不返回任何实际数据,它只得到逻辑值“真”或“假”。当子查询的的查询结果集合为非空时,外层的WHERE子句返回真值,否则返回假值。


语法:


    select 列名[….列名] from 表名 whereexists


(select 列名 from 表名 [where 条件表达式])


说明:可以使用IN代替“=ANY”。


在查询窗口写入以下代码:


      selectCID,grade from grade where exists


(select SID from studentxinxi where SID='niit0806')

下表显示了使用ALL和ANY关键字的操作符:

操作符

                描述

>all

表示大于列表中的最大值

表达式| 列名>all(10,20,30)表示“大于30”

>any

表示大于列表中的最小值

表达式 列名>any(10,20,30)表示“大于10”

=any

表示列表中的任何值,它与 in 从句的作用一样。

表达式 列名=any(10,20,30)表示“等于10或20或30”

<>any

表示不等于任何列表中的值。

表达式 列名<>any(10,20,30)表示“不等于10或20或30“

<>all

表示不等于列表中的所有值,它与 not in从句的作用一样

表达式 列名<>all(10,20,30)表示“不等于10和20和30“

在查询窗口写入以下代码:

select SID,SAddress from studentxinxi where

SID>all( select SID from grade where grade=98)

实践问题

1、什么时候使用子查询?

2、写出一个查询以显示employee ID和员工支付率大于40的植物。

3、你需要从两个表中抽取所有的列。你将使用哪种类型的连接?

  A、交叉连接

  B、等值连接

  C、自连接

  D、右连接

小结

1  连接和子查询被用于从多表中抽取数据。


2.      内连接在公共列上使用比较操作符从多表中组合记录。


3.      左外连接返回来自左表的所有行和来自右表的匹配行。


4.      右外连接返回来自右表的所有行和来自左表的匹配行。


5.      完全外连接返回所有来自第一个表的每行和来自第二个表的每行的连接。


6.      等值连接被用于显示连接的表的所有列。


7.      自连接将一行与同一表中的其他行相关。


8.      在IN子查询的从句中返回0或更多值。


9.      在EXISTS子查询的从句中返回true 或 false值。


10.  ALL和ANY 关键字被用于在子查询中修改已有的比较操作符。


11.  集合函数也被用于在子查询中以产生来自内部查询的集合值。


12.  包含一个或更多查询的子查询被称为嵌入子查询。


13.  在相关查询被定义为依赖与外部查询进行求值的查询。


目录
相关文章
|
消息中间件 缓存 JSON
PHP实现think-queue介绍
PHP实现think-queue介绍
820 0
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
265 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
656 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
328 32
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1517 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
893 61