코딩/SQL

SQL 문제 2 - 프로그래머스

americanoallday 2025. 1. 22. 19:08

특정 형질을 가지는 대장균 찾기 (AND 연산자, ROUND 함수)
https://school.programmers.co.kr/learn/courses/30/lessons/301646

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

더보기

 

 

아 이걸 하려면 AND연산자에 대해 잘 알아야 함.

 

& (비트 AND 연산자) :

AND 연산은 두 비트가 모두 1일 때 결과가 1이 되고, 그렇지 않으면 0이 됨.
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

&비트 연산자로, 두 숫자를 이진수로 변환한 뒤 각 비트를 비교하여 AND 연산을 수행.

 

8을 이진수로 표현하면 아래와 같음
1 (2³) + 0 (2²) + 0 (2¹) + 0 (2⁰)

 

그래서 8 & 2¹ 하게되면 
1000 & 0010 = 0000


2가 없고, 1, 3 포함되어야 하니까,

(2 = 0010, 5 = 0101, GENOTYPE 이진수값이랑 대조해서 해당 자리에 1있으면 1 이상임)


즉, 조건이 이렇게 됨
GENOTYPE & 2 = 0 

GENOTYPE & 5 > 0

 

정답 (컬럼에 별명(count) 안붙이니까, 계속 실패 뜸.)

SELECT COUNT(ID) count FROM ECOLI_DATA WHERE (GENOTYPE & 2 = 0) AND (GENOTYPE & 5 > 0)

 
추가로 찾은 함수

BIN() 함수 :

MySQL에서 숫자를 이진수 문자열로 변환하는 내장 함수


POWER(base, exponent) 함수 :
 주어진 숫자의 거듭제곱(제곱)을 계산
(POWER(2, 3) = 2³ = 2 × 2 × 2)


평균 일일 대여 요금 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/151136

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ROUND(AVG(DAILY_FEE),0) AVERAGE_FEE FROM CAR_RENTAL_COMPANY_CAR WHERE CAR_TYPE='SUV';

ROUND(expression, decimal_places)

expression: 계산할 값(예: 평균 값).

decimal_places: 소수점 이하 자리수.

1이면 소수 첫 번째 자리까지 반올림.

0이면 정수로 반올림.


3월에 태어난 여성 회원 목록 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/131120

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH,'%Y-%m-%d') DATE_OF_BIRTH FROM MEMBER_PROFILE WHERE GENDER='W' AND MONTH(DATE_OF_BIRTH)=3 AND TLNO IS NOT NULL ORDER BY MEMBER_ID;​

서울에 위치한 식당 목록 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/131118

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(R.REVIEW_SCORE),2) SCORE FROM REST_INFO I JOIN REST_REVIEW R ON I.REST_ID=R.REST_ID 
WHERE I.ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;

2025.01.23

 

흉부외과 또는 일반외과 의사 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/132203

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') HIRE_YMD 
FROM DOCTOR 
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;

재구매가 일어난 상품과 회원 리스트 구하기 (HAVING, GROUP BY절)
https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT USER_ID, PRODUCT_ID FROM ONLINE_SALE 
GROUP BY PRODUCT_ID, USER_ID
HAVING COUNT(PRODUCT_ID) > 1
ORDER BY USER_ID, PRODUCT_ID DESC;

역순 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/59035

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;

아픈 동물 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/59036

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS 
WHERE INTAKE_CONDITION='Sick'
ORDER BY ANIMAL_ID;

어린 동물 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/59037

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS 
WHERE INTAKE_CONDITION<>'Aged'
ORDER BY ANIMAL_ID

동물의 아이디와 이름

https://school.programmers.co.kr/learn/courses/30/lessons/59403

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID

여러 기준으로 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/59404

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME, DATETIME DESC;

상위 n개 레코드

https://school.programmers.co.kr/learn/courses/30/lessons/59405

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;

조건에 맞는 회원수 구하기 (YEAR 함수)

https://school.programmers.co.kr/learn/courses/30/lessons/131535

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT COUNT(*) USERS FROM USER_INFO
WHERE (AGE BETWEEN 20 AND 29) AND YEAR(JOINED) = 2021;

과일로 만든 아이스크림 고르기

https://school.programmers.co.kr/learn/courses/30/lessons/133025

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT F.FLAVOR FROM FIRST_HALF F JOIN ICECREAM_INFO I ON F.FLAVOR=I.FLAVOR 
WHERE F.TOTAL_ORDER > 3000 AND I.INGREDIENT_TYPE='fruit_based'
ORDER BY TOTAL_ORDER DESC;

가장 큰 물고기 10마리 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/298517

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ID, LENGTH FROM FISH_INFO 
ORDER BY LENGTH DESC, ID LIMIT 10;

특정 물고기를 잡은 총 수 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/298518

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT COUNT(I.FISH_TYPE) FISH_COUNT 
FROM FISH_INFO I JOIN FISH_NAME_INFO N ON I.FISH_TYPE=N.FISH_TYPE
WHERE N.FISH_NAME='BASS' OR N.FISH_NAME='SNAPPER'

2025.01.24

강원도에 위치한 생산공장 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131112

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS FROM FOOD_FACTORY
WHERE ADDRESS LIKE "%강원도%"
ORDER BY FACTORY_ID

인기있는 아이스크림

https://school.programmers.co.kr/learn/courses/30/lessons/133024

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT FLAVOR FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;

12세 이하인 여자 환자 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/132201

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(TLNO IS NULL,"NONE",TLNO) TLNO FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME;

