2025 SQLD 2과목 개념 요약 정리

2025. 2. 27. 16:27·SQLD

데이터 조작어(DML)

오라클은 사용자가 수동으로 COMMIT 해야 해서 ROLLBACK이 가능하다.

SQL Server(기본적으로 자동 커밋)는 AUTO COMMIT OFF를 하면 DML, DDL 모두 사용자가 수동으로 COMMIT해야 한다.

  • SELECT
  • INSERT
  • UPDATE
  • DELETE : ROLLBACK으로 복구가 가능하다.
  • MERGE

 

데이터 정의어(DDL)

오라클은 자동으로 COMMIT 되어서 ROLLBACK이 불가능하다.

SQL Server(기본적으로 자동 커밋)는 AUTO COMMIT ON를 하면 DML, DDL 모두 자동으로 COMMIT 된다.

  • CREATE
  • ALTER
    • 오라클 : ALTER TABLE 테이블명 MODIFIY (컬럼명1 데이터유형 [DEFAULT 식] [NOT NULL], 컬럼명2 데이터유형 [DEFAULT 식] [NOT NULL] ...);
    • SQL Server : ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 데이터유형 [DEFAULT 식] [NOT NULL];
    • SQL Server는 여러 개의 컬럼에 대한 정의를 한 번에 바꿀 수 없다.
  • DROP
    • ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
    • 오라클에서는 CASCADE를 지원한다.
    • SQL Server는 CASCADE를 지원하지 않는다. 따라서 외래키 제약조건을 삭제한 후 테이블을 삭제해야 한다.
  • RENAME
  • TRUNCATE : 시스템 활용 측면에서 시스템 부하가 적다.

 

DELETE ACTION

  • CASCADE : 부모 삭제 시 자식도 같이 삭제
  • SET NULL : 부모 삭제 시 자식 필드를 NULL로 설정함
  • SET DEFAULT : 부모 삭제 시 자식 필드 디폴트 값으로 설정함
  • RESTRICT : 자식 테이블이 참조하고 있는 경우 삭제가 불가능함
  • NO ACTION : 참조 무결성을 위반하는 삭제/수정 액션을 취하지 않음

 

INSERT ACTION

  • AUTOMATIC : 부모 테이블에 PK 값이 없는 경우 부모 PK를 생성 후 자식을 입력
  • SET NULL : 부모 테이블에 PK 값이 없는 경우 자식 외부키를 NULL로 설정함
  • SET DEFAULT : 부모 테이블에 PK 값이 없는 경우 자식 외부키를 디폴트 값으로 설정함
  • DEPENDENT : 부모 테이블에 PK 값이 존재할 때만 자식 입력할 수 있음
  • NO ACTION : 참조 무결성을 위반하는 입력 액션을 취하지 않음

 

기본키 설정하는 4가지 방법

  • 테이블 생성 시 바로 PK 설정(단, PK로 만들 속성이 단일 속성일 경우)
CREATE TABLE 테이블 (
	컬럼1 VARCHAR(10) PRIMARY KEY,
    컬럼2 VARCHAR(10)
);
  • 테이블 먼저 생성 후 제약조건으로 추가
CREATE TABLE 테이블 (
	컬럼1 VARCHAR(10),
    컬럼2 VARCHAR(10)
);

ALTER TABLE 테이블 ADD CONSTRAINT 제약조건명 PRIMARY KEY (컬럼1);
  • 테이블 생성 시 동시에 PK 설정(PK 만들 속성의 개수 상관 없음)
CREATE TABLE 테이블 (
	컬럼1 VARCHAR(10) NOT NULL,
    컬럼2 VARCHAR(10),
    PRIMARY KEY (컬럼1)
);
  • 테이블 생성 시 동시에 PK 설정(PK 만들 속성의 개수 상관 없음, 이름 지정 가능)
CREATE TABLE 테이블 (
	컬럼1 VARCHAR(10) NOT NULL,
    컬럼2 VARCHAR(10),
    CONSTRAINT 제약조건명 PRIMARY KEY (컬럼1)
);

 

WITH GRANT OPTION

  • 해당 권한을 특정 사용자에게도 부여할 수 있는 권한 부여
  • 객체에 대한 권한 (SELECT, INSERT, UPDATE, DELETE 등)

 

WITH ADMIN OPTION

  • 지정된 테이블에 대한 모든 권한을 부여하고 특정 사용자에게도 부여할 수 있는 권한 부여
  • 시스템에 대한 권한 (CREATE TABLE, DROP USER 등) 

 

데이터 제어어(DCL)

  • GRANT
    • GRANT 권한명 ON 객체명 TO 유저명
  • REVOKE
    • REVOKE 권한명 ON 객체명 FROM 유저명
    • WITH GRANT OPTION을 REVOKE 하면 해당 사용자가 다른 사용자에게 부여한 권한도 모두 회수한다.
    • WITH ADMIN OPTION을 REVOKE 하면 해당 사용자의 권한만 회수한다.

 

