์ค์ํ๊ฑฐ ์ ๋ฆฌํ๊ฑฐ ์๋๊ณ ๋ด๊ฐ ๋ณผ๋ ค๊ณ ํท๊ฐ๋ฆฌ๋๊ฑฐ ์ ๋ฆฌํจ
๊ธฐ๋ณธ์ ์ผ๋ก ORACLE ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌ
MySQL์ด๋ MSSQL์ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐ๋ก ์ ๋ฆฌ ํด ๋์
1. NVL(์ธ์1, ์ธ์2)
`์ธ์1`์ ๊ฐ์ด `NULL`์ผ ๊ฒฝ์ฐ `์ธ์2` ๋ฐํ, `NULL` ์๋ ๊ฒฝ์ฐ `์ธ์ 1` ๋ฐํ
ํ ๋ง๋๋ก ์ฐ์ฐํด์ผ ํ๋๋ฐ NULL ๊ฐ์ด ์์ผ๋ฉด 0์ผ๋ก ์นํํด์ค์ผ ๋๋๊น 0์ผ๋ก ๋ฐ๊พธ๋ ํจ์๋ผ๊ณ ์ธ์ฐ๋ฉด ๋๋ค. ์๋ฅผ ๋ค๋ฉด ์ํ ๋ฆฌ๋ทฐํ๋๋ฐ ํ์ ์ฌ์ด์ NULL์ด ๊ปด ์์ด์ ํ๊ท ์ ๋ชป ๋ด์ค ๋ ๊ทธ๋ฅ ๋ค 0์ผ๋ก ์นํํ ๋ ์ฐ๋๊ฑฐ๋ผ ์ดํดํ๋ฉด ๋๋ค.
NVL(expression, replacement_value)
- expression: ํ์ธํ ๊ฐ.
- replacement_value: expression์ด NULL์ผ ๋ ๋์ ์ฌ์ฉํ ๊ฐ.
ORACLE `NVL(์ธ์1, ์ธ์2)`
MySQL `IFNULL(์ธ์1, ์ธ์2)`
MSSQL `ISNULL(์ธ์1, ์ธ์2)`
NVL(REVIEW_SOCRE, 0) // Oracle
IFNULL(REVIEW_SOCRE, 0) // MYSQL
ISNULL (REVIEW_SOCRE, 0) // MSSQL
2. NULLIF(์ธ์1, ์ธ์2)
`์ธ์1`๊ณผ `์ธ์2`๊ฐ ๊ฐ์ผ๋ฉด `NULL` ๋ฐํํ๊ณ , ๊ฐ์ง ์์ผ๋ฉด `์ธ์1` ๋ฐํ
NULLIF(expression1, expression2)
- expression1: ์ฒซ ๋ฒ์งธ ๊ฐ (๋๋๋ ค๋ ๊ฐ)
- expression2: ๋ ๋ฒ์งธ ๊ฐ (๋๋๋ ๊ฐ)
- ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด NULL์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฐํ
๊ทธ๋ฅ ์ ๋ก๋๋๊ธฐ ์ค๋ฅ ๋ฐฉ์ง์ฉ์ด๋ผ๊ณ ์๊ฐ ํ์
SELECT 100 / NULLIF(denominator, 0) AS result
FROM dual;
// denominator๊ฐ 0์ด๋ฉด ๋๋๊ธฐ ์ฐ์ฐ ์์ฒด๊ฐ NULL์ ๋ฐํํ๊ฒ ๋๊ณ , ์ค๋ฅ๋ฐ์X
// denominator๊ฐ 0์ด ์๋๋ฉด ์ ์์ ์ผ๋ก ๋๋๊ธฐ ์ฐ์ฐ์ด ์ํ
3. COALESCE(์ธ์1, ์ธ์2, ์ธ์3...)
null์ด ์๋ ์ฒซ๋ฒ์งธ ๊ฐ(์ธ์) ๋ฐํ
์) COALESCE(PHONE, EMAIL, FAX)
์ฌ์ฐ๋๊น ๊ฑด๋ ๋ฐ์
4. NVL2(์ธ์1, ์ธ์2, ์ธ์3)
์ธ์1์ด NULL์ด ์๋ ๊ฒฝ์ฐ ์ธ์2 ๋ฐํ, NULL์ธ ๊ฒฝ์ฐ ์ธ์3 ๋ฐํ(์ค๋ผํด์๋ง ์์)
NVL2(REVIEW_SCORE, '๋ฆฌ๋ทฐ์์', '๋ฆฌ๋ทฐ์์')
5. CASE
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'])
CASE๋ฌธ์์๋ ELSE ๋ค์ ๊ฐ์ด DEFAULT ๊ฐ์ด ๋๊ณ ๋ณ๋์ ELSE๊ฐ ์์ ๊ฒฝ์ฐ NULL ๊ฐ์ด DEFAULT๊ฐ์ด ๋๋ค.
6. ์ฐ์ฐ์
๋ถ์ ๋น๊ต์ฐ์ฐ์
`^=`, `!=`, `<>` ๊ฐ์ง ์์
`where not col = 10`๊ฐ์ง ์์
FAVORITES๊ฐ Y๊ฐ ์๋ ํ ์กฐํ
SELECT PLAY_ID, NAME, FAVORITES
FROM PLAY_LIST
WEHRE FAVORITES <> 'Y';
TITLE์ด IT Staff์ IT Manager์ด ์๋ ํ ์กฐํํ๊ธฐ
์๋์ ์ฟผ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ์ฟผ๋ฆฌ์ด๋ค
SELECT LAST_NAME, FIRST_NAME, TITLE
FROM EMPLOYEE
WHERE TITLE NOT IN ('IT Staff', 'IT Manager');
SELECT LAST_NAME, FIRST_NAME, TITLE
FROM EMPLOYEE
WHERE NOT(TITLE IN('IT Staff', 'It Manager'));
SELECT LAST_NAME, FIRST_NAME, TITLE
FROM EMPLOYEE
WHERE NOT (TITLE = 'IT Staff' OR TITLE = 'IT Manager');
SELECT LAST_NAME, FIRST_NAME, TITLE
FROM EMPLOYEE
WHERE (TITLE <> 'IT Staff' AND TITLE <> 'IT Manager');
๋๊ฐ๋ ๊ฐ์ ํํ
SELECT * FROM EMP WHERE NOT (SAL < 300 AND SAL > 500 );
SELECT * FROM EMP WHERE SAL >= 300 OR SAL <= 500
โญโญโญ <>๊ณผ NOT ์ฐจ์ด
title์ด 'sales support agent' ์ด๊ฑฐ๋ city๊ฐ 'Calgary'์ธ ์ง์๋ง ์ ์ธํ๋ ์ฟผ๋ฆฌ
title์ด 'sales support agent'๊ฐ ์๋๊ณ , city๊ฐ 'Calgary'๊ฐ ์๋ ์ฌ๋๋ค๋ง ๋ฐํ
SELECT LAST_NAME, FIRST_NAME, TITLE, CITY
FROM EMPLOYEE
WHERE NOT (TITLE = 'SALES SUPPORT AGENT' OR CITY = 'CALGARY');
SELECT LAST_NAME, FIRST_NAME, TITLE, CITY
FROM EMPLOYEE
WHERE title <> 'sales support agent' AND city <> 'calgary';
title์ด 'sales support agent'์ด๊ณ city๊ฐ 'Calgary'์ธ ์ง์๋ง ์ ์ธ
NOT ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ, ์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ๋๋ค์ ์ ์ธํ๊ณ ,
title์ด 'sales support agent'์ด๊ณ city๊ฐ 'Calgary'์ธ ์ฌ๋๋ง ๊ฒฐ๊ณผ๋ก ๋ฐํํฉ๋๋ค.
SELECT LAST_NAME, FIRST_NAME, TITLE, CITY
FROM EMPLOYEE
WHERE NOT (title = 'sales support agent' AND city = 'Calgary');
SELECT LAST_NAME, FIRST_NAME, TITLE, CITY
FROM EMPLOYEE
WHERE NOT (title <> 'sales support agent' OR city <> 'Calgary');
title์ด sales support agent๋ผ๋ city๊ฐ Calgary์ด๋ฉด safe
city๊ฐ Calgary๋ผ๋ title์ด sales support agent์ด๋ฉด safe
๊ทธ๋ฅ ์ด๋์ชฝ์ด๋ ํ๋๋ผ๋ ํด๋นํ๋๊ฒ ์๋๋ฉด ๋จ.
์ฆ ๋ ๋ค ํด๋นํ๋ ์ฌ๋๋ง ์ ์ธ
์ฐ์ฐ์ ๊ด๋ จ ๋ฌธ์
โญ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ SQL์ ๋ช ์๋ ์์์ ์๊ด ์์ด () -> NOT -> AND -> OR ์์ผ๋ก ์ฒ๋ฆฌ
โญNULL๊ณผ์ ์ฐ์ฐ(+, - , *, /)์ ๊ฒฐ๊ณผ๋ ํญ์ NULL์ด๋ค.
โ์กฐ๊ฑด์์์ ์ปฌ๋ผ๋ช ์ ๋ฐ๋์ ์ข์ธก์ ์์นํด์ผ ํ๋ค.
=> ์กฐ๊ฑด์์์ ์ปฌ๋ผ๋ช ์ ๋ฐ๋์ ์ข์ธก์ ์์นํด์ผ ํ๋ค.
SQL์ฐ์ฐ์
์ฐ์ฐ์ | ์๋ฏธ | ์์ |
BETWEEN A AND B | A์ B์ ์ฌ์ด(A, Bํฌํจ) | where col between 1 and 10 |
LIKE '๋น๊ต ๋ฌธ์์ด' | ๋น๊ต๋ฌธ์์ด ํฌํจ '%'๋ ๋ฌธ์์ด '_'๋ ํ๋์ ๋ฌธ์ |
where col like '๋ฐฉํ%' where col like '%์๋ ๋จ' where col like '%ํ์๋ %' where col like '๋ฐฉ_์%' |
IN (LIST) | LIST ์ค ํ๋์ ์ผ์น | where col in (1, 3, 5) |
IS NULL | NULL ๊ฐ | where col is not null |
SQL์ ESCAPE
'_' or '%'๊ธฐํธํฌํจ ๋ฌธ์ ๊ฒ์์ ESCAPE ์ง์
SQL์ ESCAPE ํค์๋๋ LIKE ์ฐ์ฐ์์์ ํน์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ(escape) ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก LIKE ์ฐ์ฐ์๋ ์์ผ๋์นด๋ ๋ฌธ์์ธ %(์์์ ๋ฌธ์์ด)์ _(์์์ ๋จ์ผ ๋ฌธ์)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์ํ ๋ฌธ์์ด์ ์ด๋ฌํ ์์ผ๋์นด๋ ๋ฌธ์๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ๊ฒ์ํ๋ ค๋ฉด ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
ํน์๋ฌธ์ %๋ฅผ ๊ฒ์ํ๊ณ ์ถ์ ๋
SELECT *
FROM table_name
WHERE col LIKE '100#%' ESCAPE '#';
โญ 7. SQL๋ฌธ์ ์คํ ์์
5 `SELECT`
1 `FROM`
2 `WHERE`
3 `GROUP BY`
4 `HAVING`
6 `ORDER BY`
FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
HAVING์ VS WHERE์
WHERE ์ ์ Group by ์ ์ ์ํ
HAVING ์ ์ CROUP BY ์ ์ดํ์ ์ํ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฃนํ ํ์ ๊ฐ๋ฅํ ์ง๊ณ ํจ์๋ก ์กฐ๊ฑด ๋ถ์ฌ
// 2021๋
7์์ ์ฃผ๋ฌธ๋ ์ ํ ์ฝ๋๋ณ๋ก ์ฃผ๋ฌธ ์๋ฅผ ๊ณ์ฐํ๊ณ
// ๊ทธ ์ฃผ๋ฌธ ์๊ฐ 1000๊ฐ ์ด์์ธ ์ ํ ์ฝ๋๋ค๋ง ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ ์ฟผ๋ฆฌ
SELECT PRODUCT_CODE,
COUNT(ORDER_CNT) AS ORDER_CNT
FROM ORDERED_PRODUCT
WHERE ORDER_DATE BETWEEN '20210701' AND '20210731'
GROUP BY PRODUCT_CODE
HAVING COUNT(ORDER_CNT) >= 1000;
HAVING์ ์ ๋ ผ๋ฆฌ์ ์ผ๋ก SELECT ์ ์ ์ ์ํ๋๊ธฐ ๋๋ฌธ์ SELECT ์ ์ ๋ช ์๋์ง ์์ ์ง๊ณํจ์๋ก๋ ์กฐ๊ฑด์ ๋ถ์ฌํ ์ ์๋ค. ์ฃผ์ํ ์ ์ WHERE ์ ์ ์ฌ์ฉํด๋ ๋๋ ์กฐ๊ฑด๊น์ง HAVING ์ ์ ์จ๋ฒ๋ฆฌ๋ฉด ์ฑ๋ฅ์ ๋ถ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ด๋ค(์ํ์ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค). ์๋ํ๋ฉด WHERE ์ ์์ ํํฐ๋ง์ด ์ ํ๋์ด์ผ GROUP BY๋ฅผ ํ ๋ฐ์ดํฐ๋์ด ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค. GROUP BY๋ ๋น๊ต์ ๋ง์ ๋น์ฉ์ด ๋๋ ์์ ์ด๋ฏ๋ก ์ํ ์ ์ ๋ฐ์ดํฐ๋์ ์ต์๋ก ์ค์ฌ๋๋๊ฒ์ด ๋ฐ๋์งํ๋ค. (์ ๋ฏธ๋, ์ ์ ๋ฐฐ SQL๊ฐ๋ฐ์ ๊ณผ์ธ๋ ธํธ)
ORDER BY ์ ์์ ALIAS ์์จ๋ ๋๋ ์ด์
ORDER BY ์ ์์ALIAS(๋ณ์นญ)์จ๋ ๋์ง๋ง ๊ธฐ์กด ์ปฌ๋ผ๋ช ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋๋ ์ด์ ๋ SQL์์ ORDER BY ์ ์ด SELECT ์ ์์ ๋ฐํ๋๋ ์ปฌ๋ผ์ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ORDER BY COL1 DESC, COL2, COL3 DESC;
COL1 ๋ด๋ฆผ์ฐจ์, COL2 ๋ ์ค๋ฆ์ฐจ์, COL3 ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
์ต์ ์๋ต์ ๊ธฐ๋ณธ์ ์ผ๋ก ASC (์ค๋ฆ์ฐจ์) ์ ๋ ฌ
8. ์ง๊ณํจ์
โญ`COUNT(*)` ์ ์ฒด Row๋ฅผ Count (NULL๊ฐ ํฌํจ)
`COUNT(์ปฌ๋ผ)` ์ปฌ๋ผ๊ฐ์ด NULL์ธ Row ์ ์ธํ๊ณ Count
`COUNT(DISTINCT ์ปฌ๋ผ)` ์ปฌ๋ผ๊ฐ์ด NULL์ด ์๋ Row์์ ์ค๋ณต ์ ๊ฑฐํ๊ณ Count
๋๋จธ์ง ์ง๊ณํจ์์์ NULL๊ฐ์ ์ ์ธ๋จ
ํ๊ท ๊ตฌํ ๋๋ null ๊ฐ ์ ์ธํ๊ณ ๋ํด์ null ๊ฐ์ธ ํ์ ๋นผ๊ณ ๋๋จธ์ง ํ ๊ฐ์๋ก ๋๋
โญ Oracle์ NULL ๊ฐ์ด ์ต๋๊ฐ์ด๋ค.
โญ UNION ๊ณผ UNION ALL ์ฐจ์ด
union์ ์ค๋ณต๊ฐ ์ ๊ฑฐ
union all ์ ์ค๋ณต๊ฐ๋ ๋ฐํ
'Coding > SQL&DataBase' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQLD] ์ค๋ต์ ๋ฆฌ & ์๋ธ์ฟผ๋ฆฌ & ์งํฉ์ฐ์ฐ์ UNION, UNION ALL (7) | 2024.11.17 |
---|---|
[SQLD] JOIN (Inner, Outer, Self, Natural, Cross JOIN) (6) | 2024.11.17 |
[SQLD] SQL ๊ธฐ๋ณธ ํจ์ (๋ฌธ์์ด, ์ซ์, ๋ ์ง ๋ฑ) (7) | 2024.11.16 |
[SQLD] ์ ๊ทํ, ๋ฐ์ ๊ทํ (36) | 2024.11.16 |
[SQLD] ๋ฐ์ดํฐ๋ชจ๋ธ๋ง์ ์ดํด (6) | 2024.11.16 |