몸과 마음이 건전한 SW 개발자

프로그래머스 SQL 고득점 Kit Lv 1 SELECT (1) 10 문제 모음 본문

SQL

프로그래머스 SQL 고득점 Kit Lv 1 SELECT (1) 10 문제 모음

스위태니 2023. 12. 29. 17:09

1. 평균 일일 대여 요금 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/151136

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE 
FROM CAR_RENTAL_COMPANY_CAR 
WHERE CAR_TYPE = "SUV";

Key Point

ROUND 함수

문법 : ROUND(숫자, N)

설명 : ROUND 함수는 주어진 숫자를 특정 소수점 자리까지 반올림하는 데 사용됩니다. ROUND(숫자, N) 형식의 문법에서 숫자는 반올림할 숫자이고, N은 반올림하고자 하는 소수점 위치입니다. N이 양수일 경우, 소수점 아래 N째 자리까지 반올림하고, N이 0이면 가장 가까운 정수로 반올림합니다. 음수일 경우, 소수점 왼쪽의 자리수를 반올림합니다.

예시 : ROUND(10.23, 1) => 10.2

AVG 함수

문법 : AVG(숫자 집합)

설명 : AVG(숫자 집) 함수는 주어진 숫자 집합의 평균을 계산하는 데 사용됩니다. 여기서 N은 하나 이상의 숫자 또는 숫자가 있는 열을 나타낼 수 있습니다. 일반적으로 데이터베이스에서 사용되며, 특정 열에 있는 모든 값의 평균을 계산하거나 지정된 값의 집합에 대한 평균을 구할 때 사용됩니다.

예시 : AVG(10, 20, 30)  => 20

2. 조건에 맞는 도서 리스트 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT
    BOOK_ID,
    DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') 
FROM BOOK 
WHERE 
    YEAR(PUBLISHED_DATE) = "2021" AND
    CATEGORY = "인문" 
ORDER BY PUBLISHED_DATE ASC;

Key Point

DATE_FORMAT 함수

문법 : DATE_FORMAT(날짜, 형식)

설명 : 여기서 날짜는 변환할 날짜와 시간 값이고, 형식은 결과로 표시될 날짜와 시간의 형식을 지정하는 문자열입니다.

  • 형식 문자열:
    • 형식 문자열에는 날짜와 시간을 나타내는 다양한 지시자가 사용됩니다. 예를 들어, %Y는 4자리 연도를, %m은 2자리 월을, %d는 2자리 일을 나타냅니다. 시간을 나타내는 지시자로는 %H (24시간 기준 시간), %i (분), %s (초) 등이 있습니다.

예시 : 

  • DATE_FORMAT('2023-12-25 15:30:00', '%Y년 %m월 %d일 %H시 %i분 %s초')는 "2023년 12월 25일 15시 30분 00초"로 결과를 반환합니다.
  • DATE_FORMAT('2023-12-25', '%Y/%m/%d')는 "2023/12/25"로 결과를 반환합니다.

ORDER BY 구문

문법 : SELECT 컬럼1, 컬럼2,... FROM 테이블명 ORDER BY 컬럼1 [ASC|DESC], 컬럼2 [ASC|DESC],...

설명 : ORDER BY 구문은 SQL(Structured Query Language)에서 결과 집합의 레코드를 정렬할 때 사용됩니다. 데이터베이스에서 쿼리를 실행한 후 결과를 특정 순서로 보고 싶을 때 ORDER BY를 사용하여 레코드를 오름차순이나 내림차순으로 정렬할 수 있습니다.

  • 동작:
    • 오름차순 (ASC): 가장 낮은 값에서 시작해 가장 높은 값으로 끝나는 순서로 정렬합니다. 숫자의 경우 작은 숫자에서 큰 숫자로, 문자열의 경우 알파벳 순으로 정렬됩니다.
    • 내림차순 (DESC): 가장 높은 값에서 시작해 가장 낮은 값으로 끝나는 순서로 정렬합니다.

