📌 where clause 사용되는 연산자
# database/240605/select-ex01.sql
* 비교 연산자
= : 같다
<> : 다르다
< : 오른쪽 값이 더 큼
> : 왼쪽 값이 더 큼
<= : 값이 같거나, 오른쪽 값이 더 큼
>= : 값이 같거나, 왼쪽 값이 더 큼
* 논리 연산자 : and, or, not
* 범위 연산자 : between A and B
* 집합 연산자 : in (값 1, 값 2, ...)
not in (값 1, 값 2 , ...)
* 문자열 연산자 : like
not like
와일드 카드 - '%' (모든), '_' (하나)
* null 연산자 : is null null 과 같다. null 이다. (부등호를 쓰는 것이 아니라 is)
is not null null 과 같지 않다. null이 아니다.
📌 산술 연산자 : + - * /
# database/240604/select-ex03.sql
- 단순 계산
select 에 컬럼을 쓴다는 것은 데이터가 있다는 뜻인데, 만약 컬럼이 없는 것이면, 조건이 컬럼이 됨
select 10 + 10; select 20 - 10, 30 * 3, 40 / 2;
- 특정 컬럼 데이터 연산
MySQL 에서 문자열 취급할 땐 ' ' 또는 " "
한 단어일 땐 생략해도 되지만, 2개 이상의 단어로 이루어질 때 감싸줘야 한다.
select emp_no, salary, salary + 10 from salaries; select emp_no, salary, salary + 10 as '10 증가 값' from salaries;
[예제] 사원 번호, 현재 연봉, 10% 인상된 각 사원의 연봉 조회 (조회 결과 20개 로우만 조회)
select emp_no, salary, salary * 1.1 as '10% 인상' from salaries limit 20;
[문제 1] d005 부서 매니저의 사원번호, 부서번호 추출하시오.
select emp_no, dept_no from dept_manager
where dept_no = 'd005';
[문제 2] doo3 부서 소속(담당)이 아닌 매니저들의 사원번호, 부서번호 추출하시오.
select * from dept_manager;
현재 해당 사원번호 사원이 부서장을 맡고 있기 때문에 아직 언제까지 했는지 미정이라 임의로 설정 !
select emp_no, dept_no from dept_manager
where dept_no <> 'd003';
[문제 3] 연봉이 150,000 이상인 사원들의 사원번호, 연봉 추출하시오.
select emp_no, salary from salaries
where salary >= 150000;
[문제 4] 1986년 이후에 입사한 사원의 사원번호, 입사일, 이름 추출하시오.
날짜를 나타내는 표현은 하이픈으로 표현 '-', 또 문자열로 취급해줘야 한다 !
결과값은 보여질 때 기본키 기준으로 정렬해서 보여주게 됨
select emp_no, salary from salaries
where salary >= 150000;
[문제 5] 1990년 이후부터 매니저로 근무하고 있는 사원들의 사원번호, 부서번호, 매니저 시작 날짜 추출하시오.
select emp_no, dept_no, from_date from dept_manager
where from_date >= '1990-01-01';
근데 to_date 롤 추가해서 보면
이전에 매니저로 근무 했던 사람들 DB 정보도 같이 추출이 되기 때문에
현재 근무 하고 있는 사람들 정보만 가져오게 해야된다 !
이전에 999-01-01 은 현재 매니저를 맡고 있어서 임기 기간이 미정이라고 했다 !
그래서 to_date 에 1999-01-01 인 조건을 논리 연산자를 통해 and 해줬다
select emp_no, dept_no, from_date, to_date from dept_manager
where from_date >= '1990-01-01' and to_date = '9999-01-01';
[문제 6] 1990년 이전 입사한 사원들의 사원번호, 입사일 추출하시오.
1990년대까지 일했던 사람들도 포함이니까 ! 조건에 맡게 쿼리문을 작성해줘야 한다
select emp_no, hire_date from employees
where hire_date <= '1990-12-31';
select emp_no, hire_date from employees
where hire_date < '1991-01-01';
📌 논리 연산자 : and, or, not
[문제 1] d001 부서 매니저 중 1990년 이후 매니저인 사원의 사번, 부서번호, 매니저 시작일 조회
자바에서는 피연산자가 2개 와서 이항 연선자인데 sql 에서는 여러 개가 올 수 있다 !
86년 이전에 다닌 사람은 뺀다면 !
그리고 여성만 !
다시 문제로 돌아와 풀어보장
select emp_no, dept_no, from_date from dept_manager
where dept_no = 'd001' and from_date >= '1990-01-01';
[문제 2] 1990년 이후 입사한 남자 사원의 사원번호, 성별, 입사일 추출
select emp_no, gender, hire_date from employees
where gender = 'M' and hire_date >= '1990-01-01';
[문제 3] 1990년 이후부터 연봉을 60,000 이상 받는 사원의 사원 번호, 연봉, 연봉 시작일 추출
select emp_no, salary, from_date from salaries
where salary >= 60000 and from_date > '1990-01-01';
[문제 4] d001 부서와 d002 부서 매니저의 사원번호, 부서번호 추출
dept_no = 'd001' or 'd002'
위 코드 처럼 조건이 같을 때 저렇게 하면 실행이 제대로 안됨
연산자 기준으로 실행이 되기 때문에 위 코드처럼 하면 연산자를 제외한 것
select * from dept_manager
where dept_no = 'd001' or dept_no = 'd002';
[문제 5] 직책이 staff 이거나 engineer 인 사원의 사원번호, 직책 추출
select * from titles
where title = 'staff' or title = 'engineer';
[문제 6] d003 부서 소속(담당)이 아닌 매니저의 사원번호, 부서번호 추출
select * from dept_manager
where not dept_no = 'd003';
실행 순서
📌 범위 연산자 : between A and B
연봉이 60,000 이상 70,000 이하인 사원의 사번, 연봉 추출
논리 연산자 사용했을 때
select emp_no, salary from salaries
where salary >= 60000 and salary <= 70000;
범위 연산자 사용했을 때
select emp_no, salary from salaries
where salary between 60000 and 70000;
실행 결과는 같음 !
📌 집합 연산자 : in (값 1, 값 2, ...) / not in (값 1, 값 2 , ...)
d001 부서와 d002 부서 매니저의 사번, 부서번호 추출
or 연산자 사용 했을 때
select emp_no, dept_no from dept_manager
where dept_no = 'd001' or dept_no = 'd002';
in 연산자 사용 했을 때
select emp_no, dept_no from dept_manager
where dept_no in ('d001', 'd002');
그럼 다시 d001 부서와 d002 부서가 아닌 매니저의 사번, 부서번호 추출일땐 ?
or 연산자를 사용하면 이것 또는 이것인데 false + false 가 되어 버리니까 사용하면 안됨
그래서 and 연산자를 사용해야함 !
and 연산자는 모든 조건에 다 충족했을 때 ! 조건이 실행이 됨
select emp_no, dept_no from dept_manager
where dept_no <> 'd001' and dept_no <> 'd002';
not in 연산자 사용하면 조건을 보고 해당하지 않은 조건을 출력 !
select emp_no, dept_no from dept_manager
where dept_no not in ('d001', 'd002');
📌 문자열 연산자
문자열 연산자 : like, not like, 와일드 카드 - '%' (모든, 글자 1개 이상), '_' (하나, 글자 1개)
컬럼의 타입이 문자열인 것만 !
like 연산자
[문제 1] 직책이 마케팅일 때 !
select * from departments
where dept_name = 'Marketing';
like 연산자 써보자
근데 똑같다 !
select * from departments
where dept_name like 'Marketing';
그럼 왜 나뉘어질까 !
DBMS 에서 문자열 처리를 할 때 = 연산자 보다 like 연산자를 쓰는게 더 빠르고 정확하다
그래서 쿼리문 작성할 때 컬럼의 타입에 따라 연산자를 사용해야한다.
[문제 2] R 로 시작하는 부서명일 때
select * from departments
where dept_name like 'R%';
[문제 3] S 로 끝나는 부서명
select * from departments
where dept_name like '%S';
[문제 4] S 가 포함된 부서명
select * from departments
where dept_name like '%S%';
이름의 두 번째 글자가 r 인 데이터 추출
select * from employees
where first_name like '_r%'
[문제 1] 이름이 B 로 시작하는 사원의 사번, 이름 추출
select emp_no, first_name from employees
where first_name like 'B%';
[문제 2] 이름이 i 로 끝나는 사원의 사번, 이름 추출
select emp_no, first_name from employees
where first_name like '%i';
[문제 3] 이름의 두 번째 글자가 r 인 사원의 사번, 이름 추출 단, 이름 글자 수가 3개인 이름만
select emp_no, first_name from employees
where first_name like '_r_';
[문제 4] 이름이 B 로 시작하지 않은 직원의 이름과 사번 추출
select emp_no, first_name from employees
where first_name not like 'B%';
Binary : 대/소문자 구분
where binary first_name like '%g%'
and gender like 'm';
📌NULL 연산자
# database/p240605/select-ec01.sql
DBMS 기준으로 null 은 알 수 없는 값, 알려지지 않은 값, 공백 아님 ! 0 아님 !
is null null 과 같다. # null 이다. (부등호를 쓰는 것이 아니라 is)
is not null null 과 같지 않다. # null이 아니다.
[문제 1] emp_no 가 10001인 사원의 to_date 를 null 로 변경
update titles
set to_date = null
where emp_no = 10001;
[문제 2] 전체 조회, 10001인 사원의 to_date 를 null 로 변경된 거 확인됨
select * from titles;
[문제 3] 10001인 사원 제외 모두 출력
select * from titles
where to_date is not null;
https://webstudynote.tistory.com/48
'Others > 데이터베이스' 카테고리의 다른 글
[SQL] JOIN 문법 정리 및 예제 (0) | 2024.06.16 |
---|---|
[SQL] 데이터형 (0) | 2024.06.16 |
[SQL] TCL (트랜잭션 제어어) 문법 정리 및 예제 (0) | 2024.06.16 |
[SQL] DCL (제어어) 문법 정리 및 예제 (0) | 2024.06.16 |
[SQL] DDL (정의어) 문법 정리 및 예제 (1) | 2024.06.16 |