正确答案是:C: full join 和 D: union all。
### 专业分析:
1. **INNER JOIN**:
- **功能**: 仅返回两个表中满足连接条件的匹配行。
- **保留信息**: 只保留两个表中满足条件的匹配行,不保留不匹配的行。
- **示例**: `SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;`
2. **LEFT JOIN**:
- **功能**: 返回左表中的所有行,以及右表中满足连接条件的匹配行。对于右表中没有匹配的行,结果集中对应的列将包含NULL。
- **保留信息**: 保留左表的全部信息,但不保留右表中没有匹配的行。
- **示例**: `SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;`
3. **FULL JOIN**:
- **功能**: 返回左表和右表中的所有行。对于没有匹配的行,结果集中对应的列将包含NULL。
- **保留信息**: 保留被连接的两表的全部信息,包括匹配和不匹配的行。
- **示例**: `SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.id;`
4. **UNION ALL**:
- **功能**: 返回两个查询结果的并集,包括所有重复的行。
- **保留信息**: 保留两个查询结果的全部信息,不去重。
- **示例**: `SELECT * FROM table1 UNION ALL SELECT * FROM table2;`
### 总结:
- **FULL JOIN** 保留两个表的全部信息,包括匹配和不匹配的行。
- **UNION ALL** 保留两个查询结果的全部信息,包括所有重复的行。
所以,正确答案是 C: full join 和 D: union all。