그룹: 특정한 특징들을 공유하는 원소들의 집합.
질의문 Q1. 단과대학의 개수를 출력하시오.
SQL: SELECT COUNT(단과대학) FROM 학과
단과대학 중 중복되는 값들이 있음. -> 중복을 제거하고 싶은 경우
SQL: SELECT COUNT(DISTINCT 단과대학) FROM 학과
컬럼명이 복잡. 결과값 많을 문외한이 보는 경우 의미전달력이 떨어짐. 이 컬럼값을 의미값이 높도록 별칭을 부여할 수 있음 => AS 사용
SQL: SELECT COUNT(DISTINCT 단과대학) AS 단과대학수 FROM 학과
구문형식: SELECT GROUP BY 컬럼
질의문 Q1. 소속학과별 교수의 수를 출력하시오.
SQL: SELECT 소속학과, COUNT(*) AS 교수수 FROM 교수 GROUP BY 소속학과
소속학과가 같은 레코들끼리 묶어서 그룹화시키고, 해당 그룹에 대해 COUNT를 시행한다.
💬 저는 생활과학과 교수들의 이름들도 보고 싶어요. 교수이름 컬럼을 추가하면 안되나요?
✔️ 그럼 어떻게 될까?
관계형 DBMS는 컬럼값의 원자성에 의해서 하나의 컬럼값은 단 하나의 의미만을 가진다. 교수 이름이라는 컬럼이 추가되면, 교수수가 두명인 경우 두명의 이름이 들어가게 된다. 이처럼 SELECT절에 그룹의 기준과 집계 함수 이외의 컬럼이 포함되는 경우 원자성을 위반하게 되므로 사용이 불가능하다.
그룹의 기준:소속학과, 집계함수:count(*)
질의문 Q1. 2개 이상의 전공을 신청한 학생의 학생번호와 신청 정공수를 출력하시오.
이렇게 집계함수를 통해 구분한 결과중에, 내가 원하는 결과만 출력하고자 할 때 HAVING절을 사용한다!
개별적으로 혼자 작동할 수 있는 완전한 SELECT문이 내부에 삽입됨.
질의문 Q1. 학과별 교수의 평균 연봉이 70,000,000 미만인 학과 중 가장 높은 평균 연봉을 출력하시오.
질의문을 사용해 테이블을 도출하고, 내부 질의문을 통해 해당 질의문을 또 다른 테이블인양 사용할 수 있다.
질의문 Q1. '생활과학과' 소속 학생 중 수강신청을 하지 않은 학생의 학생번호를 출력하시오.
생활과학과 학생의 학생번호를 찾아낸 뒤, 각 학생번호마다 수강신청 테이블에 가서 '이 학생 번호로 수강신청 내역이 있어?'라고 물어봐야 함. 수강신청한 내역이 있으면 출력하지 않고, 내역이 없으면 결과물로 나와야 함. 이럴 때, EXISTS, NOT EXISTS를 사용한다.
질의문 Q1. 나이가 30세 이상인 학생의 학생이름과 나이, 그리고 그 학생이 소유한 계좌의 계좌번호, 잔액을 출력하시오.
학생: 학생 테이블. 계좌: 계좌 테이블. 두개의 테이블에 나뉘어들어가 있는 데이트를 결합시켜 하나의 테이블로 출력해달라는 의미
INNER JOIN: 테이블이 2개. FROM의 테이블 두개 사이에 "INNER JOIN"을 명시하여 결합한다.
ON: 막 연결하는거 아님. 어떠한 레코드와 어떠한 레코드를 결합시켜야 하는지에 관한 조인조건을 기술한다.
질의문 Q1. 나이가 30세 이상인 학생의 학생이름과 나이, 그리고 그 학생이 소유한 계좌의 계좌번호, 잔액을 출력하시오.
컬럼값이 어느 테이블에서 왔는지를 명시해줘야 함.(ex. 학생.나이 계좌.잔액)
구획없이 중복적으로 사용됨.
1. FROM절: 외부조인, 내부조인 구분하지 않음. 콤마로 여러 테이블 명시. WHERE절이 없으면 그냥 테이블 두개를 "CROSS JOIN"함.
2. WHERE절: JOIN에 대한 조건 (학생.학생번호=계좌.학생번호) , 레코드에 대한 조건 (학생.나이>=30) 을 한꺼번에 명시한다. (ON절을 명시하지 않는다.)
자연조인이라고 이미 조인에 대한 조건을 포함하고 있으므로 따로 ON절을 사용해 조인 조건을 명시하지 않습니다.
FROM절에서 사용하는 두 테이블 사이에 NATURAL JOIN 명시. 따로 ON을 사용하여 JOIN조건을 명시하지 않고, 바로 WHERE조건 사용함.
자주 사용하지는 않는데, 특수한 경우 유용하게 사용될 수 있으므로 알아두면 좋음
내부조인은 공통요소만 나오고, 외부조인은 공통 외 요소들도 출력한다!
차이점: LEFT|RIGHT [OUTER] JOIN. 외는 내부조인과 같음.
질의문Q1. 학생의 학생번호, 학생이름과 그 학생이 수강신청한 과목의 과목코드, 신청시각을 출력하시오. 단, 수강신청을 하지 않은 학생도 결과에 폼하시키고 과목코드를 기준으로 오름차순 정렬한다.
💬 학생 테이블(학생번호, 학생이름) 수강테이블(과목코드, 신청시각)의 결과를 조인을 통해 함께 출력해야 하는 상황. 내부조인을 사용하는 경우, 수강신청을 하지 않은 학생은 수강테이블과의 접점이 없어 결과 출력에 배제된다. 이처럼 두 테이블을 접목시켜 결과를 출력하는 조인에서 공통 분모가 없는 여집합 부분을 출력할때, 외부 조인을 사용할 수 있다!
조중대 학생은 수강신청을 하지 않았음. 그러나 LEFT OUTER JOIN으로 왼쪽 테이블(학생)은 모두 출력되므로, 수강 테이블의 항목들은 NULL인 상태로 결과가 출력된다.
수강신청을 하지 않은 조중대와 박은식은 계좌 항목은 NULL로 비워두고 학생정보가 출력되었다.
재귀적 관계. 하나의 테이블이 자기자신의 복사본과 조인하는 경우에 사용.
질의문Q1. 과목의 과목코드, 과목명 그리고 그 과목의 선수과목의 과목코드, 과목명을 모두 출력하시오. 단, 선수과목이 없는 과목도 결과에 포함시킨다.
💬 과목에 대한 정보 뿐 아니라, 선수과목에 대한 정보 역시 과목 테이블에 있음. 따라서 과목테이블이 스스로와 JOIN해 정보를 도출해야 함. 뿐만 아니라 선수과목이 없는 과목도 출력해야 하므로 OUTER JOIN도 사용해야 한다.
존재하지 않는, 논리상에서만 존재하는 가상의 테이블. 그러나 테이블로 다뤄 결과를 도출할 수 있는 객체.
단, ALTER 시 각각의 컬럼 리스트가 동일하게 유지되어야 한다.
그럼 몰 바꾸는건데? 수정의 이미가 있음? 그냥 이름 변경용인가?
질의문 Q1. 컴퓨터과학과 소속의 학생정보와 학과이름 및 이수학점을 출력하는 '컴퓨터과학과_학생'뷰를 생성하시오.
동일한게 학생번호밖에 없으므로 굳이 ON으로 JOIN조건을 명시해줄 것 없이 NATURAL JOIN 사용하면 됨.
실행 시 나는 FROM에 뷰 이름만 입력해주면 됨. 실제 실행에서는 WHERE절에 내가 입력한 조건 뿐 아니라 뷰의 조건역시 AND와 함께 사용 됨.