[Cloud SQL] Introduction to SQL for BigQuery and Cloud SQL

yejinยท2026๋…„ 4์›” 16์ผ

Google Skills

๋ชฉ๋ก ๋ณด๊ธฐ
8/46

Course

Cloud Engineering

Lab

๋ชฉ๋ก


๐ŸŒ Introduction to SQL for BigQuery and Cloud SQL

๊ฐœ์š”

BigQuery์—์„œ ๋Ÿฐ๋˜์˜ ์ž์ „๊ฑฐ ๊ณต์œ  ๊ด€๋ จ ๊ณต๊ฐœ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ SQL ์ฟผ๋ฆฌ ํ‚ค์›Œ๋“œ๋ฅผ ํ•™์Šตํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ CSV ํŒŒ์ผ๋กœ ๋ณด๋‚ด Cloud SQL์— ์—…๋กœ๋“œ ํ•ด๋ณด์ž.

์‹ค์Šต ๊ณผ์ •

1. ์ฟผ๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œ

1) ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด > BigQuery > Studio ๋ฉ”๋‰ด ํด๋ฆญ

2) Explorer(ํƒ์ƒ‰๊ธฐ) ์•„์ด์ฝ˜ ํด๋ฆญ > [+ Add data] ๋ฒ„ํŠผ ํด๋ฆญ

3) ๊ฒ€์ƒ‰์ฐฝ(Search for resources)์— ๊ฒ€์ƒ‰

  • bigquery-public-data
  • london_bicycles
  • cycle_hire
  • cycle_stations

์ฐธ๊ณ 

๋‚˜๋Š” ๊ฒ€์ƒ‰์ด ์ž˜ ์•ˆ๋˜์–ด์„œ cycle_hire์™€ cycle_stations๋ฅผ ์ง์ ‘ ๊ฒ€์ƒ‰ ํ›„์— ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ€์žฅ ๋์— ์žˆ๋Š” ๋ณ„(โญ) ํ‘œ์‹œ๋ฅผ ํด๋ฆญํ•˜์˜€๋‹ค.
์ด ํ‘œ์‹œ๋ฅผ ํ•˜๋ฉด ๋‚˜์ค‘์— Explorer ์•„๋ž˜์— Starred ๋ฉ”๋‰ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


2. ํ…Œ์ด๋ธ”์—์„œ ์ฟผ๋ฆฌ ์‹คํ–‰

1) ํ…Œ์ด๋ธ” ๋‚ด์šฉ ์‚ดํŽด๋ณด๊ธฐ


โžก๏ธ Explorer > โญ Starred > cycle_hire ํด๋ฆญ > Preview ํƒญ์„ ์„ ํƒํ•˜๋ฉด ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋“ค์˜ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2) SQL ํŽธ์ง‘๊ธฐ ์—ด๊ธฐ


โžก๏ธ Preview ํƒญ ์˜†์— [+] ์„ ํด๋ฆญํ•˜์—ฌ SQL ํŽธ์ง‘๊ธฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

3) SELECT ์‹คํ–‰

SELECT end_station_name FROM `bigquery-public-data.london_bicycles.cycle_hire`;


โžก๏ธ ํŽธ์ง‘๊ธฐ์— ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑ ํ›„ Run(Ctrl+Enter) ์‹คํ–‰ํ•˜๋ฉด ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

4) WHERE ์กฐ๊ฑด์ด ์žˆ๋Š” SELECT ์‹คํ–‰

SELECT * FROM `bigquery-public-data.london_bicycles.cycle_hire` WHERE duration>=1200;


โžก๏ธ 3)๊ณผ ๋‹ฌ๋ฆฌ, ์ง€์†์‹œ๊ฐ„(duration) ๊ฐ’์ด 1200 ์ด์ƒ์ธ ๊ฐ’๋งŒ ์กฐํšŒํ•˜์˜€๊ณ , ์šฐ์ธก ํ•˜๋‹จ์— ๋ณด๋ฉด ์กฐํšŒ๋œ ๊ฐœ์ˆ˜๊ฐ€ ๋” ์ค„์–ด๋“ค์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


3. ์‹ฌํ™” SQL ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ

1) GROUP BY ์‚ฌ์šฉ

SELECT start_station_name FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name;

GROUP BYโœจ

