[231105] SQL 문제풀이_해커랭크 (1)

ese2o·2023년 11월 4일

SQL

목록 보기
1/2

문제 링크: https://www.hackerrank.com/domains/sql
카테고리: 해커랭크 > Prepare > SQL > Select All

1번

SELECT * FROM CITY
WHERE COUNTRYCODE = 'USA' AND POPULATION > 100000

기본 문법 정리

SELECT * FROM 테이블명 : 테이블 전체를 조회
WHERE 뒤에 조건

  • 파이썬이랑 다르게, = 기호는 하나만 사용한다.

2번

SELECT NAME FROM CITY
WHERE COUNTRYCODE = 'USA' AND POPULATION > 120000

SELECT 컬럼명 FROM 테이블명 : 테이블 중에서 출력하고 싶은 컬럼값

3번

SELECT * FROM CITY
WHERE ID = 1661

4,5번 설명 생략

6번

SELECT CITY, STATE FROM STATION

7번

SELECT DISTINCT(CITY) FROM STATION
WHERE ID % 2 = 0

DISTINCT(컬럼명) : delete duplicates

8번

중복 포함 값의 개수 - 중복을 제외한 UNIQUE 값의 개수를 구해야 하는 문제이다.

SELECT (COUNT(CITY) - COUNT(DISTINCT CITY)) FROM STATION;

DISTINCT 뒤에는 괄호를 씌워도 되고, 생략해도 된다.
SELECT 함수도 괄호를 생략해도 된다.

9번

이름(문자열)의 길이가 가장 짧은 나라와 가장 긴 나라를 <이름 길이> 의 형식으로 출력해야 한다. 단, 문자열의 길이가 같은 나라가 있을 경우 알파벳 순으로 더 앞에 오는 나라를 출력해야 한다.
예를 들어, ABC BCD CDEF 라는 세 나라가 있을 때, 출력값은 다음과 같을 것이다.
ABC 3
CDEF 4

  1. 먼저 문자열의 길이를 구해야 한다.
SELECT CITY, LENGTH(CITY)
FROM STATION

이렇게 SELECT 구문을 작성하면 <이름 길이> 의 형식으로 출력 가능하다.

  1. ORDER BY 함수를 사용하여 오름차순으로 정렬한다.
ORDER BY 2, 1

먼저 2번째 열(여기서는 LENGTH(CITY))을 기준으로 오름차순으로 정렬한 후, 동일한 길이의 도시 중에서는 1번째 열(CITY)를 기준으로 오름차순으로 정렬한다.
ORDER BY는 기본이 오름차순이다. 지금은 오름차순으로 코드를 작성했기 때문에 가장 짧은 문자열이 구해질 것이다.
위 코드에서는 2, 1로 몇 번째 열인지 표현했지만, 그냥 열의 이름을 적는 것도 기본적인 방법 중 하나이다.

  1. LIMIT 절을 사용하여 정렬된 결과 중 선택할 열을 지정한다.
LIMIT 1;

위에서는 세미콜론 없이도 실행이 잘 됐는데 왜 이번엔 에러가 뜨는지 모르겠다. 두 문단이어서 그런 것 같다..

  1. ORDER BY 함수를 사용하여 내림차순으로 정렬한다.
    이번에는 가장 긴 문자열을 구할 차례이다.
ORDER BY 2 DESC, 1

2번째 열은 내림차순으로 정렬하고, 1번째 열은 오름차순으로 정렬하는 코드이다.

  1. 전체 코드
SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY 2, 1
LIMIT 1;

SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY 2 DESC, 1
LIMIT 1;

10번

모음으로 시작하지 않는 CITY 이름을 중복 없이 출력해야 한다.
단어의 생김새(?)를 결정해주는 정규표현식을 작성하여 조건으로 지정해 준다.
이를 위해 REGEXP라는 함수를 사용한다.
Regular Expression, 즉 정규표현식이라는 뜻이다.

[^] : 특정 문자 시작, [|] : OR 연산자, [$] : 특정 문자로 종료

REGEXP의 쓰임은 https://velog.io/@gillog/MySQL-REGEXPRegular-Expression%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D 에서 더 알아볼 수 있다.

  1. 중복 없이 컬럼을 선택해 준다.
SELECT DISTINCT CITY
FROM STATION
  1. 모음으로 시작하는 정규표현식을 만든다.
[aeiouAEIOU].*

글자들의 집합은 대괄호로 묶어준다.
. 는 "모든 문자"를 의미한다.
예를 들어, 'a.
b' 패턴은 a로 시작하고 b로 끝나는 문자열을 매치한다.

  1. 문자열의 시작 조건에 위의 정규표현식을 지정해 준다.
^[aeiouAEIOU].*

맨 첫 글자에 이 조건을 할당해 주어야 하기 때문에, 시작하는 문자열을 찾는 ^를 사용한다.

  1. REGEXP 함수를 완성해 준다.
WHERE CITY REGEXP('^[aeiouAEIOU].*')
  1. 전체 코드
SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP('^[aeiouAEIOU].*')

추가로, 모음으로 시작하지 않는 단어는 다음의 문법을 사용한다.

[^aeiouAEIOU]

[^문자]의 형태로 작성하면, 괄호 안의 문자를 포함하지 않은 문자열을 찾는다.
따라서 이 코드는 모음으로 시작하지 않는 문자열을 찾게 될 것이다.

0개의 댓글