SQL 코딩테스트 대비 문법 정리

지인·2023년 9월 10일
5

TIL

목록 보기
14/17

1.SQL은 무엇인가? 어떨 때 쓰나요?

SQL은 데이터베이스(DB)에서 데이터를 다루기 위한 언어입니다.

어떨 때 쓰이나요?

  • 정보 찾기: 예를 들어, "지난달에 가장 많이 팔린 상품은 무엇인가?"라는 질문에 답하기 위해 사용됩니다.

  • 정보 입력 및 수정: 새로운 상품 정보를 데이터베이스에 추가하거나, 기존 정보를 수정할 때 사용됩니다.

  • 정보 삭제: 예전에 사용하던 상품 정보나 더 이상 필요 없는 정보를 제거할 때 사용됩니다.

  • 리포트나 통계: 여러 가지 정보를 종합하여, 예를 들어 "올해 가장 많은 이익을 낸 분기는 언제인가?" 같은 질문에 답할 수 있습니다.

1-1. 테이블과 컬럼이란

테이블 (Table)

테이블은 데이터베이스의 핵심 구성 요소 중 하나로, 행(row)과 열(column)을 가진 "표"와 유사한 형태로 데이터를 저장합니다. 각 테이블은 특정한 "주제"나 "개념"에 대한 정보를 모아 놓습니다. 예를 들어, "고객" 테이블은 고객에 관한 정보를, "주문" 테이블은 주문에 관한 정보를 저장할 수 있습니다.

컬럼 (Column)

테이블 내에서 컬럼은 "필드"나 "속성"이라고도 하며, 테이블에서 관리하려는 각각의 정보 유형을 나타냅니다. 예를 들어, "고객" 테이블의 경우 컬럼은 '고객ID', '이름', '이메일 주소', '전화번호' 등이 될 수 있습니다.

2. 프로그래머스에서 사용할 수 있는 두 개의 DB

MySQL

  • 간단하고 직관적입니다. MySQL은 작은 규모의 애플리케이션에 적합하며, 쉽고 간단한 문법을 가지고 있습니다.
  • MySQL은 오픈 소스 커뮤니티에서 널리 사용되므로, 문제 해결을 위한 자료가 풍부합니다.
  • 빠른 처리 속도를 가지고 있습니다. 간단한 쿼리에 대한 처리 속도가 빠르고, 설정이 쉽습니다.

Oracle

  • 고급 기능을 사용하는 데 유리합니다. 복잡한 쿼리와 트랜잭션을 처리하는 데 필요한 다양한 고급 기능을 제공합니다.
  • 확장성이 좋습니다. 대규모 데이터베이스와 복잡한 쿼리 처리에 적합합니다.

3. 코딩 테스트를 위한 SQL 문법

적는 순서
SELECT - DISTINCT -FROM - JOIN - ON - WHERE - GROUP BY - HAVING - ORDER BY - LIMIT - OFFSET

  • SELECT: 조회할 열(column)을 지정합니다.
  • DISTINCT: 중복된 결과를 제거합니다 (선택적).
  • FROM: 데이터를 가져올 테이블을 지정합니다.
  • JOIN: 다른 테이블과의 조인을 정의합니다.
  • ON: 조인의 조건을 정의합니다.
  • WHERE: 특정 조건에 맞는 레코드를 필터링합니다.
  • GROUP BY: 결과를 특정 열로 그룹화합니다.
  • HAVING: GROUP BY로 그룹화된 결과에 추가적인 필터링을 적용합니다.
  • ORDER BY: 결과를 특정 열을 기준으로 정렬합니다.
  • LIMIT: 반환할 레코드의 수를 제한합니다.
  • OFFSET: 반환할 레코드의 시작점을 지정합니다. (페이지네이션)
SELECT 
	DISTINCT E.first_name, E.last_name
FROM 
	EMPLOYEES AS E
JOIN 
	DEPARTMENTS AS D
ON 
	E.department_id = D.department_id
WHERE 
	E.salary > 50000
GROUP BY 
	E.first_name, E.last_name
HAVING 
	COUNT(E.employee_id) > 1
ORDER BY 
	E.first_name ASC, E.last_name DESC
LIMIT 
	10;

ORDER BY: 정렬 기준을 두개를 주고 싶다면 ?

'주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여' 라는 문제가 있다면,

ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;

JOIN을 해야할 때. 두 개의 테이블에서 값을 가져와야 할 때

