아래 모든 항목은 "문법 설명 → 비유 → 코드 예시 → 코드 설명" 구조로 작성했습니다.
예제는 모두 "마당 DB" 기준으로 작성되었습니다.
데이터를 특정 컬럼 기준으로 정렬할 때 사용하는 명령어입니다. 오름차순(ASC) 또는 내림차순(DESC) 지정이 가능합니다.
책을 가격순으로 진열하거나, 도서 번호순으로 정리해서 쉽게 찾는 느낌이에요.
-- 도서 가격을 오름차순으로, 가격이 같다면 책 번호(bookid) 기준으로 내림차순 정렬
SELECT *
FROM Book
ORDER BY price ASC, bookid DESC;
정렬은 데이터를 원하는 순서대로 보여줄 수 있도록 정리할 때 꼭 필요한 기능입니다.
연산 결과나 함수 결과에 별칭(alias)을 붙일 때 사용하는 키워드입니다.
계산기에서 나온 결과에 '총합' 같은 이름을 붙여서 어떤 값인지 명확히 해주는 느낌이에요.
-- 가격과 재고 수량을 곱해서 총 가치를 계산하고, 'total_value'라는 이름으로 출력
SELECT bookid, price, stock, (price * stock) AS total_value
FROM Book;
복잡한 연산 결과를 보기 좋게 표현하거나, 계산된 컬럼을 다른 이름으로 다룰 때 유용합니다.
숫자 데이터를 대상으로 덧셈, 뺄셈, 곱셈, 나눗셈 같은 기본 산술 연산을 수행할 수 있습니다.
서점에서 책 가격과 재고 수를 곱해서 총 가치를 계산하는 느낌이에요.
-- 각 도서의 재고 가치를 계산 (가격 × 재고)
SELECT bookname, price, stock, price * stock AS total_value
FROM Book;
테이블 내 수치 데이터를 조합하거나 계산할 때 사용됩니다.
두 값을 비교하여 참(1) 또는 거짓(0) 여부를 판단합니다.
도서 가격이 일정 금액을 넘는지 확인해서 고급 도서인지 판단하는 것처럼 조건을 따지는 느낌이에요.
-- 가격이 20,000원보다 큰 도서만 조회
SELECT *
FROM Book
WHERE price > 20000;
조건문에서 특정 값과의 비교가 필요할 때 사용됩니다.
여러 조건을 조합하여 복합적인 필터링이 가능하게 합니다.
책을 고를 때 가격도 적당하고 재고도 넉넉하면 좋고(AND), 둘 중 하나만 괜찮아도 고를 수 있는(OR) 조건이에요.
-- 가격이 10000 이상이고 재고가 10 이상인 도서
SELECT *
FROM Book
WHERE price >= 10000 AND stock >= 10;
-- 가격이 5000 이하 또는 재고가 0인 도서
SELECT *
FROM Book
WHERE price <= 5000 OR stock = 0;
복수 조건을 걸어 더 정교하게 데이터를 필터링할 수 있습니다.
특정 컬럼 값이 두 값 사이에 포함되는지 확인할 때 사용합니다.
도서 가격이 1만원 이상 2만원 이하인 책만 찾고 싶을 때 쓰는 조건이에요.
-- 가격이 10000 이상 20000 이하인 도서
SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000;
BETWEEN A AND B: A 이상 B 이하price BETWEEN 10000 AND 20000: 범위 내 가격의 도서만 조회숫자나 날짜 등 연속적인 범위를 조건으로 사용할 때 유용합니다.
지정된 여러 값 중 하나라도 일치하면 조건을 만족합니다.
서울, 부산, 대전처럼 내가 찾고 싶은 지역 목록 안에 포함되는 고객만 골라내는 느낌이에요.
-- 서울, 부산, 대전 지역의 고객만 조회
SELECT *
FROM Customer
WHERE address IN ('서울', '부산', '대전');
IN (...): 괄호 안 값 중 하나라도 포함되면 TRUE여러 값 중 하나에 해당되는 조건을 간단히 표현할 수 있습니다.
문자열의 특정 패턴을 검색할 때 사용합니다.
도서관에서 '김'으로 시작하는 저자 이름만 찾아보는 것처럼, 원하는 형태의 문자열을 걸러낼 수 있어요.
-- '김'으로 시작하는 고객 이름
SELECT *
FROM Customer
WHERE name LIKE '김%';
-- '김'으로 시작하지 않는 고객
SELECT *
FROM Customer
WHERE name NOT LIKE '김%';
%: 0글자 이상을 의미하는 와일드카드LIKE '김%': 김으로 시작하는 모든 이름문자열 검색이 필요한 경우 필수적으로 사용됩니다.
실수(소수점 포함 숫자)를 올림, 반올림, 버림 처리할 수 있습니다.
도서 가격을 계산할 때, 소수점을 반올림하거나 올림 처리하는 것처럼 숫자를 다듬는 느낌이에요.
SELECT CEIL(10.1), ROUND(10.4), FLOOR(10.9);
CEIL(10.1): 11 (올림)ROUND(10.4): 10 (반올림)FLOOR(10.9): 10 (버림)정수화가 필요한 숫자 계산 시 활용됩니다.
여러 행의 값을 하나의 값으로 요약할 때 사용하는 함수들입니다.
한 학급의 평균 점수나 총합을 계산하듯, 여러 데이터를 요약해서 보여주는 느낌이에요.
-- 도서 가격에 대한 통계
SELECT AVG(price), MAX(price), MIN(price), SUM(price), COUNT(*)
FROM Book;
AVG: 평균MAX: 최대값MIN: 최소값SUM: 합계COUNT(*): 조회된 행의 총 개수대량의 데이터를 분석하거나 통계를 낼 때 필수적으로 사용됩니다.
문자열 여러 개를 하나로 연결하는 함수입니다.
고객 이름과 주소를 이어붙여서 하나의 문장으로 보여주는 느낌이에요.
-- 고객 이름 + 주소를 연결
SELECT CONCAT(name, ' - ', address) AS info
FROM Customer;
' - ': 이름과 주소 사이에 넣을 구분자AS info: 결과 컬럼 이름텍스트 가공이나 출력 형식 지정 시 자주 사용됩니다.
문자열 중 원하는 구간만 잘라내어 사용할 수 있습니다.
출판일에서 연도만 뽑아내고 싶을 때처럼, 원하는 위치의 텍스트만 잘라서 쓸 수 있어요.
-- 도서 출판일에서 연도만 추출
SELECT SUBSTR(pubdate, 1, 4) AS year
FROM Book;
SUBSTR(pubdate, 1, 4): 문자열의 1번째 글자부터 시작해서 총 4글자를 추출날짜, 코드, 고정 문자열에서 일부를 잘라낼 때 사용됩니다.
문자열 내 특정 문자를 다른 문자로 바꾸는 함수입니다.
문서에서 '서울'이라는 단어를 'SEOUL'로 바꾸는 자동 치환 기능 같은 느낌이에요.
-- 주소의 '서울'을 'SEOUL'로 변경
SELECT REPLACE(address, '서울', 'SEOUL')
FROM Customer;
'서울'을 'SEOUL'로 치환데이터 정제 또는 포맷 통일할 때 사용됩니다.
현재 날짜와 시간, 날짜 계산 등을 수행할 수 있는 함수입니다.
캘린더 앱처럼 오늘 날짜를 보여주거나 며칠 전/후를 계산하는 기능이에요.
SELECT CURDATE(), NOW();
SELECT ADDDATE('2024-01-01', INTERVAL 10 DAY);
SELECT SUBDATE('2024-01-01', INTERVAL 5 DAY);
SELECT DATEDIFF('2024-03-01', '2024-01-01');
CURDATE(): 오늘 날짜 (연월일)NOW(): 오늘 날짜 + 시간ADDDATE: 날짜 더하기SUBDATE: 날짜 빼기DATEDIFF: 두 날짜 간 차이 (단위: 일)일정 계산, 기한 비교, 일 수 추산 등 날짜 연산에 활용됩니다.
중복되는 값을 제거하고 고유한 값만 반환합니다.
고객이 사는 지역 중복 없이 고유한 지역명만 뽑고 싶을 때 사용하는 기능이에요.
-- 고객이 거주하는 지역(주소)의 고유 목록
SELECT DISTINCT address
FROM Customer;
DISTINCT: 중복 제거분석이나 그룹핑 전에 유일한 값을 추출할 때 사용됩니다.
같은 값을 기준으로 데이터를 묶고 집계함수를 사용할 수 있도록 합니다.
지역별 고객 수나 이름 목록처럼, 기준에 따라 데이터를 묶어서 정리하는 기능이에요.
-- 지역별 고객 수 조회
SELECT address, COUNT(*) AS cnt
FROM Customer
GROUP BY address;
-- 지역별 고객 이름 모아서 보기
SELECT address, GROUP_CONCAT(name) AS names
FROM Customer
GROUP BY address;
GROUP BY: address 기준으로 묶기COUNT(*): 각 그룹의 인원 수GROUP_CONCAT: 같은 지역에 사는 고객 이름을 쉼표로 연결하여 표시통계 분석이나 분류된 데이터 요약에 사용됩니다.
GROUP BY로 묶인 결과에서 조건을 거는 데 사용됩니다.
반별 평균 점수를 구한 뒤, 그 평균이 일정 이상인 반만 보여주는 느낌이에요.
-- 고객 수가 2명 이상인 지역만 출력
SELECT address, COUNT(*) AS cnt
FROM Customer
GROUP BY address
HAVING cnt >= 2;
HAVING: 집계 함수 결과에 조건 적용WHERE는 그룹 전 조건, HAVING은 그룹 후 필터로 사용됩니다.
하나하나 문법은 어렵지 않았는데, 막상 여러 개를 조합해서 쿼리를 짜려니까 생각보다 헷갈리는 부분이 많았다.
특히 GROUP BY나 날짜 계산 같은 건, 개념만 알면 끝날 줄 알았는데 실제로 써보니까 훨씬 더 꼼꼼하게 이해해야 한다는 걸 느꼈다.
그동안 알고 있었던 문법들도 다시 써보고 정리하면서 '아 이게 이럴 때 쓰는 거였지!' 하고 다시 떠오르는 부분이 많았고,확실히 반복해서 손으로 쳐보는 게 제일 도움이 되는 것 같다.
역시 제일 중요한건 복습이다!!!