这些SQL查询之间的区别

时间:2017-07-25 14:18:35

标签: mysql sql

我似乎无法理解为什么这两个查询会为以下任务返回不同的结果:“查找只有同一年级朋友的学生的姓名和成绩。返回按成绩排序的结果,然后按名称排列级“。

此处的表格: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;

第二个返回预期结果,但不返回第一个结果。如果有人关心澄清,谢谢。

3 个答案:

答案 0 :(得分:1)

第一个查询同时在查询中将三个过滤器应用于表中的所有数据,并仅返回与所有过滤器匹配的条目。第二个查询首先执行一个子查询,它返回与子查询条件匹配的行,然后返回所有不存在的ID,其中还包括H1.ID = Friend.ID1Friend.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,这是唯一一个在他的成绩中没有任何朋友的学生。

第二个问题在拉德克的答案中有解释。

我希望这会有所帮助。