이 단계에서는 "Daniel" 강사가 가르치는 강좌를 수강하지 않은 모든 학생의 이름을 나열하는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:
-
/home/labex/project 디렉토리에서 answer.sql 파일을 엽니다.
-
주석 아래에 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 문은 먼저 S 테이블에서 sname 열을 선택합니다. 그런 다음 NOT EXISTS 절을 사용하여 "Daniel" 강사가 가르치는 강좌와 일치하는 강좌 ID (cno) 를 가진 레코드가 SC 테이블에 있는지, 그리고 학생 ID (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 테이블을 조인하여 학생 정보와 강좌 ID 를 가져옵니다. 그런 다음 강좌 ID 가 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 의 성적 정보를 가져옵니다. 그런 다음 강좌 ID 가 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 문은 먼저 "John Davis"라는 이름을 가진 학생의 sage 값을 선택하여 서브쿼리 zs에 저장합니다. 그런 다음 학생의 나이 (sage) 가 "John Davis"의 나이보다 큰 S 테이블에서 sname을 선택합니다.
-
주석 -- 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 문은 먼저 강좌 ID 가 12 이고 성적이 강좌 12 를 수강한 모든 학생 중 최대 성적과 같은 SC 테이블에서 sno를 선택합니다. 이렇게 하면 강좌 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 문은 S 테이블과 SC 테이블 간에 왼쪽 조인 (left join) 을 수행합니다. 이는 SC 테이블에 레코드가 없는 경우에도 S 테이블의 모든 학생을 포함합니다. 이렇게 하면 모든 학생 이름과 함께 강좌 ID 및 성적 (있는 경우) 이 결과에 포함됩니다.
-
주석 -- 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 절을 사용하여 네 개 이상의 강좌를 수강한 학생만 포함하도록 결과를 필터링합니다. 마지막으로 총 성적의 내림차순으로 결과를 정렬합니다.