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

全面掌握MS ACCESS SQL(41)

时 间:2018-01-23 16:33:30
作 者:Big Young   ID:252  城市:襄阳
摘 要:    LEFT JOIN、RIGHT JOIN查询实例详解。
正 文:

第二节 LEFT JOINRIGHT JOIN查询实例详解

ACCESS数据库中外部连接查询主要有两种,即左外部连接查询与右外部连接查询,下面我们分别通过实例来学习这几种查询的具体用法。

在进行实例操作前,我们还是按贯例先准备好示例数据,我们先创建一个外部连接示例的数据库,再用下例的SQL语句创建两上示例表,然后再插入数据。

创建一个名为学生的表并插入数据:

创建表的SQL语句:

Create TABLE 学生

(

  学号 COUNTER PRIMARY KEY,

  姓名 VARCHAR(5),

  性别 VARCHAR(1),

  年龄 INTEGER,

  生日 DATETIME

);

向“学生”表插入数据的SQL语句:

Insert INTO 学生

Select DISTINCT *

FROM (

Select  '赵一' AS 姓名, '' AS 性别,16 AS 年龄, #2001-05-22# AS 生日 FROM MSysObjects

UNION

Select  '钱二' AS 姓名, '' AS 性别,17 AS 年龄, #2000-08-12# AS 生日 FROM MSysObjects

UNION

Select  '孙三' AS 姓名, '' AS 性别,15 AS 年龄, #2002-12-02# AS 生日 FROM MSysObjects

UNION

Select  '李四' AS 姓名, '' AS 性别,18 AS 年龄, #1999-03-26# AS 生日 FROM MSysObjects

UNION

Select  '周五' AS 姓名, '' AS 性别,16 AS 年龄, #2001-10-30# AS 生日 FROM MSysObjects

UNION

Select  '吴六' AS 姓名, '' AS 性别,16 AS 年龄, #2001-08-23# AS 生日 FROM MSysObjects

) AS TEMP;

接下来我们再创建一个名为课程的表并插入示例数据,其SQL语句分另如下所示:

创建课程表的SQL语句:

Create TABLE 课程

(

  学号 INTEGER PRIMARY KEY,

  语文 INTEGER,

  数学 INTEGER,

  外语 INTEGER

);

再向创建好的课程表中插入数据,其SQL语句:

Insert INTO 课程

Select DISTINCT *

FROM (

Select  1 AS 学号, 85 AS 语文,106 AS 数学, 120 AS 外语 FROM MSysObjects

UNION

Select  3 AS 学号, 95 AS 语文,100 AS 数学, 112 AS 外语 FROM MSysObjects

UNION

Select  4 AS 学号, 120 AS 语文,116 AS 数学, 103 AS 外语 FROM MSysObjects

UNION

Select  7 AS 学号, 100 AS 语文,98 AS 数学, 96 AS 外语 FROM MSysObjects

UNION

Select  10 AS 学号, 116 AS 语文,99 AS 数学, 109 AS 外语 FROM MSysObjects

UNION

Select  12 AS 学号, 118 AS 语文,96 AS 数学, 88 AS 外语 FROM MSysObjects

) AS TEMP;

准备好的表中数据如下:

“学生”表:

学号    姓名    性别    年龄    生日

1       李四          18      1999-03-26

2       钱二          17      2000-08-12

3       孙三          15      2002-12-02

4       吴六          16      2001-08-23

5       赵一          16      2001-05-22

6       周五          16      2001-10-30

“课程表:

学号    语文    数学    外语

1       85      106     120

3       95      100     112

4       120     116     103

7       100     98      96

10      116     99      109

12      118     96      88

 

一、LEFT JOIN(左外部连接)查询示例

左(外)连接的SQL语法格式:

Select……FROM 1 LEFT JOIN 2 ON 1.某字段 = 2.某字段;

左(外)连接中的是要把左表要将表中的所有记录保留在结果集中,右表对应的列填NULL。我们来用上面的示例数据来演示下:

Select 学生.*, 课程.*

FROM 学生 LEFT JOIN 课程

ON 学生.学号=课程.学号;

运行此左外连接查询后,结果集如下:

学生.学号   姓名    性别    年龄    生日    课程.学号   语文    数学    外语

1           李四          18  1999-03-26  1           85  106     120

2           钱二          17  2000-08-12             

3           孙三          15  2002-12-02  3           95  100     112

4           吴六          16  2001-08-23  4           120 116     103

5           赵一          16  2001-05-22             

6           周五          16  2001-10-30             

从结果中我们看到,左外部连接查询返回左表的全部的行及右表中与之关联的对应行,右表中没对应关联行的则为NULL值。就是说左(外)连接不仅选择属性值相等的那些元组,其他在左表(表一)不相等的元组被保留下来了,在右表(表二)不相等的元组被舍弃掉了。

二、RIGHT JOIN(右外部连接)查询示例

右(外)连接的SQL语法格式:

Select……FROM 1 RIGHT JOIN 2 ON 1.某字段 = 2.某字段

右(外)连接中的是要把右表要舍弃的元组保留在结果集中,左表对应的列填NULL

