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.  在相关查询被定义为依赖与外部查询进行求值的查询。

时间: 2024-12-15 07:54:00

MSSQL之五 连接查询与子查询的相关文章

Mysql数据库理论基础之五--SELECT单多表查询、子查询、别名

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

mysql的查询、子查询及连接查询

一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)  1.where常用运算符: 比较运算符 > ,  < ,=  , != (< >),>=   ,   <= in(v1,v2..vn) between v1 and v2    在v1至v2之间(包含v1,v2) 逻辑运算符 not ( ! )  逻辑非 or ( || )    逻辑或 and ( &&am

MSSQL 4表联查,子查询,函数统计,分组条件查询综合应用实例

1 SELECT 2 [UserName] 3 ,[Yhxm] 4 ,[Qx] 5 ,[Phone] 6 ,[Number] = COUNT([UserName]) 7 FROM 8 (SELECT 9 [UserName] = A.[username] 10 ,[Yhxm] = B.[xm] 11 ,[Qx] = D.[P_Power] 12 ,[Phone] = B.[dh] 13 ,[DayCount] = (SELECT COUNT(*) FROM [Caihuashun_FuJian_

MySQL 外连接、内连接,连接查询、多表查询、子查询、视图

MySQL连接查询.多表查询.子查询: 连接查询:事先将两张或多张表join,根据join的结果进行查询: [导入hellodb.sql数据库],输入密码即可 [[email protected] home]# mysql -uroot -p  mydb < /home/hellodb.sql     hellodb.sql数据库下载链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re [查看students表] mysql> select * from stu

mysql学习笔记之连接查询与子查询

mysql连接查询与子查询 1.子查询是指在另一个查询语句中的SELECT子句. 例句: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement), SELECT column1 FROM t2 称为Sub Query[子查询]. 所以,我们说子查询是嵌套在外查询内部.而事实上它有可能在子查询内部再嵌套子查询. 子查

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

SQL编程之高级查询(子查询)以及注意事项

1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌套在一个 SELECT.SELECT...INTO 语句.INSERT...INTO 语句.DELETE 语句.或 UPDATE 语句或嵌套在另一子查询中. 语法:select ....from  表1  where  列1  > (子查询) 外面的查询成为父查询,圆括号嵌入的查询成为称

#4 SQL 多表查询、子查询

今天讲了一个SQL的多表查询和子查询 笔记里面有挺多有用的图片,重要是为了方便了解外连接和内连接,还有自连接等... 这里显示不出来,所以放一个链接, 到有道云笔记去看:http://note.youdao.com/share/?id=90f107b6a6aac379a795373f7f98c6ff&type=note 多表查询和子查询的关系? 多表查询可以做到的,子查询都可以做到,子查询思路比较符合正常人的思路,但是代码稍微长一点 多表查询 |--内部链接查询 : select * from

单表查询、多表查询和子查询

查询语句: select SELECT-LIST from  TB where QYAKUDUCATION; 简单查询: select * from TB_NAME; select FIED1,FIED2 from TB_NAME; 投影 select [distinct] * from TB_NAME where QYAKUDUCATION;选择  #distinct重复的值只显示一次 from子句:要查询的关系   表,多个表,其他的select语句 where子句:指定布尔关系表达式, =