착해지는 중 입니다.
[SQL] 연산자 본문
데이터 가공:산술 및 연산자
SQL연산자
연산자 | 의미 | 괄호를 사용해서 우선 순위규칙을 재정의 할 수 있다! |
1 | 산술 연산자 | |
2 | 연결 연산자 | |
3 | 비교 조건 | |
4 | IS [NOT] NULL LIKE, [NOT] IN | |
5 | [NOT] BETWEEN | |
6 | 같지않음 | |
7 | NOT 논리조건 | |
8 | AND 논리조건 | |
9 | OR 논리조건 |
피연산자 수에 따라 단항, 이항연산자로 나뉨
단항연산자의 우선순위가 높음.
가능에 따라 나눌 떄
산술 연산자
*, /, -, + 사칙연산 사용, FROM 절을 제외한 모든 절에서 사용 가능.
--p63 예제1
SELECT employee_id, last_name, salary, salary*12 AS ANN_SAL
FROM EMPLOYEES;
--p63 예제2
SELECT employee_id, last_name,job_id,salary,commission_pct,salary*commission_pct as 커미션형식
FROM EMPLOYEES;
--p63 예제3
SELECT employee_id, last_name, first_name, salary, ROUND(salary/12)*3 분기급여
FROM EMPLOYEES;
연결 연산자
연산기호 : ||
문자열과 문자열을 연결하거나 숫자 또는 날짜데이터(변환가능한경우)를 문자열로 자동 변환 후 연결
CONCAT단일행 함수와 동일한 기능
❓ CONCAT 함수는?
문자열을 결합할 때 사용되며, 두 개 이상의 문자열을 연결하여 하나의 문자열로 반환합니다. 주로 문자열을 연결하거나 조립할 때 유용합니다.
SELECT CONCAT('Hello', ' ', 'world') AS concatenated_string;
--PDF p64 예제1
SELECT employee_id, last_name||' '||first_name,salary
FROM employees;
--PDF p64 예제1
SELECT '['||department_id||']' AS 부서번호 ,last_name ||'_'|| job_id 성_직무
FROM employees;
다른 프로그래밍 언어와 비교해서 SQL에 없는 struct(구조, 구성요소)
명령형언어와 함수형 언어의 큰 차이 3가지라고도 볼 수 있음.
- 변수가 없음 ->그래서 대입문이없음.
- 제어문(flow control): 분기문, 반복문
- 예외처리
다음주 목요일쯤부터 PL/SQL을 사용 할 예정
PL/SQL = Procedual Language + SQL / SQL을 포함한 함수의 기능
변수선언가능, 반복문도됨, case,expression문도됨,예외처리구조 지원(자바의 try-catch처럼)
SELECT문에서의 행 제한.
where절을 사용해서 반환되는 행을 제한.
후보행을 평가하여 그 결과가 true인 후보행만 허용
재료집합의 모든 행이 후보행으로 평가 될 때 까지 처리
후보행 평가를 위한 조건식 필요. ex) [where condition(s)];
작성시 FROM절다음에 , 컬럼별칭 사용 불가, 그룹 함수 사용불가
where의 null = 90(x) 결과 모르겠다, 90번과 동등비교에 적용 할 수 없다.
where의 null != 90(x) o 모르겠다 90번과 같지않은지 비교에 적용할 수 없다.
--PDF p68 90번 부서에 근무하는 모든사원을 보고
--PDF p68 17000달러를 받는 사원들의 정보를 출럭 사원번호,급여,부서번호로 구성)
문자열 및 날짜/시간 비교
DATE형
대소문자 구별, 날짜(표현)형식 구별
비교연산자
연산자 | 의미 | 괄호를 사용해서 우선 순위규칙을 재정의 할 수 있다! |
= | 같음 | |
> | 보다 큼 | |
>= | 보다 크거나 같음 | |
< | 보다 작음 | |
<= | 보다 작거나 같음 | |
<> | 같지않음 | |
BETWEEN ...AND... | 두 값 사이(경계값 포함) | |
IN(set) | 값 리스트 중 일치하는 값 검색 | |
LIKE | 일치하는 문자 패턴 검색 | |
IS NULL | NULL 값인지 여부 |
1. 대소동등 비교 연산
--PDF p72 코드실행해보기
SELECT last_name, salary
FROM employees
WHERE salary <= 3000;
SELECT last_name, salary
FROM employees
WHERE salary > 'King';
SELECT last_name, salary
FROM employees
WHERE hire_date > '2002/02/01';--1초부터 포함 되는 것 세션의 날짜데이터로
2. BETWEEN...AND... 연산자를 사용하는 범위
--PDF p73 코드실행해보기
--하한과 상한포함
SELECT last_name, salary
FROM employees
WHERE salary BETWEEN 2500 AND 3500;
--WHERE salary>= 2500 AND salary <=3500
SELECT last_name, salary
FROM employees
WHERE last_name BETWEEN 'Hartstein' AND 'King';
SELECT last_name, salary
FROM employees
WHERE hire_date BETWEEN '2002/01/01' AND '2002/12/31';
3. IN (IN으로 바꾸는건 쉬운데 OR로 바꾸는건 오려움)
4. LIKE(퍼센트없이쓰면 그냥 동등기호)
LIKE연산자의 좌우에는 문자열 혹은 문자열로 변환 가능한 타입, 대체문자
%:0개 이상의 아무문자
_:하나의 아무문자
--PDF p75 코드실행해보기
SELECT first_name, last_name
FROM employees
where first_name LIKE'S%';--S로시작되는 이름
SELECT first_name, last_name
FROM employees
where last_name LIKE'_o%';--첫글자가 있고 o가 두번째에 있는이름
SELECT first_name, last_name,salary
FROM employees
where salary LIKE'1%';--연봉이 1로시작되는 사람들
패턴매칭의 경우
--패턴매칭
CREATE TABLE TEST (
NAME VARCHAR(50)
);
INSERT INTO TEST VALUES('AAA');
INSERT INTO TEST VALUES('ABC');
INSERT INTO TEST VALUES('A_A');
INSERT INTO TEST VALUES('B_A');
INSERT INTO TEST VALUES('HEL_O');
SELECT * FROM TEST;
COMMIT;
SELECT *
FROM TEST
WHERE NAME LIKE'_!_A' ESCAPE'!';--아무글자 사이에 밑줄이 있는거
SELECT *
FROM TEST
WHERE NAME LIKE '%_%' ESCAPE '!';--아무글자 사이에 밑줄이 있는거
--WHERE NAME LIKE '\%%' ESCAPE '!';--퍼센트로 시작
--WHERE NAME LIKE '%\' ESCAPE '!'; --퍼센트로 끝나는
--WHERE NAME LIKE '%\%%' ESCAPE '!';퍼센트가 포함된
❓ESCAPE 절
ESCAPE 절은 특수문자를 검색 패턴의 와일드카드로 사용할 때 사용
SQL의 조건식
SQL의 논리
조건식에서는 3VL( Three Valued Logic) 결과는 논리값이 3가지 True, False, NuLL
조건식(Condition)
predicate:결과가 참tru, 거짓false 몰라null 중에 참인 경우만 허용/ 통과 (조건식에서만)
-제약조건을 제외한 WHERE, HAVING, WHEN, CASE수식 등의 조건들은 모드 predicate
Constraint : 결과가 true또는 null이면 허용/통과 (제약조건에서만 적용
NULL값 비교
결과는 무조건 Null/
값의 유무를 판단(값이 없는 상태가 Null)
비교연산자에서 아래 예외를 제외하고 결과는 무조건 NULL
예외 1 IS [NOT] NULL
예외 2 IN의 연산자 멤버값 중 적어도 하나는 NULL이 아닌 경우
--PDF p80 코드실행해보기
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pct IS NULL;--NULL인것만 출력
SELECT last_name, salary, commission_pct
FROM employees
WHERE commission_pct IN(0.1,NULL,NULL);--하나라도 NULL아닌게있으면 NULL아님
논리연산자
연산자 | 의미 |
AND | 두 구성 요소 조건이 모두 참인 경우 TRUE를 반환. |
OR | 구성 요소 중 하나가 참인 경우 TRUE를 반환. |
NOT | 조건이 거짓인 경우 TRUE를 반환. |
진리표
AND | TRUE | FALSE | NULL |
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
OR | TRUE | FALSE | NULL |
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
NOT | TRUE | FALSE | NULL |
FALSE | TRUE | NULL |
연산자 우선 순위 NOT > AND > OR
아래 두가지 제외하고모두 NULL
FALSE AND NULL => FALSE // AND는 둘중에 하나라도 FALSE면 FALSE
TRUE OR NULL => TRUE// // OR은 둘중에 하나라도 TRUE면 TRUE
NULL
값의 부재 : 값 자체가 없는 상태
Unavailable, Inapplicable, Unassigned, Unknown
0도아니고 빈공간도 아니다.
NULL리터럴
INSERT, UPDATE 에서 주로 사용 문자형, 날짜형, 숫자형NULL /문자나 날짜의 경우 "도 가능
NULL의 연산
NULL에 대한 모든 산술 연산에 대한 결과는 NULL.
--PDF p90 코드실행해보기
SELECT last_name, commission_pct, commission_pct+0.1
FROM employees;
SELECT last_name,salary , commission_pct, salary*12*(1+commission_pct) sal_year
FROM employees; -- 연봉이 null값이됨.
NULL에 대한 연결 연산에서는 문자열 없는 것과의 연결이므로 NULL은 어떤 영향도 미치지 못함.
'BackEnd > Sql' 카테고리의 다른 글
[SQL] 중첩 함수 및 NULL 관련 함수 (0) | 2024.05.07 |
---|---|
[SQL] 데이터 타입 및 변환 함수 (0) | 2024.05.07 |
[SQL]단축키 (0) | 2024.05.07 |
[SQL] 날짜 연산과 날짜 함수 (0) | 2024.05.07 |
[SQL] SQL설치 및 Developer사용하기 (0) | 2024.05.02 |