ROLE

  • ROLE을 이용하면 권한 부여와 회수를 쉽게 할 수 있다.
  • ROLE은 CREATE ROLE 권한을 가진 유저에 의해 생성된다.
  • 한 사용자가 여러 개의 ROLE을 가질 수 있고, 여러 사용자들에게 동일한 ROLE을 부여할 수 있다.
  • GRANT와 REVOKE로 유저에게 ROLE을 부여하고 취소가 가능하다.
  • 유저는 ROLE에 ROLE을 부여하는 것도 가능하다.

 

VIEW의 장점

  • 독립성 : 테이블 구조가 변경되어도 뷰를 사용하는 응용프로그램은 변경하지 않아도 된다.
  • 편리성 : 복잡한 질의를 뷰로 생성함으로써 관련 질의를 단순하게 작성할 수 있다.
  • 보안성 : 숨기고 싶은 정보가 있다면 뷰를 생성할 시에 해당 컬럼을 빼고 생성하여 사용자에게 정보를 감출 수 있다.

 

트랜잭션 제어어(TCL)

  • COMMIT
  • ROLLBACK
  • SAVEPOINT : 동일 이름을 지정하면 덮어쓴다.

 

트랜잭션의 특성

  • 원자성 : 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되든지 아니면 전혀 실행되지 않은 상태로 남아있어야 한다.
  • 고립성 : 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.
  • 지속성 : 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.
  • 일관성 : 트랜잭션이 실행되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 일관성 있는 데이터베이스를 유지해야만 한다.

 

순수 관계 연산자

  • SELECT
  • PROJECT
  • JOIN
  • DIVISION

 

일반 집합 연산자

  • UNION : 합집합, 중복을 배제한다.
  • UNION ALL : 합집합, 중복 데이터를 모두 가져온다.
  • INTERSECT : 교집합, 중복을 배제한다.
  • EXCEPT(SQL Server) 또는 MINUS(오라클) : 차집합, 중복을 배제한다.

 

테이블명, 컬럼명 명명 규칙

  • 테이블명과 컬럼명은 반드시 문자로 시작해야한다.
  • A-Z, a-z, 0-9, 특수문자는 '_', '$', '#'만 사용이 가능하다.

 

SQL문 작성 주의사항

  • 문자 상수, 날짜 상수 표현 시 작은따옴표를 사용한다.
  • 오라클은 빈 문자열('') 입력 시 NULL로 입력된다.
  • SQL Server는 빈 문자열('') 입력 시 그대로 빈 문자열이 입력된다.
  • 문자와 숫자를 비교할 때 문자를 숫자로 파싱이 가능해서(TO_NUMBER 함수) 비교할 수 있으면 SQL문이 올바르게 실행된다.
  • 오라클은 문자 상수의 대소문자를 구분한다.
  • MSSQL, MySQL은 기본적으로 문자 상수의 대소문자를 구분하지 않는다.
  • SQL 문 연산 순서 : FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
  • ORDER BY 절에서만 SELECT 에서 사용된 별칭을 사용할 수 있다.
  • 오라클의 시간/분/초 표현 방법
    • 1/24 : 1시간 (1일을 24시간으로 나누기)
    • 1.5/24 : 1시간 30분 (1.5일을 24시간으로 나누기)
    • 1/24/60 : 1분 (1일을 24시간으로 나누고 60분으로 나누기)
    • 1/24(60/10) : 10분 (1일을 24시간으로 나누고 6분으로 나누기)
    • 1.5/24/(60/10) : 15분 (1.5일을 24시간으로 나누고 6분으로 나누기)
    • 1/24/60/60 : 1초 (1일을 24시간으로 나누고 60분으로 나누고 60초로 나누기)

 

AS(Alias)

  • Column Header를 변경하는 기능을 한다.
  • 쌍따옴표를 공백, 특수문자를 표현할 때 사용해야만 한다.
  • 오라클에서는 별칭을 사용할 때 AS를 사용할 수 없다. (생략해서 쓰면 됨)
  • SQL Server는 사용해도 되고, 생략해도 된다.

 

FROM 절

  • 오라클에서는 FROM절을 생략할 수 없다. 의미상 테이블이 필요 없다면 DUAL 테이블을 사용한다. (... FROM DUAL;)

 

단일행 함수

