Career/SQLD

[SQLD] 2과목. SQL 기본 및 활용 - 1

by somida 2021. 5. 12.

01. SQL 기본

기본 SQL

WHERE절

SQL을 사용해 DB에서 데이터를 조회할 때 원하는 데이터만 검색하기 위해 FROM절 다음에 위치해 조건을 설정해 조회

  • 구성
    • 칼럼명(보통 조건식의 좌측)
    • 비교 연산자
    • 문자/숫자/표현식(보통 조건식 우측에 위치)
    • 비교 칼럼명(JOIN사용 시)

연산자

비교 연산자 =, >, <, >=, <=  
SQL 연산자 BETWEEN a AND b a와 b의 값 사이에 있다
IN (List) 리스트에 있는 값 중 어느 하나라도 일치 하는지
LIKE '비교문자열' 비교문자열과 형태가 일치하는지
IS NULL NULL인 경우
논리 연산자 AND 앞과 뒤의 조건이 참이면 결과도 참
OR 앞이 참이거나 뒤가 참이어야 결과도 참
NOT 뒤에 오는 조건에 반대되는 결과
부정 비교
연산자
!=, ^=, <> 같지 않다
NOT 칼럼명 =  ~와 같지 않다
NOT 칼럼명 > ~보다 크지 않다
부정 SQL
연산자
NOT BETWEEN a AND b a와 b의 값 사이에 있지 않다
NOT IN (List) List 값과 일치하지 않는다
IS NOT NULL NULL 값을 갖지 않는다

 

연산자 우선순위

  1. 괄호로 묶은 연산
  2. 부정 연산자(NOT)
  3. 비교 연산자(=, <, >, <=, >=)와 SQL 연산자(BETWEEN, IN, LIKE, IS NULL)
  4. 논리 연산자 중 AND, OR 순

 

NULL

  • 모르는 값. 값의 부재
  • 공백 문자 혹은 숫자 0과 동일하지 않음
  • NULL과의 모든 비교(IS NULL 제외)는 알 수 없음을 반환
  • Oracle에서 ''를 NULL로 처리
  • 테이블을 생성할 때, NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL값 포함 가능
  • 결괏값을 NULL이 아닌 다른 값을 얻고자 할 때, NVL/ISNULL 함수를 사용

 

NULL 연산

  • NULL값과의 연산(+, -, *, /)은 NULL 값을 Return
  • NULL값과의 비교 연산은 거짓(FALSE)을 Return
  • 특정 값보다 크다, 적다고 표현할 수 없음

 

 

DML(데이터 조작어)

DB에 들어있는 데이터를 조회하거나 검색, 혹은 데이터에 변형을 가하는 종류의 명령어

DB 사용자가 응용프로그램이나 질의어를 통해 저장된 DB를 실질적으로 접근하는 데 사용

  • SELECT
  • INSERT
  • UPDATE
  • DELETE

 

종류

  • 절차적 DML : 사용자가 어떻게(How) 데이터를 접근해야 하는지 명세
  • 비절차적 DML : 사용자가 무슨(What) 데이터를 원하는 지만을 명세

 

ALL / DISTINCT

  • ALL : Default 옵션
  • DISTINCT : 중복된 데이터가 있는 경우 1건으로 처리해 출력

 

INSERT 규칙

NO ACTION 참조 무결성을 위반하는 입력 액션 취하지 않음
SET NULL Master 테이블에 PK가 없을 경우, Child 외부키를 Null값으로 처리
SET DEFAULT Master 테이블에 PK가 없을 경우, Child 외부키를 지정된 기본값으로 처리
AUTOMATIC Master 테이블에 PK가 없을 경우, Master PK 생성 후 Child 입력
DEPENDENT Master 테이블에 PK가 존재할 때만 Child 입력 허용
  • INSERT를 사용할 땐 삽입 칼럼을 명시하지 않은 경우 모든 칼럼을 삽입해야 함
INSERT INTO 테이블명 (COL1, COL3, COL5) VALUES(1, 3, 5);

INSERT INTO 테이블명 VALUES(1, 2, 3, 4, 5);

 

 

UPDATE

UPDATE 테이블명 SET 컬럼명='값';

 

DELETE / MODIFY 규칙

NO ACTION 참조무결성을 위반하는 삭제/수정 액션 취하지 않음
RESTICT Child 테이블에 PK값이 없는 경우만 Master 삭제 허용
CASCADE Master 삭제 시 Child 같이 삭제
SET NULL Master 삭제 시 Child 해당 필드 NULL 값으로 설정
SET DEFAULT Master 삭제 시 Child 해당 필드 Default 값으로 설정

 

