본문 바로가기

Codestates AI 부트캠프/4. Data Engineering

[데이터 엔지니어링] 1-2 SQL

1. SQL이란?

Structured Query Langage. 관계형 데이터베이스에 "이러이러한 데이터를 줘"라고 날리는 일종의 '질의문'. 

*관계형 데이터베이스 : 구조화된 데이터를 의미하는 것으로 테이블이 서로 관계성을 가질 수 있다 통상 .json 파일, 문자열을 데이터로 가진다.


2. 활용 예시

* 사용한 데이터는 chinook.db (첨부)

chinook.zip
0.29MB

 

- Customer_Package 테이블을 생성합니다

CREATE TABLE Customer_Package(
cp_id INTEGER PRIMARY KEY NOT NULL,
customer_id INTEGER,
package_id INTEGER,
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id),
FOREIGN KEY (package_id) REFERENCES Package(package_id)
);


- Title 컬럼의 유니크한 값들을 출력하시오

SELECT DISTINCT Title
FROM albums;


- AlbumId 가 31 인 앨범의 Title 을 구합니다

SELECT Title
FROM albums
WHERE AlbumId = 31;


- 아티스트 이름에 'the' 가 들어간 앨범의 AlbumId를 전부 조회합니다

SELECT albums.AlbumId
FROM albums
JOIN artists on artists.ArtistId = albums.ArtistId 
WHERE artists.Name LIKE '%the%';


- invoices 테이블에서 BillingCity 가 Stuttgart, Oslo, Redmond 인 InvoiceId 를 InvoiceId 에 따라 오름차순으로 전부 조회합니다

SELECT i.InvoiceId 
FROM invoices i 
WHERE i.BillingCity IN ('Stuttgart', 'Oslo', 'Redmond')
ORDER BY i.InvoiceId;

 

-tracks 테이블에서 트랙 Name 이 'The' 로 시작하는 trackId들을 전부 조회합니다

SELECT TrackId 
FROM tracks 
WHERE Name LIKE 'The%';


- customers 테이블에서 Email 이 'gmail.com' 인 CustomerId를 전부 조회합니다

SELECT CustomerId
FROM customers c
WHERE Email  LIKE '%@gmail.com';

 

- CustomerId 가 29, 30, 63 인 고객들의 주문금액이 $1.00 이상 $3.00 이하인 주문 (invoice)의 Id를 전부 조회합니다

SELECT i.InvoiceId
FROM invoices i 
WHERE i.CustomerId IN (29,30,63)
AND i.Total BETWEEN 1 AND 3;


- 장르 (genre) 가 'Soundtrack' 인 트랙 중 트랙의 길이 (Milliseconds) 가 300,000 이상 400,000 이하인 트랙들의 Id 들을 전부 조회합니다

SELECT t.TrackId 
FROM tracks t 
JOIN genres g ON t.GenreId = g.GenreId 
WHERE g.Name = 'Soundtrack'
AND t.Milliseconds  BETWEEN 300000 AND 400000;


- 각 나라 (country) 별로 고객 (customer) 수를 구해봅니다

SELECT count(c.Country) as 'The_Num_of_customers_X_Country'
FROM customers c 
GROUP BY c.Country;

 

- 총 구매한 비용이 가장 많은 고객 (customer) 5 명의 고객 (customer)의 CustomerId를 조회합니다

SELECT c.CustomerId
FROM customers c
JOIN invoices i ON c.CustomerId = i.CustomerId
GROUP BY i.CustomerId 
ORDER BY SUM(i.Total) DESC
LIMIT 5;


- 각 장르 (genre) 마다 트랙을 구매한 고객의 id 의 수를 구해봅니다

SELECT g.Name as 'genre_name', COUNT(DISTINCT i.CustomerId) as 'The Number of customer_ID'
FROM tracks t 
JOIN invoice_items ii ON t.TrackId = ii.TrackId
JOIN genres g ON t.GenreId = g.GenreId 
JOIN invoices i  ON ii.InvoiceId = i.InvoiceId  
GROUP BY t.GenreId;