데이터베이스를 사용하기 위한 기본적인 SQL 문법에 대해 알아봅니다.
데이터베이스에서 가장 핵심이 되는 SQL 문법입니다. 다음은 테이블에서 필요한 데이터를 추출하는데 사용하는 구문입니다.
SELECT [컬럼명들]
FROM [테이블명]
WHERE [조건들]
ORDER BY [컬럼명들]
select절
: 검색할 컬럼들을 나열하고 쉼표(,)를 통해서 구분합니다.from절
: 검색할 데이터가 들어있는 테이블을 명시합니다.where절
: 테이블의 컬럼들을 어떤 조건으로 추출할 것인지 명시합니다. 조건은 1개 이상이며 AND, OR 연산자로 구분합니다.order by절
: 어떤 컬럼들을 기준으로 정렬할 것인지 쉼표(,)를 통해 나열합니다. 기본은 내림차순(DESC)입니다.GROUP BY
를 이용하여 검색할 데이터를 그룹화하여 추출하는데 사용하는 구문입니다.
GROUP BY를 사용할 때 주의해야할 점은 SELECT절, HAVING절에 나열되는 컬럼들은 GROUP BY절에서 나열한 컬럼들만 쓸 수 있습니다. GROUP BY절에서 사용하지 않은 컬럼들을 명시하고 싶다면 집계함수를 이용해서 표현할 수 있습니다.
SELECT [group by에서 사용된 컬럼명들, 집계 함수]
FROM [테이블명]
WHERE [조건들]
GROUP BY [컬럼명들]
HAVING [group by절에 해당하는 조건들]
group by절
: 그룹으로 묶을 컬럼명들을 쉼표로 구분하여 나열합니다.having절
: group by로 생성된 그룹에 대하여 임의의 조건들을 명시합니다. where절과 다르게 집계 함수를 이용해서 조건을 표현할 수도 있습니다.다음은 주소 컬럼으로 그룹화하여 동일한 주소가 2개 이상 있는 그룹만을 추출하는 예시 구문입니다.
SELECT name, COUNT(address)
FROM customer
GROUP BY address
HAVING COUNT(address) >= 2
CASE문
을 이용하여 SQL문을 분기합니다. CASE문은 크게 두가지로 나눠 사용할 수 있습니다.
SELECT
(CASE [컬럼명] WHEN [비교값1] THEN [반환값1]
WHEN [비교값2] THEN [반환값2]
WHEN [비교값3] THEN [반환값3]
ELSE [when절 이외의 조건일 때 반환될 값]
END) AS [별칭 컬럼명]
FROM [테이블명]
다음은 사원 ID와 비교하여 직급을 구분하는 case문의 사용 예시 구문입니다.
SELECT name,
id,
(CASE id WHEN 'C001' THEN '부장'
WHEN 'C002' THEN '차장'
WHEN 'C003' THEN '대리'
WHEN 'C004' THEN '사원'
ELSE '직급 없음'
END) AS '직급'
FROM employee
SELECT
(CASE WHEN [조건문1] THEN [반환값1]
WHEN [조건문2] THEN [반환값2]
WHEN [조건문3] THEN [반환값3]
ELSE [when절 이외의 조건일 때 반환될 값]
END) AS [별칭 컬럼명]
FROM [테이블명]
다음은 조건문을 이용해 직급을 구분하는 case문의 사용 예시 구문입니다.
SELECT name,
id,
(CASE WHEN id = 'C001' THEN '부장'
WHEN id = 'C002' THEN '차장'
WHEN id = 'C003' THEN '대리'
WHEN 'id = C004' THEN '사원'
ELSE '직급 없음'
END) AS '직급'
FROM employee
집합 연산자 UNION
과 UNION ALL
을 이용하여 2개 이상의 SELECT 쿼리 결과를 하나로 합쳐줍니다.
주의해야 할 점은 각 SELECT절에서 반환되는 컬럼들의 개수와 순서가 동일해야합니다. 그리고 각 컬럼의 데이터 형식이 서로 호환되어야 합니다.
합쳐지는 select 쿼리 결과 중 중복되는 값은 제거하거 보여줍니다.
SELECT [컬럼1],
[컬럼2],
[컬럼3]
FROM [테이블명1]
UNION
SELECT [컬럼1],
[컬럼2],
[컬럼3]
FROM [테이블명2]
합쳐지는 select 쿼리 결과 중 중복되는 값을 제거하지 않고 모두 보여줍니다.
SELECT [컬럼1],
[컬럼2],
[컬럼3]
FROM [테이블명1]
UNION ALL
SELECT [컬럼1],
[컬럼2],
[컬럼3]
FROM [테이블명2]
RANK, DENSE_RANK, ROW_NUMBER
를 이용하여 순위를 집계합니다.
각각 OVER()함수 내부에 순위를 매길 수 있도록 PARTITION BY
절과 ORDER BY
절을 이용합니다.
동일한 점수에는 동일한 순위를 부여하고, 사용된 순위만큼 다음 순위를 건너뜁니다.
SELECT RANK() OVER(PARTITION BY [그룹할 컬럼들]
ORDER BY [순위를 매길 때 사용할 컬럼들])
다음은 각 부서별로 직원들의 점수를 이용하여 순위를 구한 예시 구문입니다.
SELECT name,
score,
RANK() OVER(PARTITION BY department ORDER BY score DESC)
FROM employee
1등(100점), 2등(90점), 3등(85점), 3등(85점), 3등(85점), 6등(80점), 7등(75점), ...
동일한 점수에는 동일한 순위를 부여하고, 사용된 순위만큼 다음 순위를 건너뛰지 않고 차례대로 순위를 부여합니다.
SELECT DENSE_RANK() OVER(PARTITION BY [그룹할 컬럼들]
ORDER BY [순위를 매길 때 사용할 컬럼들])
다음은 각 부서별로 직원들의 점수를 이용하여 순위를 구한 예시 구문입니다.
SELECT name,
score,
DENSE_RANK() OVER(PARTITION BY department ORDER BY score DESC)
FROM employee
1등(100점), 2등(90점), 3등(85점), 3등(85점), 3등(85점), 4등(80점), 5등(75점), ...
동일한 점수에도 차례대로 고유의 순위를 부여합니다.
SELECT ROW_NUMBER() OVER(PARTITION BY [그룹할 컬럼들]
ORDER BY [순위를 매길 때 사용할 컬럼들])
다음은 각 부서별로 직원들의 점수를 이용하여 순위를 구한 예시 구문입니다.
SELECT name,
score,
ROW_NUMBER() OVER(PARTITION BY department ORDER BY score DESC)
FROM employee
1등(100점), 2등(90점), 3등(85점), 4등(85점), 5등(85점), 6등(80점), 7등(75점), ...
조인은 서로 다른 테이블들을 하나의 결과로 결합할 때 사용합니다. 조인의 종류는 5가지로 나뉩니다.
양쪽 테이블에 공통적으로 존재하는 데이터들만 추출합니다. INNER 키워드는 생략 가능합니다.
SELECT *
FROM [테이블1] AS A
INNER JOIN [테이블2] AS B
ON A.KEY = B.KEY
LEFT OUTER JOIN과 RIGHT OUTER JOIN이 있으며, 양쪽 테이블의 공통적으로 존재하는 데이터와 함께 기준이 되는 테이블의 데이터는 모두 추출하게 됩니다. 매칭되는 키값이 없는 경우는 NULL과 결합하여 결과값이 나타납니다.
OUTER 키워드는 생략 가능합니다.
SELECT *
FROM [테이블1] AS A
LEFT OUTER JOIN [테이블2] AS B
ON A.KEY = B.KEY
SELECT *
FROM [테이블1] AS A
RIGHT OUTER JOIN [테이블2] AS B
ON A.KEY = B.KEY
양쪽 테이블의 데이터가 모두 추출됩니다. 매칭되는 키값이 없는 경우 NULL과 결합되어 결과값이 나타납니다.
SELECT *
FROM [테이블1] AS A
FULL OUTER JOIN [테이블2] AS B
ON A.KEY = B.KEY
자기 자신의 테이블과 조인합니다. 테이블이 동일하기 때문에 AS를 이용하여 꼭 별칭을 주어야합니다.
SELECT *
FROM [테이블1] AS A
FULL OUTER JOIN [테이블1] AS B
ON A.NAME = B.MANAGER
두 테이블을 연결하는 ON절이 없어 모든 경우의 수가 발생되는 조인입니다.
SELECT *
FROM [테이블1] AS A
CROSS JOIN [테이블2] AS B