难度大。先查出左反连接和右反连接,再对两张宽表进行纵向连接。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是唯一正确的答案。