[HakerRank]The PADS

SQL-쿼리테스트

목록 보기
1/21

Q)

Generate the following two result sets:

  1. Query an alphabetically ordered list of all names in OCCUPATIONS, immediately followed by the first letter of each profession as a parenthetical (i.e.: enclosed in parentheses). For example: AnActorName(A), ADoctorName(D), AProfessorName(P), and ASingerName(S).

  2. Query the number of ocurrences of each occupation in OCCUPATIONS. Sort the occurrences in ascending order, and output them in the following format:

There are a total of [occupation_count][occupation]s.
where [occupation_count] is the number of occurrences of an occupation in OCCUPATIONS and [occupation] is the lowercase occupation name. If more than one Occupation has the same [occupation_count], they should be ordered alphabetically.

Note: There will be at least two entries in the table for each type of occupation.

A)

-- 1번 조건 쿼리.
SELECT CONCAT(name,'(',UPPER(LEFT(occupation,1)),')') as a
FROM occupations
ORDER BY 1;
-- 2번 조건 쿼리.
SELECT 
    CONCAT('There are a total of ', COUNT(*), ' ', LOWER(occupation), 's.') AS occupation_info
FROM 
    occupations
GROUP BY 
    occupation
ORDER BY 
    COUNT(*) ASC, LOWER(occupation);

주어진 조건에 맞춰 조회하는 문제고, Concat 그리고 Count 함수에 대해서 생각해볼 수 있는 문제라고 생각한다.


CONCAT()

: 여러 문자열을 조합하는 함수로써 인자로 받은 문자열,함수의 결과 등을 조합할 수 있다.
1번문제에서 NAME(Occupation의 첫글자) 의 출력을 위해 CONCAT 함수를 사용할 수 있다

UPPER()

: 주어진 문자열을 대문자로 전환해주는 함수.
Occupation의 첫글자를 대문자로 전환해주는 것 처럼 사용할 수 있다.

LEFT()

: 주어진 문자열을 왼쪽부터 지정된 수 만큼 가져올 수 있다.
여기서는 Occupation의 첫글자를 가져오기 위해 left(occupation,1) 처럼 사용하였다.

COUNT()

: 조건에 맞는 로우의 수를 세서 반환하는 함수.
COUNT 함수는 조건으로 사용되는 대표적인 경우가 나눠져 있어 아래 추가로 작성해보았다.


사용할 때마다 햇갈리는 COUNT 함수를 정리를 해보자

1. COUNT(*)

테이블의 모든 행을 세는 함수. NULL 값을 포함하여 모든 행을 카운트한다.
가장 많이 사용되는 조건의 형태라고 생각한다.. 여기서 중요한 점은 NULL 값을 포함하여 라는 부분이다.

2. COUNT(1)

이 함수는 항상 1을 반환하는 표현식을 센다. 각 행에 대해 1을 반환한다. MYSQL 에서는 둘의 정의를 똑같이 해놨기 때문에 두 쿼리의 결과는 똑같은 결과를 반환한다. 하지만 코드의 가독성을 위해서 COUNT(*) 을 사용하는 것이 더 좋지 않을까 생각된다.

3. COUNT(col)

지정한 열(col)의 값이 NULL이 아닌 행의 수를 세는 함수. 즉 NULL 값은 카운트에서 제외된다.
정의에 따라 조건에 컬럼명을 사용할 경우 해당 컬럼의 값 가운데 NULL 이 아닌 값을 갯수를 알아볼 때 사용하기에 적합한 경우이다.

위 정의를 간단하게 표로 정리하면 다음과 같이 정리할 수 있다.

함수설명NULL 값 처리
COUNT(*)모든 행을 세기 때문에 NULL 포함NULL 포함
COUNT(1)항상 1을 반환하는 표현식으로 모든 행을 세기NULL 포함
COUNT(col)특정 열의 NULL이 아닌 값만 세기NULL 제외

이제 예시를 통해 각 조건에 따라 어떤 결과를 반환하는지 알아보자.

다음과 같은 테이블이 있다고 해보자.

nameoccupation
JohnDoctor
JaneNULL
EmilyNurse
MikeTeacher
NULLArtist
  • COUNT(*) :
SELECT COUNT(*) FROM occupations;
-- 결과 : 5 
  • COUNT(1):
SELECT COUNT(1) FROM occupations;
-- 결과 : 5
  • COUNT(col):
SELECT COUNT(occupation) FROM occupations;
-- 결과 : 3

이처럼 사용하는 조건에 따라 NULL값을 포함하는지, 안하는지 경우가 달라지기 때문에 조건을 잘정의해서 사용하여야 한다.

COUNT(COL) 의 경우 NULL 이 아닌 값을 세기 때문에

SELECT COUNT(CASE WHEN AGE >= 10 THEN 1 END )

처럼 조건을 이용해 사용하면 원하는 조건에 맞는 컬럼의 수를 셀 때 유용할 수 있다.


profile
살아남기 위해 끄적이는 블로그 : 생존법

0개의 댓글