全面掌握MS ACCESS SQL(41)
时 间:2018-01-23 16:33:30
作 者:Big Young ID:252 城市:襄阳
摘 要: LEFT JOIN、RIGHT JOIN查询实例详解。
正 文:
第二节 LEFT JOIN、RIGHT 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 JOIN与RIGHIT 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群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access判断多条明细的配方或订...(11.30)
- 如何让后台数据库在局域网共享时,且...(11.29)
- 【Access月初月末日期设置方法...(11.29)
- 【Access IIF函数嵌套示例...(11.26)
- Access快速开发平台--使用组...(11.25)
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)