๐ก SQLD ์๊ฒฉ์ฆ ์ํ ๋๋น ํ์ตํ ๋ด์ฉ์ ์์ฝ์ ๋ฆฌํฉ๋๋ค.
WHERE ์กฐ๊ฑด์
WHERE ์ ์ ์ฌ์ฉํ์ง ์๊ณ ํ์ ์๋ ๋ง์ ์๋ฃ๋ค์ DB๋ก๋ถํฐ ์์ฒญํ๊ฒ ๋๋ฉด CPU, ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์์คํ
์์์ ๊ณผ๋คํ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ค.
WHERE ์ ์ ์กฐํํ๋ ค๋ ๋ฐ์ดํฐ์ ํน์ ์กฐ๊ฑด์ ๋ถ์ฌํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ FROM ์ ๋ค์ ์จ๋ค.
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
WHERE ์กฐ๊ฑด์;
์กฐ๊ฑด์์ ๊ตฌ์ฑ
- ์ปฌ๋ผ๋ช
, ๋น๊ต์ฐ์ฐ์, ๋ฌธ์, ์ซ์, ํํ์, ๋น๊ต ์ปฌ๋ ด๋ช
์ฐ์ฐ์์ ์ข
๋ฅ
- ๋น๊ต ์ฐ์ฐ์ : =, >, >=, <, <=
- SQL ์ฐ์ฐ์ : BETWEEN a AND b, IN (list), LIKE ๋ฌธ์์ด, IS NULL
- ๋
ผ๋ฆฌ ์ฐ์ฐ์ : AND, OR, NOT
- ๋ถ์ ๋น๊ต ์ฐ์ฐ์ : !=, ^=, <>, NOT ์ปฌ๋ผ๋ช
=, NOT ์ปฌ๋ผ๋ช
>
- ๋ถ์ SQL ์ฐ์ฐ์ : NOT BETWEEN a AND b, NOT IN (list), IS NOT NULL
์ฐ์ฐ์ ์ฐ์ ์์
๊ดํธ() -> NOT ์ฐ์ฐ์ -> ๋น๊ต, SQL ๋น๊ต ์ฐ์ฐ์ ->AND ->OR
ROWNUM(์ค๋ผํด)
์ปฌ๋ผ๊ณผ ๋น์ทํ ์ฑ๊ฒฉ์ Pseudo Column, ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์ ๊ฐ ํ์ ๋ํด ์์๋ก ๋ถ์ฌ๋๋ ์ผ๋ จ๋ฒํธ์ด๋ฉฐ, WHERE ์ ์์ ํ์ ๊ฐ์๋ฅผ ์ ํํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
WHERE ROWNUM <= n;
TOP์ : ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ์ถ๋ ฅ๋๋ ํ์ ์๋ฅผ ์ ํ(SQL Server)
SELECT TOP(n) ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
;
ํจ์(Function)
๋ด์ฅ ํจ์ : ๋ฒค๋์์ ์ ๊ณตํ๋ ํจ์
์ฌ์ฉ์ ์ ์ ํจ์ : ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ํจ์
๋ด์ฅ ํจ์
- ๋จ์ผํ ํจ์ : ์
๋ ฅ ๊ฐ์ด ๋จ์ผํ ๊ฐ์ด ์
๋ ฅ
- ๋ค์คํ ํจ์ : ์ฌ๋ฌ ํ์ ๊ฐ์ด ์
๋ ฅ
๐กํจ์ = ์
๋ ฅ๊ฐ : ์ถ๋ ฅ๊ฐ = m : 1
๋จ์ผํ ํจ์์ ์ข
๋ฅ(์ค๋ผํด/SQL Server)
1. ๋ฌธ์ํ ํจ์
- LOWER : ์ํ๋ฒณ ๋ -> ์
- UPPER : ์ํ๋ฒณ ์ -> ๋
- ASCII : ๋ฌธ์, ์ซ์ -> ASCII ์ฝ๋
- CHA/CHAR : ASCII ์ฝ๋ -> ๋ฌธ์, ์ซ์
- CONCAT : ๋ฌธ์์ด์ ์ฐ๊ฒฐ
CONCAT(โabc, โdef); => โabcdefโ
- SUBSTR/SUBSTRING : m๋ถํฐ n๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐํ
SUBSTR(โ012345โ, 2, 3); => โ234โ
- LENGTH/LEN : ๋ฌธ์์ด์ ๊ธธ์ด ๋ฐํ
- LTRIM : ๋ฌธ์์ด์ ์ฒซ ๋ฌธ์๋ถํฐ ์์ํด ์ง์ ๋ฌธ์๋ฅผ ์ญ์
LTRIM(โstudy springโ, โsโ); => โtudy springโโ
- RTRIM : ๋ฌธ์์ด์ ๋ท ๋ฌธ์๋ถํฐ ์์ํด ์ง์ ๋ฌธ์ ์ญ์
RTRIM(โstudy springโ, โsโ); => โstudy pringโ
- TRIM : ๋ฌธ์์ด์์ ๋จธ๋ฆฌ๋ง, ๊ผฌ๋ฆฌ๋ง, ์์ชฝ ์ง์ ๋ฌธ์๋ฅผ ์ ๊ฑฐ
TRIM(โaโ, FROM โaaBBccDDBaDaaโ); => โBBccDDBaDโ
2. ์ซ์ํ ํจ์
- ABS : ์ซ์์ ์ ๋๊ฐ
- SIGN : ์ซ์๊ฐ ์์, ์์, 0 ๊ตฌ๋ณ
- MOD : ์1์ ์2๋ก ๋๋์ด ๋๋จธ์ง ๊ฐ์ ๋ฐํ(% ๋์ฒด๊ฐ๋ฅ)
MOD(7, 3) = 7 % 3
- CEIL/CEILING : ์์์ ์ฌ๋ฆผ
- FLOOR : ์์์ ๋ด๋ฆผ
- ROUND : ์ซ์๋ฅผ ์์์ m์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ
ROUND(38.5235, 3) = 38.524
- TRUNC : ์ซ์๋ฅผ ์์ m์๋ฆฌ์์ ์๋ผ์ ๋ฒ๋ฆผ
TRUNC(38.5235, 3) = 38.523
- SIN, COS, TAN : ์ซ์์ ์ผ๊ฐํจ์ ๊ฐ์ ๋ฐํ
- EXP(์ง์), POWER(๊ฑฐ๋ญ์ ๊ณฑ), SQRT(์ ๊ณฑ๊ทผ), LOG(๋ก๊ทธ), LN(์์ฐ๋ก๊ทธ)
3. ๋ ์งํ ํจ์
- SYSDATE/GETDATE() : ํ์ฌ ๋ ์ง์ ์๊ฐ์ ์ถ๋ ฅ
- EXTRACT/DATEPART : ๋
/์/์ผ ๋ฐ์ดํฐ ์ถ๋ ฅ
- TO_NUMBER(TO_CHAR(d, โYYYYโ))/ YEAR(d)
- TO_NUMBER(TO_CHAR(d, โMMโ))/ MONTH(d)
- TO_NUMBER(TO_CHAR(d, โDDโ))/ DAY(d)
4. ๋ณํํ ํจ์
ํน์ ๋ฐ์ดํฐ ํ์
์ ๋ค์ํ ํ์์ผ๋ก ์ถ๋ ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
- ๋ช
์์ ๋ฐ์ดํฐ ์ ํ ๋ฐํ : ์ง์ ๋ณํ ํจ์๋ฅผ ์ฌ์ฉ
- ์์์ ๋ฐ์ดํฐ ์ ํ ๋ฐํ : ์๋์ผ๋ก DB๊ฐ ๋ณํํด์ค
๋ช
์์ ๋ฐ์ดํฐ ์ ํ ๋ฐํ์ ํจ์
์ค๋ผํด
- TO_NUMBER(๋ฌธ์์ด) : ๋ฌธ์์ด -> ์ซ์
- TO_CHAR(์ซ์|๋ ์ง [, FORMAT]) : ์ซ์๋ ๋ ์ง๋ฅผ ์ฃผ์ด์ง FORMAT ํํ๋ก ๋ฌธ์์ด ํ์
์ผ๋ก ๋ณํ
- TO_DATE(๋ฌธ์์ด [, FORMAT]) : ๋ฌธ์์ด -> ๋ ์งํ์
SQL Server
- CAST(expression AS data_type [(length)])
- CONVERT(data_type [(length)], expression [, style ])
CASE ํํ
IF-THEN-ELSE ๋
ผ๋ฆฌ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ํํ์์ ์์ฑํด SQL์ ๋น๊ต ์ฐ์ฐ ๊ธฐ๋ฅ์ ๋ณด์ํ๋ ์ญํ ์ ํ๋ค.
CASE SIMPLE(SEARCHED)_CASE_EXPRESSION ์กฐ๊ฑด ELSE ํํ์ END;
SIMPLE(SEARCHED)_CASE_EXPRESSION ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ํด๋น ์กฐ๊ฑด ๋ด์ THEN์ ์ ์ํํ๊ณ ๋ง์ง ์์ผ๋ฉด ELSE์ ์ ์ํํ๋ค.
DECODE(ํํ์, ๊ธฐ์ค๊ฐ1, ๊ฐ1 [, ๊ธฐ์ค๊ฐ2, ๊ฐ2, โฆ, ๋ํดํธ๊ฐ)
์ค๋ผํด์์๋ง ์ฌ์ฉํ๋ ํจ์๋ก, ํํ์์ ๊ฐ์ด ๊ธฐ์ค๊ฐ1์ด๋ฉด ๊ฐ1์ ์ถ๋ ฅํ๊ณ , ๊ธฐ์ค๊ฐ2๋ฉด ๊ฐ2๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๊ธฐ์ค๊ฐ์ด ์์ผ๋ฉด ๋ํดํธ๊ฐ์ ์ถ๋ ฅํ๋ค.
NULL ๊ด๋ จ ํจ์
- NVL(์1,์2)/ISNULL(์1,์2) : ์1์ ๊ฐ์ด NULL ์ด๋ฉด ์2 ์ถ๋ ฅ
- NULLIF(์1,์2) : ์1์ด ์2์ ๊ฐ์ผ๋ฉด NULL์ ์๋๋ฉด ์1์ ์ถ๋ ฅ
- COALESCE(์1,์2) : ์์์ ๊ฐ์ํํ์์์ NULL์ด ์๋ ์ต์ด์ ํํ์, ๋ชจ๋ NULL์ด๋ฉด NULL ๋ฐํex)COALESCE(NULL,NULL,โabcโ) -> โabc
GROUP BY, HAVING ์
์ง๊ณ ํจ์
- ๋ค์คํ ํจ์ ์ค ํ๋๋ก ์ฌ๋ฌ ํ๋ค์ ๊ทธ๋ฃน์ด ๋ชจ์ฌ์ ๊ทธ๋ฃน๋น ๋จ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ํจ์
- GROUP BY์ ์ ํ๋ค์ ์๊ทธ๋ฃนํ ํ๋ค.
- SELECT์ , HAVING์ , ORDER BY ์ ์ ์ฌ์ฉํ ์ ์๋ค.
์ง๊ณ ํจ์์ ์ข
๋ฅ
- COUNT(*) : NULL ํฌํจ ํ์ ์
- COUNT(ํํ์) : NULL ์ ์ธ ํ์ ์
- SUM, AVG : NULL ์ ์ธ ํฉ๊ณ, ํ๊ท ์ฐ์ฐ
- STDDEV : ํ์ค ํธ์ฐจ
- VARIAN : ๋ถ์ฐ
- MAX, MIN : ์ต๋๊ฐ, ์ต์๊ฐ
GROUP BY์
๋ฐ์ดํฐ๋ค์ ์์์ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅํ์ฌ ์๊ทธ๋ฃน์ ๋ํ ํญ๋ชฉ๋ณ๋ก ํต๊ณ ์ ๋ณด๋ฅผ ์ป์ ๋ ์ถ๊ฐ ์ฌ์ฉ๋๋ค.
HAVING ์
WHERE์ ๊ณผ ๋น์ทํ์ง๋ง ๊ทธ๋ฃน์ ๋ํ๋ ๊ฒฐ๊ณผ ์งํฉ์ ํ์ ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
[WHERE ์กฐ๊ฑด์] [GROUP BY ์ปฌ๋ผ์ด๋ ํํ์] [HAVING ๊ทธ๋ฃน์กฐ๊ฑด์];
SELECT position ํฌ์ง์
FROM player GROUP BY position HAVING AVG(height) >= 180;
GROUP BY, HAVING ์ ์ ํน์ง
- GROUP BY ์ ์ ํตํด ์๊ทธ๋ฃน๋ณ ๊ธฐ์ค์ ์ ํ ํ, SELECT ์ ์ ์ง๊ณ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- ์ง๊ณ ํจ์์ ํต๊ณ ์ ๋ณด๋ NULL ๊ฐ์ ๊ฐ์ง ํ์ ์ ์ธํ๊ณ ์ํํ๋ค.
- GROUP BY ์ ์์๋ ALIAS ์ฌ์ฉ ๋ถ๊ฐ
- ์ง๊ณ ํจ์๋ WHERE ์ ์ ์ฌ ์ ์๋ค.(GROUP BY์ ๋ณด๋ค WERER์ ์ด ๋จผ์ ์ํ๋๋ค)
- HAVING ์ ์๋ ์ง๊ณํจ์๋ฅผ ์ด์ฉํ์ฌ ์กฐ๊ฑด ํ์o
- HAVING ์ ์ ์ผ๋ฐ์ ์ผ๋ก GROUP BY ๋ค์ ์์น
GROUP BY ์๊ทธ๋ฃน์ ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ง ์ถ์ถํ๋ ๋ฐฉ๋ฒ
- GROUP BY ์ฐ์ฐ ์ WHERE ์ ์์ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํ์ฌ GROUP BY ์ฐ์ฐ์ ํ๋ ๋ฐฉ๋ฒ
- GROUP BY ์ฐ์ฐ ํ HAVING ์ ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ํํฐ๋ง
๊ฐ๋ฅํ๋ฉด 1๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ์ฌ์ฉ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค.
ORDER BY ์
: SQL ๋ฌธ์ฅ์ผ๋ก ์กฐํ๋ ๋ฐ์ดํฐ๋ค์ ๋ค์ํ ๋ชฉ์ ์ ๋ง๊ฒ ํน์ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉ.
ORDER BY ์ ์ ํน์ง
- ALIAS ๋ช
์ด๋ ์ปฌ๋ผ ์์๋ฅผ ๋ํ๋ด๋ ์ ์ ์ฌ์ฉ ๊ฐ๋ฅ
(์ ์ง๋ณด์์ฑ, ๊ฐ๋
์ฑ์ ๊ณ ๋ คํ์ฌ ์ปฌ๋ผ๋ช
, ALIAS๋ช
์ฌ์ฉ ๊ถ๊ณ )
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ์ฉ
- SQL ๋ฌธ์ฅ์ ์ ์ผ ๋ง์ง๋ง์ ์์น์น
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ๋ช
[WHERE ์กฐ๊ฑด์] [GROUP BY ์ปฌ๋ผ์ด๋ ํํ์] [HAVING ๊ทธ๋ฃน์กฐ๊ฑด์] [ORDER BY ์ปฌ๋ผ์ด๋ ํํ์[ASC or DESC]];
- ASC(Ascending) : ์ค๋ฆ์ฐจ์(๊ธฐ๋ณธ๊ฐ, ์๋ต๊ฐ๋ฅ)
- DESC(Descending) : ๋ด๋ฆผ์ฐจ์
๐ก Null์ ์ทจ๊ธ
์ค๋ผํด : null ๊ฐ์ ๊ฐ์ฅ ํฐ ๊ฐ์ผ๋ก ์ทจ๊ธ
SQL Server : null ๊ฐ์ ๊ฐ์ฅ ์์ ๊ฐ์ผ๋ก ์ทจ๊ธ
SELECT ๋ฌธ์ฅ ์คํ ์์
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆด ๋ ํ ๋จ์๋ก ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค๊ฒ ๋๋ฏ๋ก, SELECT ์ ์์ ์ผ๋ถ ์ปฌ๋ผ๋ง ์ ํํ๋๋ผ๋ ORDER BY ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์ ์๋ ๋ค๋ฅธ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
SELECT ์ปฌ๋ผ1, ์ปฌ๋ผ2 FROM ํ
์ด๋ธ๋ช
ORDER BY ์ปฌ๋ผ3;
์กฐ์ธ(JOIN)
: ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ๋ค์ ์ฐ๊ฒฐ ๋๋ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ. ์ผ๋ฐ์ ์ผ๋ก ํ๋ค์ PK, FK ๊ฐ์ ์ฐ๊ด์ ์ํด JOIN์ด ์ฑ๋ฆฝ๋์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ PK, FK ๊ด๊ณ๊ฐ ์์ด๋ ๋
ผ๋ฆฌ์ ์ธ ๊ฐ๋ค์ ์ฐ๊ด๋ง์ผ๋ก ์ฑ๋ฆฝ ๊ฐ๋ฅ!
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด์ ๋ํ ํต์ฌ ๊ธฐ๋ฅ!
๐จ ์ฃผ์ํ ์ !
FROM ์ ์ ์ฌ๋ฌ ํ
์ด๋ธ์ด ๋์ด๋๋๋ผ๋ SQL์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ๋จ ๋ ๊ฐ์ ์งํฉ ๊ฐ์๋ง ์กฐ์ธ์ด ์ผ์ด๋๋ค.
JOIN์ ์ฐธ์ฌํ๋ ๋์ ํ
์ด๋ธ : N๊ฐ
ํ์ํ JOIN์ ์กฐ๊ฑด : N-1๊ฐ ์ด์
JOIN์ ์กฐ๊ฑด์ WHERE ์ ์ ๊ธฐ์ ํ๋ค.
EQUI JOIN(๋ฑ๊ฐ ์กฐ์ธ, โ=โ)
- ๋ ๊ฐ์ ํ
์ด๋ธ ๊ฐ์ ์ปฌ๋ผ ๊ฐ๋ค์ด ์๋ก ์ ํํ๊ฒ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ. ๋๋ถ๋ถ PK, FK์ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
SELECT ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
, ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ1, ํ
์ด๋ธ2 WHERE ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
= ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
;
SELECT ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
, ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ1 INNER JOIN ํ
์ด๋ธ2 ON ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
= ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
;
- FROM์ ์ ํ
์ด๋ธ์ ๋ํด์ ALIAS๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
- ๊ฐ๋
์ฑ์ ์ํด ํ
์ด๋ธ๋ช
๋์ ALIAS ์ฌ์ฉ์ ๊ถ๊ณ .
Non EQUI JOIN(๋น๋ฑ๊ฐ ์กฐ์ธ)
- ๋ ๊ฐ์ ํ
์ด๋ธ ๊ฐ์ ์ปฌ๋ผ ๊ฐ๋ค์ด ์๋ก ์ ํํ๊ฒ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ.
- BETWEEN, >, >=, <, <= ๋ฑ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ
SELECT ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
, ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ1, ํ
์ด๋ธ2 WHERE ํ
์ด๋ธ1.์ปฌ๋ผ๋ช
1 BETWEEN ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
1 AND ํ
์ด๋ธ2.์ปฌ๋ผ๋ช
2;