Generate the following two result sets:
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).
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.
-- 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 함수에 대해서 생각해볼 수 있는 문제라고 생각한다.
: 여러 문자열을 조합하는 함수로써 인자로 받은 문자열,함수의 결과 등을 조합할 수 있다.
1번문제에서 NAME(Occupation의 첫글자) 의 출력을 위해 CONCAT 함수를 사용할 수 있다
: 주어진 문자열을 대문자로 전환해주는 함수.
Occupation의 첫글자를 대문자로 전환해주는 것 처럼 사용할 수 있다.
: 주어진 문자열을 왼쪽부터 지정된 수 만큼 가져올 수 있다.
여기서는 Occupation의 첫글자를 가져오기 위해 left(occupation,1) 처럼 사용하였다.
: 조건에 맞는 로우의 수를 세서 반환하는 함수.
COUNT 함수는 조건으로 사용되는 대표적인 경우가 나눠져 있어 아래 추가로 작성해보았다.
사용할 때마다 햇갈리는 COUNT 함수를 정리를 해보자
테이블의 모든 행을 세는 함수. NULL 값을 포함하여 모든 행을 카운트한다.
가장 많이 사용되는 조건의 형태라고 생각한다.. 여기서 중요한 점은 NULL 값을 포함하여 라는 부분이다.
이 함수는 항상 1을 반환하는 표현식을 센다. 각 행에 대해 1을 반환한다. MYSQL 에서는 둘의 정의를 똑같이 해놨기 때문에 두 쿼리의 결과는 똑같은 결과를 반환한다. 하지만 코드의 가독성을 위해서 COUNT(*) 을 사용하는 것이 더 좋지 않을까 생각된다.
지정한 열(col)의 값이 NULL이 아닌 행의 수를 세는 함수. 즉 NULL 값은 카운트에서 제외된다.
정의에 따라 조건에 컬럼명을 사용할 경우 해당 컬럼의 값 가운데 NULL 이 아닌 값을 갯수를 알아볼 때 사용하기에 적합한 경우이다.
위 정의를 간단하게 표로 정리하면 다음과 같이 정리할 수 있다.
| 함수 | 설명 | NULL 값 처리 |
|---|---|---|
| COUNT(*) | 모든 행을 세기 때문에 NULL 포함 | NULL 포함 |
| COUNT(1) | 항상 1을 반환하는 표현식으로 모든 행을 세기 | NULL 포함 |
| COUNT(col) | 특정 열의 NULL이 아닌 값만 세기 | NULL 제외 |
이제 예시를 통해 각 조건에 따라 어떤 결과를 반환하는지 알아보자.
다음과 같은 테이블이 있다고 해보자.
| name | occupation |
|---|---|
| John | Doctor |
| Jane | NULL |
| Emily | Nurse |
| Mike | Teacher |
| NULL | Artist |
SELECT COUNT(*) FROM occupations;
-- 결과 : 5
SELECT COUNT(1) FROM occupations;
-- 결과 : 5
SELECT COUNT(occupation) FROM occupations;
-- 결과 : 3
이처럼 사용하는 조건에 따라 NULL값을 포함하는지, 안하는지 경우가 달라지기 때문에 조건을 잘정의해서 사용하여야 한다.
COUNT(COL) 의 경우 NULL 이 아닌 값을 세기 때문에
SELECT COUNT(CASE WHEN AGE >= 10 THEN 1 END )
처럼 조건을 이용해 사용하면 원하는 조건에 맞는 컬럼의 수를 셀 때 유용할 수 있다.