Skip to content

Latest commit

 

History

History
273 lines (226 loc) · 8.45 KB

File metadata and controls

273 lines (226 loc) · 8.45 KB

2022-08-22 / DB 5일차 실습

1. playlist_track 테이블에 A라는 별칭을 부여하고 데이터를 출력하세요.

| 단, 모든 컬럼을 PlaylistId 기준으로 내림차순으로 5개만 출력하세요.

SELECT *
FROM playlist_track A
ORDER BY A.PlaylistId DESC
LIMIT 5;

PlaylistId  TrackId
----------  -------
18          597
17          3290
17          2096
17          2095
17          2094

2. tracks 테이블에 B라는 별칭을 부여하고 데이터를 출력하세요

| 단, 모든 컬럼을 TrackId 기준으로 오름차순으로 5개만 출력하세요.

SELECT *
FROM tracks B
ORDER BY B.TrackId
LIMIT 5;

TrackId  Name                                     AlbumId  MediaTypeId  GenreId  Composer       
                                               Milliseconds  Bytes     UnitPrice
-------  ---------------------------------------  -------  -----------  -------  ---------------
---------------------------------------------  ------------  --------  ---------
1        For Those About To Rock (We Salute You)  1        1            1        Angus Young, Ma
lcolm Young, Brian Johnson                     343719        11170334  0.99

2        Balls to the Wall                        2        2            1
                                               342562        5510424   0.99

3        Fast As a Shark                          3        2            1        F. Baltes, S. K
aufman, U. Dirkscneider & W. Hoffman           230619        3990994   0.99

4        Restless and Wild                        3        2            1        F. Baltes, R.A.
 Smith-Diesel, S. Kaufman, U. Dirkscneider &   252051        4331779   0.99
                                                                                 W. Hoffman     


5        Princess of the Dawn                     3        2            1        Deaffy & R.A. S
mith-Diesel                                    375418        6290521   0.99

3. 각 playlist_track 해당하는 track 데이터를 함께 출력하세요.

| 단, PlaylistId, Name 컬럼을 PlaylistId 기준으로 내림차순으로 10개만 출력하세요.

-- playlist_track, tracks 두 개의 테이블을 연결해주는 컬럼은
-- TrackId

SELECT A.PlaylistId, B.Name
FROM playlist_track A INNER JOIN tracks B 
	ON A.TrackId = B.TrackId 
ORDER BY A.PlaylistId DESC
LIMIT 10;

PlaylistId  Name
----------  -----------------------
18          Now's The Time
17          The Zoo
17          Flying High Again
17          Crazy Train
17          I Don't Know
17          Looks That Kill
17          Live To Win
17          Ace Of Spades
17          Creeping Death
17          For Whom The Bell Tolls

4. PlaylistId10인 track 데이터를 함께 출력하세요.

| 단, PlaylistId, Name 컬럼을 Name 기준으로 내림차순으로 5개만 출력하세요.

SELECT A.PlaylistId, B.Name
FROM playlist_track A INNER JOIN tracks B 
	ON A.TrackId = B.TrackId 
WHERE A.PlaylistId = 10 
ORDER BY B.Name DESC
LIMIT 5;

PlaylistId  Name
----------  ------------------------
10          Women's Appreciation
10          White Rabbit
10          Whatever the Case May Be
10          What Kate Did
10          War of the Gods, Pt. 2

5. tracks 테이블을 기준으로 tracks Composer 와 artists 테이블의 NameINNER JOIN해서 데이터를 출력하세요.

| 단, 행의 개수만 출력하세요.

SELECT COUNT(*)
FROM tracks A JOIN artists B
	ON A.Composer = B.Name;
	
COUNT(*)
--------
402

6. tracks 테이블을 기준으로 tracks Composer 와 artists 테이블의 NameLEFT JOIN해서 데이터를 출력하세요.

| 단, 행의 개수만 출력하세요.

SELECT COUNT(*)
FROM tracks A LEFT JOIN artists B
	ON A.Composer = B.Name;
	
COUNT(*)
--------
3503

7. INNER JOINLEFT JOIN 행의 개수가 다른 이유를 작성하세요.

INNER JOIN절은 테이블A와 테이블B 사이에 공통된(=일치하는) 행만 반환하는 한편, LEFT OUTER JOIN절은 동일한 값이 없는 데이터도 반환하기 때문이다. LEFT OUTER JOIN절로 인한 새로운 테이블 출력 과정을 도식화한다면, 기준이 되는 테이블(예시:테이블A)을 새로 출력하고자 하는 테이블의 왼편에 지정하고 테이블B를 그 오른편에 붙이는 식이다. 이 과정에서 테이블A 행의 개수보다 테이블B의 행의 개수가 더 길다면, 행의 길이가 더 긴 쪽에 맞춰서 새로운 테이블을 출력해 볼 수 있다(새로 생긴 값 없는 부분은 전부 NULL 처리). 따라서 문제5~6과 같이 INNER JOIN에서 출력된 행의 개수가 LEFT JOIN에서 출력된 행의 개수보다 적은 상황이 발생하기도 한다.

