9월 4일 SQL 강의 정리 - 연산자

 비교연산 < , >, =, !=, <> , <=, >= 


연산자 


1                   +              5 

피연산자   연산자  피연산자 


자바에서 a++ -> 단항연산자 


int a  =       b > 5     ?        a   :   b ----> 자바에서 삼항연산자 

BETWEEN AND : WHERE 비교대상 BETWEEN 시작값 AND 종료값 


비교대상이 시작값부터 종료값까지의 값을 가지냐? -> 참 -> 그부분 출력

만약 이게 거짓 --> 출력이 없음 


IN : WHERE 비교대상 IN (A, B, ...) 

OR의 의미로 AD이거나  B이거나.....



LIKE : WHERE 비교대상 LIKE '매칭문자열 % _ ' 





NULL 비교 

 

NULL 값은 =, != 등의 비교연산으로 비교가 불가능 

비교연산을 사용할 수가 없다. = 도 비교연산.. !!!!



EX : EMP 테이블에는 comm컬럼의 값이 NULL인 데이터가 존재

comm이 NULL인 데이터를 조회하기 위해 = , != 등이 연산자로 실행할 경우 정상적으로 작동하지 않음 




SELECT *

FROM emp 

WHERE comm IS NULL; 



comm 컬럼값이 null 이 아닐때 =, !=, <>을 사용할 수 있다. 




IN <-----> NOT IN 


사원중 소속 부서가 10번이 아닌 사원 조회 


select * 

FROM emp 

WHERE deptno NOT IN (10) ; 


논리연산 : AND, OR, NOT 


AND, OR : 조건을 결합 


- WHERE 절에 AND 조건을 사용하게 되면 : 보통 행은 줄어든다 

-WHERE 절에 OR 조건을 사용하게 되면 : 보통 행이 더 많다. 



NOT : 부정 연산

다른 연산자와 함께 사용되며 부정형 표현으로 사용됨 


 EX) 과제 : emp 테이블의 사원중에 mgr 가 7698, 7839가 아닌 직원 


SELECT *

FROM emp

where mgr != 7968

AND   mgr != 7839; 


SELECT *

FROM EMP

where mgr NOT IN ( 7668, 7839 );


결론 : IN은 OR 연산자로 대체하는게 가능



WHERE mgr NOT IN (7698, 7839);  

==> mgr != 7698 AND mgr != 7839



NULL


IN 연산자 사용시 NULL 데이터 유의점 


요구사항 : mgr가 7698, 7839, Null 이 아닌 사원만 조회 





SELECT * 

FROM emp 

WHERE mgr IN  ( 7698, 7839, NULL) ; 



WHERE mgr NOT IN ( 7698, 7839);

====> mgr != 7698, AND mgr != 7839



NULL 


IN 연산자 사용시 NULL 데이터 유의점 


NULL 비교는 연산자 + = 이런거로 못한다. 


문제 : NULL 비교는 IS라는 특수 연산자를 이용한다. 


WHERE mgr NOT IN (7698, 7839, NULL); 

---> 해석 : mgr != 7698 AND mgr != 7839 AND mgr != NULL

mgr != NULL 은 항상 false  왜냐면 != 이 연산자가 아니라 is라는 연산자를 사용해야 하기 때문






SELECT *

FROM emp 

WHERE job =  'SALESMAN'


SALESMAN은 데이터라서 대소문자를 구분함 그리고 데이터이기 때문에 ' '이랑 쓰임 


/date 타입에 대한 표현 잘 알아놓기 TO_DATE('1982/01/01', 'YYYY/MM/DD')


. AND와 OR 중에 AND 가 더 우선순위가 높다. 

따라서 


조건 1 OR 조건2 AND 조건3 이면


이걸 실제로 들어가봤을때 AND연산자가 우선이기 때문에 조건1 OR (조건2 AND 조건3 ) 이렇게 조건2와 조건 3 먼저 해줘야한다. 

만약 조건 OR 조건2를 먼저 해주고 싶으면 괄호를 묶어야 한다 




/정렬



아래 SQL의 실행결과, 데이터의 조회 순서는 보장되지 않는다. 

지금은 7369, 7499....조회가 되지만

내일 동일한 SQL을 실행하더라도 오늘 순서가 보장되지 않는다 ( 바뀔 수 있다. ) 

*데이터는 보편적으로 데이터를 입력한 순서대로 나온다 ( 보장은 아님) 

테이블에는 순서가 없다. 

시스템을 만들다 보면 데이터의 정렬이 중요한 경우가 많다. 


게시판 글 리스트 : 가장 최신글이 가장위로 

매우 중요함.

** 즉 SELECT 결과 행의 순서를 조정할 수 있어야 한다. 

==> ORDER BY 구문 



문법


SELECT * 

FROM 테이블명 

WHERE 

             ORDER BY column1, column2 .... 


column1로 정렬이 됬는데 두개가 같을때는 column2로 정렬이 된다. 


오름차순 (ASC) : 값이 작은 순서부터 큰 데이터 순으로 나열

내림차순 (DESC) : 값이 큰 데이터부터 작은 데이터 순으로 나열 


ORACLE에서는 기본적으로 오름차순이 기본 값으로 적용됨. 


내림차순으로 정렬을 원할 경우 정렬 기준 컬럼 뒤에 DESC를 붙여주기 



/참고


1. ORDER BY 절에 별칭 사용 가능 


 EX ) SELECT empno eno, enam enm 

FROM emp 

ORDER BY enm; 


2. ORDER BY 절에 SELECT 절의 컬럼 순서 번호로 간략하게 할 수 있다


SELECT empno, ename 

FROM emp 

ORDER 2 ; --> 의미 : ORDER BY ename 


? by안붙이는건가??


3. EXPRESSION도 가능하다. 

SELECT empno, enma, sal * 500 

FROM emp 

ORDER BY sal * 500 


도 가능하다는 얘기 * sal * 500  을 select 에서 별칭으로 놓고 ORDER BY 에 별칭으로 넣어도 된다. 


SELECT *

FROM emp

WHERE (deptno 10 OR 30)  ------> or를 먼저 연산하려고 

AND sal > 1500

ORDER BY ename DESC;





* 참고 연산자 우선 순위

1. 산술연산자 ( * , /, +, - )

2. 문자열 결합 (|| ) 

3. 비교연산( =, <= , < , >=, > ) 

4. IS, [NOT ] NULL , LIKE, [NOT] IN 

5. [NOT] BETWEEN

6. NOT

7. AND

8. OR 

일반 수학과 마찬가지로 괄호() 를 통해 우선순위를 변경할 수 있다. 



댓글