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
댓글
댓글 쓰기