KDT/DB

231108 DB - WHERE 2, ORDER BY

001cloudid 2023. 11. 8. 12:35
728x90

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 숫자형식
그림 1. between 숫자형식

 

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

between 날짜 형식
그림 2. between 날짜 형식

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

 

between 문자 형식
그림 3. between 문자 형식

 

in 비교연산자

우변에 값 리스트가 올 수 있는 다중행 비교연산자로 값 리스트와 비교해서 하나 이상 동일(=)하면 true를 반환.

(=, or)의 성격을 내포하고 있음. 모든 데이터 타입에 활용 가능.

-- 숫자
select employee_id, last_name, manager_id, salary, department_id
from employees
where manager_id in (100, 101, 201);

in 숫자형식
그림 4. in 숫자형식

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

in 날짜 형식
그림 5. in 날짜형식

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

in 문자형식
그림 6. in 문자형식

 

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%';

like 예시 1
그림 7. like 예시 1

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

like 예시 2
그림 8. like 예시 2

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

like 예시 3
그림 9. like 예시 3

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

like 예시 4
그림 10. like 예시 4

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

like 예시 5
그림 11. like 예시 5

-- 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%' ;

like 예시 6
그림 12. like 예시 6

 

is null 비교연산자

값이 null인지를 비교해주는 연산

-- employees 테이블에서 부서가 없는 사원
select * 
from employees
where department_id is null;

is null 예시
그림 13. is null 예시 1

is null은 비교연산자이자 우변의 역할까지 함.

-- employees 테이블에서 매니저가 없는 사원의 정보를 출력
select * 
from employees
where manager_id is null;

is null 예시 2
그림 14. is null 예시 2

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

is null 예시 3
그림 15. is null 예시 3

 

논리연산자

AND 논리연산자

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

and 예시 1
그림 16. and 예시 1

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

and 예시 2
그림 17. and 예시 2

 

OR 논리연산자

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

or 예시 1
그림 18. or 예시 1

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

or 예시 2
그림 19. or 예시 2

 

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 작업

and와 or가 함께 사용된 논리연산자 예시1

그림 20. and와 or가 함께 사용된 논리연산자 예시 1
select employee_id, last_name, salary, job_id, department_id
from employees
where (department_id = 20 or department_id = 50) and salary> 7000;

and와 or가 함께 사용된 논리연산자 예시2
그림 21. and와 or가 함께 사용된 논리연산자 예시 2

 

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;

not 예시 1
그림 22. not 예시 1

-- 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');

not 예시 2
그림 23. not 예시 2

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

not 예시 3
그림 24. not 예시 3

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

not 예시 4
그림 25. not 예시 4

 

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;

order by 예시 1
그림 26. order by 예시 1

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

order by 예시 2
그림 27. order by 예시 2

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

order by 예시 3
그림 28. order by 예시 3

select EMPLOYEE_ID, LAST_NAME
from employees
order by LAST_NAME;

order by 예시 4
그림 29. order by 예시 4

 

표현식 또는 컬럼 alias를 기준으로 정렬

select EMPLOYEE_ID, LAST_NAME, SALARY, SALARY*12 as ann_sal
from employees
order by ann_sal desc;

order by 예시 5
그림 30. order by 예시 5

 

위치표기법을 기준으로 정렬

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

order by 예시 6
그림 30. order by 예시 6

 

여러 컬럼을 기준으로 정렬

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

order by 예시 7
그림 31. order by 예시 7

 

-- 연습문제 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-%-%');

연습문제 1
그림 32. 연습문제1

--연습문제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;

연습문제 2
그림 33. 연습문제2

-- 연습문제 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));

연습문제 3
그림 34. 연습문제3

-- 연습문제 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;

연습문제 4
그림 35. 연습문제4

 

728x90

'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