8. invoice_items 테이블의 데이터를 출력하세요.

| 단, InvoiceLineId, InvoiceId 컬럼을 InvoiceId 기준으로 오름차순으로 5개만 출력하세요.

SELECT InvoiceLineId, InvoiceId 
FROM invoice_items 
ORDER BY InvoiceId
LIMIT 5;

InvoiceLineId  InvoiceId
-------------  ---------
1              1
2              1
3              2
4              2
5              2

9. invoices 테이블의 데이터를 출력하세요.

| 단, InvoiceId, CustomerId 컬럼을 InvoiceId 기준으로 오름차순으로 5개만 출력하세요.

SELECT InvoiceId, CustomerId
FROM invoices
ORDER BY InvoiceId
LIMIT 5;

InvoiceId  CustomerId
---------  ----------
1          2
2          4
3          8
4          14
5          23

10. 각 invoices_item에 해당하는 invoice 데이터를 함께 출력하세요.

| 단, InvoiceLineId, InvoiceId 컬럼을 InvoiceId 기준으로 내림차순으로 5개만 출력하세요.

SELECT A.InvoiceLineId, B.InvoiceId
FROM invoice_items A INNER JOIN invoices B
	ON A.InvoiceId = B.InvoiceId 
ORDER BY B.InvoiceId DESC
LIMIT 5;

InvoiceLineId  InvoiceId
-------------  ---------
2240           412
2226           411
2227           411
2228           411
2229           411

11. 각 invoice에 해당하는 customer 데이터를 함께 출력하세요.

| 단, InvoiceId, CustomerId 컬럼을 InvoiceId 기준으로 내림차순으로 5개만 출력하세요.

SELECT A.InvoiceId, B.CustomerId
FROM invoices A INNER JOIN customers B 
	ON A.CustomerId = B.CustomerId
ORDER BY A.InvoiceId DESC
LIMIT 5;

InvoiceId  CustomerId
---------  ----------
412        58
411        44
410        35
409        29
408        25

12. 각 invoices_item(상품)을 포함하는 invoice(송장)와 해당 invoice를 받을 customer(고객) 데이터를 모두 함께 출력하세요.

| 단, InvoiceLineId, InvoiceId, CustomerId 컬럼을 InvoiceId 기준으로 내림차순으로 5개만 출력하세요.

-- 내 쿼리
SELECT A.InvoiceLineId, B.InvoiceId, C.CustomerId
FROM invoice_items A 
    JOIN invoices B 
        ON A.InvoiceId = B.InvoiceId
    JOIN customers C
    	ON B.CustomerId = C.CustomerId
ORDER BY B.InvoiceId DESC
LIMIT 5;

InvoiceLineId  InvoiceId  CustomerId
-------------  ---------  ----------
2240           412        58
2226           411        44
2227           411        44
2228           411        44
2229           411        44

-- 선생님 쿼리
-- 문제에서 [invoices_item(상품)을 "포함하는" invoice(송장)] 이라고 적어서
-- B.InvoiceId 가 아닌, A.InvoiceId 를 출력하는 것일까?
SELECT A.InvoiceLineId, A.InvoiceId, C.CustomerId 
FROM invoice_items A
    INNER JOIN invoices B
        ON A.InvoiceId = B.InvoiceId
    INNER JOIN customers C
        ON B.CustomerId = C.CustomerId
ORDER BY A.InvoiceId DESC
LIMIT 5;

InvoiceLineId  InvoiceId  CustomerId
-------------  ---------  ----------
2240           412        58
2239           411        44
2238           411        44
2237           411        44
2236           411        44

13. 각 customer가 주문한 invoices_item의 개수를 출력하세요.

| 단, CustomerId와 개수 컬럼을 CustomerId 기준으로 오름차순으로 5개만 출력하세요.

-- invoice_items 와 customers 를 직접 연결하는 컬럼 이름은 없음
-- 따라서 이 둘을 모두 연결하는 invoices 테이블을 이용(서브쿼리로)

SELECT C.CustomerId, COUNT(*) FROM invoice_items A 
INNER JOIN (
    SELECT * FROM invoices A
    INNER JOIN customers B
    ON A.CustomerId = B.CustomerId
) C
	ON A.InvoiceId = C.InvoiceId
GROUP BY C.CustomerId
ORDER BY C.CustomerId ASC 
LIMIT 5;

CustomerId  COUNT(*)
----------  --------
1           38
2           38
3           38
4           38
5           38