校验给定SQL查询的有效性并验证查询结果是否正确
SQL合法性判断与推导验证
给定关系与数据表
我们有两个关系:
Teacher(Name, Class, Age)Student(Name, Class, Age)
对应的数据表如下:
Student表
| Name | Class | Age |
|---|---|---|
| John | A1 | 12 |
| Mike | A1 | 8 |
| Harry | A2 | 11 |
Teacher表
| Name | Class | Age |
|---|---|---|
| Mr.Smith | A1 | 30 |
| Mr.Newmann | A2 | 29 |
问题
- 请问以下SQL代码是否合法:
SELECT * FROM Student WHERE Age>10 AND Class IN(SELECT Class FROM Teacher WHERE Name='Mrs.Smith')
- 我尝试反向推导:
子查询(SELECT Class FROM Teacher WHERE Name='Mrs.Smith')的返回结果为:
| Class |
|---|
| A1 |
因此最终查询结果应为:
| Name | Class | Age |
|---|---|---|
| John | A1 | 12 |
请问我的推导是否正确?
回答
SQL代码合法性:这段SQL完全合法,语法符合SQL标准,逻辑是从Student表中筛选年龄大于10且班级存在于指定子查询结果中的记录,没有语法错误。
推导正确性:你的推导是错误的。
- 首先看子查询:Teacher表中只有
Mr.Smith,不存在Mrs.Smith这条记录,所以SELECT Class FROM Teacher WHERE Name='Mrs.Smith'的返回结果是空集,不是A1。 - 当
IN子查询返回空集时,Class IN(空集)这个条件不成立,整个WHERE条件Age>10 AND 不成立的结果为假,最终查询结果是空表,不会返回John的记录。
- 首先看子查询:Teacher表中只有
内容的提问来源于stack exchange,提问作者Volpina
相关产品推荐
相关产品推荐

