where절과 order by 절
비교연산자
Between A and B 비교연산자
A(하한값) 이상 B(상한값)이하의 값을 비교해주는 연산자로 범위 검색시 활용. 모든 데이터 타입에 활용 가능
-- 숫자형식 : between 하한값 and 상한값
select employee_id, last_name, salary, job_id, department_id
from employees
where salary between 2500 and 3500;

-- 날짜 : between 과거 날짜 and 최근 날짜
select employee_id, last_name, salary, hire_date
from employees
where hire_date between '1990-01-01' and '1991-12-31';

-- 문자 : a~z, 가~하 순서로
select employee_id, last_name, department_id
from employees
where last_name between 'bell' and 'dehann';

in 비교연산자
우변에 값 리스트가 올 수 있는 다중행 비교연산자로 값 리스트와 비교해서 하나 이상 동일(=)하면 true를 반환.
(=, or)의 성격을 내포하고 있음. 모든 데이터 타입에 활용 가능.
-- 숫자
select employee_id, last_name, manager_id, salary, department_id
from employees
where manager_id in (100, 101, 201);

-- 날짜
select employee_id, last_name, hire_date, department_id
from employees
where hire_date in ('1990-01-03', '1992-12-15', '1987-06-17');

--문자
select employee_id, last_name, job_id
from employees
where job_id in ('ad_vp', 'sa_rep', 'it_prog', 'st_man');

like 비교연산자
패턴 일치 여부를 비교해주는 연산. 검색하고자 하는 값을 다 알지 못하고 일부분만 아는 경우 활용될 수 있음
like 비교연산자 우변에 패턴 작성 시 활용되는 기호 _와 %가 있음.
% : 0개 이상의 문자가 올 수 있음.
a로 시작되는 문자열을 찾고 싶다 → 'a%' a만족 abc만족 dasc 불가능
a가 포함된 문자열을 찾고 싶다 → '%a%' a만족 abc만족 dasc만족 qwer불가능
a로 끝나는 문자열을 찾고 싶다 → '%a'
_ : 반드시 하나의 문자가 와야한다.
두 번째 문자가 a인 문자열을 찾고 싶다 → '_a%'
끝에서 세 번째 문자가 a인 문자열을 찾고 싶다 → '%a__'
-- employees 테이블에서 last_name이 'a'로 시작되는 사원 출력
select employee_id, last_name, job_id, department_id
from employees
where last_name like 'a%';

-- employess 테이블에서 last_name의 두 번째 문자가 'o'인 사원 출력
select employee_id, last_name, job_id, department_id
from employees
where last_name like '_o%';

-- employess 테이블에서 job_id가 'rep'로 끝나는 사원 출력
select employee_id, last_name, job_id, job_id
from employees
where job_id like '%rep';

-- employess 테이블에서 hire_date가 1일인 사원 출력
select employee_id, last_name, hire_date
from employees
where hire_date like '%01';

-- employess 테이블에서 hire_date가 1월 사원 출력
select employee_id, last_name, hire_date
from employees
where hire_date like '____-01-%';

-- employess 테이블에서 last_name에 순서는 상관없이 'a'와 'e'가 모두 포함된 사원 출력
select employee_id, last_name, salary, department_id
from employees
where last_name like '%a%e%' or last_name like '%e%a%' ;
-- 또는 where last_name like '%a%' and last_name like '%e%' ;

is null 비교연산자
값이 null인지를 비교해주는 연산
-- employees 테이블에서 부서가 없는 사원
select *
from employees
where department_id is null;

is null은 비교연산자이자 우변의 역할까지 함.
-- employees 테이블에서 매니저가 없는 사원의 정보를 출력
select *
from employees
where manager_id is null;

-- employees 테이블에서 커미션을 받지 않는 사원 출력
select *
from employees
where commission_pct is null;

논리연산자
AND 논리연산자
-- employees 테이블에서50번 부서에 소속되어 있으면서 5000이상의 급여를 받는 사원 출력
select *
from employees
where department_id=50 and salary>=5000;

-- employees 테이블에서 급여가 5000이상이면서 8000이하인 사원을 출력
select *
from employees
where 5000<=salary and salary<=8000;
--또는
select *
from employees
where salary between 5000 and 8000;

OR 논리연산자
-- employees 테이블로부터 20번 또는 50번 부서에 소속된 사원을 출력
select *
from employees
where department_id = 20 or department_id=50;
-- 또는
select *
from employees
where department_id in ('20', '50');

-- employees 테이블로부터 10000 이상의 급여를 받거나 또는 30번 부서에 소속된 사원을 출력
select *
from employees
where salary >= 10000 or department_id=30;

