SQL
SQL 쿼리연습- IS NULL, JOIN(feat.프로그래머스, SQL고득점 KIT)
은듀
2022. 1. 6. 15:15
반응형
4. IS NULL 완료

- NULL 처리하기 (문법 다름)
-- mysql IFNULL(값1,값2) : 값1이 null이면 값2출력, null이 아니면 값1
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME ,SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
-- oracle NVL(값1,값2) : 값1이 null이면 값2 출력, null이 아니면 값1
SELECT ANIMAL_TYPE, NVL(NAME, 'No name') AS NAME ,SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
5. JOIN 완료

-없어진 기록찾기
-- LEFT OUTER JOIN으로 푸는 방법
SELECT A.ANIMAL_ID , A.NAME
FROM ANIMAL_OUTS A -- 입양간 기록
LEFT OUTER JOIN ANIMAL_INS B -- 보호소 들어온 기록
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.ANIMAL_ID ASC
-- 서브쿼리로 푸는 방법
SELECT A.ANIMAL_ID , A.NAME FROM ANIMAL_OUTS A
WHERE A.ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY A.ANIMAL_ID ASC
- 오랜 기간 보호한 동물(1)
오래된 순으로 3건 조회하기
-- mysql
SELECT A.NAME, A.DATETIME FROM ANIMAL_INS A
LEFT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME ASC
limit 3
-- oracle
SELECT * FROM
(
SELECT A.NAME, A.DATETIME FROM ANIMAL_INS A
LEFT OUTER JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME ASC
)
WHERE ROWNUM <= 3
- 보호소에서 중성화 된 동물
-- 보호소 들어올때 중성화 x (SEX_UPON_INTAKE :"Intact" 표시)
-- 보호소 나갈때 중성화(SEX_UPON_OUTCOME : "Spayed" 또는 "Neutered" 표시)
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A , ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
AND A.SEX_UPON_INTAKE like 'Intact%'
AND B.SEX_UPON_OUTCOME not like 'Intact%'
6. String, Date 완료
- 이름에 el이 들어가는 동물 찾기
오라클은 대소문자 구분하여 조회해야함
UPPER() : 대문자로 변환
LOWER() : 소문자로 변환
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
-- mysql
-- WHERE NAME LIKE '%el%' AND ANIMAL_TYPE='Dog'
--oracle 대소문자 구분! UPPER() : 대문자로 변환
WHERE UPPER(NAME) LIKE UPPER('%el%') AND ANIMAL_TYPE='Dog'
ORDER BY NAME ASC
- 이름에 el이 들어가는 동물 찾기
CASE WHEN 조건 THEN 결과 ELSE 결과 END (오라클,mysql 동일)
--mysql
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE like 'Neutered%' THEN 'O'
WHEN SEX_UPON_INTAKE like 'Spayed%' THEN 'O'
ELSE 'X'
END
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
--oracle
SELECT ANIMAL_ID, NAME,
--REGEXP_LIKE 포함한대상
CASE WHEN REGEXP_LIKE(SEX_UPON_INTAKE ,'Neutered') THEN 'O'
WHEN REGEXP_LIKE(SEX_UPON_INTAKE ,'Spayed') THEN 'O'
ELSE 'X'
END
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
- 오랜기간 보호한 동물(2)
--mysql 두건조회
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O , ANIMAL_INS I
WHERE O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY (O.DATETIME-I.DATETIME) DESC
limit 2
--oracle
-- 보호소들어온 동물 중 입양보낸정보 추출
-- O.DATETIME(입양일), I.DATETIME(보호시작일)
SELECT * FROM
(
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O , ANIMAL_INS I
WHERE O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY (O.DATETIME-I.DATETIME) DESC
)
WHERE ROWNUM <=2
- DATETIME에서 DATE로 형 변환
mysql 날짜변환 : date_format(SYSDATE(),'%Y-%m-%d %T')
-- mysql
SELECT ANIMAL_ID, NAME, date_format(DATETIME,'%Y-%m-%d') FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
--oracle
SELECT ANIMAL_ID, NAME,TO_CHAR(DATETIME,'YYYY-MM-DD') FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC