착해지는 중 입니다.

[SQL] 연산자 본문

BackEnd/Sql

[SQL] 연산자

박쓸개 2024. 5. 3. 10:17

데이터 가공:산술 및 연산자

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