where절에 and와 or가 함께 사용된 경우 우선순위 : and를 먼저 처리한 후 or (and > or)
select employee_id, last_name, salary, job_id, department_id
from employees
where department_id = 20 or department_id = 50 and salary> 7000;
-- 해석 where (department_id = 20 or (department_id = 50 and salary> 7000));
-- and를 먼저 작업한 후 or 작업
select employee_id, last_name, salary, job_id, department_id
from employees
where (department_id = 20 or department_id = 50) and salary> 7000;

not 논리 연산
between A and B(A이상 B이하) ↔ not between A and B(A미만 B초과)
in(=, or) ↔ not in(<>, and)
like ↔ not like
is null ↔ is not null(값이 null이 아닌 것, 실제값을 찾아줌)
-- employees 테이블로부터 5000미만 10000초과 급여를 받는 사원을 출력
select employee_id, last_name, salary
from employees
where salary not between 5000 and 10000;

-- employees 테이블로부터 담당업무가 'sa_rep', 'it_prog','st_man'이 아닌 사원을 출력
select employee_id, last_name, job_id
from employees
where job_id not in ('sa_rep','it_prog','st_man');

-- employees 테이블로부터 clerk으로 끝나지 않는 업무 담당자를 출력
select employee_id, last_name, job_id
from employees
where job_id not like '%clerk';

-- employees테이블로부터 커미션을 받는 사원 출력
select employee_id, last_name, commission_pct
from employees
where commission_pct is not null;

Order by절(정렬)
Select 컬럼명1, 컬럼명2, .. from 테이블명 [where 조건문 ] [order by 정렬 기준이 될 컬럼명 asc/desc];
숫자, 날짜, 문자 기준으로 모두 가능하다.
Order by절은 항상 쿼리 구문 마지막에 사용, 위치한다
컬럼명을 기준으로 정렬하기
select EMPLOYEE_ID, LAST_NAME, SALARY, JOB_ID, DEPARTMENT_ID
from employees
order by salary;

select EMPLOYEE_ID, LAST_NAME, SALARY, JOB_ID, DEPARTMENT_ID
from employees
order by salary desc;

select EMPLOYEE_ID, LAST_NAME, HIRE_DATE, DEPARTMENT_ID
from employees
order by HIRE_DATE desc;

select EMPLOYEE_ID, LAST_NAME
from employees
order by LAST_NAME;

표현식 또는 컬럼 alias를 기준으로 정렬
select EMPLOYEE_ID, LAST_NAME, SALARY, SALARY*12 as ann_sal
from employees
order by ann_sal desc;

위치표기법을 기준으로 정렬
select EMPLOYEE_ID, LAST_NAME, SALARY, DEPARTMENT_ID, JOB_ID
from employees
order by 4;
-- 해석 EMPLOYEE_ID : 1, LAST_NAME : 2, SALARY : 3, DEPARTMENT_ID : 4, JOB_ID :5

여러 컬럼을 기준으로 정렬
select EMPLOYEE_ID, LAST_NAME, SALARY, JOB_ID, DEPARTMENT_ID
from employees
order by DEPARTMENT_ID, SALARY desc;

-- 연습문제 1
-- employees 테이블로부터 2000년도에 입사한 모든 사원의 last_name과 hire_date를 출력
-- between 사용
select last_name, hire_date
from employees
where hire_date between '2000-01-01' and '2000-12-31';
-- like 사용
select last_name, hire_date
from employees
where hire_date like ('2000-%-%');

--연습문제2
--employees 테이블로부터 커미션을 받지 않는 모든 사원의 last_name, salary, commission_pct를 출력하되 salary를 기준으로 내림차순 정렬
select last_name, salary, commission_pct
from employees
where commission_pct is null
order by salary desc;

-- 연습문제 3
-- employees 테이블에서 5000~12000의 급여를 받으면서 부서 20 또는 50에 속하는 사원의
employee_id, last_name, salary, department_id를 출력
select employee_id, last_name, salary, department_id
from employees
where (salary between 5000 and 12000) and (department_id in (20, 50));

-- 연습문제 4
-- employees 테이블에서 커미션 금액이 20%인 사원의 employee_id, last_name, salary, commission_pct 출력하되 salary를 기준으로 내림차순 정렬하여 출력
select employee_id, last_name, salary, commission_pct
from employees
where commission_pct=0.2
order by salary desc;

'KDT > DB' 카테고리의 다른 글
231123 DB - JOIN 2, 단일행함수 1 (0) | 2023.11.23 |
---|---|
231115 DB - ERD, JOIN 1 (0) | 2023.11.17 |
231103 DB - SELECT, 비교연산자, 정렬, WHERE 1 (0) | 2023.11.03 |
231101 DB - CRUD (0) | 2023.11.01 |
231027 DB - MySQL 설치 및 설정 (0) | 2023.10.31 |