문자 함수

  • LOWER(대상)
  • UPPER(대상)
  • SUBSTR(대상, m, n)
  • INSTR(대상, 찾을문자열, m, n) : m위치에서 시작해서 n번째 발견된 문자열의 위치를 반환한다. m이 음수일 경우 스캔 방향 또한 바뀐다.
  • LTRIM(대상, 삭제문자열) : 삭제할 문자열을 왼쪽에서 삭제한다.
  • RTRIM(대상, 삭제문자열) : 삭제할 문자열을 오른쪽에서 삭제한다.
  • TRIM(대상) : 양쪽에서 공백을 삭제한다.
  • LPAD(대상, n, 문자열) : 대상의 왼쪽에 대상의 총 길이가 n이 되도록 문자열을 추가한다.
  • RPAD(대상, n, 문자열) : 대상의 오른쪽에 대상의 총 길이가 n이 되도록 문자열을 추가한다.
  • CONCAT(대상1, 대상2) : 대상1 뒤에 대상2를 이어붙인다.
  • LENGTH(대상) : 대상의 총 길이를 반환한다.
  • REPLACE(대상, 찾을문자열, 바꿀문자열) : 찾을문자열을 바꿀문자열로 치환한다.
  • TRANSLATE(대상, 찾을문자열, 바꿀문자열) : 1대1로 치환한다. 3번째 인자값을 생략하면 NULL이 반환된다.

 

숫자 함수

  • ABS(숫자)
  • ROUND(숫자, 자릿수) : 숫자를 자릿수까지 반올림한다. 자릿수가 음수이면 정수자리에서 반올림한다.
    • ROUND(123.456, 2) -> 123.46
    • ROUND(123.456, -2) -> 100
    • ROUND(272, -1) -> 270
  • TRUNC(숫자, 자릿수) : 숫자를 자릿수까지 유지하고 나머지는 버린다.
  • SIGN(숫자) : 양수면 1, 음수면 -1, 0이면 0을 반환한다.
  • FLOOR(숫자) : 작거나 같은 최대 정수를 반환한다.
  • CEIL(숫자) : 크거나 같은 최소 정수를 반환한다.
  • MOD(숫자1, 숫자2) : 숫자1을 숫자2로 나눈 나머지를 반환한다.
  • POWER(숫자1, 숫자2) : 숫자1을 숫자2만큼 거듭제곱한 수를 반환한다.
  • SQRT(숫자) : 제곱근을 반환한다.

 

날짜 함수

  • SYSDATE : 현재 날짜와 시간을 반환한다.
    • 2025/02/27 14:30:00
  • CURRENT_DATE : 현재 날짜를 반환한다.
    • 2025/02/27
  • CURRENT_TIMESTAMP : 현재 타임스탬프를 반환한다.
    • 2025/02/27 14:30:00 +09:00
  • ADD_MONTHS(날짜, n) : 날짜에서 n개월 후의 날짜와 시간을 반환한다. n이 음수인 경우 n개월 이전 날짜와 시간을 반환한다.
    • ADD_MONTHS(SYSDATE, 3) -> 2025/05/27 14:30:00
  • MONTHS_BETWEEN(날짜1, 날짜2) : 날짜1과 날짜2 사이의 개월 수를 반환한다.
  • LAST_DAY(날짜) : 날짜의 마지막 날짜와 시간을 반환한다.
  • NEXT_DAY(날짜, n) : 날짜 이후의 n 요일의 첫 번째 날짜와 시간을 반환한다. (n=1 일요일, n=2 월요일, n=3 화요일, n=7 토요일)

 

변환 함수

  • TO_NUMBER(문자) : 숫자 타입으로 변경한다.
  • TO_CHAR(대상, 포맷) : 대상이 날짜인 경우 날짜의 포맷을 변경한다. 대상이 숫자인 경우 숫자의 포맷을 변경한다.
    • TO_CHAR(SYSDATE, 'MM/DD-YYY') -> 02/25-2025
    • TO_CHAR(9000, '9,999') -> 9,000 : (천 단위 구분자)
    • TO_CHAR(9000, '09999') -> 09000 : (5자리로 반환하기 위해 대상의 앞을 0으로 채운다)
  • TO_DATE(문자, 포맷) : 문자를 포맷에 맞게 날짜와 시간을 반환한다.
    • TO_DATE('2025/02/25', 'YYYY/MM/DD') -> 2025/02/25 00:00:00
  • FORMAT(날짜, 포맷) : 날짜의 포맷을 변경하여 문자로 반환한다.
  • CAST(대상 AS 데이터타입) : 대상을 데이터타입으로 변경한다.

 

일반 함수

  • DECODE(대상, 값1, 리턴1, 값2, 리턴2, ..., 기본리턴값) : 대상이 값1이면 리턴1을 반환하고, 값2이면 리턴2를 반환하고, 매칭되지 않으면 기본리턴값을 반환한다. (기본리턴값을 생략하면 NULL이 반환된다.)
  • NVL(대상, 치환값) : 대상이 NULL이면 치환값을 반환한다.
  • NVL2(대상, 치환값1, 치환값2) : 대상이 NULL이면 치환값2로 치환하고, NULL이 아니면 치환값1로 치환한다.
  • COALESCE(대상1, 대상2, ..., 기본리턴값) : 대상들 중 가장 처음으로 NULL이 아닌 값을 반환한다. 모두 다 NULL이라면 기본리턴값을 반환한다.
  • ISNULL(대상, 치환값) : 대상이 NULL이면 치환값을 반환하고, NULL이 아니면 대상을 반환한다. (SQL Server 함수)
  • NULLIF(대상1, 대상2) : 두 값이 같으면 NULL을 반환하고, 다르면 대상1을 반환한다.

 

