Jin's Dev Story

[SQLD] 2과목 - 1. SQL 기본 본문

자격증 & 공부/SQLD

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

woojin._. 2024. 5. 16. 14:16

[ 2과목 - 1. SQL 기본 ]

 * 데이터베이스
   - 데이터들을 저장하는 공간
   - 용도와 목적에 맞는 데이터들끼리 모아서 저장함

 * 관계형 데이터베이스 - RDB(Relational Database)
   - 관계형 데이터 모델에 기초를 둔 데이터베이스
   - 모든 데이터를 2차원 테이블 형태로 표현한 뒤 각 테이블 간의 관계를 정의하는 것
   - RDBMS(Relational Database Management System)는 RDB를 관리/감독하기 위한 시스템이며, Oracle,
     MySQL, MariaDB, PostgreSQL 등이 속함

 * TABLE
   - 컬럼 : 항목을 나타내는 각각의 세로 열
   - 로우 : 각각의 가로 행
   - 관계형 데이터베이스의 기본 단위
   - 데이터베이스는 여러 개의 테이블로 구성됨

 * SQL(Structured Query Language)
   - 관계형 데이터베이스에서 데이터를 다루기 위해 사용하는 언어
   - 라인수가 많아지는 복잡한 SQL은 어떻게 작성하느냐에 따라 성능 차가 확연히 드러나기 때문에 SQL을 잘 작성하고 
     튜닝하는 것이 매우 중요함

 * SELECT문
   (1) SELECT
      - 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
      - 컬럼을 따로 명시하지 않고 *를 쓰면 전체 컬럼이 조회되며, 조회되는 컬럼의 순서는 테이블의 컬럼 순서와 동일함
      - 별도의 WHERE 절이 없으면 테이블의 전체 ROW가 조회됨
      - 테이블 명이나 컬럼명에 별도의 별칭을 붙여줄 수 있는데 붙여주는 목적은 테이블명은 비교적 길기 때문에 
        짧게 줄여쓰기 위해 Alias를 붙여주는 것 (AS 사용 가능)
      - DISTINCT : 중복된 데이터가 있을 경우 1건으로 처리해 출력함

   (2) 산술연산자
      - 수학에서 사용하는 사칙연산의 기능을 가진 연산자
      - () : 괄호로 우선순위 조정 가능
      - * : 곱하기
      -  / : 나누기 (0으로 나눌 경우 에러 발생)
      - + : 더하기
      - - : 뻬기
      - % : 나머지 (0으로 나눌 경우 NULL 반환)
      => 우선순위 : 괄호 > 곱하기/나누기 > 더하기/빼기/나머지

   (3) 합성연산자 (||)
      - 문자와 문자를 연결할 때 사용하는 연산자

 * 함수
   (1) 내장 함수 
      - 다시 함수 입력 값이 단일행 값이 입력되는 단일행 함수와 여러 행의 값이 입력되는 다중행 함수로 구분
      - 단일행 함수 : 처리하는 데이터의 형식에 따라서 문자형, 숫자형, 날짜형, 변환형, NULL 관련 함수
        : SELECT, WHERE, ORDER BY 절에 사용 가능
        : 각 행들에 대해 개별적으로 작용해 데이터 값들을 조작하고, 각각의 행에 대한 조작 결과를 리턴
        :  여러 인자를 입력해도 단 하나의 결과만 리턴
        :  함수도 인자로 상수, 변수, 표현식이 사용 가능하고, 하나의 인수를 가지는 경우도 있지만  여러 개의 인수를 가질 수도 있음
        :  특별한 경우가 아니면 함수의 인자로 함수를 사용하는 함수의 중첩이 가능
      - 다중행 함수 : 다시 집계함수, 그룹함수, 윈도우 함수

종류 내용 함수
문자형 함수 문자를 입력하면 문자나 숫자 값을 반환 LOWER, UPPER, ASCII, CHAR, CONCAT, SUBSTRGIN, LEN, LTRIM, RTRIM, TRIM
숫자형 함수 숫자를 입력하면 숫자 값 반환 ABS, SIGN, MOD, CEILING, FLOOR, ROUND, TRUNC, SIN, COS, TAN, EXP, POWER, SQRT, LOG, LN
날짜형 함수 DATE 타입의 값을 연산 SYSDATE, EXTRACT, TO_NUMBER(TO_CHAR(d, ‘YYYY’|’MM’|’DD’))/YEAR|MONTH|DAY
변환형 함수 문자, 숫자, 날짜형의 데이터 타입 변환 (CAST, TO_NUMBER, TO_CHAR, TO_DATE)/(CAST, CONVER)
NULL 관련 함수 NULL 처리를 위한 함수 NVL/ISNULL, NULLIF, COALESCE


   (2) 문자형 함수
      - 문자 데이터를 매개변수로 받아들여서 문자나 숫자 값의 결과를 돌려주는 함수

