โ๏ธ ์ฃผ์
- SELECT ์ ์์ ์์ฑํ ๋ณ์นญ์ Where ์ ์์ ์ฌ์ฉํ ์ ์์
- Partition๊ณผ ๊ฐ์ ์๋์ฐ ํจ์๋ Where ์ ์์ ์ฌ์ฉํ ์ ์์
- ์๋ธ์ฟผ๋ฆฌ ๋ง๋ค๊ณ , ๋ณ์นญ ์ ์ฌ์ฉํด๋ ๋ง๋ค์ด์ผ ํจ
โญ๏ธ SQL ์ฟผ๋ฆฌ ์์
1. SELECT
2. FROM
3. JOIN
4. WHERE
5. GROUP BY
6. HAVING
7. ORDER BY
8. LIMIT
๐ NULL ์ฒ๋ฆฌ ๊ด๋ จ ํจ์
NULL ์ฒ๋ฆฌ
: ์ปฌ๋ผ์ ๊ฐ์ด NULL์ธ ๊ฒฝ์ฐ ์ฒ๋ฆฌํด์ฃผ๋ ํจ์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์์ ๋๋ฝ๋๊ฑฐ๋ ์ ์๋์ง ์์ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ฉ
- NULL ๊ฐ ํ์ธ
- `IS NULL` : ๊ฐ์ด NULL์ธ์ง ํ์ธ
- `IS NOT NULL` : ๊ฐ์ด NULL์ด ์๋์ง ํ์ธ
- `ISNULL(expr)` : NULL์ด๋ฉด 1 ๋ฐํ, ์๋๋ฉด 0์ ๋ฐํ
- NULL๊ฐ ๋์ฒด
- `IFNULL` : ์ปฌ๋ผ ๊ฐ์ด NULL์ ๋ฐํํ ๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ถ๋ ฅํ ์ ์๋๋ก ํ๋ ํจ์
- ex) SELECT IFNULL(์นผ๋ผ๋ช , 'null์ผ ๊ฒฝ์ฐ ๋์ฒด ๊ฐ') FROM ํ ์ด๋ธ๋ช ;
- `COALESCE` : ์ง์ ํ ํํ์๋ค ์ค์ NULL์ด ์๋ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๋ฐํ
- ex) SELECT COALESCE(์นผ๋ผ๋ช 1, ์นผ๋ผ๋ช 2, ์นผ๋ผ๋ช 3, 0) : ์ด๋ฐ์์ผ๋ก ์์๋๋ก NULL์ด ์๋๊ฑฐ ๋ฐํ
- `NULLIF`
- NULL(expr1, expr2) : ๋ ํํ์์ด ๊ฐ์ผ๋ฉด NULL ๋ฐํ, ๋ค๋ฅด๋ฉด expr1 ๋ฐํ
- ์ฃผ๋ก ๋ ๊ฐ์ด ๊ฐ์ ๋ NULL ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ
- ex)SELECT product_id, NULLIF(discount, price) AS adjusted_discount FROM products;
- `CASE` ๊ตฌ๋ฌธ ์ฌ์ฉ
- case ๊ตฌ๋ฌธ์ผ๋ก NULL ๊ฐ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ex) CASE WHEN salary IS NULL THEN ~~~
- `IFNULL` : ์ปฌ๋ผ ๊ฐ์ด NULL์ ๋ฐํํ ๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ถ๋ ฅํ ์ ์๋๋ก ํ๋ ํจ์
๐ ์กฐ๊ฑด ์ฐ์ฐ์
BETWEEN
: WHERE ์ ๋ด ํน์ ๊ฐ์ด ์ฃผ์ด์ง ๋ฒ์ ๋ด์ ํฌํจ๋๋์ง ํ์ธํ ๋ ์ฌ์ฉ
์ซ์, ๋ ์ง, ์๊ฐ, ๋ฌธ์์ด ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ
- ex) WHERE age BETWEEN 20 AND 29;
- ์ ์ฌ์ฉ? : WHERE ~ AND 20<= AGE <= 29; ์ด๋ฐ ์์ผ๋ก ๊ธฐํธ๋ก๋ ์ฐ์์ ์ธ ์กฐ๊ฑด ๋น๊ต๊ฐ ์๋จ
IN
: ํน์ ๊ฐ์ด ์ฃผ์ด์ง ๊ฐ ๋ชฉ๋ก ์์ ์๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉ
- SELECT ์นผ๋ผ๋ช `IN` (val1, val2, val3, ..., val N)
* ํ์ฉ : ์๋์ฒ๋ผ ๊ดํธ๋ฅผ ์ฌ์ฉํด์ ๋๊ฐ์ง ์นผ๋ผ์ ๋ํด ์กฐ๊ฑด์ ์ค์ ํ ์๋ ์์
SELECT * FOOD_TYPE
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
SELECT
FOOD_TYPE
, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
IF
: ์กฐ๊ฑด์ ํ๊ฐํ๊ณ , ํด๋น ์กฐ๊ฑด์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ฐํ
- IF(condition, true_value, false_value) : condition์ด true ๋ฉด 2๋ฒ์งธ ๊ฐ, false๋ฉด 3๋ฒ์งธ ๊ฐ
- ex) SELECT IF(1 > 0, 'Yes', 'No') AS result;
- IF(salary > 5000, 'High', 'Low')
SELECT
ANIMAL_ID
, NAME
, IF(SEX_UPON_INTAKE LIKE 'Neutered%'
OR SEX_UPON_INTAKE LIKE 'Spayed%', 'O', 'X') AS ์ค์ฑํ
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
๐ ์ง๊ณ & ์๋์ฐ ํจ์
MAX, MIN, ABS, AVG, SUM
* ์ต๋๊ฐ์ ํด๋นํ๋ ์๊ฐ 1๊ฐ๋ก ๋ณด์ฅ๋ ๋
SELECT MAX(DATETIME) AS ์๊ฐ
FROM ANIMAL_INS
* ์ต๋๊ฐ์ ํด๋นํ๋ ์๊ฐ ์ฌ๋ฌ๊ฐ ์์ ์ ์์ ๋
SELECT DATETIME AS ์๊ฐ
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MAX(DATETIME)
FROM ANIMAL_INS);
* MAX ํจ์ ํ์ฉ ์์ (์ข์ผ๋๊น ์ฐธ๊ณ )
SELECT
CAR_ID
, CASE
WHEN MAX('2022-10-16' BETWEEN START_DATE AND END_DATE) = 1 THEN '๋์ฌ์ค'
ELSE '๋์ฌ ๊ฐ๋ฅ'
END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
group by๋ฅผ ์ํํ๋ฉด car_id ๋ผ๋ฆฌ ๋ฌถ์ด๊ฒ ๋๋๋ฐ ์ด๋ when์ max ์ ์์ ์กฐ๊ฑด์ ํตํด ์๋์ฒ๋ผ ์ถ๋ ฅ
- ์ฐธ์ด๋ฉด 1
- ๊ฑฐ์ง์ด๋ฉด 0
๋ฐ๋ผ์ max ํจ์์ ์ํด ๋์ฌ์ค์ด ํ๋ฒ์ด๋ผ๋ ์์์ผ๋ฉด 1์ ์ถ๋ ฅํ๊ฒ ๋๋ฉฐ
๊ทธ๊ฒ์ด =1 ์ ์กฐ๊ฑด์ ๋ง์ then '๋์ฌ์ค'์ผ๋ก ๋์ค๊ฒ ๋๋ ๊ฒ
COUNT
: ํ์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉ
- `COUNT(*)` : ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๊ณ์ฐ (NULL์ ์ฌ๋ถ์ ์๊ด์์ด ๋ชจ๋ ํ์ ํฌํจํด์ ๊ณ์ฐ)
- `COUNT(์นผ๋ผ๋ช )` : ํด๋น ์ด์ NULL ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์ ์ธ
- `COUNT(DISTINCT ์นผ๋ผ๋ช )` : ํน์ ์ด์ ๊ณ ์ ๊ฐ ๊ฐ์๋ฅผ ๊ณ์ฐ, ์ค๋ณต๋ ๊ฐ์ ์ ์ธํ๊ณ ๊ณ์ฐ
* ์ด์ NULL ์ ๋ฎค๋ฅผ ๊ณ ๋ คํด์ COUNT(*)์ COUNT(์นผ๋ผ๋ช ) ์ค ์ ์ ํ๊ฒ ๊ณ ๋ คํด์ผ ํ๋ค
OVER
: ์๋์ฐ ํจ์์ ๋์ ๋ฒ์๋ฅผ ์ง์
- ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํจ ๊ตฌ๋ฌธ
* ์ฐธ๊ณ ํ๊ธฐ ์ข์ ์ฟผ๋ฆฌ ์์ : Group by ๋ฌด์ํ๊ณ ์ ์ฒด ์ง๊ณํ๊ธฐ
* ๊ฐ ์ง์์ด ๋ด๋นํ ๋งค์ถ์ ์ดํฉ์ ์ ์ฒด ๋งค์ถ ๋๋น ์ผ๋ง์ธ์ง ๋น์จ ๊ณ์ฐ
SELECT
E.EmployeeId
, SUM(I.Total) / SUM(SUM(I.Total)) OVER() AS TOTAL_SALES
FROM
Invoice AS I
JOIN Customer AS C
ON I.CustomerId = C.CustomerId
JOIN Employee AS E
ON C.SupportRepId = E.EmployeeId
GROUP BY E.EmployeeId;
- GROUP BY ์ ์ํด ์ง์ ์์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง๊ณ ๋์ง๋ง, `SUM(~) OVER()`๋ฅผ ์ํํ๋ฉด ์ ์ฒด ํฉ๊ณ๋ฅผ ๊ตฌํ ์ ์์
- ์ฃผ์ ) SUM(I.Total) OVER () ~ ์ด๋ ๊ฒ ์ํํ๋ฉด ์ค๋ฅ๋จ -> `SUM(SUM(~)) OVER()` ์ด๋ ๊ฒ ํด์ผ ํจ
PARTITON BY
: ์๋์ฐ ํจ์์ ์ผ๋ถ๋ก, ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ ๊ฐ ํํฐ์ ๋ด์์ ๊ณ์ฐ์ ์ํ
* PARTITION BY๋ WHERE์ ์ ์ฌ์ฉํ ์ ์์
๐ก PARTITION BY์ GROUP BY์ ์ฐจ์ด
- `GROUP BY` : ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ๊ณ , ๊ทธ๋ฃน๋น ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ
- `PARTITION BY` : ๋ฐ์ดํฐ๋ฅผ ํํฐ์ ์ผ๋ก ๋๋์ง๋ง, ๋ชจ๋ ํ์ ์ ์งํ๋ฉฐ ์ถ๊ฐ ๊ณ์ฐ์ ์ํ
* ์ข์ ํด๋ฆฌ ์์ ์ฝ๋ ๋ชจ์
-- ์์ . ์์ ์ข
๋ฅ๋ณ๋ก ๊ฐ์ฅ ๋ง์ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ๋ฐ์ ์์์ ์ ์กฐํํ๋ ์ฟผ๋ฆฌ
SELECT
FOOD_TYPE
, REST_ID
, REST_NAME
, FAVORITES
FROM (
SELECT *
, MAX(FAVORITES) OVER (PARTITION BY FOOD_TYPE) AS MAX_FAV
FROM REST_INFO
) AS M
WHERE FAVORITES = MAX_FAV
ORDER BY FOOD_TYPE DESC
* GROUP BY๊ฐ ์๋ ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ
-- ์์ 1. ๊ฐ ์ฐ๋๋ณ๋ก ํธ๋๋ณ ํ๋งค๋๊ณผ ์ด ๋งค์ถ ์ค์ ๊ฐ์ฅ ๋ง์ด ํ๋งค๋ ํธ๋
SELECT *
FROM (
SELECT
YEAR(InvoiceDate) AS year
, TrackId AS track_id
, COUNT(Quantity) AS sales_cnt
, SUM(Quantity * UnitPrice) AS total_sales
, MAX(COUNT(Quantity)) OVER (PARTITION BY YEAR(InvoiceDate)) AS max_cnt
FROM data
GROUP BY 1, 2
) AS z
WHERE sales_cnt = max_cnt;
-- ์์ 2. ๊ฐ ์ง์๋ณ ๊ณ ๊ฐ์ ์ด๋งค์ถ ์ค์ ์ต๋ ๋งค์ถ์ ๊ธฐ๋กํ ๊ณ ๊ฐ
SELECT *
FROM (
SELECT
SupportRepId
, CustomerId AS cust_id
, SUM(Total) AS sales_sum
, MAX(SUM(Total)) OVER (PARTITION BY SupportRepId) AS sales_max
FROM data
GROUP BY CustomerId
) AS sub
WHERE sales_sum = sales_max
RANK
: ์์ ๊ณ์ฐ ๊ด๋ จ ํจ์
- `ROW_NUMBER()`: ๊ณ ์ ์์ ๊ณ์ฐ
- `RANK()`: ์์๋ฅผ ๋ถ์ฌํ๋ฉฐ ์ค๋ณต ์์๋ฅผ ํ์ฉ(๋ค์ ์์๋ฅผ ๊ฑด๋๋)
- `DENSE_RANK()`: ์ค๋ณต ์์๋ฅผ ํ์ฉํ๋ ๋ค์ ์์๋ฅผ ๊ฑด๋๋ฐ์ง ์์
- `PERCENT_RANK()`: ํน์ ํ์ ์์๋ฅผ ๋ฐฑ๋ถ์จ (%)๋ก ๊ณ์ฐ * 0.0~1.0 ๊ฐ ๋ฐํ
* ์ฐธ๊ณ ํ๊ธฐ ์ข์ ์์
* ํผ์ผํธ๋ก ๋ฑ๊ธ ๋ถ๋ฅํ๊ธฐ
SELECT
ID
, (CASE
WHEN PER_RANK <= 0.25 THEN 'CRITICAL'
WHEN PER_RANK <= 0.5 THEN 'HIGH'
WHEN PER_RANK <= 0.75 THEN 'MEDIUM'
ELSE 'LOW'
END) AS COLONY_NAME
FROM (SELECT
ID,
PERCENT_RANK() OVER (ORDER BY SIZE_OF_COLONY DESC) AS PER_RANK
FROM ECOLI_DATA
) AS D
ORDER BY ID
SELECT *
FROM (
SELECT
YEAR(InvoiceDate) AS year
, t.TrackId AS track_id
, t.Name AS track_name
, art.Name AS artist_name
, COUNT(il.Quantity) AS sales_cnt
, SUM(il.Quantity * il.UnitPrice) AS total_sales
, MAX(COUNT(il.Quantity)) OVER (PARTITION BY YEAR(InvoiceDate)) AS max_cnt
FROM data
GROUP BY 1, 2
) AS z
WHERE sales_cnt = max_cnt;
LAG / LEAD
: ์ด์ / ๋ค์ ํ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์๋์ฐ ํจ์
- ํ์ฌ ํ์ ๊ธฐ์ค์ผ๋ก ํน์ ์ด์ ์ด์ / ๋ค์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋๋ก ํจ
- `LAG(์นผ๋ผ๋ช
, offset, ๊ธฐ๋ณธ๊ฐ)`
- offset : ๋ช ๋ฒ์งธ ์ด์ ์ ๊ฐ์ ๊ฐ์ ธ์ฌ์ง (default: 1)
- ๊ธฐ๋ณธ๊ฐ : ์ด์ ๊ฐ์ด ์์ ๋ ๋ฐํํ ๊ธฐ๋ณธ ๊ฐ (default: NULL)
- ํ์ฉ : LAG(์นผ๋ผ๋ช , offset, ๊ธฐ๋ณธ๊ฐ) OVER (PARTITION BY ์นผ๋ผ๋ช ORDER BY ์นผ๋ผ๋ช )
* ๊ธฐ๋ณธ ์์ : ์ฆ๊ฐ์จ ๊ตฌํ๊ธฐ
SELECT (ํ์ฌ๋งค์ถ - ๊ณผ๊ฑฐ๋งค์ถ) / ๊ณผ๊ฑฐ๋งค์ถ * 100
FROM (SELECT
*
, LAG(ํ์ฌ๋งค์ถ, 1) OVER (ORDER BY ๋ ์ง์ด) AS ๊ณผ๊ฑฐ๋งค์ถ
FROM data
) AS sub
* ์ด๋ ค์ด ํ์ฉ ์์
WITH genre_sale AS (
SELECT
g.GenreId
, YEAR(InvoiceDate) AS year
, SUM(il.UnitPrice * il.Quantity) AS cur_sales
, LAG(SUM(il.UnitPrice * il.Quantity)) OVER (PARTITION BY g.GenreId ORDER BY YEAR(InvoiceDate)) AS pre_sales
FROM data
GROUP BY 1, 2
)
SELECT
GenreId
, year
, cur_sales
, ROUND((cur_sales - pre_sales) / pre_sales * 100, 2) AS growth_rate
FROM genre_sale;
๐ ์ซ์ ์ฒ๋ฆฌ ๊ด๋ จ ํจ์
TRUNCATE()
: ์ซ์๋ฅผ ๋ฒ๋ฆฌ๋ฅผ ์๋ฆฟ์ ์๋๋ก ๋ฒ๋ฆผ
* ๋ฒ๋ฆผ์ด๋ ๋ฐ์ฌ๋ฆผํ์ง ์ํธ, ์ง์ ํ ์๋ฆฌ์ ์ดํ์ ๊ฐ์ ๋จ์ํ ์ ๊ฑฐํ๋ ๊ฒ์ ์๋ฏธ != ROUND()
- SELECT TRUNCATE(12345.1234567 ,1) >> 12345.1
- SELECT TRUNCATE(12345.1234567 ,4) >> 12345.1234
- SELECT TRUNCATE(12345.1234567 ,-1) >> 12340
- SELECT TRUNCATE(12345.1234567 ,-2) >> 12300
* ์ ์ ์๋ฆฌ๋ฅผ ๋ฒ๋ฆด ๋๋ - ๊ธฐํธ ํ์ฉ
- `ROUND(์ซ์, ์๋ฆฟ์)`
- SELECT TRUNCATE(123.567, 2) >> 123.57
๐ ๋ฌธ์์ด ์ฒ๋ฆฌ ๊ด๋ จ ํจ์
LIKE
: ๋ฌธ์์ด ํจํด์ ๊ฒ์, ๋น๊ตํ ๋ ์ฌ์ฉํ๋ ์ฐ์ฐ์
์ฃผ๋ก ๊ฒ์ ์กฐ๊ฑด์์ ํน์ ํจํด๊ณผ ์ผ์นํ๋ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋จ
- `%` ํ์ฉ๋ฒ
- '์'์ผ๋ก ์์ํ๋ 4๊ธ์ ๋ฐ์ดํฐ ์กฐํ : ~ LIKE '์___'
- '์'์ผ๋ก ์์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ : ~ LIKE '์%'
- '๋ธ'์ด ๋ค์ด๊ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํ : ~ LIKE '%์%'
- `_` ํ์ฉ๋ฒ
- %์ ๊ฐ์ง๋ง, ์ ํํ 1๊ฐ์ ๋ฌธ์๋ฅผ ๋์ฒดํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
REGEXP
: ์ ๊ท ํํ์์ ํ์ฉํด ๋ฌธ์์ด ํจํด์ ๊ฒ์ํ๋ ๋ฐ ํ์ฉ
๊ธฐ์กด ์ฐ์ฐ์๋ณด๋ค ๋ณต์กํ ๋ฌธ์์ด ์กฐ๊ฑด ๊ฐ๋ฅ
๊ธฐํธ | ์ค๋ช | ์์ | |
. | ์์์ ํ ๋ฌธ์์ ์ผ์น | 'a.b' | acb, a_b |
^ | ๋ฌธ์์ด์ ์์์ ์๋ฏธ | '^hello' | hello world, hello hi |
$ | ๋ฌธ์์ด์ ๋์ ์๋ฏธ | 'world$' | hello word, hi word |
* | ์์ ๋ฌธ์๊ฐ 0๋ฒ ์ด์ ๋ฐ๋ณต๋จ | 'ab*c' | ac, abc, abbc, abbbc |
+ | ์์ ๋ฌธ์๊ฐ 1๋ฒ ์ด์ ๋ฐ๋ณต๋จ | 'ab+c' | abc, abbc, ac (x) |
? | ์์ ๋ฌธ์๊ฐ 0๋ฒ ๋๋ 1๋ฒ ๋ํ๋จ | 'colou?r' | color, colour |
[abc] | 'a', 'b', 'c' ์ค ํ๋์ ์ผ์น | '[abc]' | apple, banna, cherry |
[a-z] | ์๋ฌธ์ ์ํ๋ฒณ ์ค ํ๋์ ์ผ์น | ||
[A-Z] | ๋๋ฌธ์ ์ํ๋ฒณ ์ค ํ๋์ ์ผ์น | ||
[0-9] | ์ซ์ ์ค ํ๋์ ์ผ์น | ||
| | OR ์ฐ์ฐ์ ์ญํ | 'cat|dog' | i have a cat, dog is good |
* ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ์
SELECT CAR_TYPE
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS REGEXP '์ด์ ์ํธ|๊ฐ์ฃฝ์ํธ|ํตํ์ํธ'
SUBSTR
: ๋ฌธ์์ด์์ ํน์ ๋ถ๋ถ์ ์ถ์ถํ๋ ์ฌ์ฉ
- `SUBSTR(str, ์์ ์์น, ๊ธธ์ด)`
- SELECT SUBSTR('Hello World', 1, 5) = Hello
- SELECT SUBSTR('Hello World',7 ) = 7๋ฒ ์์น๋ถํฐ ๋๊น์ง
- `SUBSTR(str, - ์์ ์์น, ๊ธธ์ด)`
- ์์ ์ฌ์ฉ : ๋ค์์๋ถํฐ ๋ฌธ์์ด ์๋ฅด๊ธฐ
- SELECT SUBSTR('Hello World', -5, 3) = wor
SUBSTRING_INDEX
: ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌธ์์ด์ ๋ถ๋ฆฌํ์ฌ ํน์ ๋ถ๋ถ์ ์ถ์ถํ๋ ํจ์
- `SUBSTRING_INDEX(str, ๊ตฌ๋ถ์, ๊ฐ์)`
- SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', 2) = apple,banana (์์์ 2๊ฐ ์ถ์ถ)
- SELECT SUBSTRING_INDEX('apple,banana,cherry', ',', -1) = cherry (๋ง์ง๋ง ์ถ์ถ)
CONCAT
: ๋ ๊ฐ ์ด์์ ๋ฌธ์์ด์ ํ๋๋ก ์ฐ๊ฒฐ (ํฉ์น๊ธฐ) ํ๋ ๋ฐ ์ฌ์ฉ
- `CONCAT`
- ์ฌ๋ฌ ๋ฌธ์์ด์ ๋จ์ํ ๋ถ์ฌ์ ์ฌ์ฉ
- ์์ ex) CONCAT(CITY, '-', STREET_ADDRESS1, '-', STREET_ADDRESS2)
- `CONCAT_WS`
- ๊ตฌ๋ถ์๋ฅผ ์ง์ ํ์ฌ ์ฌ๋ฌ ๋ฌธ์์ด์ ๊ฒฐํฉ
- ์์ ex) CONCAT_WS(' ', CITY, STREET_ADDRESS1, STREET_ADDRESS2)
- ํ๋๋ผ๋ NULL ๊ฐ์ด ํฌํจ๋๋ฉด ๊ฒฐ๊ณผ๋ NULL์ด ๋ฐํ๋จ <- `IFNULL` ์ด๋ `COALESCE` ํ์ฉํด์ ์ฒ๋ฆฌ
* 3๊ฐ ์ด์์ ๋ฌธ์์ด์ ๊ฒฐํฉํ ๋๋ concat_ws๊ฐ ๋ ๊ฐํธํ๋ค.
๐ ๋ ์ง ๊ด๋ จ ํจ์
DATE_FORMAT
: ๋ ์ง์ ์๊ฐ์ ์ง์ ๋ ํ์์ผ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ
- ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํ์ : `DATE_FORMAT(๋ ์ง ์ปฌ๋ผ, '%Y-%m-%d')`
- ํน์ ์ฐ๋์ ํ๋ง ~~ ์ด๋ ๊ฒ ์์ ๋ ์๋ 3๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ํ์ฉ ๊ฐ๋ฅ (date ex: 2021-02-01)
- WHERE date `LIKE` '2021%'
- `DATE_FORMAT`(date, '%Y') = 2021
- `YEAR`(date)
ํฌ๋งท ์ฝ๋ | ์ค๋ช | ์์ | ๊ฒฐ๊ณผ |
%Y | 4์๋ฆฌ ์ฐ๋ | '2025-01-02 15:30:45' | 2025 |
%y | 2์๋ฆฌ ์ฐ๋ | '2025-01-02 15:30:45' | 25 |
%M | ์ ์ด๋ฆ (์ ์ฒด) | '2025-01-02 15:30:45' | January |
%m | ์ (2์๋ฆฌ ์ซ์) | '2025-01-02 15:30:45' | 01 |
%b | ์ ์ด๋ฆ (์ถ์ฝํ) | '2025-01-02 15:30:45' | Jan |
%d | ์ผ (2์๋ฆฌ ์ซ์) | '2025-01-02 15:30:45' | 02 |
%e | ์ผ (์ซ์, ์์ 0 ์์) | '2025-01-02 15:30:45' | 2 |
%W | ์์ผ ์ด๋ฆ (์ ์ฒด) | '2025-01-02 15:30:45' | Thursday |
%a | ์์ผ ์ด๋ฆ (์ถ์ฝํ) | '2025-01-02 15:30:45' | Thu |
%H | ์๊ฐ (24์๊ฐ, 2์๋ฆฌ) | '2025-01-02 15:30:45' | 15 |
%h | ์๊ฐ (12์๊ฐ, 2์๋ฆฌ) | '2025-01-02 15:30:45' | 03 |
%i | ๋ถ (2์๋ฆฌ ์ซ์) | '2025-01-02 15:30:45' | 30 |
%s | ์ด (2์๋ฆฌ ์ซ์) | '2025-01-02 15:30:45' | 45 |
%p | ์ค์ / ์คํ (AM / PM) | '2025-01-02 15:30:45' | PM |
%% | % ๋ฌธ์ ์ถ๋ ฅ | '2025-01-02 15:30:45' | % |
์ถ๊ฐ ํจ์
: DATE_FORMAT์ ์ฐ์ง ์๊ณ , ๋ ์ง ๋ฐ์ดํฐ๋ฅผ ํน์ ์์๋ก ๋ฐ๋ก ๋ณํํ ์ ์๋ ํจ์
ํจ์ | ์ค๋ช | ์์ | ๊ฒฐ๊ณผ |
YEAR(date) | ์ฐ๋ | YEAR('2025-01-02') | 2025 |
MONTH(date) | ์ | MONTH('2025-01-02') | 1 |
DAY(date) | ์ผ | DAY('2025-01-02') | 2 |
HOUR(time) | ์๊ฐ | HOUR('15:30:00') | 15 |
MINUTE(time) | ๋ถ | MINUTE('15:30:00') | 30 |
SECOND(time) | ์ด | SECOND('15:30:45') | 45 |
DAYNAME(date) | ์์ผ ์ด๋ฆ | DAYNAME('2025-01-02') | Thursday |
MONTHNAME(date) | ์ ์ด๋ฆ | MONTHNAME('2025-01-02') | January |
QUARTER(date) | ๋ถ๊ธฐ (1~4) | QUARTER('2025-04-15') | 2 |
WEEK(date) | ์ฃผ ๋ฒํธ | WEEK('2025-01-02') | 1 |
DAYOFYEAR(date) | ์ฐ๋ ๊ธฐ์ค ๋ช ๋ฒ์งธ ๋ ์ธ์ง | DAYOFYEAR('2025-01-02') | 2 |
TO_DAYS(date) | ๋ ์ง์ผ ์ผ (day)๋ก ๋ณํ | TO_DAYS('2025-01-02') | 738850 |
TIME_TO_SEC(time) | ์๊ฐ์ ์ด(second)๋ก ๋ณํ | TIME_TO_SEC('01:02:03') | 3723 |
SEC_TO_TIME(sec) | ์ด๋ฅผ ์๊ฐ ํ์์ผ๋ก ๋ณํ | SEC_TO_TIME(3723) | 01:02:03 |
๋ ์ง ํ์ฉ ํจ์
: ์์ฃผ ์ฐ์ด๋ ๋ ์ง ํ์ฉ ํจ์ ์ ๋ฆฌ
ํจ์ | ์ค๋ช | ์์ | ๊ฒฐ๊ณผ |
DATEDIFF | ๋ ๋ ์ง ๊ฐ์ ์ฐจ์ด ๋ฐํ | DATEDIFF('2023-12-31', '2023-01-01') | 364 |
TIMESTAMPDIFF | ์ง์ ๋ ๋จ์์ ์ฐจ์ด ๋ฐํ | TIMESTAMPDIFF(DAY, '2023-01-01', '2023-12-31'); TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-12-31'); |
364; 11; |
CURDATE | ํ์ฌ ๋ ์ง ๋ฐํ (์๊ฐ ์ ์ธ) | SELECT CURDATE(); SELECT CURRENT_DATE(); |
2025-01-02 |
๋ ์ง ๋น๊ต ์ฐ์ฐ
: ๊ธฐํธ๋ฅผ ์ฌ์ฉํด์ ๋ ๋ ์ง๋ฅผ ๋น๊ตํ ์ ์์
- ํฐ ๊ฐ์ผ์๋ก ๋ ๋์ค์ ์๊ฐ์ด๋ค !
SELECT
I.ANIMAL_ID
, I.NAME
FROM ANIMAL_INS AS I
JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME -- ๋ณดํธ์์์ผ > ์
์์ผ (๋ณดํธ ์์์ผ๋ณด๋ค ์
์์ผ์ด ๋ ๋น ๋ฆ)
ORDER BY I.DATETIME