Closed icegosimperson closed 1 month ago
동물의 보호 관련 데이터가 있는 ANIMAL_INS
테이블과 입양 데이터에 대한 ANIMAL_OUTS
테이블이 있을 때, 입양일이 보호 시작일보다 빠른 데이터 조회하기
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME
보호소에 맡겨진 정보(ANIMAL_INS
)에 대한 테이블과 입양된 정보(ANIMAL_OUTS
)에 대한 테이블이 주어졌을 때, 오랜 기간 보호된 동물 Top3 뽑기
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
WHERE A.ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY A.DATETIME
LIMIT 3
WHERE
절에서 NOT IN
사용하였고, 조건대로 출력해주기 위해 ORDER BY
와 LIMIT
사용ANIMAL_INS
와 ANIMAL_OUTS
를 LEFT JOIN
해준 뒤, ANIMAL_OUTS.DATE
이 NULL
값인 데이터를 가져오고 조건대로 출력해줘도 됨경제
카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력
정렬 : 출판일 기준 오름차순
SELECT A.BOOK_ID, B.AUTHOR_NAME, DATE_FORMAT(A.PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK A JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE CATEGORY = '경제'
ORDER BY A.PUBLISHED_DATE ASC;
JOIN
사용한 이유 연결
SELECT e.name
FROM Employee e
JOIN Employee m ON e.id = m.managerId
GROUP BY m.managerId
HAVING COUNT(m.managerId) >=5;
self Join
사용
JOIN Employee m ON e.id = m.managerId
GROUP BY
로 매니저별 관리하는 직원의 수 찾기SELECT
fp.PRODUCT_ID
,fp.PRODUCT_NAME
,SUM(fp.PRICE*fo.AMOUNT) AS TOTAL_SALES
FROM FOOD_ORDER fo
INNER JOIN FOOD_PRODUCT fp
ON fo.PRODUCT_ID = fp.PRODUCT_ID
WHERE fo.PRODUCE_DATE LIKE '2022-05%'
GROUP BY fp.PRODUCT_ID,fp.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC ,fp.PRODUCT_ID;
FOOD_ORDER
테이블에서 수량
, FOOD_PRODUCT
테이블에서 가격
이 필요해서 PRODUCT_ID
로 JOIN
PRODUCT_ID
가 있기 때문에 GROUP BY
로 집계SELECT
A.student_id
, A.student_name
, B.subject_name
, COUNT(C.student_id) attended_exams
FROM
Students A
CROSS JOIN Subjects B
LEFT JOIN Examinations C
ON A.student_id = C.student_id
AND B.subject_name = C.subject_name
GROUP BY
A.student_id
, A.student_name
, B.subject_name
ORDER BY
A.student_id
, A.student_name
, B.subject_name
JOIN
한 후 COUNT
하는 문제 INNER JOIN
에 조건을 1=1
을 넣어서 곱집합 테이블을 만들었는데 CROSS JOIN
이라는 간단한 구문이 있음COUNT
를 할 때 주 테이블의 PK값을 넣었었지만 이번 문제는 NULL 값을 제외
해야 하므로 다른 칼럼을 기준으로 카운트
COUNT(컬럼명)을 사용하면 NULL 값은 제외하고 COUNT 합니다.
COUNT(*)를 사용하면 NULL도 포함하여 전부 COUNT 합니다.
SELECT P.ID, COUNT(C.ID) AS CHILD_COUNT
FROM ECOLI_DATA P
LEFT JOIN ECOLI_DATA C
ON P.ID = C.PARENT_ID
GROUP BY(P.ID)
ORDER BY P.ID;
count(c.id)
로 자식의 수 카운트SELECT J.FLAVOR
FROM JULY J
LEFT JOIN FIRST_HALF F
ON J.FLAVOR = F.FLAVOR
GROUP BY J.FLAVOR
ORDER BY SUM(J.TOTAL_ORDER)+SUM(F.TOTAL_ORDER) DESC
LIMIT 3
limit
를 활용해 상위 3개만 출력+-------------+------+ | Column Name | Type | +-------------+------+ | account_id | int | | income | int | +-------------+------+
SELECT 'High Salary' AS category,
SUM(income > 50000) AS accounts_count
FROM Accounts
UNION
SELECT 'Average Salary' AS category,
SUM(income BETWEEN 20000 AND 50000) AS accounts_count
FROM Accounts
UNION
SELECT 'Low Salary' AS category,
SUM(income < 20000) AS accounts_count
FROM Accounts
우선, 이번주 주제가 Join이였으나 해당 문제는 UNION으로 풀었음...!
JOIN
을 사용해야하는 이유
카테고리에 계정이 없으면 0 반환
이란 조건 존재그냥 CASE WHEN 조건으로 카테고리 나누고, COUNT로 세면 계정이 없는 카테고리는 빠짐
UNION
을 사용한 이유
JOIN은 수평적 결합, UNION은 수직적 결합
SUM
과 COUNT
위 문제에서 COUNT보다 SUM으로 보다 간결하게 쿼리를 작성할 수 있어서 SUM 사용
동물의 보호 관련 데이터가 있는 ANIMAL_INS
테이블과 입양 데이터에 대한 ANIMAL_OUTS
테이블이 있을 때, 입양일이 보호 시작일보다 빠른 데이터 조회
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME;
ANIMAL_INS
, ANIMAL_OUTS
테이블이 있을 때, 보호소에서 중성화된 동물들의 데이터 출력하
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE
A.SEX_UPON_INTAKE LIKE 'Intact%'
AND
B.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
ORDER BY A.ANIMAL_ID ASC
Intact
로 시작, 중성화된 동물들은 Intact
가 아닌 다른 단어로 시작하므로 LIKE
와 NOT LIKE
사용SELECT
CONCAT('/home/grep/src/',ugf.BOARD_ID,'/',ugf.FILE_ID,ugf.FILE_NAME,ugf.FILE_EXT) FILE_PATH
FROM USED_GOODS_BOARD ugb
INNER JOIN USED_GOODS_FILE ugf
ON ugb.BOARD_ID = ugf.BOARD_ID
WHERE ugb.VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
ORDER BY ugf.FILE_ID DESC;
CONCAT(n1, n2, n...)
인수는 2개 이상 254개 이하
로 사용 가능
MAX 또는 MIN 값을 가진 칼럼을 조회할 때, 단순히 SELECT 문에 MAX,MIN 함수와 칼럼을 조회하면 잘못된 값이 나오기 때문에 주의하기
조회수가 제일 높은 게시글ID 찾기
조회수가 제일 높은 게시글은 B0008
아래 쿼리로 조회할 경우 테이블의 첫번째 ROW 데이터가 나옴
SELECT MAX(VIEWS),BOARD_ID
FROM USED_GOODS_BOARD;
Signups
테이블에 저장된 유저별로 Confirmations
테이블에서 action
칼럼의 confirmed
비율을 출력
SELECT
A.user_id
, ROUND(AVG(IF(B.action = 'confirmed', 1, 0)), 2) confirmation_rate
FROM
Signups A
LEFT JOIN Confirmations B
ON A.user_id = B.user_id
GROUP BY
A.user_id
ROUND
를 사용해서 반올림AVG
를 사용해서 confirmed
비율을 계산IF
를 사용해서 confirmed
의 값을 1로, 그 외의 값은 0으로 처리
JOIN