카이로스의 시간

Database SQL 쿼리 문법 정리 Part1 본문

기타

Database SQL 쿼리 문법 정리 Part1

차녕 2022. 4. 4. 20:32

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

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

이 프로그래머스 SQL 문제들은 SELECT를 통해서 데이터를 조회하는 방식의 문제가 주로 출제됩니다.

그래서 여기서는 SELECT 쿼리 명령문 위주로 보도록 하겠습니다. (SELECT 외에 SQL 쿼리 명령은 UPDATE, INSERT, DELETE가 있습니다.)

 

 

SELECT

 

  •  ANIMAL_INS라는 테이블에서 모든 칼럼 조회
SELECT * FROM ANIMAL_INS

 

  • ANIMAL_INS에서 A, B, C칼럼 조회
SELECT A, B, C FROM ANIMAL_INS

 

  • ANIMAL_INS에서 A, B 칼럼 가져와서 C 칼럼 기준으로 내림차순(역순) 정렬
SELECT A, B FROM ANIMAL_INS ORDER BY C DESC

 

  • ANIMAL_INS에서 A, B 칼럼 가져와서 C 칼럼 기준으로 오름차순 정렬
SELECT A, B FROM ANIMAL_INS ORDER BY C ASC

 

  • ANIMAL_INS에서 칼럼 ATTR 칼럼이 'VALUE' 로우의 A, B 칼럼 조회
SELECT A, B FROM ANIMAL_INS WHERE ATTR = 'VALUE'

 

  • ANIMAL_INS에서 칼럼 ATTR 칼럼이 'VALUE' 아닌 로우의 A, B 칼럼 조회
SELECT A, B FROM ANIMAL_INS WHERE ATTR != 'VALUE'

 

  • ANIMAL_INS에서 NAME 오름차순, 같은 이름이면 DATETIME 내림차순으로 A, B칼 조회
SELECT A,B FROM ANIMAL_INS ORDER BY NAME ASC, DATETIME DESC

 

  • ANIMAL_INS에서 DATETIME 오름차순으로 정렬해서 상위 1(TOP) NAME 조회
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1

 

  • ANIMAL_INS에서 DATETIME 내림차순으로 정렬해서 상위 1(TOP) DATETIME 조회
SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1

 

  • ANIMAL_INS에서 DATETIME 최댓값 조회
SELECT MAX(DATETIME) FROM ANIMAL_INS

 

  • ANIMAL_INS에서 DATETIME 최솟값 조회
SELECT MIN(DATETIME) FROM ANIMAL_INS

 

  • ANIMAL_INS에서 로우 세기
SELECT COUNT(*) FROM ANIMAL_INS

 

  • ANIMAL_INS에서 동일한 NAME 중복을 제외하고 로우 세기
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS

 

  • ANIMAL_INS 에서 ANIMAL_TYPE 기준으로 정렬하고, 그룹핑해서 ANIMAL_TYPE, 해당되는 ROW 세기
SELECT ANIMAL_TYPE COUNT(ANIMAL_TYPE) FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE 
ORDER BY ANIMAL_TYPE

 

  • ANIMAL_INS에서 NAME으로 그룹핑했을때 NAME 수가 1이상인 것들만 NAME, COUNT(NAME)조회, 이때 NAME기준으로 정렬
SELECT NAME, COUNT(NAME) FROM ANIMAL_INS 
GROUP BY NAME HAVING COUNT(NAME) > 1 
ORDER BY NAME

 

  • ANIMAL_OUTS에서 HOUR(DATETIME) 9이상이고 20미만인 것들 HOUR(DATETIME) 기준으로 그룹핑, 1 기준으로 정렬해서 HOUR(DATETIME, COUNT(HOUR(DATETIME)) 조회 이때 HOUR(DATETIME HOUR 출력되고, COUNT(HOUR(DATETIME)) COUNT 출력
SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20 
GROUP BY HOUR(DATETIME)
ORDER BY 1

 

  • TEMP_TABLE을 생성해서 0부터 23까지의 값을 갖는 테이블을 만들고, TEMP_TABLE의 H를 기준으로 그룹핑, 정렬 진행 그리고, 이걸 ANIMAL_OUTS와 LEFT OUT JOIN(HOUR(DATETIME)이 TEMP_TABLE의 H인 경우)해서 H, COUNT(ANIMAL_ID)를 출력
WITH RECURSIVE TEMP_TABLE AS (
SELECT 0 AS H
UNION ALL
SELECT H+1 FROM TEMP_TABLE WHERE H < 23
)

SELECT H, COUNT(ANIMAL_ID) AS COUNT
FROM TEMP_TABLE
LEFT OUTER JOIN ANIMAL_OUTS
ON HOUR(DATETIME) = TEMP_TABLE.H
GROUP BY H
ORDER BY H

참고) UNION ALL 결합시 중복제거 X, UNION 결합시 중복 제거

참고) JOIN할때 LEFT OUTER라고 명시했는데 여기서 LEFT FROM에서 선언한 TEMP_TABLE임

예를 들어, FROM A LEFT OUTER JOIN B ON C = D 이렇게 쓰면 C=D 것을 JOIN하고 기준이 되는 A 모두 가져오라는 의미.

 

  • ANIMAL_INS에서 NAME 칼럼이 NULL 로우를 조회
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL

 

  • ANIMAL_INS에서 NAME 칼럼이 NULL 아닌 로우를 조회
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL

 

  • ANIMAL_INS에서 ANIMAL_TYPE, NAME(NAME NULL이면 "No name"으로 대체), SEX_UPON_INTAKE ANIMAL_ID 기준으로 조회
SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID