SQL & 프로그래머스 실습

ByungHun Kim·2021년 4월 6일
0

1. SQL 개념

SQL(Structured Query Language)는 관계형 데이터베이스 관리시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.

SQL 문법의 세가지 종류

  • DDL (Data Definition Language) - 데이터 정의어

    데이터베이스를 정의하는 언어를 말하며, 데이터를 생성하거나 수정, 삭제 등 데이터의 전체 골격을 결정하는 역할의 언어를 말한다

    • CREATE

      데이터베이스, 테이블 등을 생성하는 역할을 한다.

    • ALTER

      테이블을 수정하는 역할을 한다.

    • DROP

      데이터베이스, 테이블 등을 삭제하는 역할을 한다.

    • TRUNCATE

      테이블을 초기화 시키는 역할을 한다.

  • DML (Data Manipulation Language) - 데이터 조작어

    테이블에 있는 행과 열을 조작하는 언어

    정의된 데이터베이스에 입력된 레코드를 조회, 수정, 삭제하는 등의 역할을 하는 언어를 말한다. 데이터베이스 사용자가 질의어를 통하여 저장된 데이터를 실질적으로 처리하는 데 사용하는 언어이다.

    • SELECT

      데이터를 조회하는 역할을 한다.

    • INSERT

      데이터를 삽입(추가)하는 역할을 한다.

    • UPDATE

      데이터를 수정하는 역할을 한다.

    • DELETE

      데이터를 삭제하는 역할을 한다.

  • DCL (Data Control Language) - 데이터 제어어

    데이터베이스에 접근하거나 객체에 권한을 주는 등의 역할을 하는 언어를 말한다.

    데이터를 제어하는 언어이며, 데이터의 보안, 무결성, 회복 등을 정의하는 데 사용한다.

    • GRANT

      특정 데이터베이스 사용자에게 특정 작업에 대한 수행권한 부여를 한다.

    • REVOKE

      특정 데이터베이스 사용자에게 특정 작업에 대한 권한을 박탈, 회수한다.

    • COMMIT

      트렌젝션 작업이 정상적으로 완료되었음을 관리자에게 알려준다.

    • ROLLBACK

      트랜젝션 작업이 비정상적으로 종료되었을 때, 원래 상태로 복구한다.

2. PROGRAMMERS 실습

프로그래머스 코딩테스트 연습

1. SELECT

DML(데이터 조작어) 중 테이블의 데이터를 읽는 데 사용하는 명령어입니다.

1. 모든 레코드 조회하기

동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID 순으로 조회하는 SQL문을 작성해주세요.

  1. 조회 컬럼 (SELECT): 모든 컬럼
  2. 조회 대상 테이블 (FROM): ANIMAL_INS
  3. 정렬 순서 (ORDER BY): ANIMAL_ID 컬럼
SELECT * FROM ANIMAL_INS ORDER BY ANIMAL_ID

2. 역순 정렬하기

동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

  1. 조회 컬럼 (SELECT): NAME, DATETIME
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 정렬 순서 (ORDER BY): ANIMAL_ID 의 역순 (DESC)
SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC

3. 아픈 동물 찾기

동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

  1. 조회 컬럼 (SELECT): ANIMAL_ID, NAME
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 정렬 순서 (ORDER BY): ANIMAL_ID (ASC)
  4. 조건 (WHERE): INTAKE_CONDITION LIKE "Sick"
# SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION="Sick" ORDER BY ANIMAL_ID ASC
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION LIKE "Sick" ORDER BY ANIMAL_ID ASC
  • LIKE 를 사용해도 되고, =를 사용해도 된다.

4. 어린 동물 찾기

동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

  1. SELECT: ANIMAL_ID, NAME
  2. FROM: ANIMAL_INS
  3. ORDER BY: ANIMAL_ID
  4. WHERE: INTAKE_CONDITION!="Aged"
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION!="Aged" ORDER BY ANIMAL_ID

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION NOT LIKE "Aged" ORDER BY ANIMAL_ID
  • NOT LIKE
  • !=

5. 동물의 아이디와 이름

동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

  1. 조회 컬럼 (SELECT): ANIMAL_ID, NAME
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 정렬 (ORDER BY): ANIMAL_ID ASC
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC

6. 여러 기준으로 정렬하기