CASE문

SELECT
    CASE 
        WHEN expression = value1 THEN result1
        WHEN expression = value2 THEN result2
        ELSE default_result
    END
FROM table;


/* 축약형 */
SELECT
    CASE expression
        WHEN value1 THEN result1
        WHEN value2 THEN result2
        ELSE default_result
    END
FROM table;

 

복수행(다중행) 함수

집계 함수

NULL을 제외하고 연산하는 것이 원칙이다. (단, COUNT(*) == COUNT(1) == COUNT(0) ... 은 예외적으로 NULL을 포함해서 카운트한다.)

  • COUNT(대상)
  • SUM(대상)
  • AVG(대상)
  • MIN(대상)
  • MAX(대상)
  • MAX(대상)
  • VARIANCE(대상) : 분산 반환한다.
  • STDDEV(대상) : 표준편차 반환한다.

 

그룹 함수

  • GROUPING SETS(컬럼1, 컬럼2) : 각 인수들의 GROUP BY 결과를 합친 결과이다.
    • GROUPING SETS(()) 또는 GROUPING SETS(NULL)은 전체에 대한 총합 행을 출력한다.
    • GROUPING SETS의 인수는 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 동일하다.
  • ROLLUP(컬럼1, 컬럼2) : GROUPING SETS((컬럼1, 컬럼2)) + GROUPING SETS(컬럼1) + GROUPING SETS(NULL) 이다.
    • ROLLUP의 인수는 계층구조이므로 인수의 순서가 바뀌면 결과도 바뀌게 된다.
  • CUBE(컬럼1, 컬럼2) : GROUPING SETS((컬럼1, 컬럼2)) + GROUPING SETS(컬럼1) + GROUPING SETS(컬럼2) + GROUPING SETS(NULL) 이다.
    • CUBE의 인수는 평등한 관계이므로 인수의 순서가 바뀌어도 결과는 동일하다.
    • ORDER BY를 사용해서 정렬할 수 있다.
    • 연산이 매우 많다.

 

윈도우 함수

  • PARTITION BY : GROUP BY와 비슷한 역할을 한다. 기준 컬럼에 따라서 윈도우 처리 범위를 모은다.
  • ORDER BY : 정렬작업으로 행과 행 사이의 관계를 정의해주는 역할을 한다. ORDER BY를 먼저 처리하고 윈도우 함수를 적용하자.
  • WINDOWING 절
    • ROWS : 현재 ROW 위치에서 물리적인 범위
    • RANGE : 현재 ROW 값을 기준으로 논리적인 범위
    • UNBOUNDED PRECENDING : 처음 행부터 포함
    • n PRECENDING : 현재 행에서 n개 이전까지 포함
    • CURRENT ROW : 현재 행 포함
    • n FOLLOWING : 현재 행에서 n개 이후까지 포함
    • UNBOUNDED FOLLOWING : 마지막 행까지 포함
  • RANK : 중복하는 등수가 존재하면, 다음 등수는 건너뛰어 매겨진다. (1, 2, 3, 3, 5)
  • DENSE_RANK : 중복하는 등수가 존재해도 다음 등수는 연속적으로 매겨진다. (1, 2, 3, 3, 4)
  • ROW_NUMBER : 중복하는 등수를 허용하지 않는다. (1, 2, 3, 4, 5)
  • FIRST_VALUE : 윈도우에서 가장 처음에 나오는 값
  • LAST_VALUE : 윈도우에서 가장 나중에 나오는 값
  • LAG(컬럼, 숫자1, 숫자2) : 파티션에서 값에 대해서 현재행 이전 숫자1의 행을 구한다. 그 행이 없다면 숫자2(디폴트값)를 반환한다.
  • LEAD(컬럼, 숫자1, 숫자2) : 파티션에서 값에 대해서 현재행 이후 숫자1(오프셋)의 행을 구한다. 그 행이 없다면 숫자2(디폴트값)를 반환한다.
  • NTILE(n) : 파티션 별로 n등분하여 조를 나눈다. 이때 나머지는 상위 조에게 순서대로 배정되게 한다.
  • RATIO_TO_REPORT : 파티션 내 주어진 컬럼 값의 합계에 대한 행별 백분율을 소수점으로 구하는 함수
  • PERCENT_RANK : 파티션 별 윈도우에서 제일 먼저 나오는 것을 0으로, 제일 늦게 나온느 것을 1로 하여 값이 아닌 행의 순서별 백분율을 구하는 함수
  • CUME_DIST : 파티션 별 윈도우의 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율을 구하는 함수

 

