코딩테스트 대비용 SQL 문법정리 (feat. programmers)
코딩테스트 대비용 SQL문법을 정리해보았습니다.
코딩테스트에 알고리즘 뿐만아니라 SQL문법관련해서도 출제가 빈번하게 나타나고 있습니다. SQL문법 순위로는 ORACLE, MYSQL순으로 출제가 제일 많이된다고 느껴서, 두개의DB엔진 위주로 문법을 정리하였습니다.
https://db-engines.com/en/ranking
DB-Engines Ranking
Popularity ranking of database management systems.
db-engines.com
1. SELECT TOP
- MYSQL Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
limit number;
- ORACLE 12 Syntax
SELECT column_name(s)
FROM table_name
ORDER BY column_name(s)
FETCH first numbers ROWS ONLY;
- ORACLE Syntax
SELECT *
FROM (SELECT column_name(s)
FROM table_name
ORDER BY column_name(s))
WHERE rownum = number;
2. GROUP BY
- Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);
ex) 각 나라에 속한 , 고객들을 오름차순으로 조회
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
3. HAVING
- Syntax
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);
- ex) 프로그래머스:동명 동물 수 찾기 (ORACLE)
-- 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과
-- 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요.
SELECT name , count(name)
FROM animal_ins
WHERE name IS NOT NULL
GROUP BY name
HAVING COUNT(name) > 1
ORDER BY name;
4. INNER JOIN
- Syntax
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
- ex) 프로그래머스:있었는데요 없었습니다. (ORACLE)
-- 보호 시작일보타 입양일이 더 빠른 동물의 아이디와 이름을 조회
SELECT animal_ins.animal_id, animal_ins.name
FROM animal_outs
INNER JOIN animal_ins
ON animal_outs.animal_id = animal_ins.animal_id
WHERE animal_outs.datetime < animal_ins.datetime
ORDER BY animal_ins.datetime
5. FULL OUTER JOIN
- Syntax
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
- ex) 프로그래머스:없어진 기록찾기 (ORACLE)
-- 입양간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회
SELECT animal_outs.animal_id, animal_outs.name
FROM animal_outs
FULL OUTER JOIN animal_ins
ON animal_outs.animal_id = animal_ins.animal_id
WHERE animal_outs.animal_id IS NOT NULL
AND animal_ins.animal_id IS NULL
ORDER BY animal_outs.animal_id;
6. SQL NULL FUNCTION
- MYSQL Syntax
: IFNULL()함수는 만약 값이 null일때 대신할 값을 적으면 해당 값을 return해준다.
SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products;
- ORACLE Syntax
: NVL()함수도 같은 용도로 사용됩니다.
SELECT ProductName, UnitPrice * (UnitsInStock + NVL(UnitsOnOrder,0))
FROM Products;
- ex) 프로그래머스:NULL 처리하기
-- 입양 게시판에 동물 정보를 게시하려 합니다.
-- 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요.
SELECT animal_type, NVL(name,'No name') , sex_upon_intake
FROM animal_ins
ORDER BY animal_id;
7. SQL Date,String 다루기
- months_between()
: 날짜 차이를 개월로 구하기
ex) 프로그래머스: 오랜 기간 보호한 동물(2)
-- MONTHS_BETWEEN(기준일자, 비교일자)
-- MONTHS_BERWEEN(SYSDATE, TO_DATE('20190701','YYYYMMDD'))
SELECT animal_ins.animal_id, animal_ins.name
FROM animal_ins
INNER JOIN animal_outs
ON animal_ins.animal_id = animal_outs.animal_id
ORDER BY months_between(animal_outs.datetime,animal_ins.datetime) DESC
FETCH FIRST 2 ROWS ONLY
- TO_CHAR()
: '날짜'를 '날짜형식'의 문자로 바꾸거나 '수치'를 '수치형식'의 문자로 바꾼다.
ex) 프로그래머스:DATETIME에서 DATE로 형변환
SELECT animal_id, name, TO_CHAR(datetime,'YYYY-MM-DD') as 날짜
FROM animal_ins
ORDER BY animal_id
- LIKE : 포함된 문자로 검색하기
SELECT column1, column2, ...
FROM table_name
WHERE column LIKE pattern;
- ex) 프로그래머스 : 이름에 el이 들어가는 동물 찾기 (대소문자 구분없이 검색하기 위해서 lower()사용)
SELECT animal_id, name
FROM animal_ins
WHERE lower(name) LIKE lower('%el%')
AND animal_type = 'Dog'
ORDER BY name
- CASE
: 조건에 만족하는 결과 값을 반환
-- syntax1
CASE column_name WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE
END as
-- syntax2
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
..
ELSE
END as
- ex) 프로그래머스 : 중성화 여부 파악하기
select
animal_id,
name,
case when sex_upon_intake = 'Neutered Male' Then 'O'
when sex_upon_intake = 'Spayed Female' Then 'O'
ELSE 'X'
END as 중성화
FROM animal_ins
order by animal_id
- replace()
: 문자열 바꾸기
-- REPLACE(문자열, 대상문자, 교체문자)
-- REPLACE('2019/08/20','/','-')