DB : 용도 & 목적에 맞는 데이터들끼리 모아서 저장하는 공간
RDB(관계형 데이터베이스) : 관계형 데이터 모델에 기초를 둔 DB
2차원 테이블 간의 관계를 정의함
RDBMS : RDB를 관리, 감독하기 위한 시스템
ex) Oracle, MySQL, MariaDB, PostgreSQL...
TABLE : RDB의 기본 단위
DB는 #개의 테이블로 구성됨
SQL(Structured Query Language) : RDB에서 데이터를 다루기 위해 사용하는 언어
SELECT 컬럼1, 컬럼2, ... FROM 테이블 WHERE 컬럼1 = '아무개';
SELECT * FROM 테이블;
SELECT B.BAND_NAME, BM.MEMBER_NAME
FROM BAND B, BAND_MEMBER BM
연산자 | 의미 | 우선순위(= 계산 순서) |
---|---|---|
( ) | 괄호로 우선순위 조정 가능 | 1 |
* | 곱하기 | 2 |
/ | 나누기 | |
+ | 더하기 | 3 |
- | 빼기 | |
SELECT COL1+COL2 AS A,
(COL1-COL2)*COL1 AS B
FROM SAMPLE;
// SQL 단어 만들기
SELECT 'S'||'Q'||'L' AS SQL
FROM DUAL;
// COL1과 COL2 띄어쓰기로 연결
SELECT COL1 || ' ' || 'COL2' AS RESULT
FROM SAMPLE;
기본 내장 함수를 사용할 땐 FROM DUAL;로 작성 (DUAL 테이블에서 가져옴)
ASCII 코드 : 총 128개의 문자를 숫자로 정의함
ex) CHR(65) -> A
ex) LOWER('GAWON') -> gawon
ex) UPPER('gawon') -> GAWON
컴퓨터에서 trim (트림)이라는 것은 "불필요한 부분을 잘라낸다"는 뜻입니다.
프로그래밍 언어 등에서의 trim 은, 주로 "문자열 앞뒤의 공백 문자"를 제거하는 것을 말합니다.
ex) TRIM(' JENNIE ') -> JENNIE
TRIM(LEADING '블' FROM '블랙핑크') -> 랙핑크
TRIM(TRAILING '크' FROM '블랙핑크') -> 블랙핑
: 문자열의 원하는 부분만 잘라서 반환해주는 함수
ex) LENGTH('JENNIE') -> 6
: 문자열에서 변경 전 문자열을 찾아 변경 후 문자열로 바꿔주는 함수
ex) REPLACE('블랙핑크제니', '제니', '지수') -> 블랙핑크지수
REPLACE('블랙핑크제니', '제니') -> 블랙핑크
: 수를 지정된 소수점 자릿수까지 반올림하여 반환
ex) ROUND(163.76, 1) -> 163.8
ROUND(163.76, -2) -> 200
: 수를 지정된 소수점 자릿수까지 버림하여 반환
ex) CEIL(72.86) -> 73
CEIL(-72.86) -> -72
📌 SYSDATE : 현재의 연, 월, 일, 시, 분, 초 반환
SELECT SYSDATE FROM DUAL; // 2022-08-28 22:08:08
📌 EXTRACT(특정 단위 FROM 날짜 데이터) : 날짜 데이터에서 특정 단위(YEAR, MONTH, DAY, HOUR, MINUTE,SECOND)만을 출력해서 반환
SELECT EXTRACT(YEAR FROM SYSDATE) AS YEAR,
EXTRACT(MONTH FROM SYSDATE) AS MONTH,
EXTRACT(DAY FROM SYSDATE) AS DAY
FROM DUAL;
📌 ADD_MONTHS(날짜 데이터, 특정 개월 수) : 날짜 데이터에서 특정 개월 수를 더한 날짜 반환
SELECT ADD_MONTHS() AS YEAR,
ADD_MONTHS() AS MONTH,
FROM DUAL;
암시적 형변환의 ex)
조건절에서 VARCHAR 유형의 BIRTHDAY 컬럼을 숫자와 비교할 경우
내부적으로 BIRTHDAY 컬럼을 NUMBER형으로 변환해줌
SELECT*FROM WHERE BIRTHDAY = 20020304;
// 내부적으로 이렇게 동작해줌 ↓
SELECT*FROM WHERE TO_NUMBER(BIRTHDAY) = 20020304;
but 암시적 형변환 -> 성능 저하, 에러날 수 있음
되도록 명시적 형변환 사용하는 게 좋음 !
📌 TO_NUMBER(문자열)
: 문자열 -> 숫자형으로 변환
ex) TO_NUMBER('1234') -> 1234
TO_NUMBER('abc') -> 에러
📌 TO_CHAR(수 / 날짜 [, 포맷])
: 수 / 날짜형 -> 포맷 형식의 문자형으로 변환
ex) TO_CHAR(1234) -> '1234'
현재 시간 나타낼 때
TO_CHAR(SYSDATE, 'YYYYMMDD HH24MISS')
📌 TO_DATE(문자열, 포맷)
: 포맷 형식의 문자형 -> 날짜형으로 변환
ex) TO_DATE('20210602', 'YYYYMMDD') -> 2021-06-02
포맷 표현 | 의미 |
---|---|
YYYY | 년 |
MM | 월 |
DD | 일 |
HH | 시(12) |
HH24 | 시(24) |
MI | 분 |
SS | 초 |
📌 NVL(인수1, 인수2)
📌 NULLIF(인수1, 인수2)
📌 COALESCE(인수1, 인수2, 인수3 ...)
: NULL이 아닌 최초의 인수를 반환
함수와 성격이 같지만 표현 방식이 함수보단 구문에 가까움
'~이면 ~이고, ~이면 ~이다' 식으로 표현
오라클의 DECODE 함수와 같은 기능함
ex) 다음 구문은 모두 같은 결과값 반환함, [ ]는 옵션
CASE WHEN SUBWAY_LINE = '1' THEN 'BLUE'
WHEN SUBWAY_LINE = '2' THEN 'GREEN'
WHEN SUBWAY_LINE = '3' THEN 'ORANGE'
[ELSE 'GRAY']
END
CASE SUBWAY_LINE
WHEN '1' THEN 'BLUE'
WHEN '2' THEN 'GREEN'
WHEN '3' THEN 'ORANGE'
[ELSE 'GRAY']
END
DECODE(SUBWAY_LINE, '1', 'BLUE', '2', 'GREEN', '3', 'ORANGE'[, 'GRAY'])
💡 WHERE문의 위치?
SELECT *
FROM ENTERTAINER
WHERE NAME = '이지은'
UPDATE ENTERTAINER SET ACENCY_NAME = '빅히트뮤직' WHERE NAME = '김태형';
DELETE FROM ENTERTAINER WHERE NAME = '김태형';
=, <, <=, >, >=
연산자 | 의미 | 예시 |
---|---|---|
!= | 같지 않음 | |
^= | 같지 않음 | |
<> | 같지 않음 | where col <> 10 |
not 컬럼명 = | 같지 않음 | where not col = 10 |
not 컬럼명 > | 크지 않음 | where not col > 10 |
연산자 | 의미 | 예시 |
---|---|---|
BETWEEN A AND B | A와 B 사이(A,B 포함) | where col between 1 and 10 |
LIKE '비교 문자열' | 비교 문자열을 포함 | where col like '방탄%' |
IN (LIST) | LIST 중 하나와 일치 | where col in (1,3,5) |
IS NULL | NULL 값 | where col is null |
// 동일한 의미 쿼리
WHERE PLAY_ID BETWEEN 1 AND 5;
WHERE PLAY_ID >= 1 AND PLAY_ID <= 5;
<LIKE>
// NAME이 Classical로 시작되는 행 조회
WHERE NAME LIKE 'Classical%';
// NAME이 M으로 시작하고 S로 끝나는 행 조회
WHERE NAME LIKE 'M%s';
// NAME에 101이 포함된 행 조회
WHERE NAME LIKE %101%;
// TITLE이 IT Staff이거나 IT Manager인 행 조회
WHERE TITLE IN ('IT Staff', 'IT Manager');
WHERE (TITLE = 'IT Staff' OR TITLE = 'IT Manager');
연산자 | 의미 | 예시 |
---|---|---|
NOT BETWEEN A AND B | A와 B의 사이가 아님(A, B 미포함) | where col not between 1 and 10 |
NOT IN (LIST) | LIST 중 일치하는 것이 없음 | where col not in (1,3,5) |
IS NOT NULL | NULL 값이 아님 | where col is not null |
WHERE PLAY_ID NOT BETWEEN 1 AND 5
WHERE NOT (PLAY_ID BETWEEN 1 AND 5)
WHERE NOT (PLAY_ID >= 1 AND PLAY_ID <= 5)
WHERE PLAY_ID < 1 OR PLAY_ID >5
GROUP BY 뒤에 그룹핑의 기준이 되는 컬럼이 오게 됨
COUNT(*
) : 전체 행을 Count하여 반환
COUNT(컬럼) : 컬럼값이 NULL인 행을 제외하고 카운트
COUNT(DISTINCT 컬럼) : 컬럼값이 NULL이 아닌 행에서 중복을 제거하고 카운트
SUM(컬럼) : 컬럼값들의 합계 반환
AVG(컬럼) : 평균
MIN(컬럼) : 최솟값
MAX(컬럼) : 최댓값
GROUP BY절 사용할 때 WHERE절처럼 사용하는 조건절
데이터를 그룹핑한 후 특정 그룸을 골라낼 때 사용
< SELECT문의 논리적 수행 순서 >
SELECT - 5
FROM - 1
WHERE - 2
GROUP BY - 3
HAVING - 4
ORDER BY - 6
SELECT문에서 가장 마지막에 수행됨
SELECT한 데이터를 정렬
ORDER BY 따로 명시 X -> 임의의 순서대로 출력됨
ORDER BY 절 뒤엔 정렬의 기준이 되는 컬럼이 옴 (1개 / #개)
: 다른 테이블을 한 번에 보여줄 때 쓰는 쿼리
: Equal(=) 조건으로 JOIN
ex) 특정 리뷰 1개만 출력하고 싶을 때
: 마우스 - 상품 테이블의 데이터임, 리뷰 - 리뷰 테이블의 데이터임 => 두 테이블을 조인
SELECT A.PRODUCT_CODE,//(겹치는 컬럼은 한 번만 SELECT하면 됨)
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A,//PRODUCT테이블을 A로 별칭 지정
PRODUCT_REVIEW B
WHERE A.PRODUCT_CODE = B.PRODUCT_CODE
AND A.PRODUCT_CODE = '10001';
: Equal(=) 조건이 아닌 다른 조건(BETWEEN, >, >=, <, <=)으로 JOIN
ex) 이벤트 기간 동안 리뷰 작성한 고객에게 사은품 주는 행사
: 리뷰 테이블 & 이벤트 테이블 join해야함
SELECT A.EVENT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REGDATE
FROM EVENT A,
PRODUCT_REVIEW B
WHERE B.REGDATE BETWEEN A.START_DATE AND A.END_DATE;
: JOIN 조건에 충족하는 데이터만 출력됨
SELECT A.PRODUCT_CODE,
A.PRODUCT_NAME,
B.MEMBER_ID,
B.CONTENT,
B.REG_DATE
FROM PRODUCT A INNER JOIN PRODUCT_REVIEW B
ON A.PRODUCT_CODE = B.PRODUCT_CODE;
: JOIN 조건에 만족하지 않는 행들도 출력됨
LEFT OUTER JOIN
- LEFT 테이블 & RIGHT 테이블 중 JOIN에 성공한 데이터
- JOIN에 성공 못한 나머지 LEFT 테이블 데이터가 함께 출력
RIGHT OUTER JOIN : LEFT와 반대
모든 행이 출력되는 테이블의 반대편 테이블 옆에 (+) 붙여서 작성
FULL OUTER JOIN : 왼, 오 테이블의 데이터의 합집합, 중복값은 제거됨
: A테이블 & B테이블에서 같은 이름 가진 컬럼들이 모두 동일한 데이터를 갖고 있으면 JOIN됨
💡 두 테이블에서 컬럼명은 같지만 데이터가 모두 동일하진 않은 컬럼이 존재하면?
SELECT CAST,
GENDER,
A.JOB AS R_JOB
B.JOB AS I_JOB
FROM RUNNING_MAIN A JOIN INFINITE_CHALLENGE B
USING (CAST, GENDER); // 컬럼명 그대로 사용
: 경우의 수 느낌
A 테이블 & B 테이블 사이에 JOIN 조건이 없는 경우, 조합할 수 있는 모든 경우를 출력