SQLD

[2-1과목] SQL 기본

Donghun Kang 2024. 11. 7. 11:24
"홍쌤의 데이터 랩" 유튜브와 유선배 SQL 개발자 책을 보고 정리한 내용임을 밝힙니다.

 

2-1. 관계형 데이터베이스 개요

  • 데이터베이스: 데이터의 집합
  • DBMS: 데이터를 효과적으로 관리하기 위한 시스템

# 관계형 데이터베이스 구성 요소

- 계정

- 테이블

- 스키마

 

# 관계형 데이터베이스 특징

- 데이터의 분류, 정렬, 탐색 속도가 빠름

- 신뢰성이 높고 데이터의 무결성 보장

- 기존의 작성된 스키마를 수정하기 어려움

- 데이터베이스의 부하를 분석하는 것이 어려움

 

  • 테이블(TABLE)
- 엑셀에서의 워크시트처럼 행(row)과 열(columm)을 갖는 2차원 구조로 구성
- 데이터를 입력하여 저장하는 최소 단위
=> 세로 열(Columm) / 가로 열(Row)
  • 특징

- 하나의 테이블은 반드시 하나의 유저(계정) 소유여야 함

- 데이블간 관계는 1:1, 1:N, N:N의 관계를 가질 수 있음

- 데이블명은 중복될 수 없지만, 소유자가 다른 경우 같은 이름으로 생성 가능

- 테이블은 행 단위로 데이터가 입력, 삭제되며 수정은 값의 단위로 가능

 

  • SQL
- 관계형 데이터베이스에서 데이터 조회 및 조작, DBMS 시스템 관리 기능을 명령하는 언어
- DDL, DML, DCL 등으로 구분
- SQL 문법은 대, 소문자 구분 X

 

  • 데이터 무결성(integrity)
- 데이터의 정확성과 일관성을 유지하고, 데이터에 결손과 부정합이 없음을 보증하는 것
- 데이터베이스에 저장된 값과 그것이 표현하는 현실의 비즈니스 모델의 값이 일치하는 정확성을 의미
  • 종류

1. 개체 무결성

2. 참조 무결성

3. 도메인 무결성

4. NULL 무결성

5. 고유 무결성

6. 키 무결성

 

- 도메인: 각 컬럼(속성)이 갖는 범위
- 릴레인션: 테이블간 관계
- 튜플: 하나의 행
- 키: 식별자

 

  • ERD
- 테이블 간 서로의 상관 관계를 그림으로 표현한 것
- 엔터티, 관계, 속성으로 구성됨

 


 

2.2 SELECT문

*FROM => WHERE => GROUP BY => HAVING => SELECT => ORDER BY 순서대로 실행 ★★★

 

  • SELECT
- 저장되어 있는 데이터를 조회하고자 할 때 사용하는 명령어
- *를 사용하여 테이블 내 전체 컬럼명을 불러올 수 있다.
- 원하는 컬름을 ,로 나열하여 작성 가능(순서대로 출력)
- 표현식: 원래의 컬럼명을 제외한 모든 표현 가능한 대상 
  • 특징

- SELECT절에서 표시할 대상 컬럼에 Alias(별칭) 지정 가능

- 대소문자 구분하지 않아도 인식

 

# Alias(별칭)

- 컬럼명 대신 출력할 임시 이름 지정 (SELECT절에서만 정의 가능, 원본 컬럼명은 변경되지 않는다.)

- 컬럼명 뒤에 AS와 함께 컬럼 별칭 전달 (AS 생략 가능)

  • 특징 및 주의 사항

- SELECT문 보다 늦게 수행되는 ORDER BY절에서만 컬럼 별칭 사용 가능 (그 외 절에서 사용시 ERROR)

- 한글 사용 가능

- 이미 존재하는 예약어는 별칭 사용 불가

- 다음의 경우 별칭에 반드시 쌍따옴표(" ") 전달 필요

1. 별칭에 공백을 포함하는 경우

2. 별칭에 특수문자를 포함하는 경우("_" 제외)