๊ณตํ†ต ๊ธฐ์ค€(์˜ˆ: ์—ด ๊ฐ’)์„ ๊ณต์œ ํ•˜๋Š” ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ํ–‰์„ ์ง‘๊ณ„ํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ์ค€์— ๋Œ€ํ•ด ์ฐพ์€ ๋ชจ๋“  ๊ณ ์œ  ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2) COUNT ์‚ฌ์šฉ

SELECT start_station_name, COUNT(*) FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name;

COUNTโœจ

๋™์ผํ•œ ๊ธฐ์ค€(์˜ˆ: ์—ด ๊ฐ’)์„ ๊ณต์œ ํ•˜๋Š” ํ–‰ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3) AS ์‚ฌ์šฉ

SELECT start_station_name, COUNT(*) AS num_starts FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name;

ASโœจ

ํ…Œ์ด๋ธ” ๋˜๋Š” ์—ด์˜ ๋ณ„์นญ์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๋ณ„์นญ์€ AS๊ฐ€ ์ง€์ •ํ•˜๋Š” ๋ฐ˜ํ™˜๋œ ์—ด์ด๋‚˜ ํ…Œ์ด๋ธ”์— ๋ถ€์—ฌ๋˜๋Š” ์ƒˆ ์ด๋ฆ„์ด๋‹ค.
2) ์—์„œ COUNT๋กœ ์ถœ๋ ฅ๋œ ์นผ๋Ÿผ๋ช…์ด AS๋กœ ๋ถ€์—ฌํ•œ num_starts๋กœ ๋ณ€๊ฒฝ๋๋‹ค.

4) ORDER BY ์‚ฌ์šฉ

//start_station_name ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ (default: ASC)
SELECT start_station_name, COUNT(*) AS num FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name ORDER BY start_station_name;

//num ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ (default: ASC)
SELECT start_station_name, COUNT(*) AS num FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name ORDER BY num;

//num ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ (DESC: ๋‚ด๋ฆผ์ฐจ์ˆœ)
SELECT start_station_name, COUNT(*) AS num FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name ORDER BY num DESC;

ORDER BYโœจ

๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •๋œ ์กฐ๊ฑด ๋˜๋Š” ์—ด ๊ฐ’์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ(AESC, default) ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ(DESC)๋กœ ์ •๋ ฌํ•œ๋‹ค.

  • ASEC: (1, 2, 3, 4), (๊ฐ€, ๋‚˜, ๋‹ค, ๋ผ), (a, b, c, d)
  • DESC: (4, 3, 2, 1), (๋ผ, ๋‹ค, ๋‚˜, ๊ฐ€), (d, c, b, a)

โžก๏ธ Database์— ๋”ฐ๋ผ, NULL ๊ฐ’์ด ๋งจ ์•ž์ด๋‚˜ ๋งจ ๋’ค์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


4. BigQuery ๋ฐ์ดํ„ฐ๋ฅผ CSV ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ

1) SQL ์—๋””ํ„ฐ ๋‚ด Save results ๋ฒ„ํŠผ ํด๋ฆญ

2) Local download > CSV ์„ ํƒ

์ €์žฅํ•ด์•ผ ํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๐Ÿค“

  • start_station_name.csv
SELECT start_station_name, COUNT(*) AS num FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY start_station_name ORDER BY num DESC;
  • end_station_name.csv
SELECT end_station_name, COUNT(*) AS num FROM `bigquery-public-data.london_bicycles.cycle_hire` GROUP BY end_station_name ORDER BY num DESC;

5. Cloud Storage Bucket์— CSV ์—…๋กœ๋“œ ํ•˜๊ธฐ

1) Cloud Storage > Bucket ๋ฉ”๋‰ด ํด๋ฆญ

2) Bucket ์ƒ์„ฑ


โžก๏ธ ๋ฒ„ํ‚ท์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„(Project ID)๋งŒ ์„ค์ • ํ›„ ๋‹ค๋ฅธ ๋ชจ๋“  ์„ค์ •์€ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„ ์ƒ์„ฑ

3) Bucket์— CSV ํŒŒ์ผ ์—…๋กœ๋“œ


โžก๏ธ Upload > file ํด๋ฆญ ํ›„ ์ €์žฅํ•œ CSV ํŒŒ์ผ ์—…๋กœ๋“œ (2๊ฐœ)


