
INSERT
<사원> 테이블에 (이름-홍승현, 부서-인터넷)을 삽입하시오.
INSERT INTO 테이블명(속성, ...) | INSERT INTO 사원(이름, 부서) |
VALUES (데이터, ...); | VALUES ('홍승현', '인터넷'); |
또는 SELECT문을 사용하여 다른 테이블의 검색 결과를 삽입할 수 있습니다.
<사원> 테이블에서 부서가 '편집'인 모든 튜플을 편집부원(이름, 생일, 주소, 기본급) 테이블에 삽입하시오.
INSERT INTO 테이블명(속성, ...) | INSERT INTO 편집부원(이름, 생일, 주소, 기본급) |
SELECTE 속성, ... | SELECT 이름, 생일, 주소, 기본급 |
FROM 테이블명 | FROM 사원 |
WHERE 조건; | WHERE 부서 = '편집'; |
★ DELETE
<사원> 테이블에서 "인터넷" 부서에 대한 모든 튜플을 삭제하시오.
DELETE FROM 테이블명 | DELETE FROM 사원; |
WHERE 조건; | WHERE 부서 = '인터넷'; |
모든 레코드를 삭제할 때는 WHERE절을 생략하면 됩니다.
<사원> 테이블의 모든 레코드를 삭제하시오.
DELETE FROM 테이블명 | DELETE FROM 사원; |
UPDATE
<사원> 테이블에서 "황진이"의 '부서'를 "기획부"로 변경하고 '기본급'을 5만원 인상시키시오.
UPDATE 테이블명 | UPDATE 사원 |
SET 속성명 = 데이터, ... | SET 부서 = '기획', 기본급 = 기본급 +5 |
WHERE 조건; | WHERE 이름 = '황진이'; |
★★ SELECT
SELECT DISTINCT 속성명 AS 별칭, ...
, 그룹함수(속성명) AS 별칭
, Window함수 OVER (PARTITION BY 속성명, ... ORDER BY 속성명, ...)
FROM 테이블명, ...
WHERE 조건
GROUP BY 속성명, ...
HAVING 조건
ORDER BY 속성명 ASC 또는 DESC;
기본 검색
<사원> 테이블에서 '기본급'에 특별수당 10을 더한 월급을 '부서2'라는 이름의 "XX부서의", 이름2라는 이름의 "XXX의 월급", 기본급2라는 이름의 "XXX" 형태로 출력하시오.
SELECT 부서 + '부서의' AS 부서2, 이름 + '의 월급' AS 이름2, 기본급 + 10 AS 기본급2 FROM 사원; |
조건 지정 검색
<사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 이름 LIKE "김%"; |
<사원> 테이블에서 '생일'이 '01/01/69'에서 '12/31/73' 사이인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 생일 BETWEEN #01/01/69# AND #12/31/73#; |
<사원> 테이블에서 '주소'가 NULL인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 주소 IS NULL; |
정렬 검색
<사원> 테이블에서 '주소'를 기준으로 내림차순 정렬시켜 상위 2개 튜플만 검색하시오.
SELECTE TOP 2 * FROM 사원 ORDER BY 주소 DESC; |
하위 질의
<사원> 테이블에서, <여가활동> 테이블의 '취미'가 "나이트댄스"인 사원의 '이름'과 '주소'를 검색하시오.
SELECT 이름, 주소 FROM 사원 WHERE 이름 = (SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스'); |
<사원> 테이블에서 여가활동을 하지 않는 사원들을 검색하시오. (<여가활동> 테이블을 이용할 것)
SELECT * FROM 사원 WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동); |
<사원> 테이블에서 여가활동을 하는 사원들의 부서를 검색하시오. (<여가활동> 테이블을 이용할 것)
SELECT 부서 FROM 사원 WHERE EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름 = 사원.이름); |
복수 테이블 검색
'경력'이 10년 이상인 사원의 '이름', '부서', '취미', '경력'을 검색하시오. ('이름'과 '부서'는 <사원> 테이블에서, '취미'와 '경력'은 <여가활동> 테이블에서 검색하시오.)
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력 FROM 사원, 여가활동 WHERE 여가활동.경력 >= 10 AND 사원.이름 = 여가활동.이름; |
WINDOW 함수 이용 검색
<상여금> 테이블에서 '상여내역'별로 '상여금'에 대한 일련 번호를 구하시오. (단 순서는 내림차순이며, 속성명은 'NO'로 할 것)
SELECT 상여내역, 상여금, ROW_NUMBER() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS NO FROM 상여금; |
<상여금> 테이블에서 '상여내역'별로 '상여금'에 대한 순위를 구하시오. (단 순서는 내림차순이며, 속성명은 '상여금순위'로 할 것)
SELECT 상여내역, 상여금, RANK() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS 상여금순위 FROM 상여금; |
그룹 지정 검색
<상여금> 테이블에서 '상여금'이 100 이상인 사원이 2명 이상인 부서와 부서의 튜플 수를 구하시오. (단 속성명은 '사원수'로 할 것)
SELECT 부서, COUNT(*) AS 사원수 FROM 상여금 WHERE 상여금 >= 100 GROUP BY 부서 HAVING COUNT(*) >= 2; |
<상여금> 테이블의 '부서', '상여내역', '상여금'에 대해 부서별 상여내역별 소계와 전체 합계를 구하시오. (단, 속성명은 '상여금합계'로 하고, ROLLUP 함수를 사용할 것)
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계 FROM 상여금 GROUP BY ROLLUP(부서, 상여내역); |
<상여금> 테이블의 '부서', '상여내역', '상여금'에 대해 부서별 상여내역별 소계와 전체 합계를 검색하시오. (단, 속성명은 '상여금합계'로 하고, CUBE 함수를 사용할 것)
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계 FROM 상여금 GROUP BY CUBE(부서, 상여내역); |
집합 연산자를 이용한 통합 질의
<사원> 테이블과 <직원> 테이블을 통합하시오. (단 같은 레코드가 중복되어 나오지 않게 하시오.)
SELECT * FROM 사원 UNION SELECT * FROM 직원; |
※ 조건연산자
- 비교연산자
= | <> | > | < | >= | <= |
같다 | 다르다 | 크다 | 작다 | 크거나 같다 | 작거나 같다 |
- 논리연산자
AND | OR | NOT |
- LIKE 연산자 + 대표 문자
'%' | '_' | '#' |
모든 문자 | 문자 1개 | 숫자 1개 |
※ 그룹 함수 : GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 함수를 기술합니다. ★★
그룹 함수 | 기능 | 그룹 함수 | 기능 |
COUNT(속성명) ★ | 튜플 수 | MAX(속성명) | 최대값 |
SUM(속성명) | 합계 | MIN(속성명) | 최소값 |
AVG(속성명) | 평균 | ROLLUP(속성명, ...) | 그룹별 소계 |
STDDEV(속성명) | 표준편차 | CUBE(속성명, ...) | 모든 조합의 그룹별 소계 |
VARIANCE(속성명) | 분산 |
※ WINDOW 함수 : GROUP BY절을 이용하지 않고 속성의 값을 집계할 함수를 기술합니다.
WINDOW 함수 | 기능 |
ROW_NUMBER() | 원도우별 일련번호 반환 |
RANK() | 윈도우별 순위 반환 (공동 순위 반영) |
DENSE_RANK() | 윈도우별 순위 반환 (공동 순위 무시) |
※ 집합 연산자 : 두 개의 SELECT문 사이에 써주면, 두 SELECT문을 연산한 결과를 출력합니다.
UNION | UNION ALL | INTERSECT | EXCEPT |
합집합 출력 (중복 제거) |
합집합 출력 | 교집합 출력 | 차집합 출력 |
JOIN
INNER JOIN | EQUI JOIN |
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명; |
SELECT 속성명, 속성명 FROM 테이블명1 JOIN 테이블명2 USING(속성명); |
||
SELECT속성명, 속성명 FROM 테이블명1 NATURAL JOIN 테이블명2; |
||
NON-EQUI JOIN | SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE =를 사용하지 않는 조건 기술; |
|
OUTER JOIN | LEFT OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 LEFT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명(+); |
||
RIGHT OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 RIGHT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
|
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명(+) = 테이블명2.속성명; |
||
FULL OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 FULL OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
INNER JOIN
- EQUI JOIN : =연산자를 이용해 JOIN합니다.
- NON-EQUI JOIN : >, <, <>, >=, <= 연산자를 이용해 JOIN합니다.
OUTER JOIN
- LEFT JOIN : 우측 릴레이션과 하나도 맞지 않는 좌측 릴레이션 튜플들에 NULL값을 붙여서 INNER JOIN 결과에 추가합니다.
- RIGHT JOIN : 좌측 릴레이션과 하나도 맞지 않는 우측 릴레이션 튜플들에 NULL값을 붙여서 INNER JOIN 결과에 추가합니다.
- FULL JOIN : LEFT JOIN과 RIGHT JOIN을 둘 다 실행합니다.
* NATURAL JOIN은 EQUI JOIN의 한 종류로, 중복된 속성을 제거하여 출력합니다. 조인할 속성을 지정하지 않기 때문에, 조인하려는 두 테이블에는 이름과 도메인이 같은 속성이 반드시 존재해야 합니다.

