[SQL] 기본 쿼리문2 - SELECT문
SELECT
1
2
3
4
5
6
7
8
9
10
11
12
SELECT [DISTINCT] 컬럼1, 컬럼2, ..., 컬럼X
[FROM 테이블1, [INNER JOIN|OUTER JOIN|CROSS JOIN
테이블2 INNER JOIN|OUTER JOIN|CROSS JOIN
ON 조인 조건식1
테이블3 INNER JOIN|OUTER JOIN|CROSS JOIN
...
테이블m [AS 별칭]
ON 조인 조건식o]
[ON 조인 조건식p]
[WHERE 조건 [중첩질의]]
[ORDER BY 컬럼1 [ASC|DESC], ..., 컬럼z [ASC|DESC]]
]
- SELECT: 질의 결과에 포함되는 컬럼을 지정한다. DISTINCT 키워드를 컬럼 앞에 붙이면 중복은 포함시키지 않는다.
- FROM: 대상 테이블을 지정한다. 2개 이상의 테이블에 JOIN을 기술하면 조인 연산을 수행한다.
- ON: 조인 연산에 대한 조건을 기술할 때 사용한다.
- WHERE: 레코드에 대한 특정 검색 조건을 기술할 때 사용한다. 산술연산자(+,-), 비교 연산자(>,>=), 논리 연산자(AND, OR, NOT) 등을 사용할 수 있다.
- ORDER BY: ASC는 오름차순, DESC는 내림차순으로 정렬한다.
- AS: 테이블이나 컬럼의 별칭 지정
예시
교수 테이블의 모든 컬럼을 출력하라.
1
SELECT * FROM 교수;
교수 테이블에서 ‘소속학과’ 컬럼을 선택하여 출력하라.
1
SELECT 소속학과 FROM 교수;
남학생이며 2000년 이전에 태어난 학생의 학생번호, 학생이름, 전화번호, 나이를 출력하라.
1
2
3
SELECT 학생번호, 학생이름, 전화번호, 나이
FROM 학생
WHERE 성별 = '남' AND 생년월일 < '2000-1-1';
학생 정보를 성별 기준으로 내림차순 정렬하고, 생년월일 기준으로 오름차순 정렬하라.
1
2
SELECT * FROM 학생
ORDER BY 성별 DESC, 생년월일 ASC;
특수 연산자 사용하기
BETWEEN ~ AND
지정한 범위의 조건을 만족하는 레코드를 검색한다.
1
2
SELECT * FROM 계좌
WHERE 잔액 BETWEEN 200000 AND 400000;
IN | NOT IN
기술한 값 중 하나와 일치하면 IN은 참을, NOT IN은 거짓을 반환한다.
1
2
SELECT * FROM 계좌
WHERE 소속학과 IN('컴퓨터과학과', '행정학과', '법학과');
LIKE
와일드 카드 특수기호를 사용하여 부분 일치 검색
- %: 어떤 문자열과도 일치
- ‘김%’: ‘김’D으로 시작하는 어떤 문자열과도 일치
- ‘%터%’: ‘컴퓨터과학개론’, ‘데이터베이스’와 같이 ‘터’를 포함하는 어떤 문자열과도 일치
- _: 어떤 문자와도 일치
- ‘__’: 두 개의 문자로 이루어진 모든 문자열과 일치
- ‘___%’: 세 문자 이상으로 이루어진 모든 문자열과 일치
1
2
SELECT * FROM 계좌
WHERE 과목코드 LIKE 'COM%';
고급 SELECT문
집계 함수
- AVG(): 컬럼에 있는 값들의 평균을 구함
- MIN(): 컬럼에 있는 값 중 가장 작은 값을 구함
- MAX(): 컬럼에 있는 값 중 가장 큰 값을 구함
- SUM(): 컬럼에 있는 값들의 합을 구함
- COUNT: 컬럼에 있는 값들의 개수를 구함
예시
개설된 전체 과목의 개수를 출력하라.
1
2
SELECT COUNT(과목코드) AS 개설과목수
FROM 학생
최연소자와 최고령자 학생의 나이를 출력하라.
1
2
SELECT MIN(나이) AS 최연소자_나이, MAX(나이) AS 최고령자_나이
FROM 학생
GROUP BY
GROUP BY 절을 사용하여 레코드를 다수의 그룹으로 분류하고, 그룹 별로 집계 함수를 적용할 수 있다.
예시
소속학과별 교수의 수를 구하라.
1
2
3
SELECT 소속학과, COUNT(*) AS 교수수
FROM 교수
GROUP BY 소속학과
HAVING
GROUP BY에 조건을 걸 떄 사용하는 절이다.
예시
2개 이상의 전공을 신청한 학생의 학생번호와 신청 전공 수를 출력하라.
1
2
3
SELECT 학생번호, COUNT(*) AS 신청_전공_수
FROM 전공
GROUP BY 학생번호 HAVING 신청_전공_수 >= 2
중첩 질의
SELECT문 안에서 FROM이나 WHERE 절에 SELECT문을 중첩할 수 있다.
예시
학과별 교수의 평균 연봉이 7000만원 미만인 학과 중 가장 높은 평균 연봉을 구하라.
1
2
3
4
5
SELECT AVG(*) AS 평균연봉
FROM (SELECT 소속학과, AVG(*) AS 평균연봉
FROM 교수
GROUP BY 소속학과) AS d
WHERE d.평균연봉 < 70000000;
교집합과 차집합 연산
IN/NOT IN 연산자는 특정 원소가 리스트에 포함되는지 검사한다.
IN/NOT IN 연산자와 중첩 질의를 사용하여 교집합과 차집합을 구할 수 있다.
예시
과목코드 ‘COM34’는 수강하지만 ‘COM11’은 수강하지 않는 학생의 학생번호를 출력하라.
1
2
3
4
5
6
SELECT A.학생번호
FROM 수강 AS A
WHERE A.과목코드 = 'COM34' AND
A.학생번호 NOT IN (SELECT B.학생번호
FROM 수강 AS B
WHERE B.과목코드 = 'COM11')
EXIST와 NOT EXISTS
일반적인 중첩 질의의 경우 내부 질의가 우선적으로 수행되지만, EXIST와 NOT EXISTS가 사용되면 외부 질의의 각 레코드에 대해 내부 질의의 조건을 만족하는지 검사한다.
예시
‘생활과학과’ 소속 학생 중 수강신청을 하지 않은 학생의 학생번호를 검색하라.
1
2
3
4
5
6
SELECT A.학생번호
FROM 수강 AS A
WHERE 학과이름 = '생활과학과' AND
NOT EXIST (SELECT 학생번호
FROM 수강 AS B
WHERE A.학생번호 = B.학생번호)
조인 연산을 이용한 SELECT문
크로스 조인
조건 없이 모든 조합의 레코드를 결합하는 카티션 프로덕트 연산과 동일하다.
1
2
3
4
SELECT 컬럼1, 컬럼2, ..., 컬럼n
FROM 테이블1 CROSS JOIN 테이블2
[... CROSS JOIN 테이블m]
WHERE 조건
내부 조인
조건에 따른 조인을 내부 조인(inner join)이라고 한다.
1
2
3
4
5
SELECT 컬럼1, 컬럼2, ..., 컬럼n
FROM 테이블1 INNER JOIN 테이블2
ON 조인조건1
[... INNER JOIN 테이블m ON 조인조건p]
WHERE 조건
INNER JOIN 키워드는 ANSI SQL-92 표준이며 Oracla에서 사용하는 조인 형식은 아래와 같다.
1
2
3
SELECT 컬럼1, 컬럼2, ..., 컬럼n
FROM 테이블1, 테이블2, [... 테이블m]
WHERE 조건 AND 조인조건1 [... AND 조인조건p]
예시
나이가 30세 이상인 학생의 학생이름과 나이, 그리고 그 학생이 소유한 계좌의 계좌번호, 잔액을 출력하라.
1
2
3
4
SELECT 계좌번호, 잔액
FROM 학생 INNER JOIN 계좌
ON 학생.학생번호 = 계좌.학생번호
WHERE 학생.나이 >= 30
자연 조인
2개 이상의 테이블을 입력 받아 하나의 테이블로 변환한다.
1
2
3
SELECT 컬럼1, 컬럼2, ..., 컬럼n
FROM 테이블1 NATURAL JOIN 테이블2
WHERE 조건
외부 조인
조건에 맞지 않는 레코드도 결과에 포함시킨다.
1
2
3
4
SELECT 컬럼1, 컬럼2, ..., 컬럼n
FROM 테이블1 LEFT|RIGHT OUTER JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼
WHERE 조건
- LEFT OUTER JOIN : 왼쪽에 있는 테이블에 존재하는 모든 레코드는 조인 결과에 포함되고 조인 조건에 맞는 오른쪽 레코드만 연결된다. 조건에 맞지 않는 레코드의 컬럼은 NULL로 대체된다.
- RIGHT OUTER JOIN : 오른쪽에 있는 테이블에 존재하는 모든 레코드는 조인 결과에 포함되고 조인 조건에 맞는 왼쪽 레코드만 연결된다. 조건에 맞지 않는 레코드의 컬럼은 NULL로 대체된다.
- OUTER JOIN : 양쪽에 있는 테이블에 존재하는 모든 레코드는 조인 결과에 포함되고 조인 조건에 맞는 레코드만 연결된다. 조건에 맞지 않는 레코드의 컬럼은 NULL로 대체된다.
셀프 조인
한 테이블이 자기 자신과 조인되는 것으로 반드시 서로 다른 ALIAS를 사용해야 한다.
1
2
3
4
SELECT 별칭1.컬럼1, 별칭2.컬럼2, ..., 별칭n.컬럼n
FROM 테이블1 AS 별칭1 INNER JOIN|OUTER JOIN 테이블2 AS 별칭2
ON 조인조건1
WHERE 조건
예시
과목의 과목코드, 과목명 그리고 그 과목의 선수과목의 과목코드, 과목명을 모두 출력하라. 단, 선수과목이 없는 과목도 결과에 포함시킨다.
1
2
3
SELECT 기준과목.과목명, 기준과목.과목코드, 선수과목.과목명 AS 선수과목명, 선수과목.과목코드 AS 선수과목코드
FROM 과목 AS 선수과목 RIGHT JOIN 과목 AS 기준과목
ON 선수과목.과목코드 = 기준과목.선수과목