Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于mysql子查询的几个问题_Mysql - Fatal编程技术网

关于mysql子查询的几个问题

关于mysql子查询的几个问题,mysql,Mysql,首先也是最重要的一点,这是任务的一部分,但我正试图得到更多关于子查询如何在初始查询中工作的澄清 问题是列出在他或她所完成的所有课程中获得A的每个学生和SSN的姓名,即没有空成绩,每个成绩都是A 我假设这可以通过子查询完成,对吗?或者我应该使用一些外部连接方法来合并所有课程都只有A的学生。我不确定哪一个应该是嵌套查询和外部查询。我试着做: SELECT * From Student S JOIN Enrollment E WHERE S.SSN = E.SSN AND E.Grade = "A"

首先也是最重要的一点,这是任务的一部分,但我正试图得到更多关于子查询如何在初始查询中工作的澄清

问题是列出在他或她所完成的所有课程中获得A的每个学生和SSN的姓名,即没有空成绩,每个成绩都是A

我假设这可以通过子查询完成,对吗?或者我应该使用一些外部连接方法来合并所有课程都只有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 |
+-----+------+