예시 : 

  • SELECT 이름, 나이 FROM 사용자 ORDER BY 나이 ASC: 사용자 테이블에서 이름과 나이를 선택하고, 나이를 기준으로 오름차순으로 정렬합니다.
  • SELECT 이름, 점수 FROM 학생 ORDER BY 점수 DESC: 학생 테이블에서 이름과 점수를 선택하고, 점수를 기준으로 내림차순으로 정렬합니다.

3. 2세 이하인 여자 환자 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/132201

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT
    PT_NAME,
    PT_NO, GEND_CD,
    AGE,
    IFNULL(TLNO, 'NONE') AS TLNO 
FROM PATIENT 
WHERE 
    AGE <= 12 
    AND GEND_CD = "W" 
ORDER BY
    AGE DESC,
    PT_NAME ASC;

Key Point

IFNULL 함수

문법 : IFNULL(표현식1, 표현식2)

설명 : 여기서 표현식1은 검사할 값이고, 표현식2표현식1NULL일 경우 대체할 값입니다.

  • 동작:
    • 표현식1이 NULL이 아니면: IFNULL은 표현식1의 값을 반환합니다.
    • 표현식1이 NULL이면: IFNULL은 표현식2의 값을 반환합니다.

예시 : 

  • IFNULL(NULL, '값 없음')은 '값 없음'을 반환합니다.
  • IFNULL(100, '값 없음')은 100을 반환합니다.

4. 인기있는 아이스크림

https://school.programmers.co.kr/learn/courses/30/lessons/133024

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT FLAVOR 
FROM FIRST_HALF 
ORDER BY TOTAL_ORDER DESC, 
  SHIPMENT_ID ASC;

5. 흉부외과 또는 일반외과 의사 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/132203

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT
    DR_NAME,
    DR_ID,
    MCDP_CD,
    DATE_FORMAT(HIRE_YMD, "%Y-%m-%d") 
FROM DOCTOR 
WHERE MCDP_CD IN ("CS", "GS") 
ORDER BY 
    HIRE_YMD DESC,
    DR_NAME ASC;

Key Point

IN 연산

문법 : WHERE 컬럼명 IN (값1, 값2, ..., 값N)

설명 : 여기서 컬럼명은 검사할 테이블의 열이고, (값1, 값2, ..., 값N)은 해당 열에서 찾고자 하는 값의 목록입니다.

  • 동작:
    • IN 구문은 지정된 열의 값이 괄호 안에 있는 값 목록 중 하나와 일치하는 모든 행을 반환합니다.
    • 이는 컬럼명 = 값1 OR 컬럼명 = 값2 OR ... OR 컬럼명 = 값N과 동일한 결과를 반환하지만, 훨씬 더 간결하고 관리하기 쉬운 형태입니다.

예시 : 

  • 주어진 쿼리에서 WHERE MCDP_CD IN ("CS", "GS")는 MCDP_CD 열이 'CS' 또는 'GS'인 모든 행을 찾습니다.
  • 이는 WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'와 동일한 결과를 반환하지만, 더 간결하게 표현됩니다.

6. 조건에 부합하는 중고거래 댓글 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/164673

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT 
    A.TITLE,
    A.BOARD_ID,
    B.REPLY_ID,
    B.WRITER_ID,
    B.CONTENTS,
    DATE_FORMAT(B.CREATED_DATE, "%Y-%m-%d") AS CREATED_DATE
FROM USED_GOODS_BOARD AS A
INNER JOIN USED_GOODS_REPLY AS B
ON A.BOARD_ID = B.BOARD_ID
WHERE SUBSTR(A.CREATED_DATE, 1, 7) = "2022-10"
ORDER BY 
    B.CREATED_DATE ASC,
    A.TITLE ASC;

Key Point

INNER JOIN 구문

문법 : SELECT ... FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.컬럼명 = 테이블2.컬럼명

설명 : 여기서 테이블1테이블2는 조인할 테이블이며, ON 절은 두 테이블을 연결하는 데 사용되는 조건을 지정합니다.

  • 동작:
    • 일치하는 행 찾기: INNER JOIN은 두 테이블에서 지정된 조인 조건에 따라 서로 일치하는 행만을 결합하여 새로운 결과 테이블을 생성합니다.
    • 결과 반환: 조인 조건에 맞는 데이터가 있는 행만 결과에 포함됩니다. 만약 한 테이블의 행이 다른 테이블의 어떤 행과도 일치하지 않으면, 그 행은 결과 집합에 나타나지 않습니다.