3. 별칭 그대로 전달할 경우 (입력한 대소를 그대로 출력하고자 할 때)

 

  • FROM절
- 데이터를 불러올 테이블명 또는 뷰명 전달
- 테이블 여러 개 전달 가능
- 테이블 별칭 선언 가능 (ORACLE은 AS 사용 불가, SQL Server는 사용/생략 가능)
=> 테이블 별칭 선언 시 컬럼 구분자는 테이블 별칭으로만 전달 (테이블명으로 사용 시 ERROR)
- ORACLE에서 FROM절 생략 불가
- SQL Server에서는 FROM절 필요 없을 경우 생략 가능

 

* 뷰: 테이블과 동일하게 데이터를 조회할 수 있는 객체지만 테이블처럼 실제 데이터가 지정된 것이 아닌, SELECT문 결과에 이름을 붙여 그 이름만으로 조회가 가능하도록 한 기능

 


 

2-3. 함수

  • 함수
- input value와 output value의 관계를 정의한 객체
- FROM절을 제외한 모든 절에서 사용 가능
  • 기능

- 기본적인 쿼리문을 더욱 강력하게 해줌

- 데이터의 계산을 수행

- 개별 데이터의 항목을 수정

- 표시할 날짜 및 숫자 형식을 지정

- 열 데이터의 유형을 반환

 

  • 종류

- 단일행 함수: input과 output의 관계가 1:1

- 복수행 함수(그룹함수, 집계함수): 여러 건의 데이터를 동시에 입력 받아서 하나의 요약값을 return

 

  • 문자 함수

1. Lower(문자열): 문자열을 소문자로 변환

EX) LOWER('JENNIE') => jennie

 

2. UPPER(문자열): 문자열을 대문자로 변환

EX) UPPER('jennie') => JENNIE

 

3. LTRIM(문자열 [,특정 문자])/ RTRIM(문자열 [,특정 문자]): 왼쪽/ 오른쪽 공백 제거, 왼쪽/ 오른쪽부터 한 글자씩 특정 문자와 비료하여 특정 문자에 포함되어 있으면 제거, 포함되지 않았으면 멈춘다.

EX) LTRIM('     JENNIE') => JENNIE 

EX) LTRIM('AABABAA', 'A') => BABAA

 

4. TRIM([위치] [특정문자] [FROM] 문자열): 왼쪽, 오른쪽 공백 제거, 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거, 같지 않으면 멈춘다.

EX) TRIM(LEADING '블' FROM '블랙핑크') => 랙핑크

EX) TRIM(TRAILING '크' FROM '블랙핑크') => 블랙핑

 

5. SUBSTR(문자열, 시작점 [,길이]): 문자열의 원하는 부분만 잘라서 반환

EX) SUBSTR('블랙핑크제니', 3, 2) => 핑크

EX) SUBSTR('ABCDE', -4, 3) = BCD

 

6. INSTR(문자열, 찾을 문자열, m, n): 대상에서 찾을 문자열 위치 변환, m 위치에서 시작/ n번째 발견된 문자열 위치

EX) INSTR('A#B#C#', '#') => 2

EX) INSTR('A#B#C#', '#', 3, 2) => 6

 

7. LENGTH(문자열): 문자열의 길이를 반환

EX) LENGTH('JENNIE') => 6

 

8. REPLACE(문자열, 변경 전 문자열 [,변경 후 문자열]): 변경 전 문자열을 찾아 변경 후 문자열로 바꿔줌, 문자열 명시하지 않으면 문자열에서 변경 전 문자열을 제거

EX) REPLACE('블랙핑크제니', '제니', '지수') => 블랙핑크지수

EX) REPLACE('블랙핑크제니', '블랙') => 핑크제니

 

9. LPAD(대상, n, 문자열)/ RPAD(대상, n, 문자열): 대상 왼쪽/ 오른쪽에 문자열을 추가하여 총 n의 길이 리턴

EX) LPAD('ABC', 5, '*') => **ABC

