INSERT
DELETE
SELECT
ALTER TABLE EMP NOLOGGING;
와일드카드(_ , %)를 문자로 취급하는 함수
SELECT * FROM EMP WHERE NAME LIKE '%#_%' ESCAPE '#';ROWNUM (Oracle)
# 행 9개 조회
SELECT * FROM table1 WHERE rownum < 10;
TOP (SQL Server)
SELECT TOP 10 col1, col2, col3 FROM table1;
# Searched CASE (조건 컬럼이 여러 개일 때)
SELECT
CASE
WHEN 조건A = 'a' THEN 1
WHEN 조건B = 'b' THEN 2
ELSE 3 # 조건에 만족하지 않으면 나타낼 값
END AS 원하는 컬럼명 # 마지막에 컬럼명 없으면 'END' 로 닫아주기
FROM TABLE;
# Simple CASE (조건 컬럼이 하나일 때)
SELECT
CASE 조건A
WHEN 'a' THEN 1
WHEN 'b' THEN 2
ELSE 3
END AS 원하는 컬럼명
FROM TABLE;
DECODE (oracle)
DECODE(값, IF1, THEN1, IF2, THEN2, .... )
SELECT
employee_id,
DECODE(department_id,
10, 'Sales',
20, 'Marketing',
30, 'IT',
'Other') AS department_name
FROM employees;
NULL 의 정의
NVL (oracle) / ISNULL (SQL server)
NVL(EXPR1, 0)
ISNULL(EXPR1, 0)
# 문자열을 반환하고 싶으면 컬럼도 문자열이어야 한다.
NVL(TO_CHAR(EXPR1), 'zero')
# commission_pct 열이 NULL이면 0을 반환, 그렇지 않으면 commission_pct 반환
ISNULL(commission_pct, 0)
NULLIF
NULLIF(EXPR1, EXPR2);
# department가 'Sales'이면 NULL을 반환하고, 그렇지 않으면 department의 값을 반환
NULLIF(department, 'Sales')
COALESCE
# discounted_price가 NULL이면 regular_price를 반환하고, 그렇지 않으면 discounted_price를 반환
COALESCE(discounted_price, regular_price)
# email이 NULL이면 phone을 반환하고, 그렇지 않으면 'Contact information not available' 메시지를 반환
COALESCE(email, phone, 'Contact information not available')
SELECT DISTINCT col1, col2 FROM table # salary 컬럼으로 내림차순 정렬 후 동일값이 있으면 hire_date 으로 오름차순 정렬한다.
ORDER BY salary DESC, hire_date ASC| 함수 | 반환 값 |
|---|---|
| COUNT(*) | NULL 값을 포함한 행의 수 |
| COUNT(표현식) | NULL 값을 제외한 행의 수 |
| SUM([DISTINCT | ALL] 표현식) | NULL 값을 제외한 합계 |
| AVG([DISTINCT | ALL] 표현식) | NULL 값을 제외한 평균 |
| MAX([DISTINCT | ALL] 표현식) | 최대값 (문자, 날짜 데이터 타입도 사용 가능) |
| MIN([DISTINCT | ALL] 표현식) | 최소값 (문자, 날짜 데이터 타입도 사용 가능) |
| STDDEV([DISTINCT | ALL] 표현식) | 표준 편차 |
| VARIAN([DISTINCT | ALL] 표현식) | 분산 |
COUNT
SELECT COUNT(*) FROM A, B -- A데이터 개수 * B데이터 개수AVG
# comm 컬럼에 값이 null 이면 0 으로 치환하여 평균 계산
SELECT AVG(NVL(comm, 0)) AS avg2 FROM emp;MIN / MAX
| 함수 | 반환 값 |
|---|---|
| ROUND(n, d) | 반올림 (5 이상이면 올림, 5 이하이면 내림) |
| CEIL(n, d) (oracle) | 올림 (소수점 상관 없이 무조건 올림 처리) 주어진 수보다 크거나 같은 가장 작은 정수를 반환 |
| CEILING(n, d) (SQL) | 올림 |
| TRUNCATE(n, d) / TRUNC | 버림 |
| FLOOR(n, d) | 버림 주어진 수보다 작거나 같은 가장 큰 정수를 반환 |
| ABS | 절대값 |
# 소수점 이하 두 번째 자리까지 반올림
ROUND(123.4567, 2) -- 123.46
# 소수점 이상의 첫 번째 자리까지 반올림
ROUND(123.4567, -1) -- 120
# 0 의 자리에서 반올림하여 정수로 나타냄
ROUND(123.4567) -- 123
# 소수점 이하 두 번째 자리까지 버림
SELECT TRUNCATE(135.375, 2); -- 135.37
# 올림
CEIL(123.12) -- 124
SELECT CEIL(-4.2) AS result FROM dual; -- 결과: -4
SELECT CEIL(-5.0) AS result FROM dual; -- 결과: -5
# 버림
FLOOR(4.8) -- 4
SELECT FLOOR(-4.8) AS result FROM dual; -- 결과: -5
SELECT FLOOR(-5.0) AS result FROM dual; -- 결과: -5
# 절대값
ABS(-22) -- 22
| 함수 | 반환 |
|---|---|
| ASCII(문자) | 문자나 숫자를 ASCII 코드로 변환 |
| CHR/CHAR(ASCII번호) | ASCII 코드 번호를 문자나 숫자로 변환 |
| CONCAT(문자열1, 문자열2) | 문자열1과 문자열2를 연결 (oracle의 || 와 SQL의 + 와 동일) |
| SUBSTR/SUBSTRING(문자열, m, n) | 문자열에서 m 번째 문자부터 n 개의 문자를 출력 (n 이 생략되면 마지막 문자까지 출력, 음수 파라미터 사용 불가) |
| INSTR(문자열1, 문자열2) | 문자열1 에서 문자열2 를 찾아서 첫번째 자리수 반환 (없으면 0 반환) |
| LENGTH/LEN(문자열) | 문자열의 개수 |
| TRIM([LEADING|TRAILING|BOTH] 지정문자 FROM 문자열) | 문자열에서 머리말(leading), 꼬리말(trailing), 양쪽(both)에 있는 지정문자를 제거 SQL server 에서는 지정문자 사용 불가능 (공백만 제거 가능) |
| LTRIM(문자열, 지정문자) | 문자열의 왼쪽부터 확인해서 지정문자가 나타나면 해당 문자를 제거 (지정문자 생략시 공백) SQL server 에서는 지정문자 사용 불가능 (공백만 제거 가능) 다른 문자 사이 또는 오른쪽에 있는 문자는 제거하지 않는다. |
| RTRIM(문자열, 지정문자) | 문자열의 오른쪽부터 확인해서 지정문자가 나타나면 해당 문자를 제거 SQL server 에서는 지정문자 사용 불가능 (공백만 제거 가능) |
| LPAD(문자, 총자릿수, 채울문자) | 특정자리수를 정하고 왼쪽부터 채워줌 |
| RPAD(문자, 총자릿수, 채울문자) | 특정자리수를 정하고 오른쪽부터 채워줌 |
# 양쪽에 있는 'x' 문자를 제거하여 'Hello World'를 반환
TRIM('x' FROM 'xxxHello Worldxxx')
TRIM(BOTH 'x' FROM 'xxxHello Worldxxx')
# 앞쪽에 있는 'x' 문자를 제거하여 'Hello Worldxxx'를 반환
TRIM(LEADING 'x' FROM 'xxxHello Worldxxx')
# 뒤쪽에 있는 'x' 문자를 제거하여 'xxxHello World'를 반환
TRIM(TRAILING 'x' FROM 'xxxHello Worldxxx')
# 'Hello World' (양쪽 공백 제거)
LTRIM(RTRIM(' Hello World '))
TRIM(' Hello World ')
# 채우기
SELECT LPAD('A', 5, '*') FROM table1; -- ****A
SELECT LPAD('AB', 5, '*') FROM table1; -- ***AB
SELECT RPAD('A', 5, '*') FROM table1; -- A****
CONVERT, CAST, 그리고 날짜 형식 변환에는 FORMAT 사용DATE_FORMAT과 STR_TO_DATE 사용TO_DATE (oracle)