DDL(데이터 정의어)

테이블의 구조를 생성, 변경, 삭제, 이름을 바꾸는 것과 같은 데이터 구조 정의하는 데 사용되는 명령어

스키마, 도메인, 테이블, 뷰, 인덱스를 정의하거나 변경 또는 제거할 때 사용

  • CREATE
  • ALTER
  • DROP
  • RENAME

 

TABLE 생성 시 제약 조건

PRIMARY KEY 테이블에 저장된 행 데이터를 고유하게 식별하기 위한 기본키
하나의 테이블엔 하나의 기본키(UNIQUE), NOT NULL의 특성
UNIQUE KEY 테이블에 저장된 행 데이터를 고유하게 식별하기 위한 고유키 정의
테이블에 중복되는 값은 없지만 NULL 입력이 가능
NOT NULL NULL 값의 입력을 금지
CHECK 입력할 수 있는 값의 범위 등을 제한. (TRUE or FALSE로 평가할 수 있는 논리식을 지정)
FOREIGN KEY 테이블 간의 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사
테이블 생성시 설정 가능 / NULL 값 가질 수 있음
한 테이블에 여러 개 존재 가능 / 참조 무결성 제약 받을 수 있음

 

TABLE 생성 시 주의사항

  • 테이블명은 객체를 의미할 수 있는 적절한 이름 사용. 가능한 단수형
  • 다른 테이블명과 중복 X
  • 한 테이블 내에서 칼럼명 중복 X
  • 테이블 이름을 지정하고 각 칼럼들은 괄호 ()로 묶어 지정
  • 각 칼럼들은 콤마 , 로 구분하고, 생성문의 끝은 항상 세미콜론 ;으로 끝남
  • 칼럼 뒤에 항상 데이터 유형이 지정되어야 하고, 칼럼에 대해서는 다른 테이블까지 고려해 DB내에 일관성 있게 사용
  • 테이블명, 칼럼명은 반드시 문자로 시작하고, 사전에 정의한 예약어 사용 불가
  • A-Z, a-z, 0-9, _, $, # 문자만 허용

 

ALTER 사용

  • SQLServer
    • 동시에 여러 개의 칼럼을칼럼을 수정하는 구문은 지원 X
    • 괄호 사용 X
ALTER TABLE 테이블명 ALTER COLUMN 칼럼명 데이터유형 [DEFAULT 식][NOT NULL];
  • Oracle
ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 데이터유형 [DEFAULT 식][NOT NULL];

 

불필요한 컬럼 삭제

ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

 

TABLE 이름 변경

RENAME 테이블명 TO 변경할 테이블명

 

TABLE 삭제

구분 DROP TRUNCATE DELETE
언어 DDL DDL(일부는 DML 성격) DML
의미 테이블 구조 완전 삭제 테이블을 최초 생성된 초기상태로 만듬 데이터만 삭제
Rollback 불가능 불가능 Commit이전에는 가능
Commit Auto Auto 사용자 Commit
데이터 삭제 O O O
디스크 사용량 초기화 O O X
스키마 정의 삭제 O X X
  • TRUNCATE는 UNDO를 위한 데이터를 생성하지 않아서 동일 데이터량 삭제 시 DELETE보다 빠름

 

DCL(데이터 제어어)

DB에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령어

  • GRANT
  • REVOKE

 

TCL(트랜잭션 제어어)

논리적인 작업의 단위를 묶어 DML에 의해 조작된 결과를 작업 단위별로 제어하는 명령어

  • Commit : 데이터에 대한 변경사항을 DB에 영구적으로 반영
  • Rollback : 데이터에 대한 변경사항을 모두 폐기하고 변경 전의 상태로 되돌리는 것
  • Savepoint : 롤백 시 트랜잭션에 포함된 전체 작업이 아닌 현시점에서 SAVEPOINT까지의 일부 작업만 롤백 가능
[ORACLE]
SAVEPOINT SVPT1;
...
ROLLBACK TO SVPT1;

[SQL SERVER]
SAVE TRANSACTION SVTR1;
...
ROLLBACK TRANSACTION SVTR1;

 

특징

  • Oracle에서는 DDL문장 수행 후 자동 Commit 수행
  • Oracle에서 DDL문장의 수행은 내부적으로 트랜젝션을 종료시키므로 앞의 명령어는 수행됨
  • SQL Server에서는 DDL문장 수행 후 자동으로 Commit 수행하지 않음
  • SQL Server에서는 자동 Commit이 진행되지 않기 때문에 ROLLBACK문장으로 인해 앞의 명령어는 수행 X

 

