SQL 헷갈릴 수 있는것.

 SELECT * 

FROM emp 

WHERE mgr IN (7698, 7839, NULL ); 

------> 값이 NULL 인 애는 조회가 되지 않는다. 


얘는 값이 나온다. 근데 NULL인 애는 안나온다 값으로 

SELECT * 

FROM emp 

WHERE mgr NOT IN ( 7698, 7839, NULL ) 

😊


SELECT * 

FROM emp 

WHERE mgr NOT IN ( 7698, 7839 ) ; 

-> 얘는 7698 과 7839 가 아닌애는 나옴 



SELECT * 

FROM emp 

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

----> 아예 값이 안나온다. 

NOT IN 과 NULL 은 값이 안나온다. 



-> 결론 : IN은 OR이기 때문에 NULL이 안들어가는데 


밑에 있는거는 연산에서 어쨋든 NULL이라는 애가 껴서 연산이 시행되고 그랬을때 결과가 안나옴 

SELECT * 

FROM emp 

WHERE mgr NOT IN ( NULL ) ; 






- NOT BETWEEN 이 되네.. 





- order by 는 맨 나중에 실행이 되기 때문에 

select 에 있던 별칭으로 order by 를 해줄 수 있다.  


SELECT empno, ename, sal * 12 salary 

FROM emp 

ORDER BY salary ; 



- SELECT empno, ename, sal * sal salary 

FROM emp 

ORDER BY 2 ; 

두번째에 있는 ename으로 정렬을 한다는뜻이다.  




- SELECT *

FROM dept

ORDER BY loc desc ; 






order by 를 하면 한글 , 소문자, 대문자순으로 정리되는거같아
그리고 알파벳도 abc 가 아니라 거꾸로부터인듯 




- comm 이 존재한다는 것은 0도 아니며 NULL 도 아니어야 한다는 것이다. 

SELECT * 
FROM emp 
WHERE comm is not NULL 
AND comm != '0' ;  

코드로 짜야한다. 









--function 은 WHERE 절에도 사용가능하다.

SELECT * 
FROM emp 
WHERE ename = UPPER('smith'); 

SELECT 
FROM emp 
WHERE LOWER(ename) = 'smith';  



TRIM 함수 문자공백 제거 OR 특정 문자열 제거

TRIM ( '              DD            ' ) 
TRIM (     'D'   FROM ' DORAL' ) 
 


ROUND 반올림함수
TRUNC 내림함수
MOD 나눗셈의 나머지 함수 

 



SELECT ename, sal , TRUNC( sal / 1000 ) SAL_Quotient , 
MOD ( sal, 1000 ) SAL_Reminder
FROM emp ; 



date FORMAT 
YYYY : 4자리 년도 
MM : 2자리 월 
DD : 2자리 일자 
D : 주간 일자 ( 1 ~ 7 ) 
IW : 주차 ( 1 ~ 53 ) 
HH, HH12 : 2자리 시간 ( 12시간 표현 ) 
HH24 : 2자리 시간 ( 24시간 표현 ) 
MI : 2자리 분 
SS 2자리 초 


조회해보기 
SELECT ename , 
TO_CHAR(hiredate, 'yyyy/mm/dd hh24 : mi : ss' ) hiredate , 
TO_CHAR(hiredate + 1 , 'yyyy/mm/dd hh24 : mi : ss' ) hiredate_addD ,
TO_CHAR(hiredate + 1/24, 'yyyy/mm/dd hh24 : mi : ss' ) hiredate_addH ,
TO_CHAR('20191010' , 'yyyymmdd' ) todate 
FROM emp 
WHERE ename = 'SMITH' ; 


날짜조작 함수 ( ROUND, TRUNC ) 