EX) RPAD('ABC', 5, '*') => ABC**

 

  • 숫자형 함수

1. ABS(수): 수의 절대 값을 반환

EX) ABS(-1) => 1

 

2. SIGN(수): 양수이면 1, 음수이면 -1, 0이면 0을 반환

EX) SIGN(-7) => -1

 

3. ROUND(수 [,자리수]): 수를 지정된 소수점 자릿수까지 반올림하여 반환, 자리수 명시하지 않으면 기본값 0

EX) ROUND(163.76, 1) => 163.8

EX) ROUND(163.76, -2) => 200

 

4. TRUNC(수 [,자리수]): 수를 지정된 소수점 자리수까지 버림 , 자리수 명시하지 않으면 기본값 0

EX) TRUNC(54.29, 1) => 54.2

EX) TRUNC(54.29, -1) => 50

 

5. CEIL(수): 소수점 이하의 수를 올림한 정수를 반환

EX) CEIL(72.86) => 73

 

6. FLOOR(수): 소수점 이하의 수를 버림한 정수를 반환

EX) FLOOR(22.3) => 22

 

7. MOD(수1, 수2): 수1을 수2로 나눈 나머지를 반환

EX) MOD(15, -4) => 3

 

  • 날짜형 함수

1. SYSDATE: 현재의 연, 월, 일, 시, 분, 초를 반환

 EX) SYSDATE => 2024-11-12 16:04:45

 

2. EXTRACT(특정단위 FROM 날짜 데이터): 날짜에서 특정 단위만을 출력하여 반환

EX) EXTRACT(YEAR FROM SYSDATE) => 2024

 

3. ADD_MONTHS(날짜 데이터, 특정 개월 수): 날짜 데이터에서 특정 개월 수를 더한 날짜를 반환

EX) ADD_MONTHS(TO_DATE('2021-12-31', 'YYYY-MM-DD'), -1) => 2021-11-30

EX) ADD_MONTHS(TO_DATE('2021-12-31', 'YYYY-MM-DD'), 1) => 2022-01-31

 

  • 변환 함수
  • 명시적 형변환: 변환함수를 사용하여 데이터 유형 변환을 명시적으로 나타냄

1. TO_NUMBER(문자열): 문자열을 숫자형으로 변환

EX) TO_NUMBER('1234') => 1234

EX) TO_NUMBER('abc') => ERROR발생

 

2. TO_CHAR(수 or 날짜 [,포맷]): 수나 날짜형의 데이터를 포맷 형식의 문자열로 변환

EX) TO_CHAR(1234) => '1234'

EX) TO_CHAR(SYSDATE, 'YYYYMMDD HH24MISS') => 20210921 223321

 

3. TO_DATE(문자열, 포맷): 포맷 형식의 문자형의 데이터를 날짜형으로 반환

EX) TO_DATE('20210602', 'YYYYMMDDD') => 2021-06-02

 

  • 암시적 형변환: 데이터베이스가 내부적으로 알아서 데이터 유형을 반환

 

  • NULL관련 함수

1. NVL(인수1, 인수2): 인수1의 값이 NULL일 경우 인수2 반환, NULL이 아닐 경우 인수1 반환

EX) NVL(COMM, 0) => COMM값 or 0 반환

 

2. NULLIF(인수1, 인수2): 인수1과 인수2가 같으면 NULL을 반환, 같지 않으면 인수1 반환

EX) NULLIF(10, 20) => 10

 

3. COALESCE(인수1, 인수2, 인수3, ...): NULL이 아닌 최초의 인수를 반환

EX) COALESCE(NULL,100) => 100

 

4. DECODE(대상, 값1, 리턴1, 값2, 리턴2, ..., 그 외 리턴): 대상이 값1이면 리턴1, 값2와 같으면 리턴2, 그 외에는 그 외 값 리턴

EX) DECODE(DEPTNO, 10, A, B) => A or B

 

5. CASE: ~이면 ~이고, ~이면 ~이다.

EX) 