RIGHT JOIN(右外部连接)查询的SQL语句:

Select 学生.*, 课程.*

FROM 学生 RIGHT JOIN 课程

ON 学生.学号=课程.学号;

我们可以看到用SQL语句中使用的是RIGHT JOIN子句,然后用ON连接两个表的字段,这就是右(外)连接,下图是这个右(外)连接的结果:

学生.学号   姓名    性别    年龄    生日    课程.学号   语文    数学    外语

1       李四          18  1999-03-26      1       85      106     120

3       孙三          15  2002-12-02      3       95      100     112

4       吴六          16  2001-08-23      4       120     116     103

                                            7       100     98      96

                                            10      116     99      109

                                            12      118     96      88

我们可以看到右(外)连接不仅选择属性值相等的那些元组,其他在右表(表二)不相等的元组被保留下来了,在左表(表一)不相等的元组被舍弃掉了。

三、全外部连接示例

全外连接是在两表进行自然连接,只把左表和右表要舍弃的都保留在结果集中,相对应的列上填NULL。前面说明,ACCESS SQL并没有直接提供“FULL OUTER JOIN”来实现全外部连接,我们只能另想办法了。观察LEFT JOINRIGHIT JOIN我们会发现将现个查询的结果集合并起来,不就是全外部连接的效果吗?全外部连接的语法如下:

Select…FROM 1 LEFT JOIN 2 ON 1.某字段 = 2.某字段

UNION

Select…FROM 1 RIGHT JOIN 2 ON 1.某字段 = 2.某字段;

下面我们来看一看实际的SQL语句实现:

Select 学生.*, 课程.*

FROM 学生 LEFT JOIN 课程

ON 学生.学号=课程.学号

UNION

Select 学生.*, 课程.*

FROM 学生 RIGHT JOIN 课程

ON 学生.学号=课程.学号;

下图是这个全外连接的结果:

学生.学号   姓名    性别    年龄    生日    课程.学号   语文    数学    外语

                                            7       100     98      96

                                            10      116     99      109

                                            12      118     96      88

1       李四          18  1999-03-26      1       85      106     120

2       钱二          17  2000-08-12             

3       孙三          15  2002-12-02      3       95      100     112

4       吴六          16  2001-08-23      4       120     116     103

5       赵一          16  2001-05-22             

6       周五          16  2001-10-30             

我们可以看到全外连接不仅选择属性值相等的那些元组,其他在表一和表二不相等的元组被保留下来了。全外连接一般用得比较少,大家看情况学习吧。

四、SQL笛卡尔或交叉连接示例

笛卡尔连接或交叉连接从两个或多个连接表返回笛卡尔乘积的记录。因此,它相当于一个内部联接,其中联接条件始终计算为真或者联接条件是从语句中空缺。

笛卡尔连接的基本语法如下:

Select table1.column1, table2.column2...

FROM  table1, table2 [, table3 ]

具体SQL实例如下:

Select 学生.*, 课程.*

FROM 学生, 课程;

交叉查询的结果如下:

学生.学号   姓名    性别    年龄    生日    课程.学号   语文    数学    外语

1       李四          18  1999-03-26      1       85      106     120

2       钱二          17  2000-08-12      1       85      106     120

3       孙三          15  2002-12-02      1       85      106     120

4       吴六          16  2001-08-23      1       85      106     120

5       赵一          16  2001-05-22      1       85      106     120

6       周五          16  2001-10-30      1       85      106     120

1       李四          18  1999-03-26      3       95      100     112

2       钱二          17  2000-08-12      3       95      100     112

3       孙三          15  2002-12-02      3       95      100     112

4       吴六          16  2001-08-23      3       95      100     112

5       赵一          16  2001-05-22      3       95      100     112

6       周五          16  2001-10-30      3       95      100     112

1       李四          18  1999-03-26      4       120     116     103

2       钱二          17  2000-08-12      4       120     116     103

3       孙三          15  2002-12-02      4       120     116     103

4       吴六          16  2001-08-23      4       120     116     103

5       赵一          16  2001-05-22      4       120     116     103

6       周五          16  2001-10-30      4       120     116     103

1       李四          18  1999-03-26      7       100     98      96

2       钱二          17  2000-08-12      7       100     98      96

3       孙三          15  2002-12-02      7       100     98      96

4       吴六          16  2001-08-23      7       100     98      96

5       赵一          16  2001-05-22      7       100     98      96

6       周五          16  2001-10-30      7       100     98      96

1       李四          18  1999-03-26      10      116     99      109

2       钱二          17  2000-08-12      10      116     99      109

3       孙三          15  2002-12-02      10      116     99      109

4       吴六          16  2001-08-23      10      116     99      109

5       赵一          16  2001-05-22      10      116     99      109

6       周五          16  2001-10-30      10      116     99      109

1       李四          18  1999-03-26      12      118     96      88

2       钱二          17  2000-08-12      12      118     96      88

3       孙三          15  2002-12-02      12      118     96      88

4       吴六          16  2001-08-23      12      118     96      88

5       赵一          16  2001-05-22      12      118     96      88

6       周五          16  2001-10-30      12      118     96      88



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

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