[SQL] HackerRank - Basic Select

kiteB·2022년 3월 28일
0

HackerRank

목록 보기
1/4
post-thumbnail

[ MySQL 구문 ]

문제 풀이를 진행하기 전에 MySQL 구문을 다시 정리해보자!

  • MySQL에서 데이터베이스에 대한 작업 명령은 SQL 구문을 이용하여 처리한다.
  • QUIT(서버와의 연결을 끊음)와 같은 경우를 제외한 일반적인 구문 뒤에는 세미콜론 ;을 붙이며, 세미콜론은 SQL 구문을 구분하는 기준이 된다.
  • MySQL은 키워드와 구문에서 대소문자를 구분하지 않는다.

✅ SELECT

0. 기본 형태

SELECT 필드명
FROM 테이블명
[WHERE 조건]
  • SELECT 문을 사용하여 테이블의 레코드(열)을 선택할 수 있다.
  • FROM 절은 레코드를 선택할 테이블의 이름을 명시한다.
  • WHERE 절을 사용하면 선택할 레코드의 조건을 상세히 설정할 수 있다.

1. 테이블의 모든 필드 선택

SELECT *
FROM 테이블명
  • * 기호를 사용하면, 해당 테이블의 모든 필드를 선택할 수 있다.

2. 특정 조건의 레코드 선택

SELECT 필드명
FROM 테이블명
WHERE 조건
  • SELECT 문과 함께 WHERE 절을 사용하면 검색할 레코드의 조건을 설정할 수 있다.
  • WHERE 절은 테이블의 크기가 매우 크거나, 특정 조건에 맞는 레코드만을 선택하고 싶을 때 유용하게 사용된다.
  • ANDOR 연산자를 이용하여 여러 조건을 연결할 수도 있다.

3. 특정 필드만 선택

SELECT 필드명1, 필드명2, ...
FROM 테이블명
  • SELECT 키워드 다음에 필드명을 명시하면, 해당 테이블의 특정 필드만을 불러올 수 있다.
  • ,를 사용하면 여러 개의 필드명을 한번에 명시할 수 있다.

4. 중복되는 값 제거

SELECT DISTINCT 필드명
FROM 테이블명
  • 만약 같은 필드에 중복되는 값을 가지는 레코드가 있다면, DISTINCT 키워드를 사용하여 그 값이 한 번만 선택되도록 설정할 수 있다.

5. 선택한 결과의 정렬

SELECT 필드명
FROM 테이블명
ORDER BY 필드명 [ASC|DESC]
  • ORDER BY 절을 사용하여 SELECT 문으로 선택한 결과를 정렬할 수 있다.
  • 기본 설정은 오름차순(ASC)이며, 키워드를 이용하여 내림차순(DESC)으로 정렬할 수도 있다.
  • ,를 이용하여 필드마다 다른 설정으로 정렬할 수도 있다.

6. 별칭(alias)을 이용한 처리

SELECT 필드명 AS 별칭
FROM 테이블명
  • AS 키워드를 이용하여 해당 필드에 새로운 별칭을 부여할 수 있다.
SELECT 필드명
FROM 테이블명 AS 별칭
  • AS 키워드를 이용하여 해당 테이블에 새로운 별칭을 부여할 수 있다.

💡 문제마다 추가적으로 필요한 개념들은 따로 정리해보도록 하겠다!


[ BASIC SELECT ]

🔗 BASIC SELECT 문제 리스트

Revising the Select Query Ⅰ

Query all columns for all American cities in the CITY table with populations larger than 100000. The CountryCode for America is USA.

  • CITY 테이블에서 POPULATION 값이 100000을 초과하는 레코드의 모든 컬럼을 출력하라.
  • COUNTRYCODE'USA'이다.

💡 Solve

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

Revising the Select Query Ⅱ

