SQL 중급 정리(2)

hhyun·2024년 11월 2일

[SQL]

목록 보기
20/20

🌟 CASE

SELECT CASE
			WHEN CategoryID = 1 THEN '음료' 
            WHEN CategoryID = 2 THEN '조미료'
			ELSE '기타'
	   END AS 'CategoryNAME', Products.*
FROM Products
WHEN절에 두가지의 조건
SELECT CASE
			WHEN CategoryID = 1 AND SupplierID = 1 THEN '음료' 
            WHEN CategoryID = 2 THEN '조미료'
			ELSE '기타'
	   END AS 'CategoryNAME', Products.*
FROM Products
만든 컬럼으로 GROUP BY
SELECT CASE
			WHEN CategoryID = 1 THEN '음료' 
            WHEN CategoryID = 2 THEN '소스'
			ELSE '이외'
	   END AS new_category 
       , AVG(Price)
FROM Products
GROUP BY new_category

💭 문제풀이

[해커랭크_문제] Type Of Triangle
WHEN절의 순서를 신경써야한다.
📌첫 조건에 해당한 값들은 제외하고 다음 조건에서 충족하는지 안하는지 확인하며 넘어간다.
SELECT CASE
            WHEN A = B AND B = C THEN 'Equilateral'
            WHEN A + B <= C OR A + C <= B OR B + C <= A THEN 'Not A Triangle'
            WHEN A = B OR A = C OR B = C THEN 'Isosceles'
            ELSE 'Scalene'
        END
FROM TRIANGLES

🌟 CASE를 활용한 테이블 PIVOT

사진 속 위의 내용을 아래처럼 추출하는 쿼리

SELECT  AVG(CASE WHEN categoryid = 1 THEN PRICE ELSE 'NULL' END) AS category1_price
	  , AVG(CASE WHEN categoryid = 2 THEN PRICE ELSE 'NULL' END) AS category2_price
      , AVG(CASE WHEN categoryid = 3 THEN PRICE ELSE 'NULL' END) AS category3_price
FROM Products

💭 문제풀이

[LeetCode_문제] Reformat Department Table
SELECT id 
    , sum(CASE WHEN month = 'Jan' THEN revenue ELSE NULL END) AS Jan_Revenue
    , sum(CASE WHEN month = 'Feb' THEN revenue ELSE NULL END) AS Feb_Revenue
    , sum(CASE WHEN month = 'Mar' THEN revenue ELSE NULL END) AS Mar_Revenue
    , sum(CASE WHEN month = 'Apr' THEN revenue ELSE NULL END) AS Apr_Revenue
    , sum(CASE WHEN month = 'May' THEN revenue ELSE NULL END) AS May_Revenue
    , sum(CASE WHEN month = 'Jun' THEN revenue ELSE NULL END) AS Jun_Revenue
    , sum(CASE WHEN month = 'Jul' THEN revenue ELSE NULL END) AS Jul_Revenue
    , sum(CASE WHEN month = 'Aug' THEN revenue ELSE NULL END) AS Aug_Revenue
    , sum(CASE WHEN month = 'Sep' THEN revenue ELSE NULL END) AS Sep_Revenue
    , sum(CASE WHEN month = 'Oct' THEN revenue ELSE NULL END) AS Oct_Revenue
    , sum(CASE WHEN month = 'Nov' THEN revenue ELSE NULL END) AS Nov_Revenue
    , sum(CASE WHEN month = 'Dec' THEN revenue ELSE NULL END) AS Dec_Revenue   
FROM department
group by id

🌟 JOIN

두개의 테이블을 연결해서 데이터를 추출하기 위해
모든 경우의 숫자를 다 만들어 줌
SELECT * FROM Users,Orders

🌟 INNER JOIN

두 테이블에 모두 포함되는 데이터를 추출 (교집합)
Old
SELECT * 
FROM Users,Orders
WHERE Users.Id = Orders.userId
New
SELECT * 
FROM Users
	INNER JOIN Orders ON Users.Id = Orders.userId

🌟 OUTER JOIN

OUTER를 적지 않아도 무관
LEFT JOIN (주로)
SELECT * 
FROM Users
	LEFT (OUTER) JOIN Orders ON Users.Id = Orders.userId
RIGHT JOIN = LEFT JOIN의 반대

💭 문제풀이

[해커랭크_문제]
African Cities
SELECT CITY.NAME
FROM CITY 
    INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE 
WHERE COUNTRY.CONTINENT = 'Africa'
Population Census
SELECT SUM(CITY.POPULATION)
FROM CITY 
    INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE 
