Yeji's Tech Notes
반응형

코딩테스트 대비용 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','/','-')
반응형
profile

Yeji's Tech Notes

@Jop

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!