문자형 함수 설명
LOWER(문자열) 알파벳 문자를 소문자로 바꿈
UPPER(문자열) 알파벳 문자를 대문자로 바꿈
ASCII(문자) 문자나 숫자를 ASCII 코드 번호로 바꿈
CHR/CHAR(ASCII번호) ASCII 코드 번호를 문자나 숫자로 바꿈
CONCAT(문자열1, 문자열2) 문자열1과 문자열2를 연결함
합성연산자 ||+와 동일함
SUBSTR/SUBSTRING(문자열, M[,n]) 문자열 중 m위치에서 n의 문자 길이에 해당하는 문자를 돌려줌
n이 생략되면 마지막 문자까지임
LENGTH/LEN(문자열) 문자열의 개수를 숫자값으로 돌려줌
LTRIM(문자열 [,지정문자])/LTRIM(문자열) 문자열의 첫 문자부터 확인해서 지정 문자가 나타나면 해당 문자를 제거함(지정문자가 생략되면 공백값이 디폴트)
RTIRM(문자열 [,지정문자])/RTRIM(문자열) 문자열의 마지막 문자부터 확인해서 지정문자가 나타나는 동안 해당 문자를 제거함(지정문자가 생략되면 공백값이 디폴트)
TRIM([leading|trailing|both] 지정문자 FROM 문자열) / TRIM(지정문자 FROM 문자열) 문자열에서 머리말, 꼬리말 또는 양쪽에 있는 지정 문자를 제거함(leading|trailing|both가 생략되면 both가 디폴트)


   (3) 숫자형 함수
      - 숫자 데이터를 입력받아 처리하고 숫자를 리턴함

숫자형 함수 함수 설명
ABS(숫자) 숫자의 절댓값을 리턴
SIGN(숫자) 숫자가 양수인지, 음수인지, 0인지를 구별
MOD(숫자1, 숫자2) 숫자1을 숫자2로 나누어 나머지 값을 리턴
MOD 함수는 % 연산자로도 대체 가능
CEIL/CEILING(숫자) 숫자보다 크거나 같은 최소 정수 리턴
FLOOR(숫자) 숫자보다 작거나 같은 최대 정수 리턴
ROUND(숫자 [,m]) 숫자를 소수점 m자리에서 반올림해서 리턴
m이 생략되면 디폴트 값은 0
TRUNC(숫자 [,m]) 숫자를 소수점 m자리에서 잘라서 리턴
m이 생략되면 디폴트 값은 0
SIN, COS, TAN, ... 숫자의 삼각함수 값을 리턴
EXP(숫자) 숫자의 지수 값을 리턴
POWER(숫자1, 숫자2) 숫자의 거듭제곱 값을 리턴
SQRT(숫자) 숫자의 제곱근 값을 리턴
LOG(숫자1, 숫자2) / LOG(숫자1, 숫자2) 숫자1을 밑수로 하는 숫자2의 로그값(LOG숫자1숫자2)을 리턴
LN(숫자) 숫자의 자연 로그 값(=LOGe숫자)을 리턴


   (4) 날짜형 함수
      - DATE 타입의 값을 연산하는 함수

날짜형 함수 함수 설명
SYSDATE/GETDATE() 현재 날짜와 시간 출력
EXTRACT(‘YEAR’|’MOMTH’/‘DAY’|from d)
/DATEPART(‘YEAR’|’MONTH’|’DAY’, d)
날짜 데이터에서 연월일 데이터 출력 가능
시분초도 가능
TO_NUMBER(TO_CHAR(d,‘YYYY’))/YEAR(d)
TO_NUMBER(TO_CHAR(d,‘MM))/MONTH(d)
TO_NUMBER(TO_CHAR(d,‘DD’))/DAY(d)
날짜 데이터에서 연월일 데이터 출력 가능


   (5) 변환형 함수
      - 특정 데이터 타입을 다양한 형식으로 출력하고 싶을 경우 사용
      - 명시적 데이터 유형 변환 : 데이터 변환형 함수를 사용해 데이터 유형을 변환하도록 명시해주는 경우
      - 암시적 데이터 유형 변환 : 데이터베이스가 자동으로 데이터 유형을 변환해 계산하는 경우

