В этом шаге вы научитесь перечислять имена всех студентов, которые не посещали курсы, преподаваемые преподавателем "Daniel". Следуйте шагам ниже, чтобы завершить этот шаг:
-
Откройте файл answer.sql
в директории /home/labex/project
.
-
Добавьте SQL-выражение ниже комментария:
-
Найдите комментарий -- List the names of all students who have not taken courses taught by the "Daniel" teacher.
SELECT s.sname
FROM S s
WHERE NOT EXISTS (
SELECT 1
FROM SC sc
JOIN C c ON sc.cno = c.cno
WHERE c.tname = 'Daniel' AND sc.sno = s.sno
);
Это SQL-выражение сначала выбирает столбец sname
из таблицы S
. Затем оно использует предложение NOT EXISTS
, чтобы проверить, есть ли записи в таблице SC
, которые имеют идентификатор курса (cno
), совпадающий с курсом, преподаваемым преподавателем "Daniel", и идентификатор студента (sno
), совпадающий с текущим студентом. Если таких записей нет, имя студента будет включено в результат.
-
Найдите комментарий -- List the student numbers and names of students who have failed (grade < 60) in two or more courses.
SELECT s.sno, s.sname
FROM S s
JOIN SC sc ON s.sno = sc.sno
WHERE sc.grade < 60
GROUP BY s.sno, s.sname
HAVING COUNT(sc.sno) >= 2;
Это SQL-выражение сначала соединяет таблицы S
и SC
, чтобы получить информацию о студентах и их оценках по курсам. Затем оно фильтрует записи, где оценка меньше 60, группирует результаты по номеру студента и имени, и в конце выбирает только тех студентов, которые не сдали два и более курсов, используя предложение HAVING
.
-
Найдите комментарий -- List the names of all students who have taken both course "11" and course "12".
SELECT s.sname
FROM S s
JOIN SC sc ON s.sno = sc.sno
WHERE sc.cno IN (11, 12)
GROUP BY s.sno
HAVING COUNT(DISTINCT sc.cno) = 2
ORDER BY s.sno;
Это SQL-выражение сначала соединяет таблицы S
и SC
, чтобы получить информацию о студентах и их идентификаторах курсов. Затем оно фильтрует записи, где идентификатор курса равен 11 или 12, группирует результаты по номеру студента, и выбирает только тех студентов, которые прошли оба курса, используя предложение HAVING
. В конце оно сортирует результаты по номеру студента.
-
Найдите комментарий -- List the student numbers of all students whose grades in course "11" are higher than those in course "12", and sort them in ascending order.
SELECT sc11.sno
FROM SC sc11
JOIN SC sc12 ON sc11.sno = sc12.sno AND sc12.cno = 12
WHERE sc11.cno = 11 AND sc11.grade > sc12.grade
ORDER BY sc11.sno;
Это SQL-выражение сначала соединяет таблицу SC
с собой, чтобы получить информацию о оценках по курсу 11 и курсу 12. Затем оно фильтрует записи, где идентификатор курса равен 11 и оценка выше, чем оценка по курсу 12, и выбирает номер студента. В конце оно сортирует результаты по номеру студента.
-
Найдите комментарий -- List the names of all students who are older than "John Davis".
SELECT s.sname
FROM S s, (SELECT sage FROM S WHERE sname = 'John Davis') AS zs
WHERE s.sage > zs.sage;
Это SQL-выражение сначала выбирает значение sage
для студента с именем "John Davis" и сохраняет его в подзапросе zs
. Затем оно выбирает sname
из таблицы S
, где возраст студента (sage
) больше возраста "John Davis".
-
Найдите комментарий -- List the student number of the student with the highest grade among all students who have taken course "12".
SELECT sc.sno
FROM SC sc
WHERE sc.cno = 12 AND sc.grade = (
SELECT MAX(grade)
FROM SC
WHERE cno = 12
);
Это SQL-выражение сначала выбирает sno
из таблицы SC
, где идентификатор курса равен 12 и оценка равна максимальной оценке среди всех студентов, которые прошли курс 12. Это даст нам номер студента с самой высокой оценкой по курсу 12.
-
Найдите комментарий -- List the names of all students, along with their selected course IDs and grades.
SELECT s.sname, sc.cno, sc.grade
FROM S s
LEFT JOIN SC sc ON s.sno = sc.sno;
Это SQL-выражение выполняет левый внешний join между таблицами S
и SC
, который будет включать всех студентов из таблицы S
, даже если у них нет записей в таблице SC
. Это обеспечит то, что все имена студентов будут включены в результат, вместе с их идентификаторами курсов и оценками (если они есть).
-
Найдите комментарий -- List the student numbers and total grades (alias as: SG) of students who have taken four or more courses, sorted in descending order of total grades.
SELECT sc.sno, SUM(sc.grade) AS SG
FROM SC sc
GROUP BY sc.sno
HAVING COUNT(sc.cno) >= 4
ORDER BY SG DESC;
Это SQL-выражение сначала группирует таблицу SC
по номеру студента (sno
) и вычисляет сумму оценок для каждого студента (алиас SG
). Затем оно фильтрует результаты, чтобы включать только тех студентов, которые прошли четыре и более курсов, используя предложение HAVING
. В конце оно сортирует результаты по общим оценкам в порядке убывания.