예시 : 

  • SELECT A.name, B.salary FROM employees A INNER JOIN salaries B ON A.employee_id = B.employee_id:
    • 여기서 employees 테이블과 salaries 테이블은 employee_id를 공통 컬럼으로 사용하여 조인됩니다. 결과는 두 테이블 모두에서 employee_id가 일치하는 행들의 namesalary를 보여줍니다.

SUBSTR 함수

문법 : SUBSTR(문자열, 시작 위치, [길이])

  • 문자열: 원본 문자열입니다.
  • 시작 위치: 추출을 시작할 위치를 나타냅니다. 위치는 1부터 시작하는 것이 일반적입니다(즉, 문자열의 첫 번째 문자가 1입니다).
  • 길이 (선택적): 추출할 문자의 수입니다. 이 인자를 생략하면 시작 위치부터 문자열의 끝까지 모든 문자가 반환됩니다.

설명 : SUBSTR 함수는 문자열에서 특정 부분 문자열(substring)을 추출할 때 사용됩니다. 이 함수는 다양한 프로그래밍 언어와 SQL에서 사용되며, 문자열의 특정 위치에서 시작하여 지정된 길이만큼의 문자들을 반환합니다. 다양한 시스템에서는 SUBSTRING, SUBSTR, 또는 MID와 같은 비슷한 이름으로 찾아볼 수 있습니다.

  • 동작:
    • 시작 위치에 따른 추출: 지정된 '시작 위치'에서 '길이'만큼의 문자를 문자열에서 추출합니다. 만약 '길이'가 문자열의 끝을 넘어가면 가능한 만큼만 반환됩니다.
    • 음수 인덱스 지원: 일부 시스템에서는 음수 인덱스를 사용하여 문자열의 끝에서부터 계산을 시작할 수 있습니다.

예시 :

  • SUBSTR('Hello World', 1, 5)는 'Hello'를 반환합니다.
  • SUBSTR('Hello World', 7)는 'World'를 반환합니다. 여기서는 시작 위치만 지정되어 문자열의 나머지 부분이 모두 반환됩니다.

7. 일로 만든 아이스크림 고르기

https://school.programmers.co.kr/learn/courses/30/lessons/133025

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT A.FLAVOR 
FROM FIRST_HALF AS A
LEFT JOIN ICECREAM_INFO AS B
ON A.FLAVOR = B.FLAVOR
WHERE
	A.TOTAL_ORDER > 3000 AND
	B.INGREDIENT_TYPE = "fruit_based"
ORDER BY A.TOTAL_ORDER DESC;

Key Point

LEFT JOIN 구문

문법 : SELECT columns FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

설명 : LEFT JOIN, 또는 LEFT OUTER JOIN은 SQL에서 사용되는 조인 유형 중 하나로, 주로 두 개의 테이블을 결합할 때 사용됩니다. 이 조인은 '왼쪽' 테이블의 모든 행을 포함하고, '오른쪽' 테이블에서는 조인 조건에 일치하는 행만 포함합니다. 조인 조건에 맞는 행이 오른쪽 테이블에 없는 경우, 해당 결과는 왼쪽 테이블의 내용과 함께 NULL 값으로 채워집니다.

  • 동작:
    • 왼쪽 테이블 포함: 쿼리에서 LEFT JOIN을 사용하면 왼쪽 테이블(table1)의 모든 행이 결과에 포함됩니다.
    • 조건 일치: 오른쪽 테이블(table2)에서는 왼쪽 테이블과 조인 조건에 맞는 행만 포함됩니다.
    • 불일치 시 NULL: 오른쪽 테이블에서 조건에 맞는 행이 없는 경우, 해당 왼쪽 테이블 행의 오른쪽 테이블 관련 컬럼은 NULL로 채워집니다.