변환형 함수 설명
TO_NUMBER (문자열)
/ CAST (expression AS data_type [(length)])
숫자로 변환 가능한 문자열을 숫자로 변환
expression을 목표 데이터 유형으로 변환
TO_CHAR (숫자 | 날짜 [, FORMAT])
/ CONVERT (data_type [(length)], expression [, style ])
숫자나 날짜를 주어진 FORMAT 형태인 문자열 타입으로 변환
expression을 주어진 style 형태인 목표 데이터 유형으로 변환
TO_DATE (문자열 [, FORMAT])
/ CONVERT (data_type [(length)], expression [, style ])
문자열을 주어진 FORMAT 형태인 날짜 타입으로 변환
expression을 주어진 style 형태인 목표 데이터 유형으로 변환


   (6) CASE 표현
      - IF-THEN-ELSE 논리와 유사한 방식으로 표현식을 작성해 SQL의 비교 연산 기능을 보완하는 역할

IF SAL > 5000
TEHN REVISED_SALARY = SAL
ELSE REBISED+SALARY = 5000
END IF
CASE 표현 함수 설명
CASE
SIMPLE_CASE_EXPRESSION 조건
[ELSE 디폴트값]
END
SIMPLE_CASE_EXPRESSION 조건이 맞으면 SIMPLE_CASE_EXPRESSION 조건 내의 THEN절을 수행하고, 조건이 맞지 않으면 ELSE 절을 수행함
CASE
SEARCHED_CASE_EXPRESSION 조건
[ELSE 디폴트값]
END
SEARCHED_CASE_EXPRESSION 조건이 맞으면 SEARCHED_CASE_EXPRESSION 조건 내의 THEN절을 수행하고, 조건이 맞지 않으면 ELSE 절을 수행함
DECODE(표현식, 기준값1, 1 [, 기준값2, 2, ..., 디폴트값]) Oracle에서만 사용되는 함수로, 표현식 값이 기준값1이면 값1을 출력하고, 기준값2이면 값2를 출력함
기준값이 없으면 디폴트 값을 출력함
case 표현sSIMPLE_CASE_EXPRESSION 조건과 동일함



   (7) NULL 관련 함수
      * NVL/ISNULL 함수
        - NULL의 특성
          : 널 값은 아직 정의되지 않은 값으로 0 또는 공백과 다름. 0은 숫자고, 공백은 하나의 문자.
          : 테이블을 생성할 때 NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 NULL 값을
            포함할 수 있음
          : NULL 값을 포함하는 연산의 경우 결과 값도 NULL 값임.
          : 결과 값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL/ISNULL 함수를 사용함
          : NULL 값의 대상이 숫자 유형인 데이터인 경우는 주로 0으로, 문자유형인 데이터의 경우는 블랭크보다는 
            ‘X’와 같이 해당 시스템에서 의미없는 문자로 바꾸는 경우가 많음

일반형 함수 설명
NVL(표현식1, 표현식2)/ISNULL(표현식1, 표현식2) 표현식1의 결과 값이 NULL이면 표현식2의 값을 출력함
, 두 표현식의 결과 데이터 타입이 같아야 함
NULLIF(표현식1, 표현식2) 표현식1이 표현식2와 같으면 NULL, 같지 않으면 표현식1을 리턴함
COALESCE(표현식1, 표현식2) 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타냄
모든 표현식이 NULL이라면 NULL을 리턴함


 * WHERE절
   - 원하는 자료만 검색하기 위해 SQL문에 WHERE절을 사용하여 자료를 제한할 수 있음

SELECT [DISTINCT/ALL] 컬럼명 [ALIAS명]
FROM 테이블명
WHERE 조건식;


   - 조건식 구성
     : 컬럼명 (보통 조건식의 좌측에 위치)
     : 비교 연산자
     : 문자 숫자 표현식 (보통 조건식의 우측에 위치)
     : 비교 컬럼명(JOIN 사용 시)     => 연산자 우선순위 : 괄호 () > 비교연산자, SQL 연산자 > NOT 연산자 > AND > OR

   - 연산자 종류

구분 연산자 의미
비교 연산자 = 같다.
> 보다 크다.
>= 보다 크거나 같다.
< 보다 작다.
<= 보다 작거나 같다.
SQL 연산자 BETWEEN a AND b ab의 값 사이의 값을 갖는다. (ab값이 포함됨)
IN (list) 리스트에 있는 값 중에서 어느 하나라도 일치한다.
LIKE ‘비교문자열 비교문자열과 형태가 일치한다. (%, _사용)
IS NULL NULL 값을 갖는다.
논리 연산자 AND 앞의 조건과 뒤의 조건이 모두 참(TRUE)이 되면 결과도 참(TRUE).
OR 앞뒤 조건 중 하나만 참(TRUE)이면 결과도 참(TRUE).
NOT 뒤에 오는 조건에 반대되는 결과를 되돌려 준다.
부정 비교 연산자 != 같지 않다.
^= 같지 않다.
<> 같지 않다. (ISO 표준, 모든 운영체제에서 사용 가능)
NOT 컬럼명 = ~와 같지 않다.
NOT 컬럼명 > ~보다 크지 않다.
부정 SQL 연산자 NOT BETWEEN a AND b ab의 값 사이에 있지 않다. (a, b값을 포함하지 않음)
NOT IN (list) list 값과 일치하지 않다.
IS NOT NULL NULL 값을 갖지 않다.


   - IS NULL 연산자
      : NULL 값 비교

 * GROUP BY, HAVING 절
   (1) 집계함수
       - 여러 행들의 그룹이 모여 그룹당 단 하나의 결과를 돌려주는 함수
       - GROUP BY 절은 행들을 소그룹화함
       - SELECT절, HAVING절, ORDER BY절에 사용 가능