CASE WHEN SUBWAY_LINE = '1' THEN 'BLUE'
     WHEN SUBWAY_LINE = '2' THEN 'RED'
     ELSE 'GRAY'
END AS LINE_COLOR

위의 코드는 DECODE로 나타내면 다음과 같다.

DECODE(SUBWAY_LINE, '1', 'BLUE', '2', 'RED', 'GRAY')

 


 

2-4. WHERE절

  • WHERE절
- 테이블의 데이터중 원하는 조건에 맞는 데이터만 조회하고 싶을 경우 사용
- 여러 조건 동시 전달 가능
- NULL 조회시 ISNULL/ ISNOTNULL 연산자 가능('='연산자로 조회 불가)
- 연산자를 이용하여 다양한 표현 가능
(= , !=, <>,  >, <, <=, >=)

 

*주의사항

- 문자나 날짜 상수 표현 시 반드시 홀따옴표('') 사용 (다른 절에서도 동일 적용)

- ORACLE은 문자 상수의 경우 대소문자 구분

- MSSQL은 기본적으로 문자상수의 대소문자를 구분하지 않는다

 

  • 부정 비교 연산자

- !=: 같지 않음

- ^=: 같지 않음

- <>: 같지 않음

- not 컬럼명: 같지 않음

- not 컬럼명 >: 크지 않음

 

  • SQL 연산자

- BETWEEN A AND B: A와 B 사이(A,B 포함)

EX) where col between 1 and 10 (1, 10 포함)

 

- LIKE '비교 문자열': 비교 문자열을 포함

1) %: 자리수 제한 없는 모든이라는 의미

2) _: 하나 당 한 자리수를 의미하며 모든 값을 포함  

EX) ENAME LIKE 'S%' => 이름이 S로 시작하는 

EX) ENAME LIKE '%S%' => 이름에 S를 포함하는 

EX) ENAME LIKE '%S' => 이름이 S로 끝나는

EX) ENAME LIKE '_S%' => 이름의 두 번째 글자가 S인 

EX) ENAME LIKE '__S__' => 이름의 가운데 글자가 S이며 이름의 길이가 5글자인

 

- IN(LIST): LIST 중 하나와 일치

EX) where col in (1, 3, 5) 

 

- ISNULL: NULL 값

EX) where col is null

 

  • 부정 SQL 연산자

- NOT BETWEEN A AND B: A와 B사이가 아님 (A, B 미포함)

- NOT IN(LIST): LIST 중 일치하는 것이 없음

- IS NOT NULL: NULL 값이 아님

 

  • 논리 연산자

- AND: 모든 조건이 TRUE여야 함

- OR: 하나 이상의 조건이 TRUE여야 함 

- NOT: TRUE이면 FALSE, FALSE이면 TRUE

 


 

2-5. GROUP BY, HAVING 절

  • GROUP BY
- 각 행을 특정 조건에 따라 그룹으로 분리하여 계산하도록 하는 구문식
- 그룹에 대한 조건을 WHERE절에서 사용할 수 없음
- GROUP BY절을 사용하면 데이터가 요약되므로 요약되기 전 데이터와 함께 출력할 수 없다.

 

  • 집계함수

- COUNT(*): 전체 ROW를 COUNT하여 반환

- COUNT(컬럼): 컬럼 값이 NULL인 ROW를 제외하고 COUNT하여 반환

- COUNT(DISTINCT 컬럼): 컬럼값이 NULL이 아닌 ROW에서 중복을 제거한 COUNT를 반환

- SUM(컬럼): 컬럼들의 합계를 반환

- AVG(컬럼): 컬럼들의 평균을 반환

- MIN(컬럼): 컬럼들의 최솟값을 반환

- MAX(컬럼): 컬럼들의 최댓값을 반환

 

  • HAVING 
- 그룹 함수 결과를 조건으로 사용할 때 사용하는 절

 


 

2.6 ORDER BY 절

  • ORDER BY