INSERT
<사원> 테이블에 (이름-홍승현, 부서-인터넷)을 삽입하시오.
INSERT INTO 테이블명(속성, ...) | INSERT INTO 사원(이름, 부서) |
VALUES (데이터, ...); | VALUES ('홍승현', '인터넷'); |
또는 SELECT문을 사용하여 다른 테이블의 검색 결과를 삽입할 수 있습니다.
<사원> 테이블에서 부서가 '편집'인 모든 튜플을 편집부원(이름, 생일, 주소, 기본급) 테이블에 삽입하시오.
INSERT INTO 테이블명(속성, ...) | INSERT INTO 편집부원(이름, 생일, 주소, 기본급) |
SELECTE 속성, ... | SELECT 이름, 생일, 주소, 기본급 |
FROM 테이블명 | FROM 사원 |
WHERE 조건; | WHERE 부서 = '편집'; |
★ DELETE
<사원> 테이블에서 "인터넷" 부서에 대한 모든 튜플을 삭제하시오.
DELETE FROM 테이블명 | DELETE FROM 사원; |
WHERE 조건; | WHERE 부서 = '인터넷'; |
모든 레코드를 삭제할 때는 WHERE절을 생략하면 됩니다.
<사원> 테이블의 모든 레코드를 삭제하시오.
DELETE FROM 테이블명 | DELETE FROM 사원; |
UPDATE
<사원> 테이블에서 "황진이"의 '부서'를 "기획부"로 변경하고 '기본급'을 5만원 인상시키시오.
UPDATE 테이블명 | UPDATE 사원 |
SET 속성명 = 데이터, ... | SET 부서 = '기획', 기본급 = 기본급 +5 |
WHERE 조건; | WHERE 이름 = '황진이'; |
★★ SELECT
SELECT DISTINCT 속성명 AS 별칭, ...
, 그룹함수(속성명) AS 별칭
, Window함수 OVER (PARTITION BY 속성명, ... ORDER BY 속성명, ...)
FROM 테이블명, ...
WHERE 조건
GROUP BY 속성명, ...
HAVING 조건
ORDER BY 속성명 ASC 또는 DESC;
기본 검색
<사원> 테이블에서 '기본급'에 특별수당 10을 더한 월급을 '부서2'라는 이름의 "XX부서의", 이름2라는 이름의 "XXX의 월급", 기본급2라는 이름의 "XXX" 형태로 출력하시오.
SELECT 부서 + '부서의' AS 부서2, 이름 + '의 월급' AS 이름2, 기본급 + 10 AS 기본급2 FROM 사원; |
조건 지정 검색
<사원> 테이블에서 성이 '김'인 사람의 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 이름 LIKE "김%"; |
<사원> 테이블에서 '생일'이 '01/01/69'에서 '12/31/73' 사이인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 생일 BETWEEN #01/01/69# AND #12/31/73#; |
<사원> 테이블에서 '주소'가 NULL인 튜플을 검색하시오.
SELECT * FROM 사원 WHERE 주소 IS NULL; |
정렬 검색
<사원> 테이블에서 '주소'를 기준으로 내림차순 정렬시켜 상위 2개 튜플만 검색하시오.
SELECTE TOP 2 * FROM 사원 ORDER BY 주소 DESC; |
하위 질의
<사원> 테이블에서, <여가활동> 테이블의 '취미'가 "나이트댄스"인 사원의 '이름'과 '주소'를 검색하시오.
SELECT 이름, 주소 FROM 사원 WHERE 이름 = (SELECT 이름 FROM 여가활동 WHERE 취미 = '나이트댄스'); |
<사원> 테이블에서 여가활동을 하지 않는 사원들을 검색하시오. (<여가활동> 테이블을 이용할 것)
SELECT * FROM 사원 WHERE 이름 NOT IN (SELECT 이름 FROM 여가활동); |
<사원> 테이블에서 여가활동을 하는 사원들의 부서를 검색하시오. (<여가활동> 테이블을 이용할 것)
SELECT 부서 FROM 사원 WHERE EXISTS (SELECT 이름 FROM 여가활동 WHERE 여가활동.이름 = 사원.이름); |
복수 테이블 검색
'경력'이 10년 이상인 사원의 '이름', '부서', '취미', '경력'을 검색하시오. ('이름'과 '부서'는 <사원> 테이블에서, '취미'와 '경력'은 <여가활동> 테이블에서 검색하시오.)
SELECT 사원.이름, 사원.부서, 여가활동.취미, 여가활동.경력 FROM 사원, 여가활동 WHERE 여가활동.경력 >= 10 AND 사원.이름 = 여가활동.이름; |
WINDOW 함수 이용 검색
<상여금> 테이블에서 '상여내역'별로 '상여금'에 대한 일련 번호를 구하시오. (단 순서는 내림차순이며, 속성명은 'NO'로 할 것)
SELECT 상여내역, 상여금, ROW_NUMBER() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS NO FROM 상여금; |
<상여금> 테이블에서 '상여내역'별로 '상여금'에 대한 순위를 구하시오. (단 순서는 내림차순이며, 속성명은 '상여금순위'로 할 것)
SELECT 상여내역, 상여금, RANK() OVER (PARTITION BY 상여내역 ORDER BY 상여금 DESC) AS 상여금순위 FROM 상여금; |
그룹 지정 검색
<상여금> 테이블에서 '상여금'이 100 이상인 사원이 2명 이상인 부서와 부서의 튜플 수를 구하시오. (단 속성명은 '사원수'로 할 것)
SELECT 부서, COUNT(*) AS 사원수 FROM 상여금 WHERE 상여금 >= 100 GROUP BY 부서 HAVING COUNT(*) >= 2; |
<상여금> 테이블의 '부서', '상여내역', '상여금'에 대해 부서별 상여내역별 소계와 전체 합계를 구하시오. (단, 속성명은 '상여금합계'로 하고, ROLLUP 함수를 사용할 것)
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계 FROM 상여금 GROUP BY ROLLUP(부서, 상여내역); |
<상여금> 테이블의 '부서', '상여내역', '상여금'에 대해 부서별 상여내역별 소계와 전체 합계를 검색하시오. (단, 속성명은 '상여금합계'로 하고, CUBE 함수를 사용할 것)
SELECT 부서, 상여내역, SUM(상여금) AS 상여금합계 FROM 상여금 GROUP BY CUBE(부서, 상여내역); |
집합 연산자를 이용한 통합 질의
<사원> 테이블과 <직원> 테이블을 통합하시오. (단 같은 레코드가 중복되어 나오지 않게 하시오.)
SELECT * FROM 사원 UNION SELECT * FROM 직원; |
※ 조건연산자
- 비교연산자
= | <> | > | < | >= | <= |
같다 | 다르다 | 크다 | 작다 | 크거나 같다 | 작거나 같다 |
- 논리연산자
AND | OR | NOT |
- LIKE 연산자 + 대표 문자
'%' | '_' | '#' |
모든 문자 | 문자 1개 | 숫자 1개 |
※ 그룹 함수 : GROUP BY절에 지정된 그룹별로 속성의 값을 집계할 함수를 기술합니다. ★★
그룹 함수 | 기능 | 그룹 함수 | 기능 |
COUNT(속성명) ★ | 튜플 수 | MAX(속성명) | 최대값 |
SUM(속성명) | 합계 | MIN(속성명) | 최소값 |
AVG(속성명) | 평균 | ROLLUP(속성명, ...) | 그룹별 소계 |
STDDEV(속성명) | 표준편차 | CUBE(속성명, ...) | 모든 조합의 그룹별 소계 |
VARIANCE(속성명) | 분산 |
※ WINDOW 함수 : GROUP BY절을 이용하지 않고 속성의 값을 집계할 함수를 기술합니다.
WINDOW 함수 | 기능 |
ROW_NUMBER() | 원도우별 일련번호 반환 |
RANK() | 윈도우별 순위 반환 (공동 순위 반영) |
DENSE_RANK() | 윈도우별 순위 반환 (공동 순위 무시) |
※ 집합 연산자 : 두 개의 SELECT문 사이에 써주면, 두 SELECT문을 연산한 결과를 출력합니다.
UNION | UNION ALL | INTERSECT | EXCEPT |
합집합 출력 (중복 제거) |
합집합 출력 | 교집합 출력 | 차집합 출력 |
JOIN
INNER JOIN | EQUI JOIN |
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명; |
SELECT 속성명, 속성명 FROM 테이블명1 JOIN 테이블명2 USING(속성명); |
||
SELECT속성명, 속성명 FROM 테이블명1 NATURAL JOIN 테이블명2; |
||
NON-EQUI JOIN | SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE =를 사용하지 않는 조건 기술; |
|
OUTER JOIN | LEFT OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 LEFT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명 = 테이블명2.속성명(+); |
||
RIGHT OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 RIGHT OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
|
SELECT 속성명, 속성명 FROM 테이블명1, 테이블명2 WHERE 테이블명1.속성명(+) = 테이블명2.속성명; |
||
FULL OUTER JOIN | SELECT 속성명, 속성명 FROM 테이블명1 FULL OUTER JOIN 테이블명2 ON 테이블명1.속성명 = 테이블명2.속성명; |
INNER JOIN
- EQUI JOIN : =연산자를 이용해 JOIN합니다.
- NON-EQUI JOIN : >, <, <>, >=, <= 연산자를 이용해 JOIN합니다.
OUTER JOIN
- LEFT JOIN : 우측 릴레이션과 하나도 맞지 않는 좌측 릴레이션 튜플들에 NULL값을 붙여서 INNER JOIN 결과에 추가합니다.
- RIGHT JOIN : 좌측 릴레이션과 하나도 맞지 않는 우측 릴레이션 튜플들에 NULL값을 붙여서 INNER JOIN 결과에 추가합니다.
- FULL JOIN : LEFT JOIN과 RIGHT JOIN을 둘 다 실행합니다.
* NATURAL JOIN은 EQUI JOIN의 한 종류로, 중복된 속성을 제거하여 출력합니다. 조인할 속성을 지정하지 않기 때문에, 조인하려는 두 테이블에는 이름과 도메인이 같은 속성이 반드시 존재해야 합니다.