SELECT TO_CHAR ( hiredate, 'YYYY-MM-DD HH24:MI:SS') hiredate , 
ROUND ( hiredate , 'YYYY' ) round_yyyy ,
이거는 년도의 그 다음에인 mm에서 반올림이 된다. 
따라서 hiredate 가 1980-12-17 이었으면 
12에서 반올림이 되서 1981 - 01- 01 이렇게 달이랑 데이는 초기화가된다. 
ROUND(hiredate, 'MM' ) round_mm , 
이거는 mm이니까 그 다음에 있는 dd  데이에서 반올림이되서 
1981-01 - 01 데이에서 반올림해서 12월에 영향을 주고 그게 1981 이 되게 되겠지? 
ROUND ( hiredate, 'DD' ) round_dd 
얘는 날짜 다음에 나오는 시간에서 반올림이 되는데 시간이 00:00:00 이기떄문에
변화가 없다. 
FORM dual; 


148P 
SELECT TO_CHAR(hiredate, 'YYYY-MM-DD HH24 : MI : SS ' ) hiredate ,
TRUNC ( hiredate , 'YYYY' 




149 P 
날짜 조작함수. 
날짜 조작 : 
MONTHS_BETWEEN( DATE, DATE ) 
두날짜 사이의 개월수 

ADD_MONTHS(DATE, NUMBER ) 
NEXT_DAY(DATE, weekday) 
LAST_DAY(DATE) 



154p
SELECTL LAST_DAY(TO_DATE('201912' , 'yyyy/mm' ) ) 
FROM dual; 








SELECT ename, job, sal , 
CASE 
    WHEN job = 'SALESMAN' THEN sal * 1.05 
    WHEN job = 'MANAGER' THEN sal * 1.10 
    WHEN job = 'PRESIDENT' THEN sal * 1.20 
    ELSE sal * 1 
    END bonus 
FROM emp ;




decode 

SELECT ename, job, sal , DECODE ( job, 'SALESMAN' , sal*1.05 , 
                                       'MANAGER' ,  sal*1.10 , 
                                       'PRESIDENT', sal*1.20 , 
                                         sal*1 ) bonus 

FROM emp ; 
FROM dual ; 





못푼문제 :  condition 실습 cond2 , condition 실습 cond3 


-GROUP BY column 
* HAVING 그룹바이컬럼 조건

그룹함수쓰면 거기 쓴 컬럼을 select 절에 쓸수있고 다른 컬럼은 못오는데 거기에 그룹함수로
묶은 컬럼은 올 수 있다. 
그룹 펑션 : AVG, COUNT, MAX , MIN, SUM 




WHERE 절에 그룹함수를 조건으로 사용할 수 없다. 

WHERE sum(sal ) > 3000 (x) 
HAVING sum(sal) > 3000 ( o ) 






순서
SELECT
FROM 
WHERE
GROUP BY 
HAVING 
ORDER BY 



195 P 답 확인해보기 

SELECT 
DECODE ( deptno ,  10 , 'ACCOUNTING' 
                ,   20   , 'RESEARCH'
                ,    30  , 'SALES' -- default 값 안써줘도 되는건가? ) dname     
 , MAX(sal) , MIN(sal) , ROUND (AVG(sal) , 2), SUM(sal), 
COUNT(sal) , COUNT(mgr) , COUNT(*) count_all
FROM emp 
GROUP BY deptno 
ORDER BY deptno



서브쿼리에서의 NULL : not IN 

관리자가 아닌 사원 정보 조회 
NOT IN 연산자 사용시, 서브쿼리의 결과에 NULL 이 존재할 경우 값이 안나온다.. 
전체가 NULL인 것처럼 동작한다. 




SELECT * 
FROM emp
WHERE empno NOT IN (SELECT mgr 
                                 FROM emp ) ; 

NULL : IN 

관리자인 사원 정보 조회


SELECT * 
FROM emp 
WHERE empno IN ( SELECT mgr 
                           FROM emp )



- 실습 SUB 5 , SUB 6  SUB 7 SUB 9 SUB 10 

SELECT * 

FROM  emp e

WHERE exists ( SELECT * 

            FROM emp m 

            WHERE null = m.empno ) ; 


이거 조회 안되는건가?? 



----  union 이랑 union all 두개를 한번 조회해보기 295 p 















































댓글