์ง๋๋ฒ ๊ธ์ ์ด์ด์ Mode์ SQL ํํ ๋ฆฌ์ผ์ ์ฝ๊ณ ์ ๋ฆฌํ๊ณ ์ค์ตํด๋ณด๊ณ ์์ต๋๋ค. ์ค๋์ Count๋ฅผ ํฌํจํ ๊ธฐ์ด ์ฐ์ ์ฐ์ฐ ๋ฐฉ๋ฒ, ์กฐ๊ฑด, ๊ทธ๋ฆฌ๊ณ join์ ๋ํด์ ๋ค๋ค๋ณด๋ ค๊ณ ํฉ๋๋ค. ์๋ชป ์ดํดํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์๋ ๋ถ๋ถ์ ์๋ ค์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
Mode์์ ๋ก๊ทธ์ธ ํ ์ report๋ฅผ ๋ง๋์ ์ ๋ฐ๋ผํ์ค ์ ์์ต๋๋ค. ๋งํฌ ์๋์ ๋ฌ์๋๊ฒ ์ต๋๋ค.
Count
SELECT COUNT(*)
FROM tutorial.aapl_historical_stock_price
ํน์ ์ด์ ํ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. *์ ์ ๋ ฅํ๋ฉด ์ ์ฒด ํ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. high๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ์๋ null์ด ์๋ ํ์ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค( *๋ณด๋ค ํญ์ ์์์! )
์ด์ ์ ์๋, ์ซ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ ๊ฐฏ์๋ฅผ ์ธ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.
SELECT COUNT(low) AS low
FROM tutorial.aapl_historical_stock_price
--
SELECT COUNT(date) AS count_of_date -- non-numerical
FROM tutorial.aapl_historical_stock_price
SUM, MIN/MAX
null์ 0 ์ทจ๊ธํฉ๋๋ค. ์ด์ ํฉ๊ณ๋ฅผ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
SELECT SUM(volume)
FROM tutorial.aapl_historical_stock_price
ํด๋น ์ด์์์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
SELECT MIN(volume) AS min_volume,
MAX(volume) AS max_volume
FROM tutorial.aapl_historical_stock_price
AVG
SELECT AVG(high)
FROM tutorial.aapl_historical_stock_price
์ด์ ํ๊ท ์ ๊ณ์ฐํ๋ฉฐ, ์ซ์์๋ง ๊ฐ๋ฅํฉ๋๋ค.
GROUP BY, HAVING
SELECT year,
month,
COUNT(*) AS count
FROM tutorial.aapl_historical_stock_price
GROUP BY year, month
์ค์ ํ ๊ฐ๋ค์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ค๋๋ค. ์์ ์ ๊ฒฝ์ฐ์๋ year๊ณผ month๊ฐ ๊ฐ์ ํญ๋ชฉ๋ค์ ํ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ณ count๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๊ฒ์ด ๋ฉ๋๋ค.
SELECT year,
month,
MAX(high) AS month_high
FROM tutorial.aapl_historical_stock_price
GROUP BY year, month
HAVING MAX(high) > 400
ORDER BY year, month
HAVING์ WHERE์ ๊ทธ๋ฃนํ ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฃนํ๋ ํญ๋ชฉ๋ค์ ์กฐ๊ฑด ํํฐ๋ง์ ๊ฑธ์ด์ค ์ ์์ด์.
Query clause order
์ฟผ๋ฆฌ ์์๋ SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
CASE
SELECT player_name,
year,
CASE WHEN year = 'SR' THEN 'yes'
ELSE NULL END AS is_a_senior
FROM benn.college_football_players
์ผ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ switch - case๋ฌธ๊ณผ ๋์ผํฉ๋๋ค. WHEN = if์ด๋ฉฐ, ์กฐ๊ฑด๋ฌธ์ ๋ง์กฑํ๋ฉด 'yes'๋ฅผ, ๋ง์กฑํ์ง ์์ผ๋ฉด NULL์ ์๋ก ์ถ๊ฐ๋ is_a_senior ์ด์ ์ถ๊ฐํ๋ ๋์์ ์ํํด์.
SELECT player_name,
weight,
CASE WHEN weight > 250 THEN 'over 250'
WHEN weight > 200 THEN '201-250'
WHEN weight > 175 THEN '176-200'
ELSE '175 or under' END AS weight_group
FROM benn.college_football_players
์ฌ๋ฌ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
SELECT CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END AS year_group,
COUNT(1) AS count
FROM benn.college_football_players
GROUP BY CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END
COUNT์ ํจ๊ป ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ ์์ ๋ฅผ ๋ฏ์ด๋ณด๋ฉด,
SELECT CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END AS year_group,
*
FROM benn.college_football_players
์ฌ๊ธฐ๊น์ง ์คํํ์ ๋๋ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธ ํ ์ ์์ด์.
์ ์ผ ์ ๋ผ์ธ์ด year_group์ด๋ฏ๋ก count๋ ์ ์ผ ์ ๋ผ์ธ์ ๊ธฐ์ค์ผ๋ก ํ๋๋ก ๋์ด์์ต๋๋ค(COUNT(1) AS count)
๊ทธ๋ฆฌ๊ณ count ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฃนํํด์ ์ถ๋ ฅํด์ผํ๋ฏ๋ก GROUP BY ๋ฅผ CASE๋ฌธ์ผ๋ก ๋๋ ์ ์คํํ๋ฉด
์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด ์์ ๋ ์๋ก countํ ํ์ ์ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๊ธฐ ์ํด ์์ ๊ฐ์ ์์ ์ ๊ฑฐ์ณค๋๋ฐ, ๊ฐ๋จํ๊ฒ๋ ์๋์ ๊ฐ์ด ์ธ ์๋ ์์ด์.
SELECT CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END AS year_group,
COUNT(1) AS count
FROM benn.college_football_players
GROUP BY year_group
๋ฐ๋๋ก COUNT ์์ CASE๋ฅผ ๋ฃ์ ์๋ ์์ต๋๋ค.
SELECT COUNT(CASE WHEN year = 'FR' THEN 1 ELSE NULL END) AS fr_count,
COUNT(CASE WHEN year = 'SO' THEN 1 ELSE NULL END) AS so_count,
COUNT(CASE WHEN year = 'JR' THEN 1 ELSE NULL END) AS jr_count,
COUNT(CASE WHEN year = 'SR' THEN 1 ELSE NULL END) AS sr_count
FROM benn.college_football_players
DISTINCT
๊ณ ์ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
SELECT COUNT(DISTINCT month) AS unique_months
FROM tutorial.aapl_historical_stock_price
์ ์์ ์ฒ๋ผ ์ฐ๋ฉด, month์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์๋ฅผ ์ธ์ unique_months์ ์ถ๊ฐํ๋๋ก ๋์ด์๋ค. ๋ฌ์ ์ด 12๊ฐ ์์ผ๋ฏ๋ก 12๊ฐ ์ถ๊ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
SELECT month,
AVG(volume) AS avg_trade_volume
FROM tutorial.aapl_historical_stock_price
GROUP BY month
ORDER BY 2 DESC
์ ์ฝ๋์์๋ ๋ฌ๊ณผ ๊ฑฐ๋๋์ ํ๊ท ์ ๊ธฐ์ค์ผ๋ก, month๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฑฐ๋๋ ํ๊ท ์ผ๋ก ์ ๋ ฌํ์ด์. ๊ฑฐ๋๋ ํ๊ท ์ ๋ฌ์ ๊ทธ๋ฃนํํ์ผ๋ฏ๋ก ๊ฐ ์์ ํด๋นํ๋ ๋ชจ๋ ๊ฑฐ๋๋์ ํ๊ท ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
SQL join - ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ง์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ ๋ณ๊ฒฝํ๋๋ฐ ์์ฃผ ๋ง์ ๋น์ฉ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ด๋ ต์ง ์๊ฒ ์์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฒฐํฉ(join)์ ํตํด ํน์ ๋ถ๋ถ์ ์ผ์น์์ผ์ ์ฐ๊ฒฐํด์ค์ผ๋ก์จ ๋น์ฉ์ ์ค์ผ ์๊ฐ ์๋๋ฐ, ์ด ์๋ง์ join๋ค์ ๋ํด์ ๊ฐ๋จํ ์ดํด๋ด ์๋ค.
SELECT *
FROM benn.college_football_players players
JOIN benn.college_football_teams teams
ON teams.school_name = players.school_name
players ๋ฐ์ดํฐ๋ฒ ์ด์ค์ school_name์ teams ๋ฐ์ดํฐ๋ฒ ์ด์ค์ school_name ๊ฐ ๊ฐ์ ๋ถ๋ถ์ players์ teams๋ฅผ ์ด์ํ๋ ๊ฒ์ด ์ฐ๋ฆฌ์ ์ฒซ๋ฒ์งธ ๋ชฉํ์ ๋๋ค.
- teams ์ฟผ๋ฆฌ
- players ์ฟผ๋ฆฌ
- ๊ฒฐ๊ณผ
school name์ด ๊ฐ์ ๊ณณ์ teams์ ์ ๋ณด๋ฅผ ๋ค์ ๋ถ์ฌ์ join ํด์คฌ์ต๋๋ค.
Inner Join
๊ต์งํฉ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ฐ์ ์ธ join์ ์ผ์ ๋ inner join์ ๋ปํ๊ฒ ๋ฉ๋๋ค.
SELECT players.*,
teams.*
FROM benn.college_football_players players
JOIN benn.college_football_teams teams
ON teams.school_name = players.school_name
players์ teams์ ๋ชฉ๋ก ์ค school name์ด ๊ฐ์ ๊ฒ์ ์ถ๋ ค players์ teams๋ฅผ joinํด์ฃผ๊ณ , ๊ทธ๊ฒ์ ์ ์ฒด scv chart์ ์ถ๋ ฅํด์ฃผ๋ ์ฝ๋์ ๋๋ค.
SELECT players.player_name,
players.school_name,
teams.conference
FROM benn.college_football_players players
JOIN benn.college_football_teams teams
ON teams.school_name = players.school_name
WHERE teams.division = 'FBS (Division I-A Teams)'
์ด ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ ์กฐ๊ฑด์ teams์ division ์กฐ๊ฑด์ด FBS์ธ ๊ฒ๋ง ๋ฝ์๋์ด์.
SELECT A.ID,
A.ENAME
A.KNAME
FROM A INNER JOIN B
ON A.ID = B.ID
์์ ๊ฐ์ด ์์ฑํ ๊ฒฝ์ฐ, A์ B์ ID๊ฐ ๊ฐ์ ๊ฒ๋ง ์ถ๋ ค์ SELECT๋ฉ๋๋ค. ๋๋จธ์ง A๋ ๋น์ฐํ SELECT๋์ง ์์ต๋๋ค.
Outer Join
ํฉ์งํฉ์ ๋๋ค. ์ ๋ถ ๋ค ๋ชจ์์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
Left Join
๊ณตํต์ ์ธ ๋ถ๋ถ๊ณผ left ์ ์๋ table 1์ ๋ถ๋ถ์ ํฌํจํฉ๋๋ค.
SELECT companies.permalink AS companies_permalink,
companies.name AS companies_name,
acquisitions.company_permalink AS acquisitions_permalink,
acquisitions.acquired_at AS acquired_date
FROM tutorial.crunchbase_companies companies
JOIN tutorial.crunchbase_acquisitions acquisitions
ON companies.permalink = acquisitions.company_permalink
์์ ๊ฐ์ด ์คํํ๋ฉด ์๋์ ๊ฐ์ด 280 North๊ฐ ๋ ๋ฒ ๋ํ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ table 2์ table 1๊ณผ ๊ฐ์ ํญ๋ชฉ์ด ์๊ณ ๊ทธ๋๋ก joinํ๊ธฐ ๋๋ฌธ์ด์์.
SELECT companies.permalink AS companies_permalink,
companies.name AS companies_name,
acquisitions.company_permalink AS acquisitions_permalink,
acquisitions.acquired_at AS acquired_date
FROM tutorial.crunchbase_companies companies
LEFT JOIN tutorial.crunchbase_acquisitions acquisitions
ON companies.permalink = acquisitions.company_permalink
์ด๋ ๊ฒ ์คํํ๋ฉด null ๊ฐ์ ํฌํจํด์ ๋ค์ด๊ฐ๋๋ค.
Right Join
left join๊ณผ ๋ฐ๋๋ก table 1๊ณผ 2์ ๊ณตํต๋ถ๋ถ๊ณผ table 2 ์ ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค.
์์ง SQL์ ๋ํด์๋ ๊ณต๋ถ๊ฐ ๋ชจ์๋ผ์ ์๋ฌด๋๋ ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ฑฐ๋ ์ค์ ์์ ์ฌ์ฉํ๋ฉด์ ๋ ๋๋ฉด ์์ ํ๊ณ ์ถ๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. mode๋ ์ฒ์ ์๊ณ ์จ๋ดค๋๋ฐ ๋ฌธ๋ฒ ์ฐ์ตํ๊ธฐ๋ ๊ฝค ์ข์ ๊ฒ ๊ฐ์์! ๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์ ๋ต๊ฒ ์ต๋๋ค :)
'๐ฅ Web > โ Back-end | etc.' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Elasticsearch] Index Template ๊ตฌ์ฑํ๊ธฐ with Kibana & Logstash (1) - Setting (0) | 2023.07.06 |
---|---|
[Elasticsearch] Logstash๋ฅผ ํตํด PostgreSQL๊ณผ Elastic Stack ์ฐ๋ํ๊ธฐ (0) | 2023.06.29 |
[Elasticsearch] Logstash ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2023.06.29 |
[Elasticsearch] Elasticsearch ๊ธฐ๋ณธ ๊ฐ๋ ๋ฐ ์ค์น, kibana ์ฐ๋ํ๊ธฐ (1) | 2023.06.29 |
[SQL] SQL ๊ธฐ์ด (0) | 2021.07.24 |