[ 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 표현s의 SIMPLE_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 | a와 b의 값 사이의 값을 갖는다. (a와 b값이 포함됨) |
IN (list) | 리스트에 있는 값 중에서 어느 하나라도 일치한다. | |
LIKE ‘비교문자열’ | 비교문자열과 형태가 일치한다. (%, _사용) | |
IS NULL | NULL 값을 갖는다. | |
논리 연산자 | AND | 앞의 조건과 뒤의 조건이 모두 참(TRUE)이 되면 결과도 참(TRUE). |
OR | 앞뒤 조건 중 하나만 참(TRUE)이면 결과도 참(TRUE). | |
NOT | 뒤에 오는 조건에 반대되는 결과를 되돌려 준다. | |
부정 비교 연산자 | != | 같지 않다. |
^= | 같지 않다. | |
<> | 같지 않다. (ISO 표준, 모든 운영체제에서 사용 가능) | |
NOT 컬럼명 = | ~와 같지 않다. | |
NOT 컬럼명 > | ~보다 크지 않다. | |
부정 SQL 연산자 | NOT BETWEEN a AND b | a와 b의 값 사이에 있지 않다. (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 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력하는 방식
'자격증 & 공부 > SQLD' 카테고리의 다른 글
[SQLD] SQLD 합격 후기 (0) | 2024.06.18 |
---|---|
[SQLD] 2과목 – 3. 관리 구문 (0) | 2024.05.16 |
[SQLD] 2과목 - 2. SQL 활용 (0) | 2024.05.16 |
[SQLD] 1과목 - 2. 데이터 모델과 SQL (0) | 2024.05.16 |
[SQLD] 1과목 - 1. 데이터 모델링의 이해 (0) | 2024.05.16 |