JOIN과 ON: JOIN과 ON 문법은 주로 두 개 이상의 테이블에서 데이터를 결합할 때 사용됩니다. JOIN의 종류에는 INNER, LEFT, RIGHT가 있습니다. 여기서는 가장 기본적인 INNER JOIN에 대해 알아보겠습니다.

가져올 테이블을 JOIN 뒤에 적어주고, 두 테이블의 공통된 열을 지정하여 어떻게 연결되어야 하는지 지정하기 위해 ON 문법을 사용해주면 됩니다.

SELECT 
	employees.name, departments.name
FROM 
	employees
JOIN 
	departments
ON 
	employees.departmentID = departments.id;
  • 너무 길어지는 코드는 AS로 줄인다.
SELECT 
    USED_GOODS_BOARD.TITLE, 
    USED_GOODS_BOARD.BOARD_ID, 
    USED_GOODS_REPLY.REPLY_ID, 
    USED_GOODS_REPLY.WRITER_ID, 
    USED_GOODS_REPLY.CONTENTS, 
    DATE_FORMAT(USED_GOODS_REPLY.CREATED_DATE, '%Y-%m-%d') AS FORMATTED_CREATED_DATE
FROM 
    USED_GOODS_BOARD 
JOIN 
    USED_GOODS_REPLY 
ON 
    USED_GOODS_BOARD.BOARD_ID = USED_GOODS_REPLY.BOARD_ID
WHERE 
    MONTH(USED_GOODS_BOARD.CREATED_DATE) = 10 AND YEAR(USED_GOODS_BOARD.CREATED_DATE) = 2022
ORDER BY 
    USED_GOODS_REPLY.CREATED_DATE, 
    USED_GOODS_BOARD.TITLE;
SELECT 
    B.TITLE, 
    B.BOARD_ID, 
    R.REPLY_ID, 
    R.WRITER_ID, 
    R.CONTENTS, 
    DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') AS FORMATTED_CREATED_DATE
FROM 
    USED_GOODS_BOARD AS B
JOIN 
    USED_GOODS_REPLY AS R
ON 
    B.BOARD_ID = R.BOARD_ID
WHERE 
    MONTH(B.CREATED_DATE) = 10 AND YEAR(B.CREATED_DATE) = 2022
ORDER BY 
    R.CREATED_DATE, 
    B.TITLE
LIMIT 
	10;

4. 실제 문제 분석

서울에 위치한 식당 목록 출력하기

REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

SELECT /*식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회*/
    I.REST_ID, 
    I.REST_NAME,
    I.FOOD_TYPE,
    I.FAVORITES,
    I.ADDRESS,
    ROUND(AVG(R.REVIEW_SCORE),2) AS SCORE /*리뷰 평균점수는 소수점 세 번째 자리에서 반올림*/
FROM  /*REST_INFO와*/
    REST_INFO AS I 
JOIN /*REST_REVIEW 테이블에서*/
    REST_REVIEW AS R
ON
    I.REST_ID = R.REST_ID
WHERE
    I.ADDRESS LIKE "서울%"  /*서울에 위치한*/
GROUP BY
    I.REST_ID
ORDER BY /*결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬*/
    SCORE DESC, I.FAVORITES DESC;

5 알아두면 좋을 문법

Column에서 NULL이 나타나면 어떻게 처리할 것인가?
1. WHERE 절에서 NULL 제외
NULL 값을 제외하려면 WHERE 절에 조건을 추가합니다.

WHERE TLNO IS NOT NUL

2. NULL을 특정 값으로 대체 (COALESCE)
COALESCE 함수를 사용하여 NULL 값을 특정 값으로 대체할 수 있습니다.

SELECT COALESCE(TLNO, 'N/A') AS TLNO, MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH

3. CASE 문으로 처리
CASE 문을 사용하여 NULL값을 특별히 처리할 수 있습니다.

SELECT
    CASE
        WHEN TLNO IS NULL THEN 'N/A'
        ELSE TLNO
    END AS TLNO,
    MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE

데이터의 갯수를 세야한다면 COUNT로(단, SELECT에서만 사용 가능)

SELECT
    COUNT(USER_ID) AS USERS

문자열 데이터 중 특정 값을 찾아야 한다면 %로

WHERE
    ADDRESS LIKE '경기도%'

MAX, MIN은 SELECT에서만 사용할 수 있다. 그래서 이런 코드가 나온다.

WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT);

6. 참고 자료

코딩테스트 SQL 문법 정리
코딩테스트 SQL 모음집
시리즈/- 초보자도 준비하는 SQL 코딩 테스트

profile
안녕하세요

0개의 댓글