트랜잭션

DB의 논리적 연산 단위로 밀접히 관련되어 분리될 수 없는 한 개 이상의 DB조작을 가리킴

특성

원자성(Atomicity) 트랜잭션에 정의된 연산들은 모두 성공적으로 실행되던지 전혀 실행되지 않은 상태로 남아 있어야함
일관성(Consistency) 트랜잭션이 실행되기 전의 DB내용에 오류가 없다면 실행 이후에도 DB내용에 오류가 있으면 안됨
고립성(Isolation) 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안됨
지속성(Durability) 트랜잭션이 성공적으로 수행되면 갱신한 DB의 내용은 영구적으로 저장됨

 

격리성이 낮은 경우 발생하는 문제점

Dirty Read 다른 트랜잭션에 의해 수정되었지만 아직 Commit되지 않은 데이터를 읽는 것
Non-Repeatable Read 한 트랜잭션 내에서 같은 쿼리 두 번 수행했는데,
그 사이 다른 트랜잭션이 값을 수정 또는 삭제해 쿼리 결과가 다르게 나타나는 현상
Phantom Read 한 트랜잭션 내에서 같은 쿼리 두 번 수행했는데,
첫 번째 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상

 

 

함수

종류

  • 내장 함수 : 벤더에서 제공하는 함수
    • 단일행 함수
    • 다중행 함수 : 집계 함수, 그룹 함수, 윈도 함수
  • 사용자 정의 함수

 

단일행 함수

  • SELECT, WHERE, ORDER BY, UPDATE의 SET 절에 사용 가능
  • 1:M의 두 테이블을 조인할 경우라도 M 쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 사용 가능
  • 다중행 함수도 동일하게 단일 값만을 반환

Oracle/SQL Server함수로 표시 ('/'가 없는 것은 공통 함수)

문자형
함수
문자를 입력하면 문자나 숫자 값 반환 LOWER, UPPER, SUBSTR/SUBSTRING, LENGTH/LEN, LTRIM, RTRIM, TRIM, ASCII
숫자형
함수
숫자를 입력하면 숫자 값 반환 ABS, MOD, ROUND, TRUNC, SIGN, CHR/CHAR, CEIL/CEILING, FLOOR, EXP, LOG, LN, POWER, SIN, COS, TAN
날짜형
함수
DATE 타입의 값 연산 SYSDATE/GETDATE, EXTRACT/DATEPART, TO_NUMBER(TO_CHAR(d, 'YYYY'|'MM'|'DD')) / YEAR|MONTH|DAY
변환형
함수
문자, 숫자, 날짜형 값의 데이터 타입을 변환 TO_NUMBER, TO_CHAR, TO_DATE / CAST, CONVERT
NULL
관련 함수
NULL을 처리하기 위한 함수 NVL / ISNULL, NULLIF, COALESCE
LOWER(문자열), UPPER(문자열) 문자열의 알파벳 문자를 소문자로 바꿔줌, 문자열의 알파벳 문자를 대문자로 바꿔줌
ASCII(문자) 문자나 숫자를 ASCII 코드 번호로 바꿔줌
CHR/CHAR(ASCII번호) ASCII 코드 번호를 문자나 숫자로 바꿔줌
CONCAT(문자열1, 문자열2) 문자열 1과 문자열 2를 연결('||'나 '+'와 동일)
SUBSTR/SUBSTRING(문자열, m[, n]) 문자열 중 M위치에서 N개의 문자 길이에 해당하는 문자를 반환
LENGTH/LEN(문자열) 문자열 개수를 숫자값으로 반환
LTRIM(문자열 [, 지정문자]) 문자열의 첫 문자로 확인해 지정문자가 나타나면 해당 문자 제거
RTRIM(문자열 [, 지정문자]) 문자열의 마지막 문자부터 확인해 지정 문자가 나타나는 동안 해당 문자 제거
TRIM 문자열에서 머리말, 꼬리말, 또는 양쪽에 있는 지정 문자를 제거

 

 

단일행 NULL 관련 함수

Oracle/SQL Server함수로 표시 ('/'가 없는 것은 공통 함수)

NVL(표현식1, 표현식2)
/ ISNULL(표현식1, 표현식2)
표현식1의 결과값이 NULL이면 표현식2의 값 출력
표현식1과 표현식2의 결과 데이터 타입이 같아야 함
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 Return
COALESCE(표현식1, 표현식2...) 임의의 표현식에서 NULL이 아닌 최초의 표현식 나타냄
모든 표현식이 NULL이면 NULL Return

 