TO_CHAR (oracle)
DATE 타입 연산
1/24 -- 1시간 (하루가 24시간이라서 24로 나누면 1시간)
1/24/60 -- 1분 (1시간은 60분이라서 60으로 나누면 1분)
1/24/30 -- 2분
1/24/12 -- 5분
1/24/(60/10) -- 10분
1/24/60/6 -- 10초
1/24/60/60 -- 1초
2/24 -- 2시간
10/24/60 -- 10분
# 1분은 하루를 24시간으로 나눈 1/24를 다시 60으로 나눈 1/24/60 = 1/1440
1/1440 = 1/24/60 -- 1분
# 1초는 하루를 24시간으로 나눈 1/24를 다시 60으로 나눈 1/24/60 을 다시 60으로 나눈 1/24/60/60 = 1/86400
1/86400 = 1/24/60/60 -- 1초
# 1/12
1/12/(60/30) = 1/12/2 = 1/24 -- 1시간
# employees 테이블에서 departments 테이블에 매칭되는 department_id가 있는 직원의 이름을 반환
SELECT employee_name
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
);관계 대수란? (Relational Algebra)
원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술하는 절차 언어
SELECT (σ)
PROJECT (π)
JOIN (▷◁)
DIVIDE (DIVISION) (÷)
UNION / UNION ALL (∪) 합집합
INTERSECTION (∩) 교집합
DIFFERENCE (-) 차집합
PRODUCT (x) 교차곱
= Cartesian Product (카타시안곱), CROSS JOIN 기능
여러 테이블의 데이터를 사용하여 동시 출력하거나 참조할 경우에 사용한다.
EQUI JOIN (등가 조인, 동등 조인)
NON EQUI JOIN
INNER JOIN (JOIN)
# Oracle 표준
SELECT * FROM order1, review WHERE order1.id = review.order_id;
# ANSI 표준
SELECT * FROM task JOIN alarm USING(title);
SELECT * FROM order1 o INNER JOIN review r ON (r.order_id = o.id);OUTER JOIN
RIGHT OUTER JOIN 은 (+) 를 왼쪽에 위치
LEFT OUTER JOIN 은 (+) 를 오른쪽에 위치
WHERE A.게시판ID = B.게시판ID(+)
WHERE A.게시판ID(+) = B.게시판ID
NATURAL JOIN (oracle)
CROSS JOIN
SELF JOIN
SELECT e1.manager_id, e1.first_name, e2.employee_id FROM employees e1, employees e2
WHERE e1.manager_id = e2.employee_id;