关于mysql子查询的几个问题
首先也是最重要的一点,这是任务的一部分,但我正试图得到更多关于子查询如何在初始查询中工作的澄清 问题是列出在他或她所完成的所有课程中获得A的每个学生和SSN的姓名,即没有空成绩,每个成绩都是A 我假设这可以通过子查询完成,对吗?或者我应该使用一些外部连接方法来合并所有课程都只有A的学生。我不确定哪一个应该是嵌套查询和外部查询。我试着做:关于mysql子查询的几个问题,mysql,Mysql,首先也是最重要的一点,这是任务的一部分,但我正试图得到更多关于子查询如何在初始查询中工作的澄清 问题是列出在他或她所完成的所有课程中获得A的每个学生和SSN的姓名,即没有空成绩,每个成绩都是A 我假设这可以通过子查询完成,对吗?或者我应该使用一些外部连接方法来合并所有课程都只有A的学生。我不确定哪一个应该是嵌套查询和外部查询。我试着做: SELECT * From Student S JOIN Enrollment E WHERE S.SSN = E.SSN AND E.Grade = "A"
SELECT *
From Student S JOIN Enrollment E
WHERE S.SSN = E.SSN AND E.Grade = "A"
ORDER BY E.CourseNumber
我的嵌套查询将返回所有得A的学生,但问题是问哪些学生在所有课程中都得A。不确定我会提出什么样的外部问题。使用它需要我把一些东西作为选择,因为我显然不能比较多个变量,我也不确定在那里比较什么
以下是db的一些上下文:
CREATE TABLE Student(
SSN INT(9),
Name VARCHAR(20),
Major VARCHAR(30),
PRIMARY KEY (SSN)
);
CREATE TABLE Course(
CourseNumber INT(5),
PrerequisiteCourseNumber INT(10),
CourseTitle VARCHAR(10),
NumberUnits INT(2),
PRIMARY KEY (CourseNumber)
);
CREATE TABLE Section(
CourseNumber INT(5),
Quarter VARCHAR(10),
RoomNumber INT(5),
DayTime VARCHAR(20),
PRIMARY KEY (CourseNumber,Quarter),
FOREIGN KEY (CourseNumber) REFERENCES Course(CourseNumber)
);
CREATE TABLE Enrollment(
SSN INT(9),
CourseNumber INT(5),
Quarter VARCHAR(10),
Grade VARCHAR(1),
PRIMARY KEY (SSN,CourseNumber,Quarter),
FOREIGN KEY (SSN) REFERENCES Student(SSN),
FOREIGN KEY (CourseNumber) REFERENCES Course(CourseNumber),
FOREIGN KEY (Quarter) REFERENCES Section(Quarter)
);
模式
查询
请注意,distinct
用于删除Stan的两行,如果没有它,结果会是两行
注意,xInner1
derived table在SSN级别返回计数为空的等级
这是SSN的快速重新计数,其具有=1。这将成为派生表xInner2
这又回到了学生和注册处,找到了A。如前所述,distinct
将其清理干净,这样Stan不会出现两次
我相信还有其他方法。那是我的专长
CREATE TABLE Student(
SSN INT(9),
Name VARCHAR(20),
Major VARCHAR(30),
PRIMARY KEY (SSN)
);
CREATE TABLE Enrollment(
SSN INT(9),
CourseNumber INT(5),
Quarter VARCHAR(10),
Grade VARCHAR(1),
PRIMARY KEY (SSN,CourseNumber,Quarter),
FOREIGN KEY (SSN) REFERENCES Student(SSN)
-- FOREIGN KEY (CourseNumber) REFERENCES Course(CourseNumber),
-- FOREIGN KEY (Quarter) REFERENCES Section(Quarter)
);
insert student(ssn,name,major) values
(1,'John','b'),(2,'Sally','b'),(3,'Kim','b'),(4,'Stan','b');
insert enrollment(ssn,coursenumber,quarter,grade) values
(1,1,'F2015','A'),
(2,1,'F2015','A'),(2,2,'F2015','B'),
(3,1,'F2015','B'),
(4,1,'F2015','A'),(4,2,'F2015',null),(4,3,'F2015','A');
select distinct s.ssn,s.name
from
( select ssn,count(ssn) outCount
from
( select e.ssn,e.grade,count(e.ssn) theCountInner
from enrollment e
where e.grade is not null
group by e.ssn,e.grade
) xInner1
-- where count(ssn)=1
group by ssn
having outCount=1
) xInner2
join student s
on s.ssn=xInner2.ssn
join enrollment
on enrollment.ssn=xInner2.ssn
and enrollment.grade='A'
+-----+------+
| ssn | name |
+-----+------+
| 1 | John |
| 4 | Stan |
+-----+------+