집계함수 사용목적
COUNT(*) NULL 값을 포함한 행의 수를 출력
COUNT(표현식) 표현식의 값이 NULL 값인 것을 제외한 행 수를 출력
SUM([DISTINCT | ALL] 표현식) 표현식의 NULL값을 제외한 합계를 출력
AVG([DISTINCT | ALL] 표현식) 표현식의 NULL값을 제외한 평균을 출력
MAX([DISTINCT | ALL] 표현식) 표현식의 최댓값을 출력
MIN([DISTINCT | ALL] 표현식) 표현식의 최솟값을 출력
STDDEV([DISTINCT | ALL] 표현식) 표현식의 표준편차를 출력
VARIANCE/VAR([DISTINCT | ALL] 표현식) 표현식의 분산을 출력
기타 통계 함수 벤터별로 다양한 통계식을 제공함


   (2) GROUP BY 절

SELECT [DISTINCT/ALL] 컬럼명 [ALIAS]
FROM 테이블명
WHERE 조건식
GROUP BY 컬럼이나 표현식
HAVING 그룹조건식
ORDER BY 컬럼이나 표현식 [ASC 또는 DESC];


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

   (3) HAVING 절
       - 데이터를 그룹핑한 후 특정 그룹을 골라낼 때 사용
       - WHERE 절을 사용해도 되는 조건까지 HAVING 절로 써버리면 성능상 불리할 수 있음

 * ORDER BY 절
   - SQL문장으로 조회한 데이터들을 다양한 목적에 맞게 특정 컬럼을 기준으로 정렬/출력하는데 사용함

   - 정렬 방식
     : ASC : 조회한 데이터를 오름차순으로 정렬
     : DESC : 조회한 데이터를 내림차순으로 정렬

 * 조인(JOIN)
   - 두 개 이상의 테이블들을 연결해 데이터를 출력하는 것
   (1) EQUI JOIN
       : Equal (=) 조건으로 JOIN하는 것으로 가장 흔히 볼 수 있는 JOIN의 방식

SELECT [DISTINCT/ALL] 컬럼명 [ALIAS]
FROM 테이블명
WHERE 조건식
GROUP BY 컬럼이나 표현식
HAVING 그룹조건식;


   (2) Non EQUI JOIN
       : Equal (=) 조건이 아닌 다른 조건(BETWEEN, >, >=, <, <=)으로 JOIN하는 방식

   (3) 3개 이상 TABLE JOIN
       : JOIN 쿼리를 좀 더 확장해서 3개 이상의 테이블을 JOIN 할 수도 있음

   (4) OUTER JOIN
       : JOIN 조건에 만족하지 않는 행들도 출력되는 형태
       : LEFT OUTER JOIN의 경우 LEFT TABLE과 RIGHT TABLE의 데이터 중 JOIN에 성공한 데이터와 
         JOIN에 성공하지 못한 나머지 LEFT TABLE의 데이터가 함께 출력됨
   (5) STANDARD JOIN (ANSI JOIN)
       : 표준 조인
       1. INNER JOIN
        - JOIN 조건에 충족하는 데이터만 출력되는 방식
        - JOIN 조건을 ON 절에 사용하여 작성해야 함
       2. OUTER JOIN
        - JOIN 조건에 충족하는 데이터가 아니어도 출력될 수 있는 방식
         1) LEFT OUTER JOIN
           : SQL에서 왼쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN
           : 오른쪽 테이블에 JOIN되는 데이터가 없는 ROW들은 오른쪽 테이블 컬럼의 값이 NULL로 출력됨
         2) RIGHT OUTER JOIN
           : SQL에서 오른쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN
           : 왼쪽 테이블에 JOIN되는 데이터가 없는 ROW들은 왼쪽 테이블 컬럼의 값이 NULL로 출력됨
         3) FULL OUTER JOIN
           : 왼쪽, 오른쪽 테이블의 데이터가 모두 출력되는 방식
           : LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합
       3. NATURAL JOIN
        - A테이블과 B테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN이 되는 방식
        - SELECT 절에서 USING 절로 정의된 컬럼 앞에는 별도의 ALIAS나 테이블명을 붙이지 않아야 함
       4. CROSS JOIN
        - A테이블과 B테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식