WHERE 절

  • 집계 함수를 사용할 수 없다.
  • AND와 OR로 여러 조건을 동시에 전달할 수 있다.

연산자

  • =
  • !=, <>, ^= : 같지 않다.
  • >
  • >=
  • <
  • <=
  • BETWEEN a AND b
  • IN(a, b, c) : a 또는 b 또는 c인 조건을 검색한다.
  • LIKE
    • % : 자릿수 제한이 없는 모든 문자를 의미한다.
    • _ : 한 자릿수를 의미하여 하나의 문자를 의미한다.
    • ENAME LIKE 'S%' : S로 시작하는 ENAME
    • ENAME LIKE '%S' : S로 끝나는 ENAME
    • ENAME LIKE '_S%' : 두 번째 글자가 S로 시작하는 ENAME
  • ESCAPE
    • LIKE와 같이 쓰인다.
    • 문자열을 검색할 때 '_', '%'와 같은 와일드카드를 진짜 문자열로 검색하고 싶을 때 사용한다.
    • ENAME LIKE 'A_#%' ESCAPE '#' : '#' 기호 뒤의 '%'는 와일드카드가 아니라 내가 검색하길 원하는 특수문자이다.
  • IS NULL
  • IS NOT NULL
  • a AND b
  • a OR B
  • NOT a

 

연산자 우선 순위

  1. 비교 연산자(=, !=, <, > 등)
  2. SQL 연산자(IS NULL, LIKE, BETWEEN, IN, EXISTS 등)
  3. NOT
  4. AND
  5. OR

 

GROUP BY 절

  • 여러개의 행들을 그룹으로 묶는다고 생각하자.
  • GROUP BY 절에 포함되지 않은 컬럼을 SELECT 절에 사용할 수 없다. (집계 함수로는 사용이 가능하다.)
  • 그룹화를 한 이후의 조건문은 HAVING 절에서 사용해야 한다.
  • 별칭 사용이 불가능하다.

 

HAVING 절

  • 집계 함수 결과를 조건으로 사용할 때 사용한다.
  • SELECT 절에서 사용된 별칭을 사용할 수 없다.
  • GROUP BY 수행 후 HAVING 절에 만족하는 그룹이 없으면 아무것도 출력하지 않는다.(공집합을 출력한다.)
  • HAVING 절은 GROUP BY 절을 사용하지 않아도 집계 함수와 함께 사용할 수 있다.

 

ORDER BY 절

  • 출력될 행의 순서를 변경하기 위해서 사용한다.
  • ASC(오름차순), DESC(내림차순)으로 순서를 결정할 수 있다. (생략 시 오름차순으로 정렬된다.)
  • GROUP BY가 포함되어 있으면 SELECT List, GROUP BY List에 포함된 컬럼만 사용할 수 있다.
  • 유일하게 SELECT 절에서 정의한 별칭을 사용할 수 있다.
  • SELECT 절에 선언된 컬럼 순서대로의 숫자를 전달할 수 있다.
  • 오라클은 NULL을 포함한 값을 오름차순 정렬 시 NULL을 마지막에 배치한다. 내림차순 정렬 시 NULL을 처음에 배치한다. (NULLS LAST, NULLS FIRST로 변경 가능하다.)
  • SQL Server는 NULL을 포함한 값을 정렬 시 NULL을 처음에 배치한다. 내림차순 정렬 시 NULL을 마지막에 배치한다.

 

JOIN

  • FROM 절에 조인할 테이블을 나열한다.
  • 오라클 표준은 테이블 나열 순서가 중요하지 않지만, ANSI 표준은 OUTER JOIN 시 테이블 나열 순서가 중요하다.
  • 오라클 표준은 WHERE 절에서 조인 조건을 작성한다.
  • N개의 테이블을 조인하려면 최소 N-1개의 조인 조건이 필요하다.

 

JOIN 종류

  • 조건의 형태에 따른 구분
    • EQUI JOIN : NULL 끼리 같은 것은 결과로 표현되지 않는다.
    • NON EQUI JOIN
  • 조인 결과에 따른 구분
    • INNER JOIN
    • OUTER JOIN : LEFT, RIGHT, FULL
  • NATURAL JOIN
  • CROSS JOIN
  • SELF JOIN

 

EQUI JOIN

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼 = 테이블2.컬럼;

 

NON EQUI JOIN

SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼 비교조건 테이블2.컬럼;

 

 

SELF JOIN

SELECT T1.컬럼1, T2.컬럼1
FROM 테이블 T1, 테이블 T2
WHERE T1.컬럼2 = T2.컬럼1;

 

 

