如何比较 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))
- 如何在 SQL 中实现除法运算符?
我们的老师给了我们这个 SQL 服务器的答案:
.#,
,
.# = .#
.#,
# ( DISTINCT #
WHERE pname ="Sullivan");
从我们在线 class 的幻灯片来看,这就是 CONTAINS
的意思:
- 不过我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 别名。
在此大学数据库中:
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))
- 如何在 SQL 中实现除法运算符?
我们的老师给了我们这个 SQL 服务器的答案:
.#,
,
.# = .#
.#,
# ( DISTINCT #
WHERE pname ="Sullivan");
从我们在线 class 的幻灯片来看,这就是 CONTAINS
的意思:
- 不过我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 别名。