6. Cloud SQL ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

1) ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด > Cloud SQL > Instances ํด๋ฆญ

2) ๊ฐœ๋ฐœ ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ(Create Development instance) ํด๋ฆญ

3) ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ


์„ ํƒ ํ•ญ๋ชฉ

  • Edition preset: Development โœ…
  • Database version: MySQL 8.0 โœ…
  • Instance ID: my-demo (๋‹ค๋ฅธ ์•„์ด๋””๋กœ ์„ค์ • ๊ฐ€๋Šฅ)
  • Password: ChangeMe1! (๋‹ค๋ฅธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์„ค์ • ๊ฐ€๋Šฅ)
  • Zone availability: Multiple zones(Highly available) โœ…
    • Specify zones: asia-southeast1-b (Primary zone)๋งŒ ์„ ํƒํ•˜๊ณ , Secondary zone์€ Any๋กœ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค.

4) ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ™•์ธ


7. Cloud SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

1) ์ธ์Šคํ„ด์Šค์˜ Cloud Shell ์—ด๊ธฐ

2) ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐ

# Instance ID๋ฅผ ๋‹ค๋ฅธ ๊ฑธ๋กœ ์„ค์ •ํ–ˆ๋‹ค๋ฉด my-demo ๋Œ€์‹  ํ•ด๋‹น ์•„์ด๋”” ์ž…๋ ฅ
gcloud sql connect my-demo --user=root --quiet

3) ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•˜์—ฌ MySQL์— ์ ‘์†


โžก๏ธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 6-3. ์—์„œ ๋งŒ๋“  ๋น„๋ฐ€๋ฒˆํ˜ธ!

4) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

CREATE DATABASE bike;

5) ํ…Œ์ด๋ธ” ์ƒ์„ฑ

//bike ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘์† > london1 ์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ
USE bike;
CREATE TABLE london1 (start_station_name VARCHAR(255), num INT);

//bike ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘์† > london2 ์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ
USE bike;
CREATE TABLE london2 (end_station_name VARCHAR(255), num INT);

6) ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ™•์ธ

SELECT * FROM london1;
SELECT * FROM london2;

โžก๏ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ๋Š” Empty๋กœ ๋œจ๋Š” ๊ฒŒ ์ •์ƒ!


8. ํ…Œ์ด๋ธ”์— CSV ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ

1) Cloud SQL ์ฝ˜์†” ์ ‘์†

2) CSV ํŒŒ์ผ import ํ•˜๊ธฐ

์ฐธ๊ณ 

  • File format: CSV
  • Select source file: Select from Google Cloud Storage
    • Cloud Storage์—์„œ ์ƒ์„ฑํ•œ Bucket ์„ ํƒ ํ›„, ์—…๋กœ๋“œํ•œ CSV ํŒŒ์ผ ํด๋ฆญ
  • Database: bike
  • Table
    • start_station_data.csv ํŒŒ์ผ: london1
    • end_station_data.csv ํŒŒ์ผ: london2

3) ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ํ™•์ธ

SELECT * FROM london1;
SELECT * FROM london2;


โžก๏ธ Instance์— ์—ฐ๊ฒฐ๋œ Cloud Shell ์„ธ์…˜์—์„œ ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฒ˜์Œ ํ…Œ์ด๋ธ” ์ƒ์„ฑํ–ˆ์„ ๋•Œ๋Š” Empty ์˜€๋˜ ๋ฐ์ดํ„ฐ๋“ค์ด ๊ฐ ํ…Œ์ด๋ธ”๋งˆ๋‹ค importํ•œ .csv ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์›Œ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


9. Cloud SQL์—์„œ ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜๊ธฐ

1) DELETE ํ‚ค์›Œ๋“œ

DELETE FROM london1 WHERE num=0;
DELETE FROM london2 WHERE num=0;

2) INSERT INTO ํ‚ค์›Œ๋“œ

INSERT INTO london1 (start_station_name, num) VALUES ("test destination", 1);

3) UNION ํ‚ค์›Œ๋“œ

SELECT start_station_name AS top_stations, num FROM london1 WHERE num>100000
UNION
SELECT end_station_name, num FROM london2 WHERE num>100000
ORDER BY top_stations DESC;

profile
์ƒˆ์‹น ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€