표준 JOIN

  • ANSI 표준으로 작성되는 INNER JOIN, OUTER JOIN, CROSS JOIN, NATURAL JOIN 을 말한다.

 

INNER JOIN

  • 조인 조건이 일치하는 행들을 출력한다.
  • 오라클 표준에서의 기본 조인이다.
  • ANSI 표준의 경우는 FROM 절에 INNER JOIN 또는 JOIN 키워드를 명시한다.
  • ANSI 표준은 USING 또는 ON 조건절을 반드시 사용해야 한다.

 

ON 절

  • 조인할 컬럼명이 서로 다르더라도 사용할 수 있다.
  • 괄호를 생략할 수 있다.
  • 컬럼명이 같을 경우에는 테이블 이름 또는 별칭을 사용해서 명확하게 지정해야 한다.
  • ON 절에서는 조인 조건을 명시하고, WHERE 절에서는 일반 조건을 명시한다.
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 INNER JOIN 테이블2
ON 테이블1.조인컬럼 = 테이블2.조인컬럼;

 

USING 절

  • 조인할 컬럼명이 같을 경우에만 사용할 수 있다.
  • 별칭이나 테이블 이름과 같은 접두사를 사용할 수 없다.
  • 괄호를 반드시 사용해야 한다.
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 INNER JOIN 테이블2
USING (동일한컬럼명);

 

 

OUTER JOIN

  • JOIN 조건에서 동일한 값이 없는 행도 결과 테이블에 포함하기 위해 사용한다.
  • 테이블 기준 방향에 따라 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN으로 구분한다.
  • OUTER는 생략 가능하다.

 

LEFT OUTER JOIN

  • 오라클 표준에서는 WHERE 절에서 기준이 되는 테이블의 반대 테이블의 조건 컬럼 뒤에 (+)를 붙인다.
  • 왼쪽 테이블은 모두 다 결과 테이블에 포함하고 오른쪽 테이블에서 같은 값이 없는 경우 NULL로 컬럼을 채운다.
  • Outer의 대상이 되는 테이블(LEFT)의 조건절이 ON 절에 위치하면 원하는 결과가 출력되지 않는다.
/* 오라클 표준 */
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.조인컬럼명 = 테이블2.조인컬럼명(+);

/* ANSI 표준 */
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 LEFT OUTER JOIN 테이블2
ON 테이블1.조인컬럼명 = 테이블2.조인컬럼명;

 

FULL OUTER JOIN

  • FULL OUTER JOIN은 LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과의 UNION 연산과 동일하다. (오라클에서 FULL OUTER JOIN을 사용하려면 이 방식으로 사용해야 한다.)
  • LEFT OUTER JOIN의 결과와 RIGHT OUTER JOIN의 결과를 동시에 출력하되, 중복 데이터는 한 번만 포함된다.
  • 오라클 표준에서 FULL OUTER JOIN은 없다. ((+) 기호를 양 쪽 테이블에 모두 명시할 수 없다.)
  • 성능적으로도 좋지 않다.

 

NATURAL JOIN

  • 두 테이블 간의 동일한 컬럼명들에 대해 EQUI JOIN을 수행한다.
  • USING, ON, WHERE 절에서 조건을 정의할 수 없다.
  • 조인에 사용되는 컬럼들은 서로 데이터 유형이 동일해야 하고, 접두사를 사용할 수 없다.
  • NULL 값의 경우에는 서로 같더라도 결과 테이블에 포함되지 않는다.
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 NATURAL JOIN 테이블2;

 

CROSS JOIN

  • 두 테이블 간에 JOIN 조건이 없는 경우 생성 가능한 모든 데이터들의 조합을 출력한다. (카테시안 곱)
  • NULL 값 또한 결과 테이블에 포함된다.
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 CROSS JOIN 테이블2;

 

 

TOP N 쿼리

  • 페이징 처리를 효과적으로 수행하기 위해 사용한다.
  • 전체 결과에서 특정 N개를 추출한다.
  • 오라클에서 행의 번호를 나타내는 가상 컬럼은 ROWNUM 이다.
  • SQL Server에서 상위 행을 출력하는 함수는 TOP 함수이다.

 

ROWNUM

  • 출력된 데이터를 기준으로 행 번호가 부여된다.
  • 서브쿼리를 이용해서 정렬을 먼저 하고 난 후에 수행해야 한다.
/* 급여가 높은 순서대로 상위 5명의 직원 출력 */
SELECT *
FROM (SELECT * FROM emp ORDER BY sal DESC)
WHERE ROWNUM <= 5
ORDER BY sal DESC;

 

TOP 함수

  • 별도의 서브쿼리를 이용해서 정렬하지 않고 ORDER BY 절의 정렬 후 원하는 데이터를 추출할 수 있다.
  • WITH TIES 옵션은 동일한 데이터가 있을 경우 함께 출력하는 옵션이다.