예시 : 

  • SELECT A.name, B.salary FROM employees A INNER JOIN salaries B ON A.employee_id = B.employee_id:
    • 여기서 employees 테이블과 salaries 테이블은 employee_id를 공통 컬럼으로 사용하여 조인됩니다. 결과는 두 테이블 모두에서 employee_id가 일치하는 행들의 name salary를 보여줍니다.

INNER JOIN vs LEFT JOIN

INNER JOIN과 LEFT JOIN은 유사해 보이지만, 결과 집합에서 반환하는 행이 크게 다릅니다.

INNER JOIN:

  • 일치하는 행만 반환: INNER JOIN은 두 테이블 간에 일치하는 행만 반환합니다. 양쪽 테이블에서 일치하는 데이터가 없는 행은 결과에 포함되지 않습니다.
  • 결과는 교집합: 결과적으로, INNER JOIN의 결과 집합은 두 테이블의 교집합과 같습니다.

LEFT JOIN:

  • 왼쪽 테이블의 모든 행 반환: LEFT JOIN은 왼쪽 테이블의 모든 행을 반환하고, 오른쪽 테이블에서는 조건에 맞는 행만 결합합니다. 오른쪽 테이블에 일치하는 행이 없는 경우, 해당 컬럼은 NULL로 채워집니다.
  • 결과는 왼쪽 테이블을 기준으로 함: 결과적으로, LEFT JOIN의 결과 집합은 왼쪽 테이블을 기준으로 하며, 오른쪽 테이블에서는 선택적으로 데이터를 추가합니다.

결론:

  • INNER JOIN은 두 테이블 간의 정확한 일치가 중요할 때 사용합니다. 일치하는 데이터만 필요하고, 불일치하는 정보는 무시할 수 있는 상황에 적합합니다.
  • LEFT JOIN은 주로 한 테이블의 데이터를 기준으로 다른 테이블에서 관련 정보를 찾을 때 사용됩니다. 일치하는 정보는 포함하되, 일치하지 않는 정보도 NULL 값으로 포함하여 완전한 왼쪽 테이블의 뷰를 유지해야 할 때 유용합니다.

8. 강원도에 위치한 생산공장 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131112

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT 
    FACTORY_ID,
    FACTORY_NAME,
    ADDRESS
FROM FOOD_FACTORY
WHERE SUBSTR(ADDRESS, 1, 4) = "강원도"
ORDER BY FACTORY_ID;

9. 모든 레코드 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/59034

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT * FROM ANIMAL_INS

Key Point

* 기

문법 : SELECT * FROM 테이블명

설명 : 지정된 테이블의 모든 컬럼에 대한 모든 데이터를 검색하라는 지시를 데이터베이스에 전달.

  • 형식 문자열:
    • 형식 문자열에는 날짜와 시간을 나타내는 다양한 지시자가 사용됩니다. 예를 들어, %Y는 4자리 연도를, %m은 2자리 월을, %d는 2자리 일을 나타냅니다. 시간을 나타내는 지시자로는 %H (24시간 기준 시간), %i (분), %s (초) 등이 있습니다.

예시 :

  • SELECT * FROM ANIMAL_INS는 ANIMAL_INS 테이블에 있는 모든 컬럼과 그 컬럼들의 모든 행을 반환합니다.

*를 사용하는 것은 특히 테이블 구조를 잘 모르거나, 모든 데이터를 빠르게 검토하고 싶을 때 유용합니다. 그러나 실제 응용 프로그램이나 복잡한 시스템에서는 다음과 같은 이유로 * 사용을 피하는 것이 좋습니다:

  1. 성능 문제: 특히 큰 테이블에서는 필요하지 않은 데이터까지 모두 가져오므로 쿼리 성능이 저하될 수 있습니다.
  2. 가독성 및 유지 관리: 어떤 데이터가 반환되는지 명확히 하여 코드의 가독성을 높이고, 향후 변경 사항에 대응하기 쉽도록 하는 것이 좋습니다.
  3. 네트워크 트래픽: 불필요한 데이터를 전송하면 네트워크 부하가 증가할 수 있습니다.

10. 역순 정렬하기

https://school.programmers.co.kr/learn/courses/30/lessons/144853

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT 
	NAME,
    DATETIME 
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID DESC;