✔ SELECT
조건에 맞는 도서 리스트 출력하기
[프로그래머스 144853]
/*
SELECT : 도서 ID, 출판일
FROM : BOOK 테이블
WHERE : 2021년에 출판한 '인문' 카테고리에 속하는 도서
ORDER BY : 출판일을 기준으로 오름차순 정렬
*/
SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK
WHERE PUBLISHED_DATE LIKE '2021%' AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE
조건에 부합하는 중고거래 댓글 조회하기
[프로그래머스 164673]
- JOIN (INNER JOIN) : 기준 테이블과 조인 테이블에 조인 컬럼에 해당하는 값이 모두 존재하는 경우에만 데이터가 조회
/*
SELECT : 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일
FROM : USED_GOODS_BOARD, USED_GOODS_REPLY 테이블
WHERE : 2022년 10월에 작성된 게시글
ORDER BY : 댓글 작성일을 기준으로 오름차순 정렬, 같다면 게시글 제목을 기준으로 오름차순 정렬
*/
SELECT A.TITLE, A.BOARD_ID, B.REPLY_ID, B.WRITER_ID, B.CONTENTS, DATE_FORMAT(B.CREATED_DATE, '%Y-%m-%d') AS CRAETED_DATE
FROM USED_GOODS_BOARD A JOIN USED_GOODS_REPLY B
ON A.BOARD_ID = B.BOARD_ID
WHERE A.CREATED_DATE LIKE '2022-10-%'
ORDER BY B.CREATED_DATE, A.TITLE
3월에 태어난 여성 회원 목록 출력하기
[프로그래머스 131120]
- IS NULL : 해당 값이 Null인 값만 가져오기
- IS NOT NULL : 해당 값이 Null이 아닌 값만 가져오기
- IFNULL(data, '대체 값') : data가 Null인 경우 대체 값으로 출력하기
/*
SELECT : 회원 ID, 이름, 성별, 생년월일
FROM : MEMBER_PROFILE 테이블
WHERE : 생일이 3월, 여성, 전화번호가 NULL이 아님
ORDER BY : 회원 ID를 기준으로 오름차순 정렬
*/
SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_OF_BIRTH LIKE '%-03-%'
AND GENDER = 'W'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
흉부외과 또는 일반외과 의사 목록 출력하기
[프로그래머스 132203]
- IN : 여러 값을 OR 관계로 묶어 나열하는 조건을 WHERE 절에 사용할 때 쓸 수 있는 키워드로 이 값 중 하나 이상과 일치하면 됨
/*
SELECT : 의사의 이름, 의사ID, 진료과, 고용일자
FROM : DOCTOR 테이블
WHERE : 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사
ORDER BY : 고용일자를 기준으로 내림차순 정렬, 같다면 이름을 기준으로 오름차순 정렬
*/
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS') -- WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME
과일로 만든 아이스크림 고르기
[프로그래머스 133025]
/*
SELECT : 아이스크림의 맛
FROM : FIRST_HALF, ICECREAM_INFO 테이블
WEHRE : 총주문량이 3,000 높음, 아이스크림의 주 성분이 과일
ORDER BY : 총주문량이 내림차순 정렬
*/
SELECT A.FLAVOR
FROM FIRST_HALF A JOIN ICECREAM_INFO B
ON A.FLAVOR = B.FLAVOR
WHERE A.TOTAL_ORDER >= 3000
AND B.INGREDIENT_TYPE = 'fruit_based'
ORDER BY A.TOTAL_ORDER DESC
평균 일일 대여 요금 구하기
[프로그래머스 151136]
/*
SELECT : 평균 일일 대여 요금(소수 첫번째 자리에서 반올림)
FROM : CAR_RENTAL_COMPANY_CAR 테이블
WHERE : 자동차 종류가 'SUV'
*/
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV'
인기있는 아이스크림
[프로그래머스 133024]
/*
SELECT : 아이스크림의 맛
FROM : FIRST_HALF 테이블
ORDER BY : 총주문량을 기준으로 내림차순 정렬, 같다면 출하 번호를 기준으로 오름차순 정렬
*/
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID
강원도에 위치한 생산공장 목록 출력하기
[프로그래머스 131112]
/*
SELECT : 공장 ID, 공장 이름, 주소
FROM : FOOD_FACTORY 테이블
WHERE : 강원도에 위치한 식품공장
ORDER BY : 공장 ID를 기준으로 오름차순 정렬
*/
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID
12세 이하인 여자 환자 목록 출력하기
[프로그래머스 132201]
/*
SELECT : 환자이름, 환자번호, 성별코드, 나이, 전화번호(전화번호가 없는 경우, 'NONE'으로 출력)
FROM : PATIENT 테이블
WHERE : 12세 이하인 여자 환자
ORDER BY : 나이를 기준으로 내림차순 정렬, 같다면 환자이름을 기준으로 오름차순 정렬
*/
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME
서울에 위치한 식당 목록 출력하기
[프로그래머스 131118]
/*
SELECT : 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수(소수점 세 번째 자리에서 반올림)
FROM : REST_INFO, REST_REVIEW 테이블
WHERE : 서울에 위치한 식당들
GROUP BY : 식당 ID
ORDER BY : 평균점수를 기준으로 내림차순 정렬, 같다면 즐겨찾기수를 기준으로 내림차순 정렬
*/
SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO A JOIN REST_REVIEW B
ON A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE '서울%'
GROUP BY B.REST_ID
ORDER BY SCORE DESC, A.FAVORITES DESC
재구매가 일어난 상품과 회원 리스트 구하기
[프로그래머스 131536]
/*
SELECT : 회원 ID, 상품 ID
FROM : ONLINE_SALE 테이블
GROUP BY : 회원 ID, 상품 ID 별
HAVING : 재구매한 데이터(2번 이상 구매)
ORDER BY : 회원 ID를 기준으로 오름차순 정렬, 같다면 상품 ID를 기준으로 내림차순 정렬
*/
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(PRODUCT_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC
모든 레코드 조회하기
[프로그래머스 59034]
/*
SELECT : 모든 동물의 정보
FROM : ANIMAL_INS 테이블
ORDER BY : ANIMAL_ID순으로 정렬
*/
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
오프라인/온라인 판매 데이터 통합하기
[프로그래머스 131537]
- UNION : 쿼리의 결과를 합쳐 반환하며 중복된 행은 제거함
- UNION ALL : 쿼리의 결과를 합쳐 반환하며 중복된 행을 제거하지 않음
- INTERSECT : 양쪽의 쿼리에 모두 포함된 행을 반환
- MINUS : 첫 번째 쿼리의 결과에서 두 번째 쿼리의 결과를 제외하여 반환
/*
SELECT : 판매 날짜, 상품ID, 유저ID, 판매량
FROM : ONLINE_SALE 테이블
WHERE : 2022년 3월의 온라인 상품 판매 데이터
UNION
SELECT : 판매 날짜, 상품ID, 유저ID(NULL), 판매량
FROM : OFFLINE_SALE 테이블
WHERE : 2022년 3월의 오프라인 상품 판매 데이터
ORDER BY : 판매일을 기준으로 오름차순 정렬, 같다면 상품 ID를 기준으로 오름차순, 같다면 유저 ID를 기준으로 오름차순 정렬
*/
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE MONTH(SALES_DATE) = 3
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
역순 정렬하기
[프로그래머스 59035]
/*
SELECT : 동물의 이름, 보호 시작일
FROM : ANIMAL_INS 테이블
ORDER BY : ANIMAL_ID 내림차순 정렬
*/
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
아픈 동물 찾기
[프로그래머스 59036]
/*
SELECT : 동물 ID, 이름
FROM : ANIMAL_INS 테이블
WHERE : 아픈 동물(INTAKE_CONDITION이 'Sick'인 경우)
ORDER BY : 동물 ID 오름차순 정렬
*/
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID
어린 동물 찾기
[프로그래머스 59037]
/*
SELECT : 동물 ID, 이름
FROM : ANIMAL_INS 테이블
WHERE : 젋은 동물(INTAKE_CONDITION이 'Aged'가 아닌 경우)
ORDER BY : 동물 ID 오름차순 정렬
*/
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT INTAKE_CONDITION = 'Aged'
ORDER BY ANIMAL_ID
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID
동물의 아이디와 이름
[프로그래머스 59403]
/*
SELECT : 동물 ID, 이름
FROM : ANIMAL_INS 테이블
ORDER BY : 동물 ID 오름차순 정렬
*/
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
여러 기준으로 정렬하기
[프로그래머스 59404]
/*
SELECT : 동물 ID, 이름, 보호 시작일
FROM : ANIMAL_INS 테이블
ORDER BY : 이름 오름차순 정렬, 같다면 보호 시작일 내림차순 정렬
*/
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
상위 n개 레코드
[프로그래머스 59405]
/*
SELECT : 가장 먼저 들어온 동물의 이름
FROM : ANIMAL_INS 테이블
ORDER BY : 보호 시작일 오름차순 정렬
*/
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
조건에 맞는 회원수 구하기
[프로그래머스 131535]
/*
SELECT : 회원 수
FROM : USER_INFO 테이블
WHERE : 2021년에 가입한 회원, 나이가 20세 이상 29세 이하
*/
SELECT COUNT(USER_ID)
FROM USER_INFO
WHERE YEAR(JOINED) = '2021'
AND AGE BETWEEN 20 AND 29
업그레이드 된 아이템 구하기
[프로그래머스 273711]
/*
SELECT : 아이템 ID, 아이템 명, 아이템의 희귀도
FROM : ITEM_INFO, ITEM_TREE 테이블
WHERE : 아이템의 희귀도가 'RARE'인 아이템의 PARENT 아이템의 ID
ORDER BY : 아이템 ID를 기준으로 내림차순 정렬
*/
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
FROM ITEM_INFO A JOIN ITEM_TREE B
ON A.ITEM_ID = B.ITEM_ID
WHERE B.PARENT_ITEM_ID IN (SELECT ITEM_ID
FROM ITEM_INFO
WHERE RARITY = 'RARE')
ORDER BY B.ITEM_ID DESC
Python 개발자 찾기
[프로그래머스 276013]
/*
SELECT : 개발자의 ID, 이메일, 이름, 성
FROM : DEVELOPER_INFOS 테이블
WHERE : Python 스킬을 가진 개발자
ORDER BY : 개발자의 ID를 기준으로 오름차순 정렬
*/
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE SKILL_1 = 'Python'
OR SKILL_2 = 'Python'
OR SKILL_3 = 'Python'
ORDER BY ID
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPER_INFOS
WHERE 'Python' IN (SKILL_1, SKILL_2, SKILL_3)
ORDER BY ID
조건에 맞는 개발자 찾기
[프로그래머스 276034]
- & (AND 연산) : 대응되는 비트가 모두 1이면 1을 반환하는 비트 연산자
- | (OR 연산) : 대응되는 비트가 하나라도 1이면 1을 반환하는 비트 연산자
- ^ (XOR 연산) : 대응되는 비트가 서로 다르면 1을 반환하는 비트 연산자
- ~ (NOT 연산) : 비트가 1이면 0으로, 0이면 1로 반전하여 반환하는 비트 연산자
- << (LEFT SHIFT 연산) : 지정한 수만큼 비트를 전부 왼쪽으로 이동시키는 비트 연산자
- >> (RIGHT SHIFT 연산) : 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시키는 비트 연산자
/*
SELECT : 개발자의 ID, 이메일, 이름, 성
FROM : DEVELOPERS 테이블
WHERE : Python의 CODE와 동일한 스킬을 가진 개발자 또는 C#의 CODE와 동일한 스킬을 가진 개발자
ORDER BY : 개발자의 ID를 기준으로 오름차순 정렬
*/
SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python')
OR SKILL_CODE & (SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#')
ORDER BY ID
잔챙이 잡은 수 구하기
[프로그래머스 293258]
/*
SELECT : 물고기의 수
FROM : FISH_INFO 테이블
WHERE : 물고기의 길이가 NULL
*/
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE LENGTH IS NULL
가장 큰 물고기 10마리 구하기
[프로그래머스 298517]
/*
SELECT : 물고기의 ID와 길이
FROM : FISH_INFO 테이블
ORDER BY : 길이를 기준으로 내림차순 정렬, 같다면 물고기의 ID에 대해 오름차순 정렬
*/
SELECT ID, LENGTH
FROM FISH_INFO
ORDER BY LENGTH DESC, ID
LIMIT 10
특정 물고기를 잡은 총 수 구하기
[프로그래머스 298518]
/*
SELECT : BASS와 SNAPPER의 수
FROM : FISH_INFO 테이블
WHERE : 물고기의 이름이 BASS 또는 SNAPPER인 종류
*/
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE FISH_TYPE IN (SELECT FISH_TYPE
FROM FISH_NAME_INFO
WHERE FISH_NAME = 'BASS'
OR FISH_NAME = 'SNAPPER')
대장균들의 자식의 수 구하기
[프로그래머스 299305]
/*
SELECT : 대장균 개체의 ID, 자식의 수(자식이 없다면 자식의 수는 0)
FROM : ECOLI_DATA 테이블
ORDER BY : 개체의 ID 에 대해 오름차순 정렬
*/
SELECT ID, IFNULL((SELECT COUNT(*)
FROM ECOLI_DATA
GROUP BY PARENT_ID
HAVING PARENT_ID = ID), 0) AS CHILD_COUNT
FROM ECOLI_DATA
ORDER BY ID
대장균의 크기에 따라 분류하기 1
[프로그래머스 299307]
/*
SELECT : 대장균 개체의 ID, 분류(대장균 개체의 크기가 100 이하라면 'LOW', 100 초과 1000 이하라면 'MEDIUM', 1000 초과라면 'HIGH')
FROM : ECOLI_DATA 테이블
ORDER BY : 개체의 ID 에 대해 오름차순 정렬
*/
SELECT ID, CASE WHEN SIZE_OF_COLONY <= 100 THEN 'LOW'
WHEN SIZE_OF_COLONY <= 1000 THEN 'MEDIUM'
ELSE 'HIGH'
END AS SIZE
FROM ECOLI_DATA
특정 형질을 가지는 대장균 찾기
[프로그래머스 301646]
/*
SELECT : 대장균 개체의 수
FROM : ECOLI_DATA 테이블
WHERE : 2번 형질이 보유하지 않으면서 1번이나 3번 형질을 보유하고 있는 대장균 개체
*/
SELECT COUNT(ID) AS COUNT
FROM ECOLI_DATA
WHERE (GENOTYPE & 2 = 0)
AND (GENOTYPE & 1 > 0 OR GENOTYPE & 4 > 0)
부모의 형질을 모두 가지는 대장균 찾기
[프로그래머스 301647]
/*
SELECT : 대장균의 ID, 대장균의 형질, 부모 대장균의 형질
FROM : ECOLI_DATA 테이블
WHERE : 부모의 형질을 모두 보유
ORDER BY : 대장균의 ID에 대해 오름차순 정렬
*/
SELECT A.ID, A.GENOTYPE, B.GENOTYPE AS PARENT_GENOTYPE
FROM ECOLI_DATA A JOIN ECOLI_DATA B
ON A.PARENT_ID = B.ID
WHERE A.GENOTYPE & B.GENOTYPE = B.GENOTYPE
ORDER BY A.ID
대장균의 크기에 따라 분류하기 2
[프로그래머스 301649]
- NTILE() OVER() : 지정된 수만큼의 파티션으로 등급을 나누어 각 등급 번호를 반환
- RANK() OVER() : 순위 값 중 동등 순위 번호를 같게 나오고 그 다음 순위를 다음 번호를 뺀 그 다음 값을 반환 (1 1 3)
- DENSE_RANK() OVER() : 순위 값 중 동등 순위 번호는 같게 나오고 그 다음 순위를 다음 번호로 반환 (1 1 2)
- ROW_NUMBER() OVER() : 동등 순위를 인식하지 않고 매번 증가되는 번호를 반환 (1 2 3)
- OVER(PARTITION BY) : 이때 파티션을 적용해 파티션 안의 순위를 찾을 수 있음
- LEAD() OVER() : 지정된 칼럼 이전의 행 값을 반환
- LAG() OVER() : 지정된 칼럼 이후의 행 값을 반환
- FIRST_VALUE() OVER() : 각 그룹별 첫 번째 값 하나만 반환
- LAST_VALUE() OVER() : 각 그룹별 마지막 값 하나만 반환
- CUME_DIST() OVER() : 주어진 그룹에 대한 상대적인 누적분포도 값을 반환하며 반환 값의 범위는 0 초과 1 이하 사이의 값
/*
SELECT : 대장균 개체의 ID, 분류된 이름(상위 0% ~ 25%를 'CRITICAL', 26% ~ 50%를 'HIGH', 51% ~ 75%를 'MEDIUM', 76% ~ 100%를 'LOW')
FROM : ECOLI_DATA 테이블
ORDER BY : 개체의 ID 에 대해 오름차순 정렬
*/
WITH PERCENT AS (SELECT ID, NTILE(4) OVER (ORDER BY SIZE_OF_COLONY DESC) AS SIZE_GROUP
FROM ECOLI_DATA),
COLONY_NAMES AS (SELECT ID, CASE WHEN SIZE_GROUP = 1 THEN 'CRITICAL'
WHEN SIZE_GROUP = 2 THEN 'HIGH'
WHEN SIZE_GROUP = 3 THEN 'MEDIUM'
WHEN SIZE_GROUP = 4 THEN 'LOW'
END AS COLONY_NAME
FROM PERCENT)
SELECT A.ID, B.COLONY_NAME
FROM ECOLI_DATA A JOIN COLONY_NAMES B
ON A.ID = B.ID
ORDER BY A.ID
특정 세대의 대장균 찾기
[프로그래머스 301650]
/*
SELECT : 대장균의 ID
FROM : ECOLI_DATA 테이블
WHERE : 3세대의 대장균
ORDER BY : 대장균의 ID 에 대해 오름차순 정렬
*/
WITH FIRST_ECOLI AS (SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL),
SECOND_ECOLI AS (SELECT A.ID, A.PARENT_ID
FROM ECOLI_DATA A JOIN FIRST_ECOLI B
ON A.PARENT_ID = B.ID)
SELECT A.ID
FROM ECOLI_DATA A JOIN SECOND_ECOLI B
ON A.PARENT_ID = B.ID
ORDER BY A.ID
멸종위기의 대장균 찾기
[프로그래머스 301651]
/*
SELECT : 개체의 수, 세대
FROM : 세대별 개체
GROUP BY : 세대별
ORDER BY : 세대에 대해 오름차순 정렬
*/
WITH RECURSIVE ANCESTOR_ECOLI AS (SELECT ID, PARENT_ID, 1 AS GENERATION
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION
SELECT A.ID, A.PARENT_ID, (1 + B.GENERATION) AS GENERATION
FROM ECOLI_DATA A JOIN ANCESTOR_ECOLI B
ON A.PARENT_ID = B.ID)
SELECT COUNT(GENERATION) AS COUNT, GENERATION
FROM ANCESTOR_ECOLI
WHERE NOT ID IN (SELECT DISTINCT PARENT_ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NOT NULL)
GROUP BY GENERATION
ORDER BY GENERATION