/* 급여가 높은 순서대로 상위 2명의 직원 출력 */
SELECT TOP(2) ename, sal
FROM emp
ORDER BY sal DESC;

/* 급여가 높은 순서대로 상위 2명의 직원을 출력하는데 두 번째로 높은 급여의 직원이 여러명이라면 같이 출력 */
SELECT TOP(2) WITH TIES ename, sal
FROM emp
ORDER BY sal DESC;

 

OFFSET, FETCH

  • 출력될 행의 수를 제한한다.
  • ORDER BY 절 뒤에 사용한다.
  • 오라클 12 C 버전 이상부터 지원한다.
  • SQL Server도 지원한다.
  • OFFSET은 N개의 행을 건너뛴다.
  • FETCH는 M개의 행을 가져온다.
ORDER BY 컬럼 OFFSET N {ROW | ROWS}
FETCH {FIRST | NEXT} M {ROW | ROWS} ONLY

 

계층형 질의

  • 부모와 자식과 같은 구조를 계층형 구조라고 부른다.
  • 오라클에서 지원하고, SQL Server에서는 지원하지 않는다.
  • START WITH 절을 먼저 보고, CONNECT BY 절을 보고 WHERE 절을 보면 된다.
  • START WITH : 계층 구조 전개의 시작 위치이다. 무조건 결과 테이블에 포함된다.
  • CONNECT BY : 다음에 전개될 자식 데이터를 지정한다.
  • PRIOR : CONNECT BY 절, SELECT 절, WHERE 절에 사용되며, 이전 레벨 데이터를 지정한다. PRIOR이 붙은 쪽이 부모 역할을 한다고 보면 된다!
    • 부모 = PRIOR 자식 : 순방향
    • 자식 = PRIOR 부모 : 역방향
    • PRIOR 자식 = 부모 : 순방향 (프자부순)
    • PRIOR 부모 = 자식 : 역방향 (프부자역)
    • 자식 쪽에 PRIOR가 붙어 있으면 순방향이다.
  • WHERE : 모든 전개 수행 후에 지정된 조건을 만족하는 데이터만을 추출한다.
  • ORDER SIBLINGS BY : 계층구조를 유지하면서 정렬한다. 즉, 계층 끼리 비교한다.

 

가상 컬럼

  • LEVEL : 루트 데이터가 1이면 하위 데이터는 2이다. 리프 데이터까지 1씩 증가한다.
  • CONNECT_BY_ISLEAF : 전개 과정에서 해당 데이터가 리프 데이터이면 1, 아니면 0이다.
  • SYS_CONNECT_BY_PATH(컬럼명, '경로분리자') : 루트 데이터로부터 현재 전개할 데이터까지의 경로를 표시한다.
  • CONNECT_BY_ROOT(컬럼명) : 현재 전개할 데이터의 루트 데이터를 표시한다.

 

서브 쿼리

  • 스칼라 서브 쿼리 : 서브 쿼리의 결과가 1행, 1열인 서브쿼리를 의미한다.
    • SELECT 절에 사용하는 서브 쿼리이다. 
    • ORDER BY를 사용할 수 없다.
    • 메인 쿼리의 컬럼을 사용할 수 없다.
  • 단일 행 서브 쿼리 : 서브 쿼리의 결과가 단 1건 이하인 서브 쿼리를 의미한다. =, <, > 등 비교 연산자를 사용한다.
  • 다중 행 서브 쿼리 : 서브 쿼리의 결과가 여러 행인 서브 쿼리를 의미한다. IN, ALL, ANY, SOME, EXIST 비교 연산자를 사용한다.
    • IN : 서브 쿼리의 결과 중 하나라도 일치하면 조건이 TRUE
    • ANY, SOME : 서브 쿼리의 결과와 하나 이상 일치하면 조건이 TRUE
    • ALL : 서브 쿼리의 결과와 모두 일치하면 조건이 TRUE
    • EXISTS : 데이터의 존재 여부를 확인할 때 사용함. 존재하면 TRUE
  • 다중 컬럼 서브 쿼리 : 서브 쿼리의 결과로 여러 컬럼을 반환하는 경우이다.

 

INLINE VIEW(인라인 뷰) == DYNAMIC VIEW(동적 뷰)

  • FROM 절에 SELECT 문을 사용하여 가상의 테이블을 만드는 효과를 말한다.
  • FROM 절에 사용하는 서브 쿼리이다.
  • 인라인 뷰에서는 메인 쿼리의 값을 사용할 수 없다.
  • 메인 쿼리에서 인라인 뷰의 컬럼을 사용할 수 있다.
  • 인라인 뷰에서 집계 함수를 사용하게 될 경우 별칭을 반드시 지정해야만 한다.
  • 대소 비교가 가능해진다.

 

