
SELECT COL1, COL2, ... FROM TABLE1 WHERE COL1 = 'A';SELECT * FROM TABLE1;SELECT M.NAME AS MEMBER_NAME, O.COST
FROM MEMBER M, ORDER O
WHERE M.ID = O.MEMBER_ID; 
||SELECT 'S' || 'Q' || 'L' || '!' AS SQLD FROM T1;CHR(ASCII 코드)SELECT CHR(65) FROM T1;LOWER(문자열)SELECT LOWER('ROSE') FROM T1;UPPER(문자열)SELECT UPPER('rose') FROM T1;LTRIM(문자열 [, 특정 문자)]) * []는 옵션SELECT LTRIM(' ROSE') FROM T1;RTRIM(문자열 [, 특정 문자]) *[] 옵션SELECT RTRIM('ROSE ') FROM T1;TRIM([위치] [특정 문자] [FROM] 문자열) *[] 옵션LEADING or TRAILING or BOTH)로 지정된 곳부터 한 글자씩 특정 문자와 비교하여 같으면 제거하고 같지 않으면 멈춤SELECT TRIM(' ROSE ') FROM T1;SELECT TRIM(LEADING '블' FROM '블랭핑크') FROM T1;SUBSTR(문자열, 시작점 [, 길이]) *[] 옵션SELECT SUBSTR('블랭핑크로제', 3, 2) FROM T1;LENGTH(문자열)SELECT LENGTH('ROSE') FROM T1;REPLACE(문자열, 변경 전 문자열 [, 변경 후 문자열]) *[] 옵션SELECT REPLACE('블랭핑크로제', '로제', '제니') FROM T1; ABS(수)SIGN(수)ROUND(수 [, 자릿수]) *[] 옵션TRUNC(수, [, 자릿수]) *[] 옵션CEIL(수)FLOOR(수)MOD(수1, 수2)SYSDATESELECT SYSDATE FROM T1;EXTRACT(특정 단위 FROM 날짜 데이터)SELECT EXTRACT(YEAR FROM SYSDATE) AS YEAR
FROM T1;ADD_MONTHS(날짜 데이터, 특정 개월 수)SELECT ADD_MONTHS(TO_DATE('2024-12-31', 'YYYY-MM-DD'), -1) AS PREV_MONTH
FROM T1; BIRTHDAY(VARCHAR)를 숫자와 비교할 경우, 데이터베이스는 BIRTHDAY를 NUMBER형으로 변환하게 됨TO_NUMBER(문자열)TO_CHAR(수 or 날짜 [, 포맷]) *[] 옵션TO_DATE(문자열, 포맷)포맷 형식의 문자형의 데이터를 날짜형으로 변환
| 포맷 표현 | 의미 |
|---|---|
| YYYY | 년 |
| MM | 월 |
| DD | 일 |
| HH | 시(12) |
| HH24 | 시(24) |
| MI | 분 |
| SS | 초 |
💡 ORACLE 날짜 계산
오라클에서 날짜 계산은 숫자 계산과 같다. 특정 날짜에 숫자 1을 더하면 하루를 더한 것과 같아진다.
1: 1일1/24: 1시간1/24/60: 1분1/24/(60/10): 10분
NVL(인수1, 인수2)NULLIF(인수1, 인수2)COALESCE(인수1, 인수2, 인수3, ...)ISNULL(인수1, 인수2) # EX1
CASE WHEN LINE = 1 THEN 'NAVY'
WHEN LINE = 2 THEN 'GREEN'
WHEN LINE = 3 THEN 'ORANGE'
[ELSE 'WHITE']
END
# EX2
CASE LINE
WHEN 1 THEN 'NAVY'
WHEN 2 THEN 'GREEN'
WHEN 3 THEN 'ORANGE'
[ELSE 'WHITE']
END
# EX3(ORACLE)
DECODE (LINE, 1, 'NAVY', 2, 'GREEN', 3, 'ORANGE' [, 'WHITE'])WHERE 절 ⭐️⭐️
INSERT를 제외한 DML문을 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문
SELECT COL1, COL2, ... FROM TABLE_NAME WHERE CONDITION;
비교 연산자 ⭐️
| 연산자 | 의미 | 예시 |
|---|---|---|
| = | 같음 | WHERE COL = 5 |
| < | 작음 | WHERE COL < 5 |
| ≥ | 작거나 같음 | WHERE COL <= 5 |
| > | 큼 | WHERE COL > 5 |
| ≥ | 크거나 같음 | WHERE COL >= 5 |
부정 비교 연산자 ⭐️⭐️
| 연산자 | 의미 | 예시 |
|---|---|---|
| != | 같지 않음 | WHERE COL != 5 |
| ^= | 같지 않음 | WHERE COL ^= 5 |
| <> | 같지 않음 | WHERE COL <> 5 |
| NOT 컬럼명 = | 같지 않음 | WHERE NOT COL = 5 |
| NOT 컬럼명 > | 크지 않음 | WHERE NOT COL > 5 |
SQL 연산자 ⭐️⭐️
| 연산자 | 의미 | 예시 |
|---|---|---|
| BETWEEN A AND B | A와 B 사이 (A, B 포함) | WHERE COL BETWEEN 100 AND 200 |
| LIKE | 비교 문자열 포함 | WHERE COL LIKE ‘APPL%’ WHERE COL LIKE ‘%PPLE’ WHERE COL LIKE ‘%PPL%’ WHERE COL LIKE ‘A__L%’ |
| IN (LIST) | LIST 중 하나와 일치 | WHERE COL IN (10, 20, 30) WHERE (COL1, COL2) IN ((10,20)) |
| IS NULL | NULL 값 | WHERE COL IS NULL |
ESCAPE_ 혹은 % 가 포함된 문자를 검색하고자 할 때, ESCAPE를 지정해서 쿼리를 작성할 수 있다. EX #% , `#`SELECT * FROM SAMPLE
WHERE COL1 LIKE '%#%%' ESCAPE '#';부정 SQL 연산자 ⭐️⭐️
| 연산자 | 의미 | 예시 |
|---|---|---|
| NOT BETWEEN A AND B | A와 B 사이가 아님 (A, B 미포함) | WHERE COL NOT BETWEEN 100 AND 200 |
| NOT IN (LIST) | LIST 중 일치하는 것 없음 | WHERE COL NOT IN (10, 20, 30) |
| IS NOT NULL | NULL 값 아님 | WHERE COL IS NOT NULL |
💡 드모르간 법칙
NOT (A AND B) ≡ (NOT A) OR (NOT B)
NOT (A OR B) ≡ (NOT A) AND (NOT B)
| 연산자 | 의미 |
|---|---|
| AND | 모든 조건이 TRUE여야 함 |
| OR | 하나 이상의 조건이 TRUE여야 함 |
| NOT | TRUE → FALSE, FALSE → TRUE |
| COUNT(*) | 전체 행 개수를 반환 |
|---|---|
| COUNT(COL) | 컬럼값이 NULL인 행을 제외한 개수 반환 |
| COUNT(DISTINCT COL) | 컬럼값이 NULL이 아닌 행에서 중복을 제외한 개수 반환 |
| SUM(COL) | 컬럼값들의 합계 반환 |
| AVG(COL) | 컬럼값들의 평균 반환 |
| MIN(COL) | 컬럼값들의 최솟값 반환 |
| MAX(COL) | 컬럼값들의 최댓값 반환 |
| STDDEV(COL) | 컬럼값들의 표준 편차 반환 |
| VARIAN(COL) | 컬럼값들의 분산 반환 |
💡 WHERE vs. HAVING ⭐️
WHERE
조회되는 데이터에 대한 조건 설정
HAVING
그룹화된 데이터에 대한 조건 설정
💡 SELECT 문의 논리적 수행 순서 ⭐️⭐️
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
💡 DISTINCT 뒤에 컬럼이 여러 개 오는 경우?
- 주어진 컬럼값이 모두 동일한 행들로만 중복으로 처리
SELECT DISTINCT NAME, AGE FROM MEMBER;- 애초에 여러 컬럼이 SELECT 절에 올 때, 하나의 컬럼에만 DISTINCT를 적용할 수 없다. 하나의 컬럼에만 적용하고 싶으면
GROUP BY를 이용해야 한다.
SELECT NAME, MIN(AGE) FROM users GROUP BY NAME;
NULLS FIRST , NULLS LAST 옵션으로 NULL의 정렬상 순서 변경 가능ORDER BY AGE ASC NULLS FIRSTSELECT 문에서 컬럼명을 별칭으로 변경해도 ORDER BY에서는 원본 컬럼을 참조할 수 있어서 무엇으로 사용하든 상관 없음SELECT P.PRODUCT_CODE, P.NAME, R.ID, R.CONTENT
FROM PRODUCT P, REVIEW R
WHERE A.PRODUCT_CODE = R.PRODUCT_CODESELECT P.NAME, R.CONTENT, R.REGDATE
FROM PRODUCT P, REIEW R
WHERE R.REGDATE BETWEEN P.START_DATE AND P.END_DATEWHERE P.CODE = R.CODE(+)표준 조인
RDBMS를 벤더별로 구분하면 Oracle, MySQL, MariaDB 등이 있다.
벤더마다 SQL 문법에 차이가 크면 호환성 이슈가 발생하고, SQL을 사용하는 사람들 입장에서도 효율성이 떨어지기 때문에 표준이 되는 ANSI SQL을 지정하게 되었다. STANDARD JOIN은 ANSI SQL 중 하나이다.
INNER JOIN ⭐️⭐️
JOIN 조건에 충족하는 데이터만 출력되는 방식

