[SQL] 데이터 제한 및 정렬

·2025년 5월 20일
0

SQL

목록 보기
2/126

1. WHERE절

  • FROM절 다음에 위치
  • 반환되는 행을 제한함

select
from
where 조건 -> from절의 테이블에서 조건을 작성하여 제한적으로 출력

SELECT * | { [DISTINCT] column [alias], ... }
FROM 테이블명
[WHERE logical expression(s)];

예시

select employee_id, last_name, job_id, department_id
from employees
where department_id = 90;

2. 문자열 및 날짜

  • 문자열 및 날짜 값은 작은따옴표로 묶음
  • 문자 값은 대소문자를 구분하고 날짜 값은 형식을 구분
  • 기본 날짜 표시 형식: DD-MON-RR
  • 검색 조건에서는 대소문자를 구분
select last_name, job_id, department_id
from employees
where last_name = 'Whalen';
select last_name, hire_date
from employees
where hire_date = '1990/01/03';

ㄴ SQL Developer에서 날짜설정을 YYYY/MM/DD로 바꿔둠
작성 형식에 맞춰서 검색해야 정확히 출력됨

3. 비교 연산자

=: 같음
>: 보다 큼
>=: 보다 크거나 같음
<: 보다 작음
<=: 보다 작거나 같음
<>: 같지 않음
BETWEEN ...AND...: 두 값 사이(경계값 포함)
IN(set): 값 리스트 중 일치하는 값 검색
LIKE: 일치하는 문자 패턴 검색 (ex. 김씨를 찾아라)
IS NULL: null 값인지 여부

select last_name, salary
from employees
where salary <= 3000;

3-1. BETWEEN 연산자를 사용하는 범위 조건

BETWEEN 작거나 같은 값 AND 크거나 같은 값

select last_name, salary
from employees
where salary between 2500 and 3500;

3-2. IN 연산자 사용

  • 하나라도 같은 값이 있으면 검색하라는 의미
  • 리스트의 값을 테스트함
select employee_id, last_name, salary, manager_id
from employees
where manager_id in (100, 101, 201);

3-3. LIKE 연산자를 사용하여 패턴 일치

  • 전체가 아닌 일부분에 대한 검색
  • 유효한 검색 문자열 값의 대체문자 검색을 수행
  • 검색 조건에는 리터럴 문자나 숫자가 포함될 수 있음
    • %0개 이상의 문자를 나타냄
    • _한 문자를 나타냄

1) S로 시작하는 이름 검색

select first_name
from employees
where first_name like 'S%';

2) S로 끝나는 이름 검색

select first_name
from employees
where first_name like '%S';

3-3-1. 대체 문자 결합

1) 패턴 일치를 위해 두 개의 대체문자(%, _)를 리터럴 문자와 결합 가능

두번째 문자가 o인 이름 검색(o 뒷글자는 글자수 상관없음)

select last_name
from employees
where last_name like '_o%';

2) ESCAPE 식별자를 사용하여 실제 % 및 _ 기호 검색 가능

  • escape는 특수문자 그대로를 조건이나 검색에 사용하고 싶을 때 식별자 뒤에 문자 자체로 인식할 수 있도록 지정하는 키워드
select cust_id, lname, email, birthday, gender
from custs
where email like '%\_%' escape '\';

3-4. NULL 조건 사용

IS NULL
IS NOT NULL

select last_name, manager_id
from employees
where manager_id is null;

where manager_id = null --> 오류

4. 논리 연산자를 사용하여 조건 정의

AND: 두 구성 요소 조건이 모두 참인 경우, TRUE 반환
OR: 구성 요소 중 하나가 참인 경우, TRUE 반환
NOT: 조건이 거짓인 경우, TRUE 반환

4-1. AND 연산자

select employee_id, last_name, job_id, salary
from employees
where salary >= 10000
and job_id like '%MAN%';

4-2. OR 연산자

select employee_id, last_name, job_id, salary
from employees
where salary >= 10000
or job_id like '%MAN%';

4-3. NOT 연산자

  • not은 조건을 부정하기 때문에, 조건으로 작성한 것 외의 결과들을 출력
  • NOT IN으로 작성하면 조건에 해당되는 경우가 없는 값들만 출력
select last_name, job_id
from employees
where job_id
      not in ('IT_PROG', 'ST_CLERK', 'SA_REP');

salary가 2500에서 3500사이인 값을 뺀 값 검색

select last_name, salary
from employees
where salary not between 2500 and 3500;

S로 시작하는 이름을 뺀 값 검색

select first_name
from employees
where first_name not like 'S%';

5. 우선순위 규칙

1: 산술 연산자
2: 연결 연산자
3: 비교 조건
4: IS [NOT] NULL LIKE, [NOT] IN
5: [NOT] BETWEEN
6: 같지 않음
7: NOT 논리 연산자
8: AND 논리 연산자
9: OR 논리 연산자

  • 1: 우선순위 가장 큼
  • 다른 건 크게 안봐도 되고, 8, 9번은 신경써서 보기
    • OR가 AND보다 우선순위 더 큼
select last_name, department_id, salary
from employees
where department_id = 60
or department_id = 80
and salary > 10000;
  • or 부분이 먼저 검색됨
  • department_id가 80이면서 salary가 10000보다 큰 것
    또는 department_id가 60인 것이 검색됨

필요하면 괄호 활용

select last_name, department_id, salary
from employees
where (department_id = 60
or department_id = 80)
and salary > 10000;

이게 가장 베스트 (in 사용)

select last_name, department_id, salary
from employees
where department_id in (60, 80)
and salary > 10000;

6. ORDER BY절 사용

  • 행 정렬
    ASC: 오름차순, 기본값
    DESC: 내림차순
  • order by절은 문장 가장 마지막에 위치
select last_name, job_id, department_id, hire_date
from employees
order by hire_date desc;

열 alias를 기준으로 정렬

select employee_id, last_name, salary*12 annsal
from employees
order by annsal;

select절의 3번째 컬럼을 기준으로 정렬

(여기서는 department_id)

select last_name, job_id, department_id, hire_date
from employees
order by 3;

여러 열을 기준으로 정렬

select last_name, department_id, salary
from employees
order by department_id, salary DESC;

department_id를 기준으로 1차 정렬 후,
같은 department_id 안에서는 salary가 큰 값부터 검색
(department_id는 지정하지 않았기 때문에 기본값으로 asc가 적용,
salary는 desc로 지정했기 때문에 내림차순 정렬)

7. SQL 행 제한 절

5개의 행만 가져오고 멈추라는 의미

select employee_id, first_name
from employees
order by employee_id
fetch first 5 rows only;

5개의 행은 건너뛰고 그 다음 5개의 행을 가져오라는 의미

select employee_id, first_name
from employees
order by employee_id
offset 5 rows fetch next 5 rows only;

0개의 댓글