SQL 기초 쿼리 정리 (SELECT- TRY)

sungsimdangmascot·2026년 4월 21일

1. SELECT · FROM (데이터 조회)

SELECT는 출력하고 싶은 결과(열)를, FROM은 데이터를 꺼내올 테이블을 명시한다.

SELECT 출력하고_싶은_결과
FROM 테이블_이름;
  • FROM 없이 SELECT만 사용하면 어느 테이블에서 데이터를 가져올지 알 수 없어 에러가 발생한다.

SELECT * FROM (전체 열 조회)

*(애스터리스크)는 테이블의 모든 열을 출력한다는 의미다.

SELECT *
FROM 테이블_이름;
  • 테이블의 구조(열 이름)나 데이터의 상태를 빠르게 확인할 때 주로 사용한다.
  • 단, 실무에서는 데이터의 양이 방대할 수 있으므로 가급적 LIMIT 구문을 붙여서 출력할 행의 수를 제한하는 것이 안전하다.
SELECT *
FROM 고객표
LIMIT 10; -- 상위 10개의 행만 출력

2. WHERE (조건 필터링)

조건을 걸어 원하는 행(row)만 걸러낼 때 사용한다.

SELECT 고객명단
FROM 고객표
WHERE 나라 = '멕시코';

WHERE 구문 상세 사용법

1) AND / OR

  • AND: 두 개 이상의 조건을 모두 만족해야 할 때 사용한다.
  • OR: 여러 조건 중 하나만 만족해도 될 때 사용한다.
WHERE 나라 = '멕시코' AND 나이 = 30
WHERE 나라 = '멕시코' OR 나이 = 30

2) 비교 연산자 및 부정(!=, <>)

  • >, <, >=, <= 기호로 크기를 비교한다.
  • != 또는 <> 기호로 특정 조건을 제외한다. (두 기호는 같은 역할을 한다)
WHERE 나이 >= 30 AND 나이 < 40
WHERE 나라 != '멕시코'

3) 문자열과 정수 표기법

  • 문자는 항상 작은따옴표 ' '로 감싸고, 숫자는 그냥 표기한다.

4) IN / NOT IN (다중 조건 지정)

  • 같은 열에 대해 OR을 여러 번 써야 할 때 리스트 형태로 묶어서 간결하게 표현한다.
-- OR을 남발한 나쁜 예
WHERE 나라='멕시코' OR 나라='미국' OR 나라='한국'

-- IN을 활용한 깔끔한 예
WHERE 나라 IN ('멕시코', '미국', '한국')
WHERE 나라 NOT IN ('일본', '중국') -- 해당 국가 제외

5) BETWEEN / NOT BETWEEN (범위 지정)

  • 특정 범위를 지정할 때 사용한다. >= AND <= 조건과 동일하다.
WHERE 나이 BETWEEN 30 AND 39      -- 30대만 출력
WHERE 나이 NOT BETWEEN 30 AND 39  -- 30대 제외하고 출력

6) LIKE / NOT LIKE (패턴 검색)

  • 특정 문자열 패턴을 찾을 때 사용한다. % 기호는 '임의의 문자열'을 의미한다. 대소문자 구별에 구애받지 않는 경우가 많다.
WHERE 이름 LIKE 'Tom%'   -- 'Tom'으로 시작하는 사람
WHERE 이름 LIKE '%or%'   -- 앞뒤 상관없이 'or'이 포함된 사람
WHERE 이름 NOT LIKE '%y' -- 'y'로 끝나지 않는 사람

3. ORDER BY (정렬)

조회된 결과를 특정 열을 기준으로 정렬할 때 사용한다.

SELECT 출력하고_싶은_결과
FROM 테이블_이름
WHERE 조건문
ORDER BY 열_이름 ASC;
  • 오름차순: ASC (생략 시 기본값으로 적용된다)
  • 내림차순: DESC
  • 여러 개의 열을 기준으로 정렬할 때는 쉼표(,)로 구분한다. 먼저 적은 열이 1순위 기준이 된다.
-- 고객가입일은 내림차순(최신순), 이름은 오름차순(가나다순) 정렬
ORDER BY 고객가입일 DESC, 고객이름 ASC;

4. 데이터 집계 함수

COUNT (데이터 개수 세기)

조건에 맞는 행(row)의 총개수를 셀 때 사용한다.

