카이로스의 시간

Database SQL 쿼리 문법 정리 Part2 본문

기타

Database SQL 쿼리 문법 정리 Part2

차녕 2022. 4. 10. 22:17

알고리즘 테스트를 위한 SQL 문법을 정리합니다.

Programmers의 SQL 고득점 Kit 테스트에 있는 문제의 풀이 위주로 작성했습니다.

아래 링크에서 이어지는 내용입니다.

https://94chan0.tistory.com/15

 

Database SQL 쿼리 문법 정리 Part1

알고리즘 테스트를 위한 SQL 문법을 정리합니다. Programmers의 SQL 고득점 Kit 테스트에 있는 문제의 풀이 위주로 작성했습니다. 이 프로그래머스 SQL 문제들은 SELECT를 통해서 데이터를 조회하는 방식

94chan0.tistory.com

 

JOIN

 

  • INS, OUTS의 ID를 기준으로 두군데 다 있는 항목 + OUTS에 있는 항목들 중에서 OUTS.ANIMAL_ID는 있고 ANIMAL_INS.ANIMAL_ID에는 없는 경우의 OUTS.ANIMAL_ID, OUTS.NAME을 조회
SELECT OUTS.ANIMAL_ID, OUTS.NAME FROM ANIMAL_INS AS INS
    RIGHT OUTER JOIN ANIMAL_OUTS AS OUTS

    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID

WHERE OUTS.ANIMAL_ID NOT IN(SELECT ANIMAL_INS.ANIMAL_ID FROM ANIMAL_INS)

 

 

  • INS, OUTS의 ID가 일치하는 데이터들 기준으로 INS.DATETIME이 OUTS.DATETIME 보다 큰 경우를 INS.DATETIME 기준으로 정렬해서 조회
SELECT OUTS.ANIMAL_ID, OUTS.NAME FROM ANIMAL_INS AS INS
    RIGHT OUTER JOIN ANIMAL_OUTS AS OUTS

    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID

WHERE INS.DATETIME > OUTS.DATETIME

ORDER BY INS.DATETIME

 

  • INS ID 기준으로 MERGE 해서 OUTS.DATETIME NULL 경우, INS.DATETIME 으로 정렬해서 상위 3개만 조회
SELECT INS.NAME, INS.DATETIME FROM ANIMAL_INS AS INS
    LEFT OUTER JOIN ANIMAL_OUTS AS OUTS

    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID

WHERE OUTS.DATETIME IS NULL

ORDER BY INS.DATETIME LIMIT 3

 

  • INS.SEX_UPON_INTAKE에는 Intact라는 문구가 포함되어있고, OUTS.SEX_UPON_OUTCOME에는 Intact 안포함되어있는 경우
SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME FROM ANIMAL_OUTS AS OUTS
    LEFT OUTER JOIN ANIMAL_INS AS INS

    ON INS.ANIMAL_ID = OUTS.ANIMAL_ID

WHERE INS.SEX_UPON_INTAKE LIKE '%Intact%'

AND OUTS.SEX_UPON_OUTCOME NOT LIKE '%Intact%'

ORDER BY OUTS.ANIMAL_ID

 

STRING, DATA

 

  • ANIMAL_INS에서 NAME ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty') 있는 row만 찾아서 컬럼 조회
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS AS INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')

 

  • 이름에 el 들어가는 ANIMAL_TYPE Dog 것들만 NAME 기준으로 정렬
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS AS INS
WHERE NAME LIKE "%el%" AND ANIMAL_TYPE="Dog"

ORDER BY NAME ASC

 

  • SEX_UPON_INTAKE Neutered Spayed가 들어가있으면 O 아니면 X로 표시해서 중성화 목록으로 이름 바꿔서 조회
SELECT ANIMAL_ID, NAME,
IF(SEX_UPON_INTAKE LIKE "%Neutered%" OR SEX_UPON_INTAKE LIKE "%Spayed%", 'O', 'X') AS "중성화"

FROM ANIMAL_INS AS INS

ORDER BY ANIMAL_ID

 

  • INS ANIMAL_ID OUTS에도 있고, 날짜 차이로 정렬해서 가장 크게 차이나는 2 기준으로 ID, NAME 조회
SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS AS INS, ANIMAL_OUTS AS OUTS
WHERE INS.ANIMAL_ID=OUTS.ANIMAL_ID

ORDER BY DATEDIFF(INS.DATETIME, OUTS.DATETIME)

LIMIT 2

 

  • ANIMAL_INS에서 DATETIME DATE type변환, 이때 %Y: 4자리 연도, %y: 2자리 연도, %m(), %d()를 나타냄. 이외에는 %H(24시간), %h(12시간), %i, %s 등이 있습니다.
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS "날짜"
FROM ANIMAL_INS AS INS

ORDER BY ANIMAL_ID