如何比较 MySQL 或 SQL SERVER 中的两组?

How to compare two sets in MySQL or SQL SERVER?

在此大学数据库中:

CREATE TABLE Stud(
    [S#] INT PRIMARY KEY,
    Sname NVARCHAR(50),
    City NVARCHAR(50),
    GPA FLOAT,
    [Clg#] SMALLINT
);

CREATE TABLE Sec(
    [Sec#] SMALLINT,
    [C#] INT,
    [S#] INT,
    Semester SMALLINT,
    Pname NVARCHAR(50),
    Score NVARCHAR(30),
    PRIMARY KEY([Sec#], [C#], Semester)
);

Stud
Sec#,C#,S#,Semester,Pname,Score
1724,10172,1133848,161,Sullivan,62%
1516,51516,4182532,152,Cooper,73%
1747,10174,1133848,152,Sullivan,75%
1747,10174,2130502,153,Sullivan,55%
1540,10156,2203305,161,Sullivan,60%
1540,10156,1133848,181,Sullivan,87%
1540,10156,2203305,182,Sullivan,40%
1802,10156,4182532,192,Sullivan,60%

Sec
S#,Sname,City,GPA,Clg#
1133848,Parker,NY,3.8,10
2130502,White,Chicago,2.8,10
2203305,Gardner,LA,3.5,1
3120504,West,Boston,3.85,4
3166801,Warren,Seattle,3.2,5
4182532,Rogers,NY,3.3,5
4209836,Allen,Austin,1.5,6

我有这个问题:

查找参加过 所有 老师 Sullivan 教授的课程的学生的姓名和 ID。

我可以很容易地用关系代数找到答案:

Π #,,#( ⋈ ) ÷ Π c#(σ pname="Sullivan" (sec))
  1. 如何在 SQL 中实现除法运算符?

我们的老师给了我们这个 SQL 服务器的答案:

 .#, 
 , 
 .# = .#
  .#, 
 #  ( DISTINCT #
 
WHERE pname ="Sullivan");

从我们在线 class 的幻灯片来看,这就是 CONTAINS 的意思:

  1. 不过我google了一下,contains这个函数跟集合没有关系,好像是一个全索引的测试搜索函数。如有不妥请指正

过了一会儿,我想到了这个解决方案:

SELECT Stud.* FROM Stud WHERE S# IN
(SELECT S#/*,COUNT(DISTINCT C#) as c*/ FROM Sec WHERE Pname='Sullivan' GROUP BY S# HAVING COUNT(DISTINCT C#)=
(SELECT COUNT(DISTINCT [C#]) FROM Sec WHERE Pname='Sullivan'));

堵嘴。这似乎回答了这个问题:

SELECT stud.s#, stud.sname
FROM stud s JOIN
     sec
     ON stud.s# = sec.s# 
WHERE secs.pname = 'Sullivan'
GROUP BY stud.s#, sname
HAVING COUNT(DISTINCT sec.c#) = (SELECT COUNT(DISTINCT sec2.c# FROM sec sec2 WHERE sec2.pname = 'Sullivan');

先说说我对老师印象不深:

  • 从不FROM 子句中使用逗号。
  • 始终使用正确、明确、标准、可读的JOIN语法。
  • CONTAINS() 是一个 SQL 服务器全文功能。 MySQL 中不存在。而且我还没有听说过它用作集合运算符。
  • . 之后的空格是非标准的。 . .我也建议 table 别名。