-
CS50 Week7: Lab7, SongsProgramming/CS50 2023. 7. 22. 22:12
하버드 CS50 강의 7주차 Lab 과제 Songs 의 풀이를 다룹니다.
SQL을 사용하여 데이터베이스를 확인하는 간단한 과제입니다.
풀이와 함께 SQL에서 다른 테이블 값을 참조해야 할 때 쓸 수 있는 두 가지 방법, JOIN 과 IN 서브쿼리를 써서 비교해보았습니다.Code
1.sql
SELECT name FROM songs;
2.sql
SELECT name FROM songs ORDER BY tempo;
3.sql
SELECT name FROM songs ORDER BY duration_ms DESC LIMIT 5;
4.sql
SELECT name FROM songs WHERE danceability >= 0.75 AND energy >= 0.75 AND valence >= 0.75;
5.sql
SELECT AVG(energy) FROM songs;
6.sql
SELECT songs.name FROM songs JOIN artists ON songs.artist_id = artists.id WHERE artists.name = 'Post Malone';
7.sql
SELECT AVG(energy) FROM songs JOIN artists ON songs.artist_id = artists.id WHERE artists.name = 'Drake';
8.sql
SELECT name FROM songs WHERE name LIKE '%feat.%';
JOIN을 써야할까 IN을 써야할까?
6번 문제처럼 다른 테이블을 참조해야 할 때, 아래와 같이 IN을 사용할 수도 있다.
SELECT name FROM songs WHERE artist_id IN( SELECT id FROM artists WHERE name = 'Post Malone');
둘 중 어떤 방식을 사용해야 좋을까? 차이점을 찾아보았다.
차이점 1. 중복 처리
JOIN 과 IN은 id가 중복을 허용할 때 동작이 달라질 수 있다.
어느날 포스트 말론이 이름을 Post Man 으로.. 바꾸었다고 가정해보자. 마치 Young Thug처럼 갑자기 바꾼 상황이다.
그리고 이를 데이터베이스 담당자가 다음과 같이 저장했다고 해보자.
id name 1332 'Post Malone' 1332 'Post Man' IN을 사용한 코드와 실행결과
SELECT name FROM songs WHERE artist_id IN( SELECT id FROM artists WHERE name = 'Post Malone' OR name = 'POST MAN');
name 'Circles' 'Sunflower' JOIN을 사용한 코드와 실행결과
SELECT songs.name FROM songs JOIN artists ON songs.artist_id = artists.id WHERE artists.name = 'Post Malone' OR artists.name = 'Post Man';
name 'Circles' 'Sunflower' 'Circles' 'Sunflower' 이는 JOIN시에 사용하는 값이 중복될 경우, 다음과 같이 같은 행을 중복해서 만들기 떄문이다.
songs.name artists.name 'Circles' 'Post Malone' 'Sunflower' 'Post Malone' 'Circles' 'Post Man' 'Sunflower' 'Post Man' 물론
DISTINCT
명령어를 적절히 사용하면 이는 해소 가능하다.차이점 2. 처리 성능
이부분은 아직 배움이 미천하여 정확히 이해하지는 못했다.
그래도 이해한 만큼만 적어보자면.- 일반적으로 JOIN이 더 빠르며, 사용이 권장된다.
- IN이 비효율적인 상황에서도 대부분 DB 엔진이 알아서 최적화를 해주기도 한다.
- 인덱싱 되지 않은 테이블에서는 JOIN이 더 느릴 수 있다.
- 결국 case by case, table by table이다. 최적화를 위해서는 실행 계획, 수행 시간을 비교해야한다.
라는 것 같다.
참조
IN vs JOIN vs EXISTS
SQL: Subqueries vs JOIN
MySQL where in (서브쿼리) vs 조인 조회 성능 비교 (5.5 vs 5.6)차이점 3. 가독성
이건 의견이 나뉘는 것 같다.
찾아보면 IN이 더 직관적이라고 하는 사람이 꽤나 있다.
실제로 시계열로 술술 읽기에는 IN을 쓴 쿼리가 더 나아보이긴 하다.
결론
여러가지를 고려했을 때, JOIN을 쓸 수 있으면 쓰되 테이블의 인덱스 상황이나 요구 조건에 다라 IN을 쓰는 걸 고려해야겠다.