요즘 쿼리 문제를 한 개씩 풀면서 문법의 중요성을 깨닫고 있다 !
생각보다 많고 생각보다 헷갈리고,,
맨날 GPT 믿고있다가는 기본적인 것도 모르는 바보가 될 것 같아서 큰일이다.(벌써 진행 중인 것 같기도,,)
이게,,암튼 서론이였고요,,
그래서 제가 꼭 꼭 알고 있으면 좋은 쿼리 함수 요약본 적어왔습니다🫡
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
-- 사용 예시
SELECT email
, age
, CASE WHEN age >= 40 THEN ‘40대’
WHEN age >= 30 THEN ’30대’
WHEN age >= 20 THEN ’20대’
ELSE NULL END AS age_group
FROM users
-- 사용 예시 : 트레이너의 고향(hometown)이 서울(Seoul)인 경우 '수도권', 아니면 '타지역'으로 구분하여
-- hometown_status라는 별칭으로 출력하세요.
SELECT hometown
, IF(hometown = 'Seoul', '수도권', '타지역') AS hometown_status
FROM trainer
;
IFNULL(A,B) A가 NULL이면 B 반환, 그렇지 않으면 A 반환
NULLIF(A,B) A와 B가 같으면 NULL 반환, 다르면 A 반환
COALESCE(A, B) NULL을 특정 값으로 대체하거나, 가장 먼저 NULL이 아닌 값 반환
SELECT name, IFNULL(age, 0) AS age
FROM users;
CAST( 특정 컬럼 AS …타입)
| 타입 | 설명 | |
|---|---|---|
| CHAR | 문자열 데이터로 변환 | |
| DECIMAL(A, B) | 수치형 데이터로 변환 (A : 총 자릿수, B : 고정 소수점 숫자) | |
| SIGNED | 음수, 0, 양수를 모두 포함하는 정수로 변환 | |
| UNSIGNED | 0과 양수만 포함하는 정수로 변환 | |
| DATE | 날짜 형식으로 변환 | |
| DATETIME | 날짜와 시간 형식으로 변환 |
-- 사용 예시
SELECT CAST('2024-12-01' AS DATE); -> 2024-12-01
SELECT CAST(123 AS CHAR); -> '123'
| 함수 | 설명 | |
|---|---|---|
| CONCAT(A,B,…) | 여러 문자열을 하나로 연결 | |
| SUBSTRING(데이터,시작위치,길이) | 데이터에서 지정된 위치부터 특정 길이만큼 문자열을 추출 | |
| LENGTH() | 문자열의 길이 반환 | |
| UPPER() | 대문자로 변환 | |
| LOWER() | 소문자로 변환 | |
| TRIM() | 데이터의 앞뒤 공백 제거 | |
| LTRIM() | 데이터의 왼쪽 공백 제거 | |
| RTRIM | 데이터의 오른쪽 공백 제거 | |
| LEFT(A,B) | A에서 왼쪽 특정 문자열 B개 선택 | |
| RIGHT(A,B) | A에서 오른쪽 특정 문자열 B개 선택 | |
| REPLACE(데이터,A,B) | 데이터에서 A를 B로 대체 |
-- 사용 예시
SELECT LEFT('HelloWorld', 3); --> 'Hel'
| 함수 | 설명 | |
|---|---|---|
| ABS() | 절댓값 | |
| ROUND(A,B) | A를 소수점 아래 B자리까지 반올림 | |
| TRUNCATE(A,B) | A를 소수점 아래 B까지 남기고 그이후를 버림 | |
| CEIL() | 특정 숫자보다 큰 숫자 중 최소 정수 | |
| FLOOR() | 특정 숫자보다 작은 숫자 중 최대 정수 | |
| MOD(A,B) | A를 B로 나눈 나머지 | /(산술 연산자) : 나누기 |
| POWER(A,B) | A의 B승 | |
| SQRT() | 제곱근 |
| 함수 | 설명 | |
|---|---|---|
| YEAR/MONTH/DAY/DAYOFWEEK | 날짜에서 연도,월,일,요일 부분을 추출 | |
| HOUR/MINUTE/SECOND | 시간에서 시,분,초 부분을 추출 | |
| DATEDIFF | 두 날짜간의 일 수 차이를 계산 | |
| DATE_ADD | 날짜에서 지정된 기간을 더하기 | |
| DATE_SUB | 날짜에서 지정된 기간을 빼기 | |
| TIMEDIFF | 두 시간의 차이를 계산 | |
| DATE_FORMAT | 날짜를 지정된 형식의 문자열로 변환 | |
| STR_TO_DATE | 문자열을 지정된 형식의 날짜로 변환 |
| 함수 | 설명 |
|---|---|
| COUNT() | 개수 |
| SUM() | 합계 |
| AVG() | 평균 |
| MAX() | 최댓값 |
| MIN() | 최솟값 |
테이블의 각 행에 대해 지정된 범위 내에서 집계,순위,누적 계산 등의 분석 작업 수행하는 함수
코딩테스트에 자주 나오므로 이해를 넘어서 꼭 사용하자 !
-- 사용 예시
SELECT 컬럼
, 윈도우 함수 OVER (PARTITION BY 컬럼 ORDER BY 컬럼) AS 별칭
FROM 테이블
윈도우 함수 종류
AND가 OR 보다 우선 순위가 높다. 가독성을 위해 먼저 실행되는 조건을 괄호로 묶어서 표시하자
BETWEEN A AND B : A 이상 B 이하
IN (A,B,C) : A 또는 B 또는 C
LIKE
NOT LIKE
-- 사용예시
select *
from battle
where CAST(battle_date AS DATE) > '20241015';
select *
from battle
where CAST(battle_date AS DATE) > '2024-10-15';
select *
from battle
where CAST(battle_date AS DATE) > date('2024-10-15');
battle_date 이 text 타입으로 'YYYY-MM-DD' 이런식으로 저장되어 있으면 아래처럼만 비교가능
select *
from battle
where battle_date > '2024-10-15';
having 에 max() 조건절 사용시 유의할점
/*
Enter your query here.
*/
1번
select salary*months, count(*)
from employee
group by salary*months
order by salary*months desc
limit 1
2번
SELECT salary*months, COUNT(*)
FROM employee
GROUP BY salary*months
HAVING salary*months = (
SELECT MAX(salary*months) FROM employee
);
3번
select salary*months, count(*)
from employee
group by salary*months
order by salary*months desc
having max(salary*months)
3번은 “가장 큰 salary*months 그룹 1개만 가져오기”에 해당하지 않는다.