Query the NAME field for all American cities in the CITY table with populations larger than 120000. The CountryCode for America is USA.

  • CITY 테이블에서 POPULATION 값이 120000을 초과하는 레코드의 NAME 필드를 출력하라.
  • COUNTRYCODE'USA'이다.

💡 Solve

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

Select All

Query all columns (attributes) for every row in the CITY table.

  • CITY 테이블의 모든 컬럼을 출력하라.

💡 Solve

SELECT *
FROM CITY;

Select By ID

Query all columns for a city in CITY with the ID 1661.

  • CITY 테이블의 ID 필드 값이 1661인 레코드의 모든 컬럼을 출력하라.

💡 Solve

SELECT *
FROM CITY
WHERE ID = 1661;

Japanese Cities' Attributes

Query all attributes of every Japanese city in the CITY table. The COUNTRYCODE for Japan is JPN.

  • CITY 테이블의 COUNTRYCODE 필드값이 'JPN'인 레코드의 모든 컬럼을 출력하라.

💡 Solve

SELECT *
FROM CITY
WHERE COUNTRYCODE = 'JPN';

Japanese Cities' Names

Query the names of all the Japanese cities in the CITY table. The COUNTRYCODE for Japan is JPN.

  • CITY 테이블의 COUNTRYCODE 필드값이 'JPN'인 데이터의 NAME 컬럼을 출력하라.

💡 Solve

SELECT NAME
FROM CITY
WHERE COUNTRYCODE = 'JPN';

Weather Observation Station 1

Query a list of CITY and STATE from the STATION table.

  • STATION 테이블의 CITY, STATE 컬럼을 출력하라.

💡 Solve

SELECT CITY, STATE
FROM STATION;

Weather Observation Station 3

Query a list of CITY names from STATION for cities that have an even ID number. Print the results in any order, but exclude duplicates from the answer.

  • STATION 테이블의 짝수 ID 번호를 갖는 레코드의 CITY를 출력하라.
  • 중복은 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE ID % 2 = 0;

Weather Observation Station 4

Find the difference between the total number of CITY entries in the table and the number of distinct CITY entries in the table.

  • STATION 테이블의 CITY 컬럼 총 개수와 CITY 컬럼 중 고유한 값을 갖는 레코드 개수의 차이를 출력하라.

💡 Solve

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

✅ COUNT(컬럼명) 함수

  • SELECT절에서 반환된 컬럼명 레코드 개수를 가져온다.
  • 이때 NULL 값은 제외하고 카운트한다.

Weather Observation Station 5

Query the two cities in STATION with the shortest and longest CITY names, as well as their respective lengths (i.e.: number of characters in the name). If there is more than one smallest or largest city, choose the one that comes first when ordered alphabetically.

  • STATION 테이블의 CITY 필드값의 길이가 가장 짧은 값과 가장 긴 값의 길이를 CITY 필드의 값과 함께 출력하라. (CITY 필드 값, 필드 값의 길이)
  • 가장 크거나 작은 필드의 값이 둘 이상일 경우 알파벳 순으로 정렬할 때 가장 먼저 오는 도시를 선택하라.

💡 Solve

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

SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY LENGTH(CITY) DESC, CITY
LIMIT 1;
  • 첫 번째 SELECT 절은 (가장 짧은 도시의 이름, 길이)를 출력한다.
  • 두 번째 SELECT 절은 (가장 긴 도시의 이름, 길이)를 출력한다.

✅ LIMIT number;

  • 반환할 레코드 수를 지정할 때 사용되며, number개를 반환한다.
  • LIMIT절은 수천 개의 레코드가 있는 큰 테이블에 유용하다.

Weather Observation Station 6

Query the list of CITY names starting with vowels (i.e., a, e, i, o, or u) from STATION. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 시작하는(첫 글자가 모음) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) IN ('a', 'e', 'i', 'o', 'u');

✅ LEFT

  • 문자열에서 왼쪽부터 개수만큼의 문자를 추출한다.
  • 예) LEFT('MYSQL', 1) → 왼쪽 첫 번째 글자인 M 추출

