[TIL]21.07.12 SQL

Seung Joo·2021년 7월 12일
0

TIL

목록 보기
24/31
post-thumbnail

기본 쿼리문


📌SELECT FROM

SELECT 특성 or wildcards
FROM 테이블;

📌WHERE

SELECT 특성 or Wildcards
FROM 테이블
WHERE 특성 (조건) '값';

ex)
SELECT c.FirstName
FROM customers c
WHERE c.FirstName = 'Sponge';
  • IN

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

리스트의 값들과 일치하는 데이터를 필터할 때 사용

  • IS

    값이 없는 NULL 과 같은 경우를 찾을 때에는 IS를 사용
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL;

ex)
SELECT *
FROM employees e
WHERE e.ReportsTo IS NULL;

값이 없는 경우를 제외할 때는 IS NOT을 사용

  • 문자열 필터링

SELECT a.Name
FROM artists a
WHERE a.Name LIKE '%the%'; 

text% 일 경우 모든 문자열 중 지정 text로 시작하는 문자열
%text 일 경우 모든 문자열중 지정 text로 끝나는 문자열
%text% 일 경우 문자열을 포함하는 모든 문자
% 대신 ? 를 쓸 경우 all 에서 +1
ex) 김? -> 김신, 김준 NOT 김시원, 김준표

📌ORDER BY

SELECT *
FROM 테이블
ORDER BY 특성;

ex)
SELECT *
FROM employees e
ORDER BY e.EmployeeId;

기본 정렬은 오름차순 정렬

  • 내림차순 정렬시

SELECT *
FROM employees e
ORDER BY e.EmployeeId DESC;

📌LIMIT

돌려받는 데이터의 갯수를 지정

SELECT *
FROM 테이블
LIMIT 돌려받고 싶은 개수;

ex)
SELECT *
FROM employees
LIMIT 10;

📌DISTNCT

중복값을 제외한 값을 돌려줌

SELECT DISTINCT 특성
FROM 테이블;
  • 여러 특성의 유니크한 조합을 선택할 수 있음

SELECT DISTINCT 특성_1, 특성_2, 특성_3
FROM 테이블;

📌JOIN

  • INNER JOIN

    JOIN의 기본은 INNER JOIN INNER JOIN or JOIN 으로 사용 가능
SELECT *
FROM 테이블
JOIN 테이블_2 ON 테이블_1.특성 = 테이블_2.특성;

ex)
SELECT a2.AlbumId 
FROM artists a
JOIN albums a2 ON a.ArtistId = a2.ArtistId;
  • OUTER JOIN

LEFT INCLUSIVE = LEFT OUTER JOIN

SELECT *
FROM 테이블
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성 = 테이블_2.특성;

RIGHT INCLUSIVE = RIGHT OUTER JOIN

SELECT *
FROM 테이블
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성 = 테이블_2.특성;

FULL OUTER JOIN

SELECT *
FROM 테이블
FULL OUTER JOIN 테이블_2 ON 테이블_1.특성 = 테이블_2.특성;

sqlite 에서는 RIGHT OUTER JOIN / FULL OUTER JOIN 을 지원하지 않기 때문에 순서를 바꾸어 LEFT JOIN 을 이용하는 방법을 사용

SQL 쿼리문 예제 풀이

sql lite chinook.db tutorial을 사용한 예제입니다.

1. 아티스트 이름에 'the' 가 들어간 앨범의 AlbumId를 전부 조회

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

2. tracks 테이블에서 트랙 Name 이 'The' 로 시작하는 trackId들을 전부 조회

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

3. customers 테이블에서 Email 이 'gmail.com' 인 CustomerId를 전부 조회

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

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

SELECT InvoiceId 
FROM invoices i
WHERE i.CustomerId IN (29, 30, 63) 
AND i.Total >= 1.00 
AND i.Total <= 3.00;

5. 각 나라 (country) 별로 고객 (customer) 수

SELECT count(c.CustomerId) AS 'The_Num_of_customers_X_Country'
FROM customers c 
Group BY c.Country

6. 총 구매한 비용이 가장 많은 고객 (customer) 5 명의 고객 (customer)의 CustomerId를 조회

  • 특정 고객이 중복 invoice를 가지고 있을 수 있음에 주의
SELECT c.CustomerId
FROM customers c 
JOIN invoices i 
ON c.CustomerId = i.CustomerId
GROUP BY c.CustomerId
HAVING SUM(i.Total)
ORDER BY SUM(i.Total) DESC
LIMIT 5;

7. 각 장르 (genre) 마다 트랙을 구매한 고객의 id 의 수

  • customer_id는 중복되지 않아야 함
  • 조회한 결과 장르 이름이 표시되는 'genre_name' 칼럼과 구매한 고객수를 표시하는 'The_Number_of_customer_ID' 칼럼이 있어야 함
SELECT g.Name as 'Genre_name', 
count(DISTINCT c.CustomerId) as 'The Number of customer_ID'
FROM customers c 
JOIN invoices i ON c.CustomerId = i.CustomerId
JOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId 
JOIN tracks t ON ii.TrackId =  t.TrackId 
JOIN genres g ON t.GenreId =  g.GenreId
GROUP BY g.Name;

📌추가적인 참고

profile
조금씩 천천히

0개의 댓글