Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

全面掌握MS ACCESS SQL(39)

时 间:2018-01-22 17:36:48
作 者:Big Young   ID:252  城市:襄阳
摘 要:    INNER JOIN(内部连接)查询实例详解。
正 文:

第二节 INNER JOIN(内部连接)查询实例详解

内连接也称为等同连接,返回的结果集是两个表中所有相匹配的数据,而舍弃不匹配的数据。也就是说,在这种查询中,DBMS只返回来自源表中的相关的行,即查询的结果表包含的两源表行,必须满足ON子句中的搜索条件。作为对照,如果在源表中的行在另一表中没有对应(相关)的行,则该行就被过滤掉,不会包括在结果表中。内连接使用比较运算符来完成。

为了很好地说明INNER JOIN连接查询的使用方法,我们先准备好示例数据,然后以示例数据为依据来说明。打开MS ACCESS,先创建一个关于“内连接查询示例的数据库,接下来我们用如下SQL语句创建一个名为会员的数据库表:

Create TABLE 会员

(

  编号 INT,

  姓名 TEXT(6),

  性别 TEXT(1)

);

表创建好后,再用几条SQL语句插入示例数据:

Insert INTO 会员

Select DISTINCT *

FROM (

Select 1 AS 编号, '张三' AS 姓名, '' AS 性别 FROM MSysObjects

UNION

Select 2 AS 编号, '李四' AS 姓名, '' AS 性别 FROM MSysObjects

UNION

Select 3 AS 编号, '王五' AS 姓名, '' AS 性别 FROM MSysObjects

);

再用SQL语句:

Create TABLE 爱好

(

  会员编号 INT,

  兴趣喜好 TEXT(6),

  爱好程度 TEXT(2)

);

来创建第二个表,名为爱好,再插入如下数据:

Insert INTO 爱好

Select DISTINCT *

FROM (

Select 1 AS 会员编号, '下棋' AS 兴趣喜好, '2' AS 爱好程度 FROM MSysObjects

UNION

Select 2 AS 会员编号, '游戏' AS 兴趣喜好, '3' AS 爱好程度 FROM MSysObjects

UNION

Select 3 AS 会员编号, '音乐' AS 兴趣喜好, '2' AS 爱好程度 FROM MSysObjects

UNION

Select 4 AS 会员编号, '学习' AS 兴趣喜好, '1' AS 爱好程度 FROM MSysObjects

);

准备好的表中的记录如下:

表一,会员表:

编号    姓名    性别

1       张三   

2       李四   

3       王五   

表二,爱好表:

会员编号    兴趣喜好    爱好程度

1           下棋        2

2           游戏        3

3           音乐        2

4           学习        1

下面我们正式开始来学习INNER JOIN查询的具体用法。

一、自然连接

我们有了上面的两个表后,现在我们想当会员表里的“编号”列与爱好表里的会员编号相等时,查看各位会员的兴趣爱好与等级,这我可以使用自然连接方式来查询数据,这种方式可以省略关键字“INNER JOIN…ON”等。

Select 会员.姓名,爱好.兴趣喜好,爱好.爱好程度

FROM 会员,爱好

Where 会员.编号=爱好.会员编号;

SQL语句执行后结果如下:

姓名    兴趣喜好    爱好程度

张三    下棋        2

李四    游戏        3

王五    音乐        2

当然,我们也可以结合多个条件来查询某一个人的情况,如:

Select 会员.姓名,爱好.兴趣喜好,爱好.爱好程度

FROM 会员,爱好

Where 会员.编号=爱好.会员编号 AND 会员.编号=1;

这样查询的结果为:

姓名    兴趣喜好    爱好程度

张三    下棋        2

二、相等连接

这个与前面的自然连接相似,只是使用了关键字“INNOR JOIN…ON”,这是ACCESS SQL首推的语法。语句如下:

Select 会员.姓名, 爱好.兴趣喜好, 爱好.爱好程度

FROM 会员 INNER JOIN 爱好

ON 会员.编号=爱好.会员编号;

执行后的结果为:

姓名    兴趣喜好    爱好程度

张三    下棋        2

李四    游戏        3

王五    音乐        2

或者:

Select 会员.姓名, 爱好.兴趣喜好, 爱好.爱好程度

FROM 会员 INNER JOIN 爱好

ON 会员.编号=爱好.会员编号

Where 会员.编号=1;

查询的结果为:

姓名    兴趣喜好    爱好程度

张三    下棋        2

三、不等连接

还是使用会员爱好两个表,现在我们想查询“会员表中的人员与“爱好表中的爱好不相匹配的有哪些类型,SQL如下:

Select *

FROM 会员 INNER JOIN 爱好

ON 会员.编号<>爱好.会员编号;

查询的结果为:

编号    姓名    性别    会员编号    兴趣喜好    爱好程度

1       张三          2           游戏        3

1       张三          3           音乐        2

1       张三          4           学习        1

2       李四          1           下棋        2

2       李四          3           音乐        2

2       李四          4           学习        1

3       王五          1           下棋        2

3       王五          2           游戏        3

3       王五          4           学习        1

四、自连接

自连接的本意就是将一张表看成多张表来做连接。例如有一个“成绩”表,里面有“学号”、“功课编号”、“学生成绩”三个字段,数据如下:

学号  功课编号     学生成绩

 1          1             99

 2          1             98

 3          1             100

 4          2             88

 5          2             87

 6          2             88

 7          3             99

 8          3             88

 9          3             100

现在要求用一个SQL查询语句得出每门功课成绩最好的前两名,实现如下:

Select 成绩1.*

FROM 成绩 AS 成绩1 Where 成绩1.学号 IN

(Select TOP 2 成绩.学号

FROM 成绩

Where 成绩.功课编号 = 成绩1.功课编号

ORDER BY 学生成绩 DESC);

查询结果为:

学号  功课编号     学生成绩

 1          1             99

 2          1             98

 4          2             88

 6          2             88

 7          3             99

 9          3             100



Access软件网QQ交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助