SELECT P.CODE, P.NAME, R.MEMBER_ID, R.CONTENT
FROM PRODUCT A INNER JOIN REVIEW R
ON P.CODE = R.CODE;
LEFT OUTER JOIN ⭐️⭐️
SQL에서 왼쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN

SELECT P.CODE, P.NAME, R.MEMBER_ID, R.CONTENT
FROM PRODUCT P LEFT OUTER JOIN REVIEW R
ON P.CODE = R.CODE;
RIGHT OUTER JOIN ⭐️⭐️
SQL에서 오른쪽에 표기된 테이블의 데이터는 무조건 출력되는 JOIN

SELECT R.MEMBER_ID, R.CONTENT, P.CODE, P.NAME
FROM REVIEW R RIGHT OUTER JOIN PRODUCT P
ON R.CODE = P.CODE;
FULL OUTER JOIN ⭐️⭐️
왼쪽, 오른쪽 테이블의 데이터가 모두 출력되는 방식
- LEFT OUTER JOIN과 RIGHT OUTER JOIN의 합집합 (중복값은 제거)

SELECT R.CAST AS R_CAST, I.CAST AS I_CAST
FROM RUNNING_MAN R FULL OUTER JOIN INFINITE_CHALLENGE I
ON R.CAST = I.CAST;
NATURAL JOIN ⭐️⭐️
A와 B 테이블에서 같은 이름을 가진 컬럼들이 모두 동일한 데이터를 가지고 있을 경우 JOIN되는 방식
SELECT *
FROM RUNNING_MAN R NATURAL JOIN INFINITE_CHALLENGE I;
CROSS JOIN(Cartesian Product) ⭐️⭐️
A와 B 테이블 사이에 조합할 수 있는 모든 경우를 출력하는 방식
# EX1
SELECT M.NAME, M.JOB, D.CODE, D.NAME
FROM MEMBER M CROSS JOIN DRINK D;
# EX2
SELECT M.NAME, M.JOB, D.CODE, D.NAME
FROM MEMBER M, DRINK D;
💡 USING ⭐️
- USING 조건절을 이용하여 같은 이름을 가진 컬럼 중 원하는 컬럼만 JOIN에 이용할 수 있음
- SELECT 절에서 USING 절로 정의된 컬럼 앞에는 별도의 별칭(alias)나 테이블명을 붙이지 않아야 함
- EX) USING (NAME, GENDER)
Standard Join 이미지 출처: Visual Representation of SQL Joins