SELECT는 출력하고 싶은 결과(열)를, FROM은 데이터를 꺼내올 테이블을 명시한다.
SELECT 출력하고_싶은_결과
FROM 테이블_이름;
FROM 없이 SELECT만 사용하면 어느 테이블에서 데이터를 가져올지 알 수 없어 에러가 발생한다.*(애스터리스크)는 테이블의 모든 열을 출력한다는 의미다.
SELECT *
FROM 테이블_이름;
LIMIT 구문을 붙여서 출력할 행의 수를 제한하는 것이 안전하다.SELECT *
FROM 고객표
LIMIT 10; -- 상위 10개의 행만 출력
조건을 걸어 원하는 행(row)만 걸러낼 때 사용한다.
SELECT 고객명단
FROM 고객표
WHERE 나라 = '멕시코';
1) 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'로 끝나지 않는 사람
조회된 결과를 특정 열을 기준으로 정렬할 때 사용한다.
SELECT 출력하고_싶은_결과
FROM 테이블_이름
WHERE 조건문
ORDER BY 열_이름 ASC;
ASC (생략 시 기본값으로 적용된다)DESC,)로 구분한다. 먼저 적은 열이 1순위 기준이 된다.-- 고객가입일은 내림차순(최신순), 이름은 오름차순(가나다순) 정렬
ORDER BY 고객가입일 DESC, 고객이름 ASC;
조건에 맞는 행(row)의 총개수를 셀 때 사용한다.
SELECT COUNT(*)
FROM 고객표
WHERE 나라 = '멕시코';
COUNT(*) 혹은 COUNT(열이름) 형태로 사용한다.COUNT(DISTINCT 열이름)을 사용하면 중복을 제거한 고유한 행의 수만 센다.숫자 데이터가 들어있는 열에 대해 합계, 평균, 최솟값, 최댓값을 계산한다.
SELECT SUM(매출) -- 합계
, AVG(매출) -- 평균
, MIN(매출) -- 최솟값
, MAX(매출) -- 최댓값
FROM 고객표;
단순히 전체 데이터를 집계하는 것이 아니라, 특정 기준(그룹)별로 묶어서 집계(개수, 합계, 평균 등)를 구하기 위해 사용한다. WHERE 뒤에 작성한다.
SELECT 나라, SUM(매출)
FROM 고객표
WHERE 날짜 = '2023-08-04'
GROUP BY 나라;
SELECT 절에 명시된 일반 열 이름은 반드시 GROUP BY 절에 포함되어 있어야 한다. 반대로 집계 함수(SUM, COUNT 등)로 감싸진 열은 GROUP BY에 없어도 무방하다.GROUP BY를 통해 그룹화된 집계 결과에 조건을 걸 때 사용한다. GROUP BY 뒤에 작성한다.
SELECT 나라, SUM(매출)
FROM 고객표
GROUP BY 나라
HAVING SUM(매출) >= 10000; -- 매출 합계가 10000 이상인 나라만 출력
💡 WHERE vs HAVING 핵심 차이
- WHERE: 그룹화(GROUP BY)를 하기 전에 원본 데이터 행을 필터링한다.
- HAVING: 그룹화(GROUP BY)가 끝난 후의 결과값(집계된 값)을 필터링한다.
조회하는 열 이름이나 테이블 이름에 새로운 이름(별칭)을 붙여 가독성을 높인다. JOIN을 사용할 때 테이블 식별용으로 매우 흔하게 쓰인다.
SELECT 열이름 AS 새로운이름
FROM 테이블_이름;
AS 키워드는 생략할 수 있다. (열 이름 뒤에 한 칸 띄우고 새 이름을 쓰면 된다)SELECT 고객이름 AS 이름, 고객주소 주소
FROM 고객표;
SELECT 테이블1.열이름, 테이블2.열이름
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.공통열 = 테이블2.공통열;
ON 절에는 두 테이블을 연결할 공통 기준(보통 기본키 PK - 외래키 FK 관계)을 명시한다.SELECT C.고객이름, O.세일
FROM 고객표 C
INNER JOIN 주문내역 O
ON C.고객번호 = O.고객번호;
try 블록 안에는 에러가 발생할 가능성이 있는 코드를 넣고, catch 블록에는 에러가 발생했을 때 어떻게 대처할지를 작성합니다.
try {
// 1. 실행하고 싶은 코드 (예외 발생 가능성이 있는 코드)
} catch (ExceptionType e) {
// 2. 예외가 발생했을 때 실행되는 코드
} finally {
// 3. (선택사항) 예외 발생 여부와 상관없이 무조건 실행되는 코드
}
자바에서 숫자를 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("프로그램이 종료되지 않고 끝까지 실행되었습니다.");
}
}