考试报名
考试报名
考试内容
考试大纲
在线客服
返回顶部

备考刷题,请到

CDA认证小程序

表A(key,v1),表B(key,v2),其中连接的公共字段key。假设A为左表,在MySQL语言中能实现如图涂色部分查询的是( )
A. select * from A full join B using(key);
B. select * from A left join B using(key) union select * from B right join B using(key);
C. select * from A left join B on A.key=B.key where B.key is null union select * from A right join B on A.key=B.key where A.key is null;
D. select * from A left join B using(key) union all select * from B right join B using(key);
上一题
下一题
收藏
点赞
评论
题目解析
题目评论(0)

难度大。先查出左反连接和右反连接,再对两张宽表进行纵向连接。select * from A left join B on A.key=B.key where B.key is null是左反连接,select * from A right join B on A.key=B.key where A.key is null是右反连接。

正确答案是:C

专业分析:

题目要求查询的结果是图中涂色部分,即需要找出左表A和右表B中不匹配的记录。具体来说,这包括以下两部分:

1. 左表A中有而右表B中没有的记录。
2. 右表B中有而左表A中没有的记录。

选项C的SQL语句如下:
```sql
select * from A left join B on A.key = B.key where B.key is null
union
select * from A right join B on A.key = B.key where A.key is null;
```

分析这段SQL语句:

1. `select * from A left join B on A.key = B.key where B.key is null`:
- 这部分查询找出了左表A中有但右表B中没有匹配记录的所有记录。通过`left join`,即使B表中没有匹配的记录,A表中的记录也会出现在结果集中。`where B.key is null`条件确保了只选取那些在B表中没有匹配记录的A表记录。

2. `select * from A right join B on A.key = B.key where A.key is null`:
- 这部分查询找出了右表B中有但左表A中没有匹配记录的所有记录。通过`right join`,即使A表中没有匹配的记录,B表中的记录也会出现在结果集中。`where A.key is null`条件确保了只选取那些在A表中没有匹配记录的B表记录。

通过`union`操作将这两部分结果合并起来,就得到了所有不匹配的记录。

其他选项分析:
- A: `select * from A full join B using(key);`:
- `full join`会返回A和B中所有匹配和不匹配的记录,而不仅仅是不匹配的记录,因此不符合要求。

- B: `select * from A left join B using(key) union select * from B right join B using(key);`
- 这里的`right join B using(key)`是错误的,应该是`right join A using(key)`。即使修正了,`union`操作也会去重,结果可能包含重复的记录。

- D: `select * from A left join B using(key) union all select * from B right join B using(key);`
- 同样地,`right join B using(key)`是错误的,应该是`right join A using(key)`。即使修正了,`union all`会包含重复的记录,不符合题意。

综上所述,选项C是唯一正确的答案。