✅ SQL 기본 문법 정리

JOPO·2025년 4월 1일
0

데이터베이스

목록 보기
4/7
post-thumbnail

아래 모든 항목은 "문법 설명 → 비유 → 코드 예시 → 코드 설명" 구조로 작성했습니다.
예제는 모두 "마당 DB" 기준으로 작성되었습니다.


📚 목차

  • 정렬 (ORDER BY)
  • 컬럼 별명 (AS)
  • 사칙연산
  • 비교연산
  • 논리연산 (AND / OR)
  • BETWEEN (범위 조회)
  • IN (포함 여부)
  • LIKE / NOT LIKE
  • CEIL, ROUND, FLOOR
  • 집계 함수 (AVG, MAX, MIN, SUM, COUNT)
  • 문자열 연결 (CONCAT)
  • 문자열 자르기 (SUBSTR)
  • 문자열 치환 (REPLACE)
  • 날짜 함수 (CURDATE, NOW, ADDDATE, SUBDATE, DATEDIFF)
  • 중복 제거 (DISTINCT)
  • 그룹핑 (GROUP BY, GROUP_CONCAT)
  • 그룹 조건 필터 (HAVING)
  • 느낀점

1️⃣ 정렬 (ORDER BY)

📖 개념 설명

데이터를 특정 컬럼 기준으로 정렬할 때 사용하는 명령어입니다. 오름차순(ASC) 또는 내림차순(DESC) 지정이 가능합니다.

💡 비유

책을 가격순으로 진열하거나, 도서 번호순으로 정리해서 쉽게 찾는 느낌이에요.

💻 예제 코드

-- 도서 가격을 오름차순으로, 가격이 같다면 책 번호(bookid) 기준으로 내림차순 정렬
SELECT *
FROM Book
ORDER BY price ASC, bookid DESC;

🔍 코드 설명

  • ORDER BY price ASC: 가격이 낮은 순서대로 정렬
  • bookid DESC: 가격이 같을 경우 책 번호를 큰 값부터 출력
  • ASC (Ascending): 오름차순 정렬
  • DESC (Descending): 내림차순 정렬

🛠️ 기능 요약

정렬은 데이터를 원하는 순서대로 보여줄 수 있도록 정리할 때 꼭 필요한 기능입니다.


2️⃣ 컬럼 별명 (AS)

📖 개념 설명

연산 결과나 함수 결과에 별칭(alias)을 붙일 때 사용하는 키워드입니다.

💡 비유

계산기에서 나온 결과에 '총합' 같은 이름을 붙여서 어떤 값인지 명확히 해주는 느낌이에요.

💻 예제 코드

-- 가격과 재고 수량을 곱해서 총 가치를 계산하고, 'total_value'라는 이름으로 출력
SELECT bookid, price, stock, (price * stock) AS total_value
FROM Book;

🔍 코드 설명

  • AS total_value: 계산 결과에 붙이는 별명
  • 출력 결과에서 해당 컬럼명이 'total_value'로 표시됨

🛠️ 기능 요약

복잡한 연산 결과를 보기 좋게 표현하거나, 계산된 컬럼을 다른 이름으로 다룰 때 유용합니다.


3️⃣ 사칙연산

📖 개념 설명

숫자 데이터를 대상으로 덧셈, 뺄셈, 곱셈, 나눗셈 같은 기본 산술 연산을 수행할 수 있습니다.

💡 비유

서점에서 책 가격과 재고 수를 곱해서 총 가치를 계산하는 느낌이에요.

💻 예제 코드

-- 각 도서의 재고 가치를 계산 (가격 × 재고)
SELECT bookname, price, stock, price * stock AS total_value
FROM Book;

🔍 코드 설명

  • price * stock: 가격과 수량을 곱한 값
  • AS total_value: 결과 컬럼의 별명 지정

🛠️ 기능 요약

테이블 내 수치 데이터를 조합하거나 계산할 때 사용됩니다.


4️⃣ 비교연산

📖 개념 설명

두 값을 비교하여 참(1) 또는 거짓(0) 여부를 판단합니다.

💡 비유

도서 가격이 일정 금액을 넘는지 확인해서 고급 도서인지 판단하는 것처럼 조건을 따지는 느낌이에요.

💻 예제 코드

-- 가격이 20,000원보다 큰 도서만 조회
SELECT *
FROM Book
WHERE price > 20000;

🔍 코드 설명

  • price > 20000: 가격이 20000보다 큰 도서만 필터링

🛠️ 기능 요약

조건문에서 특정 값과의 비교가 필요할 때 사용됩니다.


5️⃣ 논리연산 (AND / OR)

📖 개념 설명

여러 조건을 조합하여 복합적인 필터링이 가능하게 합니다.

💡 비유

책을 고를 때 가격도 적당하고 재고도 넉넉하면 좋고(AND), 둘 중 하나만 괜찮아도 고를 수 있는(OR) 조건이에요.