동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

  1. 조회 컬럼 (SELECT): ANIMAL_ID, NAME, DATETIME

  2. 조회 테이블 (FROM): ANIMAL_INS

  3. 정렬 (ORDER BY): NAME, DATETIME DESC

    이름 순으로 정렬하되, 이름이 같은 경우에는 보호 시작일의 역순으로 조회

SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME, DATETIME DESC

7. 상위 n개 레코드

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

  1. 조회 컬럼 (SELECT): NAME
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 가장 먼저 들어온 동물 찾기
    1. 정렬 (ORDER BY): DATETIME
    2. 검색 개수 (LIMIT): 1
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1

2. SUM, MAX, MIN

1. 최댓값 구하기 (MAX)

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

  1. 시간대 정렬 후 검색 개수 1로 설정하기

    1. 조회 컬럼 (SELECT): DATETIME
    2. 조회 테이블 (FROM): ANIMAL_INS
    3. 정렬 (ORDER BY): DATETIME
    4. 검색 개수 (LIMIT): 1
    SELECT DATETIME FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1
  1. DATETIME 최대값 찾기

    1. 조회 컬럼 (SELECT): DATETIME의 최대값
    2. 조회 테이블 (FROM): ANIMAL_INS
    SELECT MAX(DATETIME) AS "시간" FROM ANIMAL_INS
    • AS: 조회한 값을 표시할 컬럼의 이름을 별도로 지정할 수 있음

2. 최소값 구하기 (MIN)

동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

  1. 조회 컬럼 (SELECT): DATETIME 최소값
  2. 조회 테이블 (FROM): ANIMAL_INS
SELECT MIN(DATETIME) AS "시간" FROM ANIMAL_INS

3. 동물 수 구하기 (COUNT)

동물 보호소에 동물이 몇 마리 들어왔는지 조회하는 SQL 문을 작성해주세요.

  1. 조회 컬럼 (SELECT): 레코드 개수
  2. 조회 테이블 (FROM): ANIMAL_INS
SELECT COUNT(*) AS "count" FROM ANIMAL_INS

4. 중복 제거하기 (DISTINCT)

동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

  1. 조회 컬럼 (SELECT): NAME 개수 (중복 제거)
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 조건 (WHERE): NAME NOT NULL
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL

3. GROUP BY

1. 고양이와 개는 몇 마리 있을까?

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회 해주세요.

  1. 조회 항목 (SELECT): ANIMAL_TYPE, ANIMAL_TYPE 수
  2. 조회 테이블 (FROM): ANIMAL_INS
  3. 조회 그룹 단위 (GROUP BY): ANIMAL_TYPE
  4. 정렬 (ORDER BY): ANIMAL_TYPE
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS "count"
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

2. 동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

  1. 조회 항목 (SELECT): NAME, 중복 이름의 개수 = COUNT

  2. 조회 테이블 (FROM): ANIMAL_INS

  3. 조회 그룹 단위 (GROUP BY): NAME

  4. 정렬 (ORDER BY): NAME

  5. 조건 (HAVING)

    • 두 번 이상 쓰인 이름만 골라내는 걸 어떻게 하는 거지?

      그룹함수를 적용해서 나온 결과값 중에서 원하는 조건에 부합하는 자료만 산출할 때 사용

SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL 
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME
  • 그룹을 만든 후, 그룹에 대한 조건을 적용하는 순서대로 실행이 되어야 하기 때문에 코드도 순서대로 적어주어야 에러가 발생하지 않는다.
    1. GROUP BY
    2. HAVING

이 후 문제는 나중에!

3. IS NULL

1. 이름이 없는 동물의 아이디

동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

  • 조회 컬럼: ANIMAL_ID
  • 조회 테이블: ANIMAL_INS
  • 조건: 이름이 없음 (NULL)
  • 정렬: ID 오름차순
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NULL 
ORDER BY ANIMAL_ID

2. 이름이 있는 동물의 아이디

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

  • 조회 컬럼: ANIMAL_ID
  • 조회 테이블: ANIMAL_INS
  • 조건: 이름이 있음
  • 정렬: ID 오름차순
SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC

3. NULL 처리하기

입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.

  • 조회 컬럼: ANINAL_TYPE, NAME, SEX_UPON_INTAKE

  • 조회 테이블: ANIMAL_INS

  • 정렬: 아이디 순

  • 이름이 없는 경우, No name으로 대체하는 방법은??

    IFNULL(참조 컬럼, 대체 값)

SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE FROM ANIMAL_INS
ORDER BY ANIMAL_ID
profile
Maker가 되고 싶은 개발자

0개의 댓글