SELECT COUNT(*)
FROM 고객표
WHERE 나라 = '멕시코';
  • COUNT(*) 혹은 COUNT(열이름) 형태로 사용한다.
  • COUNT(DISTINCT 열이름)을 사용하면 중복을 제거한 고유한 행의 수만 센다.

SUM / AVG / MIN / MAX (숫자 연산)

숫자 데이터가 들어있는 열에 대해 합계, 평균, 최솟값, 최댓값을 계산한다.

SELECT SUM(매출)    -- 합계
     , AVG(매출)    -- 평균
     , MIN(매출)    -- 최솟값
     , MAX(매출)    -- 최댓값
FROM 고객표;

5. GROUP BY (그룹화)

단순히 전체 데이터를 집계하는 것이 아니라, 특정 기준(그룹)별로 묶어서 집계(개수, 합계, 평균 등)를 구하기 위해 사용한다. WHERE 뒤에 작성한다.

SELECT 나라, SUM(매출)
FROM 고객표
WHERE 날짜 = '2023-08-04'
GROUP BY 나라;
  • 주의사항: SELECT 절에 명시된 일반 열 이름은 반드시 GROUP BY 절에 포함되어 있어야 한다. 반대로 집계 함수(SUM, COUNT 등)로 감싸진 열은 GROUP BY에 없어도 무방하다.

6. HAVING (그룹 필터링)

GROUP BY를 통해 그룹화된 집계 결과에 조건을 걸 때 사용한다. GROUP BY 뒤에 작성한다.

SELECT 나라, SUM(매출)
FROM 고객표
GROUP BY 나라
HAVING SUM(매출) >= 10000; -- 매출 합계가 10000 이상인 나라만 출력

💡 WHERE vs HAVING 핵심 차이

  • WHERE: 그룹화(GROUP BY)를 하기 에 원본 데이터 행을 필터링한다.
  • HAVING: 그룹화(GROUP BY)가 끝난 의 결과값(집계된 값)을 필터링한다.

7. ALIAS (별칭 부여)

조회하는 열 이름이나 테이블 이름에 새로운 이름(별칭)을 붙여 가독성을 높인다. JOIN을 사용할 때 테이블 식별용으로 매우 흔하게 쓰인다.

SELECT 열이름 AS 새로운이름
FROM 테이블_이름;
  • AS 키워드는 생략할 수 있다. (열 이름 뒤에 한 칸 띄우고 새 이름을 쓰면 된다)
SELECT 고객이름 AS 이름, 고객주소 주소
FROM 고객표;

8. INNER JOIN (테이블 결합)

SELECT 테이블1.열이름, 테이블2.열이름
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.공통열 = 테이블2.공통열;
  • ON 절에는 두 테이블을 연결할 공통 기준(보통 기본키 PK - 외래키 FK 관계)을 명시한다.
  • 별칭(ALIAS)을 활용하면 쿼리를 훨씬 짧고 명확하게 작성할 수 있다.
SELECT C.고객이름, O.세일
FROM 고객표 C
INNER JOIN 주문내역 O
ON C.고객번호 = O.고객번호;

TRY - CATCH

1. 기본 구조

try 블록 안에는 에러가 발생할 가능성이 있는 코드를 넣고, catch 블록에는 에러가 발생했을 때 어떻게 대처할지를 작성합니다.

try {
    // 1. 실행하고 싶은 코드 (예외 발생 가능성이 있는 코드)
} catch (ExceptionType e) {
    // 2. 예외가 발생했을 때 실행되는 코드
} finally {
    // 3. (선택사항) 예외 발생 여부와 상관없이 무조건 실행되는 코드
}

2. 예시: 0으로 나누기 (ArithmeticException)

자바에서 숫자를 0으로 나누면 프로그램이 종료되지만, try-catch를 사용하면 계속 실행할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 여기서 ArithmeticException 발생!
            System.out.println("결과: " + result); // 이 줄은 실행되지 않음
        } catch (ArithmeticException e) {
            System.out.println("에러 발생: 0으로 나눌 수 없습니다.");
            System.out.println("메시지: " + e.getMessage());
        }
        
        System.out.println("프로그램이 종료되지 않고 끝까지 실행되었습니다.");
    }
}

profile
성심당마스코트

0개의 댓글