Post

[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 선수과목.과목코드 = 기준과목.선수과목
This post is licensed under CC BY 4.0 by the author.