제약 조건

  • UNIQUE KEY
  • NOT NULL
  • PRIMARY KEY : UNIQUE & NOT NULL
  • CHECK : 입력 값 범위를 제한한다.
  • FOREIGN KEY : NULL을 허용한다.

 

PIVOT

  • 행을 열로 바꾼다.
SELECT *
FROM 테이블
PIVOT (집계함수(대상) FOR 피벗할컬럼 IN (열1, 열2, ...));

 

UNPIVOT

  • 열을 행으로 바꾼다.
SELECT *
FROM 테이블
UNPIVOT (대상컬럼 FOR 피벗해제할컬럼 IN (열1, 열2, ...)

 

정규표현식

  • 메타 문자와 리터럴 문자로 구분된다.
  • 메타 문자 : 문자 그 자신이 가진 의미가 아니라 다른 의미로 사용되는 문자이다.
    • \ : 메타 문자를 리터럴 문자로 표시할 때 사용. Escape Character
    • \d : 숫자
    • \D : 숫자가 아닌 모든 것
    • \w : 글자(영어, 숫자, 한글)와 _(언더바)
    • \W : 글자가 아닌 모든 것(특수기호(언더바가 포함되지 않는다.) 또는 공백)
    • \s : 공백
    • \t : 탭
    • \n : 개행
    • [[:digit:]] : 숫자
    • [[:alpha:]] : 문자
    • [[:alnum:]] : 숫자와 문자
    • [[:punct:]] : 특수기호(언버바를 포함한다.)
    • ^ : 개행으로 나뉜 문자열의 시작 지점
    • $ : 개행으로 나뉜 문자열의 끝 지점
    • . : 임의의 하나의 문자
    • ? : 선행 문자가 1개 이하(0개 또는 1개)
    • * : 선행 문자가 0개 이상
    • + : 선행 문자가 1개 이상
    • {n} : n회
    • {n,} : n회 이상
    • {n,m} : n회 이상 m회 이
    • [ ] : 대괄호 안의 문자들 중 하나와 일치
    • [ ^ ] : 대괄호 안의 문자들을 제외한 나머지 문자들 중 하나와 일치
    • [ - ] : 연속 문자의 범위를 지정
    • ( ) : 소괄호로 묶인 표현식을 한 단위로 다룸
  • 리터럴 문자 : 문자 그 자체가 가진 의미 그대로 사용되는 문자로, 정규표현식에서 패턴 매칭을 수행할 때 처리되는 최소 단위이다.
  • 오라클 10g 버전부터 완전한 정규표현식을 지원한다. 
    • REGEXP_LIKE(대상, 찾을문자열, [옵션]) : WHERE 절에서만 사용이 가능하다.
    • REGEXP_REPLACE(대상, 찾을문자열, [바꿀문자열], [검색위치], [발견횟수], [옵션])
    • REGEXP_INSTR(대상, 찾을문자열, [시작위치], [발견횟수])
    • REGEXP_SUBSTR(대상, 패턴, [검색위치], [발견횟수], [옵션], [추출그룹번호])오라클 10g 버전부터 완전한 정규표현식을 지원한다.
    • REGEXP_COUNT(대상, 찾을문자열, [시작위치], [옵션])
      • 옵션은 아래와 같다.
      • c : 대소문자를 구분하여 검색
      • i : 대소문자를 구분하지 않고 검색
      • m : 패턴을 다중라인으로 선언 가능
  • SQL Server는 완전한 정규표현식을 지원하지 않고, 유사한 패턴 문자열을 지원한다. PATINDEX 함수와 LIKE 연산자에 사용할 수 있다.
    • % : 0개 이상의 문자
    • _ : 임의의 한 문자
    • [ ] : 대괄호 안의 문자들 중 하나와 일치
    • [ - ] : 연속 문자의 범위를 지정
    • [ ^ ] : 대괄호 안의 문자들을 제외한 나머지 문자들 중 하나와 일치
저작자표시 비영리 변경금지 (새창열림)
'SQLD' 카테고리의 다른 글
  • 2025 SQLD 1과목 개념 요약 정리
SiwonHae
SiwonHae
프로그래밍을 공부하고 있는 학생입니다.
  • SiwonHae
    시원해의 블로그
    SiwonHae
  • 전체
    오늘
    어제
    • 전체보기 (150) N
      • PS(Problem Solving) (95)
        • C (25)
        • C++ (33)
        • JAVA (37)
      • Algorithm & Data Structure (13)
      • Computer Science (12)
        • Network (2)
        • Design Pattern (10)
      • Back-end (6)
        • Spring (5)
      • Front-end (1)
        • React (1)
      • JAVA (4) N
      • 정보처리기사 (17)
      • SQLD (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
SiwonHae
2025 SQLD 2과목 개념 요약 정리
상단으로

티스토리툴바