WHERE COUNTRY.CONTINENT = 'Asia'
Average Population of Each Continent
📌 Continent별로 평균 인구를 구해야하니까 GROUP BY 해야함
SELECT COUNTRY.CONTINENT
    , FLOOR(AVG(CITY.POPULATION))
FROM CITY
    INNER JOIN COUNTRY ON CITY.COUNTRYCODE = COUNTRY.CODE
GROUP BY COUNTRY.CONTINENT
[LEETCODE 문제] 183. Customers Who Never Order
SELECT Customers.NAME AS Customers
FROM Customers
    LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
WHERE Orders.ID IS NULL

🌟 SELF JOIN

💭 문제풀이

[LEETCODE 문제] 181. Employees Earning More Than Their Managers
A 테이블에 A를 JOIN하는 경우
SELECT Employee.NAME AS Employee
FROM Employee
    INNER JOIN Employee AS Manager ON Employee.managerId = Manager.id
WHERE Employee.SALARY > Manager.SALARY
[LEETCODE 문제] 197. Rising Temperature
SELECT  TODAY.Id  AS TODAY_Id
    ,   TODAY.recordDate  AS TODAY_DATE
    ,   TODAY.temperature AS TODAY_TEP
    ,   YESTERDAY.Id  AS YESTERDAY_Id
    ,   YESTERDAY.recordDate  AS YESTERDAY_DATE
    ,   YESTERDAY.temperature AS YESTERDAY_TEP
FROM Weather AS TODAY
    INNER JOIN Weather AS YESTERDAY ON TODAY.ID = YESTERDAY.ID+1
WHERE TODAY.temperature > YESTERDAY.temperature
Submit을 하면 틀림
📌 ID가 1이 오늘 2가 전날인 경우가 있음
SELECT  TODAY.Id  AS Id
FROM Weather AS TODAY
    INNER JOIN Weather AS YESTERDAY ON TODAY.ID = YESTERDAY.ID+1
WHERE TODAY.temperature > YESTERDAY.temperature
DATE_ADD를 이용해서 데이터 추출
SELECT  TODAY.Id  AS Id
FROM Weather AS TODAY
    INNER JOIN Weather AS YESTERDAY ON TODAY.recordDate = DATE_ADD(YESTERDAY.recordDate,INTERVAL 1 DAY)
WHERE TODAY.temperature > YESTERDAY.temperature

📌 DATE_ADD(기준날짜,INTERVAL) : 더하기

SELECT DATE_ADD(SYSDATE, INTERVAL 1 SECOND)
SELECT DATE_ADD(SYSDATE, INTERVAL 1 MINUTE)
SELECT DATE_ADD(SYSDATE, INTERVAL 1 HOUR)	
SELECT DATE_ADD(SYSDATE, INTERVAL 1 DAY)
SELECT DATE_ADD(SYSDATE, INTERVAL 1 MONTH)	
SELECT DATE_ADD(SYSDATE, INTERVAL 1 YEAR)	
SELECT DATE_ADD(SYSDATE, INTERVAL -1 YEAR) 		

📌 DATE_SUB(기준날짜,INTERVAL) : 빼기

SELECT DATE_SUB(SYSDATE, INTERVAL 1 SECOND)

🌟 UNION & UNION ALL

중복값 제외 (UNION) / 중복값까지 다 포함 (UNION ALL)
Product 테이블에서 Price가 5이하 또는 200이상인 상품들만 출력
SELECT *
FROM Products
WHERE price <= 5
OR price >= 200
위의 쿼리를 UNION을 이용해서 쿼리 작성
      SELECT *
      FROM Products
      WHERE price <= 5
UNION
      SELECT *
      FROM Products
      WHERE price >= 200
위의 쿼리를 UNION ALL을 이용해서 쿼리 작성
          SELECT *
          FROM Products
          WHERE price <= 5
UNION ALL 
          SELECT *
          FROM Products
          WHERE price >= 200

🌟 FULL OUTER JOIN

MYSQL에선 지원을 안하기 때문에 FULL OUTER JOIN처럼 하고 싶은 경우
비회원의 주문정보까지도 다 보고 싶은 쿼리
      SELECT *
      FROM Customers
          LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomersID
UNION
      SELECT *
      FROM Customers
          RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomersID

💭 문제풀이

[해커랭크_문제] Symmetric Pairs
ORDER BY는 UNION아래의 SELECT절만 가능
      SELECT X,Y
      FROM Functions
      WHERE X = Y
      GROUP BY X,Y
      HAVING COUNT(*) = 2
UNION
      SELECT F1.X,F1.Y
      FROM Functions AS F1
          INNER JOIN Functions AS F2 ON F1.X = F2.Y AND F2.X = F1.Y
      WHERE F1.X < F1.Y
      ORDER BY X

0개의 댓글