💻 예제 코드

-- 가격이 10000 이상이고 재고가 10 이상인 도서
SELECT *
FROM Book
WHERE price >= 10000 AND stock >= 10;

-- 가격이 5000 이하 또는 재고가 0인 도서
SELECT *
FROM Book
WHERE price <= 5000 OR stock = 0;

🔍 코드 설명

  • AND: 두 조건을 모두 만족하는 행만 조회
  • OR: 둘 중 하나라도 만족하면 해당 행 조회

🛠️ 기능 요약

복수 조건을 걸어 더 정교하게 데이터를 필터링할 수 있습니다.


6️⃣ BETWEEN (범위 조회)

📖 개념 설명

특정 컬럼 값이 두 값 사이에 포함되는지 확인할 때 사용합니다.

💡 비유

도서 가격이 1만원 이상 2만원 이하인 책만 찾고 싶을 때 쓰는 조건이에요.

💻 예제 코드

-- 가격이 10000 이상 20000 이하인 도서
SELECT *
FROM Book
WHERE price BETWEEN 10000 AND 20000;

🔍 코드 설명

  • BETWEEN A AND B: A 이상 B 이하
  • price BETWEEN 10000 AND 20000: 범위 내 가격의 도서만 조회

🛠️ 기능 요약

숫자나 날짜 등 연속적인 범위를 조건으로 사용할 때 유용합니다.


7️⃣ IN (포함 여부)

📖 개념 설명

지정된 여러 값 중 하나라도 일치하면 조건을 만족합니다.

💡 비유

서울, 부산, 대전처럼 내가 찾고 싶은 지역 목록 안에 포함되는 고객만 골라내는 느낌이에요.

💻 예제 코드

-- 서울, 부산, 대전 지역의 고객만 조회
SELECT *
FROM Customer
WHERE address IN ('서울', '부산', '대전');

🔍 코드 설명

  • IN (...): 괄호 안 값 중 하나라도 포함되면 TRUE

🛠️ 기능 요약

여러 값 중 하나에 해당되는 조건을 간단히 표현할 수 있습니다.


8️⃣ LIKE / NOT LIKE

📖 개념 설명

문자열의 특정 패턴을 검색할 때 사용합니다.

💡 비유

도서관에서 '김'으로 시작하는 저자 이름만 찾아보는 것처럼, 원하는 형태의 문자열을 걸러낼 수 있어요.

💻 예제 코드

-- '김'으로 시작하는 고객 이름
SELECT *
FROM Customer
WHERE name LIKE '김%';

-- '김'으로 시작하지 않는 고객
SELECT *
FROM Customer
WHERE name NOT LIKE '김%';

🔍 코드 설명

  • %: 0글자 이상을 의미하는 와일드카드
  • LIKE '김%': 김으로 시작하는 모든 이름

🛠️ 기능 요약

문자열 검색이 필요한 경우 필수적으로 사용됩니다.


9️⃣ CEIL, ROUND, FLOOR

📖 개념 설명

실수(소수점 포함 숫자)를 올림, 반올림, 버림 처리할 수 있습니다.

💡 비유

도서 가격을 계산할 때, 소수점을 반올림하거나 올림 처리하는 것처럼 숫자를 다듬는 느낌이에요.

💻 예제 코드

SELECT CEIL(10.1), ROUND(10.4), FLOOR(10.9);

🔍 코드 설명

  • CEIL(10.1): 11 (올림)
  • ROUND(10.4): 10 (반올림)
  • FLOOR(10.9): 10 (버림)

🛠️ 기능 요약

정수화가 필요한 숫자 계산 시 활용됩니다.


🔟 집계 함수 (AVG, MAX, MIN, SUM, COUNT)

📖 개념 설명

여러 행의 값을 하나의 값으로 요약할 때 사용하는 함수들입니다.

💡 비유

한 학급의 평균 점수나 총합을 계산하듯, 여러 데이터를 요약해서 보여주는 느낌이에요.

💻 예제 코드

-- 도서 가격에 대한 통계
SELECT AVG(price), MAX(price), MIN(price), SUM(price), COUNT(*)
FROM Book;

🔍 코드 설명

  • AVG: 평균
  • MAX: 최대값
  • MIN: 최소값
  • SUM: 합계
  • COUNT(*): 조회된 행의 총 개수

🛠️ 기능 요약

대량의 데이터를 분석하거나 통계를 낼 때 필수적으로 사용됩니다.


1️⃣1️⃣ 문자열 연결 (CONCAT)

📖 개념 설명

문자열 여러 개를 하나로 연결하는 함수입니다.

💡 비유

고객 이름과 주소를 이어붙여서 하나의 문장으로 보여주는 느낌이에요.

💻 예제 코드

-- 고객 이름 + 주소를 연결
SELECT CONCAT(name, ' - ', address) AS info
FROM Customer;