Weather Observation Station 7

Query the list of CITY names ending with vowels (a, e, i, o, u) from STATION. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 끝나는(끝 글자가 모음) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY, 1) IN ('a', 'e', 'i', 'o', 'u');

✅ RIGHT(문자열, 개수)

  • 문자열에서 오른쪽부터 개수만큼의 문자를 추출한다.
  • 예) RIGHT('MYSQL', 1) → 오른쪽 첫 번째 글자인 L 추출

Weather Observation Station 8

Query the list of CITY names from STATION which have vowels (i.e., a, e, i, o, and u) as both their first and last characters. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 시작하고 끝나는(첫 글자, 끝 글자가 모음) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) IN ('a', 'e', 'i', 'o', 'u')
    AND RIGHT(CITY, 1) IN ('a', 'e', 'i', 'o', 'u');

Weather Observation Station 9

Query the list of CITY names from STATION that do not start with vowels. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 시작하지 않는(첫 글자가 모음 ❌(즉, 자음)) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

Weather Observation Station 10

Query the list of CITY names from STATION that do not end with vowels. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 끝나지 않는(끝 글자가 모음 ❌(즉, 자음)) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

Weather Observation Station 11

Query the list of CITY names from STATION that either do not start with vowels or do not end with vowels. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 시작하거나 끝나지 않는(첫 글자 자음 OR 끝 글자 자음) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u')
    OR RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

Weather Observation Station 12

Query the list of CITY names from STATION that do not start with vowels and do not end with vowels. Your result cannot contain duplicates.

  • STATION 테이블에서 CITY 필드값 중 모음으로 시작하고 끝나지 않는(첫 글자 자음 AND 끝 글자 자음) 레코드의 CITY를 출력하라.
  • 중복을 허용하지 않는다.

💡 Solve

SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u')
    AND RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');

Higher Than 75 Marker

Query the Name of any student in STUDENTS who scored higher than 75 Marks. Order your output by the last three characters of each name. If two or more students both have names ending in the same last three characters (i.e.: Bobby, Robby, etc.), secondary sort them by ascending ID.

  • STUDENTS 테이블에서 Marks 필드값이 75보다 높은 레코드의 Name 필드값을 출력하라.
  • 두 명 이상의 학생이 모두 이름이 마지막 세 문자로 끝나는 동일한 이름을 가질 경우(Bobby, Robby 등) ID를 기준으로 오름차순으로 정렬하라.

💡 Solve

SELECT NAME
FROM STUDENTS
WHERE MARKS > 75
ORDER BY RIGHT(NAME, 3), ID;

Employee Names

Write a query that prints a list of employee names (i.e.: the name attribute) from the Employee table in alphabetical order.

  • Employee 테이블에서 NAME 속성을 알파벳 순서로 출력하라.

💡 Solve

SELECT NAME
FROM EMPLOYEE
ORDER BY NAME;

Employee Salaries

Write a query that prints a list of employee names (i.e.: the name attribute) for employees in Employee having a salary greater than $2000 per month who have been employees for less than 10 months. Sort your result by ascending employee_id.

  • Employee 테이블에서 months 필드값이 10 보다 작으며 salary 필드값이 2000 보다 큰 레코드의 name 필드를 출력하라.
  • employee_id를 기준으로 결과를 정렬하라.

💡 Solve

SELECT NAME
FROM EMPLOYEE
WHERE MONTHS < 10
    AND SALARY > 2000
ORDER BY EMPLOYEE_ID;

[ 참고자료 ]

http://tcpschool.com/mysql/mysql_basic_syntax
https://www.w3schools.com/sql/func_mysql_count.asp
https://www.w3schools.com/sql/func_mysql_right.asp
https://www.w3schools.com/mysql/mysql_limit.asp
https://www.w3schools.com/sql/func_sqlserver_round.asp

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글