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

备考刷题,请到

CDA认证小程序

子查询是SQL语句中常用语法,合理的使用子查询可以让代码更简洁。以下关于子查询,说法不正确的是
A. 表子查询必须添加表别名
B. 引用表子查询中的计算字段,必须添加列别名
C. 所有的连接查询都可以替换为子查询
D. 所有的子查询都可以替换为连接查询
上一题
下一题
收藏
点赞
评论
题目解析
题目评论(3)

当WHERE子句中的子查询的查询条件是聚合函数时,子查询不能替换为连接查询。

### 答案:**D**
**解析:**
以下关于子查询的说法中,**D 选项不正确**。各选项详细分析如下:

---

### **A. 表子查询必须添加表别名 → 正确**
- **原因**:当子查询位于 `FROM` 子句(即表子查询)时,必须指定别名,否则数据库无法引用结果集。
- **示例**:
```sql
-- 正确写法
SELECT * FROM (SELECT * FROM employees)
AS emp_sub;

-- 错误写法(缺少别名)
SELECT * FROM (SELECT * FROM employees);
-- 报错:Every derived table must have
its own alias
```

---

### **B. 引用表子查询中的计算字段,必须添加列别名 → 正确**
- **原因**:计算字段(如表达式或聚合函数)在子查询中没有默认列名,外部查询引用时需明确别名。
- **示例**:
```sql
-- 正确写法
SELECT total FROM (SELECT SUM(salary)
AS total FROM
employees) AS sub;

-- 错误写法(未命名计算字段)
SELECT SUM(salary) FROM
(SELECT SUM(salary) FROM
employees) AS sub;
-- 报错:Column 'SUM(salary)' not found
```

---

### **C. 所有的连接查询都可以替换为子查询 → 正确**
#### 完整可测试示例证明:
```sql
-- 1. 建表及测试数据
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
salary DECIMAL(10,2)
);

INSERT INTO departments VALUES
(1, 'Sales'),
(2, 'IT'),
(3, 'HR');

INSERT INTO employees VALUES
(101, 'Alice', 1, 5000),
(102, 'Bob', 1, 6000),
(103, 'Charlie', 2, 7000),
(104, 'David', NULL, 8000);
-- 无部门员工

-- 2. 原始LEFT JOIN查询
SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON
e.dept_id = d.dept_id;

/* 结果:
Alice | Sales
Bob | Sales
Charlie | IT
David | NULL
*/

-- 3. 用子查询完全替代
SELECT
e.emp_name,
(SELECT dept_name FROM departments WHERE
dept_id = e.dept_id) AS dept_name
FROM employees e;

/* 结果相同:
Alice | Sales
Bob | Sales
Charlie | IT
David | NULL
*/
```
**结论**:所有连接类型(INNER/LEFT/RIGHT/FULL JOIN)均可逻辑等价地替换为子查询。

---

### **D. 所有的子查询都可以替换为连接查询 → 不正确**
#### 反例证明:
```sql
##场景:在SELECT子句中使用
##标量子查询(无法用连接替换)
SELECT
emp_name,
salary,
(SELECT AVG(salary) FROM employees) AS
global_avg
-- 计算全局平均薪资
FROM employees;

/* 结果:
Alice | 5000 | 6500
Bob | 6000 | 6500
Charlie | 7000 | 6500
David | 8000 | 6500
*/

-- 错误尝试用连接替换(完全不可行):
-- 无法通过连接实现每行都附加全局平均值
```
**失败原因**:
1. **标量子查询**(返回单值)会破坏连接的行数逻辑
2. **相关子查询**(依赖外部查询)难以用连接表达
3. 子查询在 `SELECT`/`HAVING` 子句中时,连接无法直接替代

---

### 总结:
| 选项 | 判断| 关键证明 |
|------|--------------|----------|--------------------------------------------|
| A 表子查询需别名 | ✅ | 无别名导致语法错误 |
| B 计算字段需别名 | ✅ | 未命名字段无法引用 |
| C 连接可替换子查询 | ✅ | 所有连接查询可被子查询替代 |
| D 子查询可替换连接 | ❌ | 标量子查询无法用连接实现(反例证明) |

用户131376
选 D
用户91712
感觉没一个对的
用户91712
感觉都不对,A对的几率大点