我似乎无法理解为什么这两个查询会为以下任务返回不同的结果:“查找只有同一年级朋友的学生的姓名和成绩。返回按成绩排序的结果,然后按名称排列级“。
此处的表格:https://lagunita.stanford.edu/c4x/DB/SQL/asset/socialdata.html
第一个查询:
SELECT DISTINCT h1.name, h1.grade
FROM Highschooler h1, Friend f, Highschooler h2
WHERE h1.ID = f.ID1 AND h2.ID = f.ID2 AND h1.grade = h2.grade
ORDER BY h1.grade, h1.name
第二个问题:
select name, grade from Highschooler
where ID not in (
select ID1 from Highschooler H1, Friend, Highschooler H2
where H1.ID = Friend.ID1 and Friend.ID2 = H2.ID and H1.grade <> H2.grade)
order by grade, name;
第二个返回预期结果,但不返回第一个结果。如果有人关心澄清,谢谢。
答案 0 :(得分:1)
第一个查询同时在查询中将三个过滤器应用于表中的所有数据,并仅返回与所有过滤器匹配的条目。第二个查询首先执行一个子查询,它返回与子查询条件匹配的行,然后返回所有不存在的ID,其中还包括H1.ID = Friend.ID1
和Friend.ID2 = H2.ID
不成立的ID。您可以尝试以下方式:
select name, grade from Highschooler
where where H1.ID = Friend.ID1 and Friend.ID2 = H2.ID and ID not in (
select ID1 from Highschooler H1, Friend, Highschooler H2
where H1.ID = Friend.ID1 and Friend.ID2 = H2.ID and H1.grade <> H2.grade)
order by grade, name;
答案 1 :(得分:1)
它可以是标准的NULL相关行为。演示
create table tble (ID int, col int);
insert tble(ID, col)
values (1,1),(2,null),(3,2);
select *
from tble
where col=1;
select *
from tble
where ID not in (select t2.ID from tble t2 where t2.col<>1);
因为select t2.ID from tble t2 where t2.col<>1
不能返回ID 2,因为谓词NULL <> 1
的计算结果不是TRUE。
答案 2 :(得分:1)
我只是想进一步澄清第一个查询解释。第一个查询结果如下:
SELECT DISTINCT h1.name, h1.grade FROM Highschooler h1, Friend f, Highschooler h2 WHERE h1.ID = f.ID1 AND h2.ID = f.ID2 AND h1.grade = h2.grade ORDER BY h1.grade, h1.name;
+-----------+-------+
| name | grade |
+-----------+-------+
| Cassandra | 9 |
| Gabriel | 9 |
| Jordan | 9 |
| Tiffany | 9 |
| Andrew | 10 |
| Brittany | 10 |
| Haley | 10 |
| Kris | 10 |
| Alexis | 11 |
| Gabriel | 11 |
| Jessica | 11 |
| John | 12 |
| Jordan | 12 |
| Kyle | 12 |
| Logan | 12 |
+-----------+-------+
15 rows in set (0,00 sec)
由于您正在执行笛卡尔积(通过选择相同的表Highschooler
两次),并且您的一个条件是h1.grade = h2.grade
,您将检索所有至少有一个的学生同等级的朋友。你唯一没有得到的学生是Austin
,这是唯一一个在他的成绩中没有任何朋友的学生。
第二个问题在拉德克的答案中有解释。
我希望这会有所帮助。