- 출력되는 행의 순서를 사용자가 변경하고자 할 때 ORDER BY절을 사용
- 정렬 순서를 오름차순(ASC), 내림차순(DESC)으로 전달
- 유일하게 SELECT 절을 정의한 컬럼 별칭 사용 가능

 

  • NULL의 정렬
- NULL을 포함한 값의 정렬 시 ORACLE은 기본적으로 NULL을 마지막에 배치 (SQL Server는 처음에 배치)

 


 

2.7 JOIN

  • JOIN
- 여러 테이블은 데이터를 사용하여 동시 출력하거나 참조할 경우 사용
- FROM절에 조인할 테이블 나열
- 동일한 열 이름이 여러 테이블에 존재할 경우 열 이름 앞에 테이블 이름이나 테이블 Alias 붙임

 

  • 조인 종류

1. EQUI JOIN: JOIN 조건이 '=' 비교를 통해 같은 값을 가지는 행을 연결하여 결과를 얻는 JOIN 방법

 

2. NON EQUI JOIN: 비교 조건이 '<', BETWEEN A AND B와 같이 '=' 조건이 아닌 연산자를 사용하는 경우의 JOIN 조건

3. OUTTER JOIN: JOIN 조건에 성립하지 않는 데이터도 출력하는 경우

4. INNER JOIN: JOIN 조건에 성립하는 데이터만 출력하는 경우

5. FULL OUTER JOIN: 왼쪽, 오른쪽 테이블의 데이터를 모두 출력하는 경우

6. NATURAL JOIN: A, B 테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을때 JOIN되는 방식

7. CROSS JOIN: A, B 테이블사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식

8. SELF JOIN: 한 테이블 내 각 행끼리 관계를 갖는 경우 JOIN 기법, 테이블 명이 중복되므로 반드시 별칭 사용

 


 

2.8 표준 조인

  • 표준조인: ANSI 표준으로 작성되는 INNER, NATURAL, CROSS , OUTER JOIN을 말함

 

  • INNER JOIN
- JOIN 조건이 일치하는 행만 추출
- ANSI 표준의 경우 FROM절에 INNER JOIN 혹은 줄여서 JOIN을 명시
- ANSI 표준의 경우 USING이나 ON 조건절을 필수적으로 사용

 

  • ON 절
- JOIN할 양 컬럼의 컬럼명이 서로 다르더라도 사용 가능
- ON 조건의 괄호는 옵션(생략 가능)

 

  • USING 조건절
- JOIN할 컬럼명이 같을 경우 사용
- Alias나 테이블 이름 같은 접두사 붙이기 불가
- 괄호 필수

 

  • NATURAL JOIN
- 두 테이블 간의 동일한 이름을 가지는 모든 컬럼들에 대해 EQUI JOIN을 수행
- USING, ON, WHERE 절에서 조건 정의 불가
- JOIN에서 사용된 컬럼들은 데이터 유형이 동일해야 하며 접두사를 사용 불가

 

 

  • CROSS JOIN
- 테이블 간 JOIN 조건이 없는 경우 생성 가능한 모든 데이터들의 조합 (cartesian product 출력)
- 양쪽 테이블 행의 수의 곱한 수의 데이터 조합 발생(m*n)

 

  • OUTTER JOIN
- JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용
- 두 테이블 중 한쪽에 NULL을 가지면 EQUI JOIN시 출력되지 않음
  • LEFT OUTER JOIN
- 왼쪽 테이블이 기준이 되어 오른쪽 테이블 데이터를 채우는 방식
- 우측 값에서 같은 값이 없는 경우 NULL 값으로 출력
  • RIGHT OUTER JOIN
- 오른쪽 테이블 기준으로 왼쪽 테이블 데이터를 채우는 방식
  • FULL OUTER JOIN
- 두 테이블 전체 기준으로 결과를 생성하여 중복 데이터는 삭제 후 리턴

'SQLD' 카테고리의 다른 글

[2-2과목] SQL 활용  (1) 2024.11.07
[1과목] 데이터모델링의 이해  (0) 2024.11.07