🔍 코드 설명

  • ' - ': 이름과 주소 사이에 넣을 구분자
  • AS info: 결과 컬럼 이름

🛠️ 기능 요약

텍스트 가공이나 출력 형식 지정 시 자주 사용됩니다.


1️⃣2️⃣ 문자열 자르기 (SUBSTR)

📖 개념 설명

문자열 중 원하는 구간만 잘라내어 사용할 수 있습니다.

💡 비유

출판일에서 연도만 뽑아내고 싶을 때처럼, 원하는 위치의 텍스트만 잘라서 쓸 수 있어요.

💻 예제 코드

-- 도서 출판일에서 연도만 추출
SELECT SUBSTR(pubdate, 1, 4) AS year
FROM Book;

🔍 코드 설명

  • SUBSTR(pubdate, 1, 4): 문자열의 1번째 글자부터 시작해서 총 4글자를 추출

🛠️ 기능 요약

날짜, 코드, 고정 문자열에서 일부를 잘라낼 때 사용됩니다.


1️⃣3️⃣ 문자열 치환 (REPLACE)

📖 개념 설명

문자열 내 특정 문자를 다른 문자로 바꾸는 함수입니다.

💡 비유

문서에서 '서울'이라는 단어를 'SEOUL'로 바꾸는 자동 치환 기능 같은 느낌이에요.

💻 예제 코드

-- 주소의 '서울'을 'SEOUL'로 변경
SELECT REPLACE(address, '서울', 'SEOUL')
FROM Customer;

🔍 코드 설명

  • '서울''SEOUL'로 치환

🛠️ 기능 요약

데이터 정제 또는 포맷 통일할 때 사용됩니다.


1️⃣4️⃣ 날짜 함수

📖 개념 설명

현재 날짜와 시간, 날짜 계산 등을 수행할 수 있는 함수입니다.

💡 비유

캘린더 앱처럼 오늘 날짜를 보여주거나 며칠 전/후를 계산하는 기능이에요.

💻 예제 코드

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: 두 날짜 간 차이 (단위: 일)

🛠️ 기능 요약

일정 계산, 기한 비교, 일 수 추산 등 날짜 연산에 활용됩니다.


1️⃣5️⃣ 중복 제거 (DISTINCT)

📖 개념 설명

중복되는 값을 제거하고 고유한 값만 반환합니다.

💡 비유

고객이 사는 지역 중복 없이 고유한 지역명만 뽑고 싶을 때 사용하는 기능이에요.

💻 예제 코드

-- 고객이 거주하는 지역(주소)의 고유 목록
SELECT DISTINCT address
FROM Customer;

🔍 코드 설명

  • DISTINCT: 중복 제거

🛠️ 기능 요약

분석이나 그룹핑 전에 유일한 값을 추출할 때 사용됩니다.


1️⃣6️⃣ 그룹핑 (GROUP BY, GROUP_CONCAT)

📖 개념 설명

같은 값을 기준으로 데이터를 묶고 집계함수를 사용할 수 있도록 합니다.

💡 비유

지역별 고객 수나 이름 목록처럼, 기준에 따라 데이터를 묶어서 정리하는 기능이에요.

💻 예제 코드

-- 지역별 고객 수 조회
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: 같은 지역에 사는 고객 이름을 쉼표로 연결하여 표시

🛠️ 기능 요약

통계 분석이나 분류된 데이터 요약에 사용됩니다.


1️⃣7️⃣ 그룹 조건 필터 (HAVING)

📖 개념 설명

GROUP BY로 묶인 결과에서 조건을 거는 데 사용됩니다.

💡 비유

반별 평균 점수를 구한 뒤, 그 평균이 일정 이상인 반만 보여주는 느낌이에요.

💻 예제 코드

-- 고객 수가 2명 이상인 지역만 출력
SELECT address, COUNT(*) AS cnt
FROM Customer
GROUP BY address
HAVING cnt >= 2;

🔍 코드 설명

  • HAVING: 집계 함수 결과에 조건 적용

🛠️ 기능 요약

WHERE는 그룹 전 조건, HAVING은 그룹 후 필터로 사용됩니다.


느낀점

하나하나 문법은 어렵지 않았는데, 막상 여러 개를 조합해서 쿼리를 짜려니까 생각보다 헷갈리는 부분이 많았다.
특히 GROUP BY나 날짜 계산 같은 건, 개념만 알면 끝날 줄 알았는데 실제로 써보니까 훨씬 더 꼼꼼하게 이해해야 한다는 걸 느꼈다.
그동안 알고 있었던 문법들도 다시 써보고 정리하면서 '아 이게 이럴 때 쓰는 거였지!' 하고 다시 떠오르는 부분이 많았고,확실히 반복해서 손으로 쳐보는 게 제일 도움이 되는 것 같다.
역시 제일 중요한건 복습이다!!!

0개의 댓글