조건에 맞는 도서 리스트 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE,'%Y-%m-%d') PUBLISHED_DATE FROM BOOK
WHERE YEAR(PUBLISHED_DATE)=2021 AND CATEGORY='인문'
ORDER BY PUBLISHED_DATE;

조건에 부합하는 중고거래 댓글 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/164673

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R ON B.BOARD_ID=R.BOARD_ID
WHERE YEAR(B.CREATED_DATE)=2022 AND MONTH(B.CREATED_DATE)=10
ORDER BY R.CREATED_DATE, B.TITLE;
SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R ON B.BOARD_ID=R.BOARD_ID
WHERE DATE_FORMAT(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY R.CREATED_DATE, B.TITLE;

모든 레코드 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/59034

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT * FROM ANIMAL_INS
ORDER BY ANIMAL_ID

오프라인/온라인 판매 데이터 통합하기

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT DATE_FORMAT(SALES_DATE,'%Y-%m-%d') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM (
    SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
    FROM ONLINE_SALE
    WHERE DATE_FORMAT(SALES_DATE,'%Y-%m')='2022-03'

    UNION ALL

    SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
    FROM OFFLINE_SALE
    WHERE YEAR(SALES_DATE) = 2022 AND MONTH(SALES_DATE) = 3
) AS combined_sales
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;


UNION ALL과 JOIN의 차이

더보기

UNION ALL

**UNION ALL**은 **두 개 이상의 테이블의 결과를 수직으로 결합(병합)**합니다.

행 단위로 데이터를 결합합니다.

UNION: 중복 제거.

UNION ALL: 중복 포함.

 

JOIN

테이블 간의 **공통된 키(컬럼)**를 사용하여 데이터를 결합합니다.

수평적으로 데이터를 병합합니다.

 

종류:

1. INNER JOIN:

공통 키가 일치하는 데이터만 반환.

2. LEFT JOIN:

왼쪽 테이블의 모든 데이터 + 오른쪽 테이블에서 매칭된 데이터.

3. RIGHT JOIN:

오른쪽 테이블의 모든 데이터 + 왼쪽 테이블에서 매칭된 데이터.

4. FULL JOIN:

양쪽 테이블의 모든 데이터.


업그레이드 된 아이템 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/273711

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I JOIN ITEM_TREE T ON I.ITEM_ID=T.ITEM_ID
WHERE T.PARENT_ITEM_ID IN(
    SELECT ITEM_ID
    FROM ITEM_INFO
    WHERE RARITY='RARE'
)
ORDER BY I.ITEM_ID DESC;

 

이거 좀 어려웠음.

T.PARENT_ITEM_ID가 조건 걸린 ITEM_ID 값에 대해서만 필터링 거는 방식으로 해결


Python 개발자 찾기 (IN 조건)

https://school.programmers.co.kr/learn/courses/30/lessons/276013

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME FROM DEVELOPER_INFOS
WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID;

조건에 맞는 개발자 찾기(조건기반 JOIN, GROUP BY 이해하기)

https://school.programmers.co.kr/learn/courses/30/lessons/276034

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME 
FROM DEVELOPERS D JOIN SKILLCODES S ON (D.SKILL_CODE & S.CODE) > 0
WHERE S.NAME IN ('Python', 'C#')
GROUP BY D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
ORDER BY D.ID;
더보기

코드 설명

 

JOIN조건 ON 설명 : 

(D.SKILL_CODE & S.CODE) > 0

110010000 400 <- DEVELERS의 SKILL_CODE
100000000 256 <- 스킬 코드 값
100000000 <- 비트연산 시 결과 값 : 해당 스킬 보유를 의미함으로 >0 설정 하면 됨

 

GROUP BY를 써야하는 이유

ID, NAME 등 중복 제거를 위해 사용.

그런데 말입니다.

GROUP BY를 사용하면 SELECT절에 컬럼은 모두 GROUP BY로 그룹화된 컬럼을 사용하거나, 집계함수(SUM, COUNT, MAX 등)를 적용해야 함


대장균의 크기에 따라 분류하기 2 (WITH)

https://school.programmers.co.kr/learn/courses/30/lessons/301649

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

더보기
-- 코드를 작성해주세요
WITH Ranked AS (
    SELECT ID, SIZE_OF_COLONY,
            NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS RANK_GROUP
    FROM ECOLI_DATA
)
SELECT ID, 
       CASE 
           WHEN RANK_GROUP = 1 THEN 'CRITICAL'
           WHEN RANK_GROUP = 2 THEN 'HIGH'
           WHEN RANK_GROUP = 3 THEN 'MEDIUM'
           ELSE 'LOW'
       END AS COLONY_NAME
FROM Ranked
ORDER BY ID;

특정 세대의 대장균 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/301650

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

더보기
SELECT D.ID
FROM ECOLI_DATA D
INNER JOIN (
        SELECT A.ID
        FROM ECOLI_DATA A
        INNER JOIN (
                SELECT ID
                FROM ECOLI_DATA
                WHERE PARENT_ID IS NULL
        ) AS B ON A.PARENT_ID = B.ID
    ) AS C ON D.PARENT_ID = C.ID
ORDER BY D.ID ASC;

멸종위기의 대장균 찾기

https://school.programmers.co.kr/learn/courses/30/lessons/301651

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

'코딩 > SQL' 카테고리의 다른 글

MySQL Community Server & Workbench 알아보기  (0) 2025.02.11
SQL 복습 - 전체적인 SQL 플로우  (0) 2025.01.24
SQL - Day3  (0) 2025.01.16
SQL 문제  (0) 2025.01.15
SQL - Day2  (0) 2025.01.15