mysql
-
프로그래머스 - FrontEnd 개발자 찾기 [MySQL]문제 풀이/프로그래머스 2024. 11. 28. 19:30
select distinct ID, EMAIL, FIRST_NAME, LAST_NAMEfrom DEVELOPERS as D left join SKILLCODES as S on (D.SKILL_CODE & S.CODE) > 0where CATEGORY = 'Front End'order by ID asc;이 문제는 Join을 이용한 문제이지만, MySQL에 비트 연산이 있는지 몰랐다면 못 풀었을 문제이다. 2의 제곱수에 따라 정해진 스킬에 대해 & 연산을 수행하고, 만약 맞는 조건이 있다면 0보다 클 것임을 조인 조건으로 걸어 문제를 풀었다.
-
프로그래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 [MySQL]문제 풀이/프로그래머스 2023. 8. 1. 00:46
이 문제는 SQL 고득점 kit에서 join 카테고리에 있는 level 4 문제이다. 어려운 SQL 문제를 풀면서 느끼는 건 처음부터 요구사항을 모두 만족하는 쿼리를 짜려고 하면 문제가 더욱 어렵게 느껴진다는 것이다. 복잡한 join 문제를 풀때는 우선 하나의 테이블 당 요구 조건을 만족하는 단일 쿼리를 짜보고, 그 다음에는 두개의 테이블을 join하는 쿼리를 짜고, 그 다음의 요구사항을 맞추는 방식으로 풀면 결국 풀리게 된다. 이 문제를 처음 제출할 때에는 틀렸습니다가 나왔는데, 아무리 생각해도 논리 구조가 맞아서 혹시 날짜 범위에 문제가 있나 싶어 수정하니 바로 정답이 나왔다. 처음에는 start_date와 end_date가 11월 1일과 11월 30일 사이인 걸 not in 안의 서브쿼리로 넣었는데..
-
MySQL - 쿼리 작성 순서와 실제 실행 순서프로그래밍 2023. 7. 29. 15:43
복잡한 쿼리 문제를 풀 때에는 요구사항을 나눠서 하나씩 해결하는게 효과적이라는 걸 느꼈다. 그 중에서 가장 도움이 되었던 건 쿼리의 실제 실행 순서를 알면 쿼리를 짜는게 쉬워진다는 것이었다. MySQL 기준으로 쿼리를 작성할 때에는 1. SELECT 2. FROM 3. WHERE 4. GROUP BY 5. HAVING 6. ORDER BY 의 순서로 작성하게 된다. 하지만 실제 쿼리의 실행 순서는 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. ORDER BY 순으로 실행이 된다. 이 사실을 알면 group by에서 sum, avg와 같은 함수가 어떻게 select 문에 컬럼으로 존재할 수 있는지가 해결된다. 쓴걸로 보면 select가 group by 보다 먼..
-
프로그래머스 - 자동차 대여 기록에서 장기/단기 대여 구분하기 - 151138 [MySQL]문제 풀이/프로그래머스 2023. 7. 18. 23:30
이 문제는 datediff 를 사용하면 쉽게 풀리는 간단한 문제지만, 한 가지 유의할 점이 있다. 예를 들어 6월 1일부터 6월 30일까지의 일수 차이를 구하면 29일이 맞지만, 이 문제에서는 대여 시작 날이 포함되도록 예시를 보여주고 있다. 즉, datediff 를 사용하고 1을 더해야 정답이 나온다. SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE, DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE, CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여' ELSE '단기 대여' END AS RENT_TYPE FROM CAR..
-
프로그래머스 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 [MySQL]문제 풀이/프로그래머스 2023. 6. 23. 15:42
이 문제는 union 과 not in 을 이용해서 푼 문제이다. not in 이나 in 을 사용하려면 where 절에서 컬럼을 지정해야 한다는 것을 꼭 기억하자. (SELECT CAR_ID, '대여중' AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE DATE(START_DATE) = '2022-10-16') UNION (SELECT CAR_ID, '대여 가능' AS AVAILABILITY FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE CAR_ID NOT IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE DATE(START_DATE) = '2022-1..
-
프로그래머스 - 식품분류별 가장 비싼 식품의 정보 조회하기 [MySQL]문제 풀이/프로그래머스 2023. 6. 23. 14:48
이 문제는 group by 를 이용하는 문제이다. 이 문제를 처음 풀때는 서브쿼리 없이 MAX 를 이용해서 SQL을 작성했는데, 이렇게 하면 MAX 는 해당 그룹, 즉 카테고리로 묶인 그룹에서 가격의 최댓값만을 알려줄뿐 해당 행까지 지정되지는 않아서 틀린 답으로 나오는 것 같았다. 그래서 카테고리로 묶은 그룹의 최댓값을 출력하는 서브쿼리를 작성하고, in 을 이용해서 해당 값을 포함하는 행을 전부 출력하면 정답이 나왔다. SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME FROM FOOD_PRODUCT WHERE PRICE IN (SELECT MAX(PRICE) AS MAX_PRICE FROM FOOD_PRODUCT WHERE CATEGORY = '과자' OR CA..
-
프로그래머스 - 동명 동물 수 찾기 [MySQL]문제 풀이/프로그래머스 2023. 6. 21. 23:55
이 문제는 group by 를 사용하는 간단한 문제이다. 나는 이 문제를 밑의 방식으로 풀었다. SELECT NAME, CNT FROM (SELECT NAME, COUNT(*) AS CNT FROM ANIMAL_INS WHERE NAME IS NOT NULL GROUP BY NAME) AS TEMP WHERE CNT >= 2 ORDER BY NAME ASC; 그러나 다른 사람들의 풀이에는 having 절이 포함되어 서브쿼리를 사용하지 않았다. 서브쿼리를 사용한 이유는 where 절에서 cnt 를 인식하지 못해서였는데, having 절은 group by 이후의 상태에서 조건을 붙이는 절이라는 사실이 생각났다. 그리하여 다음과 같은 코드로 바꿀 수 있었다. SELECT NAME, COUNT(*) AS CNT..
-
프로그래머스 - 저자 별 카테고리 별 매출액 집계하기 [MySQL]문제 풀이/프로그래머스 2023. 6. 21. 23:16
이 문제는 group by 를 다중 컬럼을 이용해서 푸는 문제이다. 하나 헤맸던 건 SUM(SALES) * PRICE 로 TOTAL_SALES 를 계산해서 계속 틀린 답이 나왔는데, 이는 BOOK_ID 로 GROUP BY 를 한게 아니므로 완료된 그룹 안에서는 다른 BOOK_ID 가 충분히 존재할 수 있다. 그러므로 SUM(SALES * PRICE) 로 TOTAL_SALES 를 계산해야 제대로 된 값이 나온다. SELECT A.AUTHOR_ID, AUTHOR_NAME, CATEGORY, TOTAL_SALES FROM AUTHOR AS A INNER JOIN (SELECT AUTHOR_ID, CATEGORY, SUM(SALES * PRICE) AS TOTAL_SALES FROM BOOK AS B INNER..