집계 함수의 종류

COUNT(*) NULL값 포함한 행의 수 출력
COUNT(표현식) 표현식의 NULL값 제외한 행의 수 출력
SUM([DISTINCT|ALL] 표현식) 표현식의 NULL값 제외한 합계 출력
AVG([DISTINCT|ALL] 표현식) 표현식의 NULL값 제외한 평균 출력
MAX([DISTINCT|ALL] 표현식) 표현식의 최대값 출력
MIN([DISTINCT|ALL] 표현식) 표현식의 최소값 출력
STDDEV([DISTINCT|ALL] 표현식) 표현식의 표준 편차를 출력
VARIAN([DISTINCT|ALL] 표현식) 표현식의 분산을 출력
기타 통계 함수 벤더별로 다양한 통계식을 제공함

 

GROUP BY

SELECT [DISTINCT] 칼럼명 [ALIAS명] FROM 테이블명 [WHERE 조건식][GROUP BY 컬럼이나 표현식][HAVING 그룹조건식];
  • GROUP BY 절을 통해 소그룹별 기준을 정한 후, SELECT 절에 집계 함수를 사용함
  • 집계 함수의 통계 정보는 NULL 값을 가진 행을 제외하고 수행
  • GROUP BY절에서는 SELECT절과는 달리 ALIAS명을 사용할 수 없음
  • 집계 함수는 WHERE절에는 올 수 없음(GROUP BY절보다 WHERE절이 먼저 수행됨)
  • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거시킴
  • HAVING 절은 GROUP BY절의 기준 항목이나 소그룹의 집계 함수를 이용한 조건을 표시할 수 있음
  • GROUP BY절에 의한 소그룹별로 만들어진 집계 데이터 중, HAVING절에서 제한 조건을 두어 만족하는 내용만 출력
  • HAVING 절은 일반적으로 GROUP BY절 뒤에 위치

 

ORDER BY

SELECT 칼럼명 [ALIAS명] FROM 테이블명 [WHERE 조건식][GROUP BY 컬럼이나 표현식][HAVING 그룹조건식][ORDER BY 컬럼이나 표현식 [ASC 또는 DESC]];
  • Default는 ASC(오름차순)
  • 숫자형 데이터 타입은 오름차순으로 정렬했을 경우 가장 작은 값부터
  • 날짜형 데이터 타입은 오름차순으로 정렬했을 경우 날짜가 가장 빠른 순서부터
  • Oracle에서는 NULL값을 가장 큰 값으로 간주
  • SQL Server에서는 NULL값을 가장 작은 값으로 간주
  • GROUP BY 절을 사용할 때 ORDER BY절에 집계 함수를 사용할 수 있음
  • ORDER BY절에서 칼럼명 대신 ALIAS명이나 칼럼 순서를 나타내는 정수를 혼용 사용 가능

 

SELECT 문장 실행 순서

  1. FROM : 발췌 대상 테이블 참조
  2. WHERE : 발췌 대상 데이터가 아닌 것은 제거
  3. GROUP BY : 행들을 소그룹화
  4. HAVING : 그룹핑된 값의 조건에 맞는 것만을 출력
  5. SELECT : 데이터 값을 출력/계산
  6. ORDER BY : 데이터 정렬
급여가 높은 2명을 내림차순으로 출력하는데 같은 급여를 받는 사원이 있으면 같이 출력
SELECT TOP(2) WITH TIES ENAME, SAL FROM EMP ORDER BY SAL DESC;

 

JOIN

  • 두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것
  • 일반적으로 행은 PK나 FK값의 연관에 의해 JOIN이 성립
  • 어떤 경우에는 이러한 PK, FK관계가 없어도 논리적인 값들의 연관만으로도 JOIN 성립 가능
  • 여러 테이블로부터 원하는 데이터를 조회하기 위해서는 전체 테이블 개수에서 최소 N-1개의 JOIN조건이 필요

EQUAL JOIN

WHERE절에 JOIN 조건

SELECT A.칼럼명, B.칼럼명 FROM A, B WHERE A.칼럼명 = B.칼럼명;

 

EQUAL JOIN(ANSI/ISO SQL 표준)

ON절에 JOIN 조건

SELECT A.칼럼명, B.칼럼명 FROM A INNER JOIN B ON A.칼럼명 = B.칼럼명;

 

 

 

 


References

  • SQL 자격검정 실전문제, 한국데이터산업진흥원
반응형

댓글