select (sysdate)
from dual;
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--오늘날짜 조회
select sysdate, systimestamp
from dual;
select add_months(sysdate, -6), add_months(sysdate, 18)
from dual;
select months_between(sysdate, add_months(sysdate, -6))
from dual;
select last_day(sysdate)
from dual;
--입사한 달의 근무일수(토, 일, 공휴일에도 근무가정)
--날짜 -날짜의 데이터 타입은 숫자
select ename, hiredate, last_day(hiredate), last_day(hiredate)-hiredate
from emp
where deptno=10
order by hiredate asc ;
--비교 : 날짜데이터대상의 trunc(날짜데이터, FMT), round(날짜데이터, FMT)
--trunc함수는 FMT에 지정된 단위로 절삭
--round함수는 FMT가 년도라면 년도단위로 반온림
--FMT가 생략되면 날짜를 가장 가까운 날짜로 반올림
--FMT: YEAR,MONTH,DD 등=>P141 날짜변환형식 참고)
select trunc(123.456), trunc(456.78) from dual;
select round(123.456, -2), round(123.456, -1),
round(123.456, 0), round(123.456, 1)
from dual;
--trunc 와 lastday는 반대 개념
select sysdate, trunc(sysdate, 'month'), trunc(sysdate, 'day'),
trunc(systimestamp, 'month'), trunc(systimestamp, 'day'),
to_char(trunc(systimestamp, 'month'), 'YYYY.MM.DD / HH24:MI:SS'), to_char(trunc(systimestamp, 'day'), 'YYYY.MM.DD / HH24:MI:SS')
from dual;
select sysdate, round(sysdate, 'month'), round(sysdate, 'day'),
round(systimestamp, 'month'), round(systimestamp, 'day'),
to_char(round(systimestamp, 'month'), 'YYYY.MM.DD / HH24:MI:SS'), to_char(round(systimestamp, 'day'), 'YYYY.MM.DD / HH24:MI:SS')
from dual;
-- * TABLE삭제 => auto commit되므로 주의.
문법> Drop table 테이블명;
--scott의 bonus, emp, dept, salgrade 제외하고 전부 삭제
Drop table ctest;
Drop table dtest;
Drop table emp1;
Drop table emp10;
Drop table emp2;
Drop table emp20;
Drop table empetc;
Drop table istest;
Drop table ntest;
Drop table test;
p176
--join
select 컬럼명 [AS] 별칭, 컬럼명 AS 별칭
from 테이블명 별칭, 테이블명 별칭
[where 조건];
--사원번호, 사원명, 업무, 부서번호 조회 (부서 번호로 오름차순 정렬)
select empno, ename, job, deptno
from emp
order by deptno asc;
--부서번호, 부서명 조회 (부서 번호로 오름차순 정렬)
select deptno, dname
from dept
order by deptno asc;
--deptno 양쪽 테이블 모두에 있어서 애매한 상황
-- 1 select empno, ename, job, deptno, dname
-- 2* from emp, dept
--SQL> /
--select empno, ename, job, deptno, dname;
-- *
/*
ERROR at line 1:
ORA-00918: column ambiguously defined
*/
--deptno를 지워버리면 결과는 나온다.그런데 ... 정확하지 않다...크로스조인 되어 데이터가 이상하다.
--CROSS JOIN, CATASIAN PRODUCT(p184)
--join조건을 명시하지 않는 조인
select empno, ename, job, dname
from emp, dept; --사원 .12개행*부서.5개의행 => 60개의 행 이것이 크로스 조인
--equi join(동등조인 p176)
--where절에 =(동등기호)를 이용하여 join 조건을 명시
--where 사원 테이블의 부서번호 부서테이블의 부서번호 컬럼의 값이 같다.
--이 구절을 써줘야 제대로 출력된다.
select empno, ename, job, dname
from emp, dept
where emp.deptno = dept.deptno; --12개의 행이 리턴.
--equi조인은 조인조건에 사용되는 값들이 서로 일치=하는 데이터만 select
--즉 여기에서는 사원테이블에 부서번호가 null인 사원은 select 되지 않는다.
--즉 소속부서가 확정되지 않은 사원은 제회 => 소속부서가 명확한 사원만 select
select empno, ename, job, dname
from emp, dept
where emp.deptno = dept.deptno
and
emp.deptno is not null;
--사원번호가 9000이상인사원 삭제후 commit;
delete from emp
where empno like '9%';
--where empno>=9000;
commit;
--부서테이블에서 부서번호가 91이상인 부서삭제후 commit;
delete from dept
where deptno>=91;
commit;
/*
select 테이블명.empno, 테이블명.ename, 테이블명.job,
테이블명.부서번호, 테이블명.dname
from emp, dept
where emp.deptno = dept.deptno;
*/
--에러 : column ambiguously defined 발생
--해결방법 : 조회하는 컬럼의 소속테이블명을 명시하면 된다.
select emp.empno, emp.ename, emp.job,
dept.deptno, dept.dname
from emp, dept;
where emp.deptno = dept.deptno;
--테이블에 별칭을 부여하여 쿼리는 간단, 소속분명, 이해도 향상
select e.empno, e.ename, e.job,
d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno;
--from절에 서브쿼리(subquery) 가 들어가면 inline view
--select e.empno, e.ename, e.job, 테이블명.컬럼명, 별칭.컬럼명
-- d.deptno, d.dname
--from emp e, dept d (select 컬럼명, 컬럼명 from 테이블명) 별칭
--where e.deptno = d.deptno;
-- 10번 또는 20번 부서에 근무하는 사원번호, 사우너명, 급여, 부서번호, 부서명을
-- 부서명 오름차순 정렬하여 조회
select e.empno, e.ename, e.sal, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno and d.deptno in (10, 20) --조인문 조건 써줘야 한다 ! 무조건!! 카타시안 프로덕트 및 크로스조인 방지!
order by d.dname asc;
--where (e.deptno=10 or e.deptno=20) and e.deptno = d.deptno --> 이렇게 써도 무관. 문법은 무궁무진
/*
급여가 1600이상인 사원번호, 사원명, 급여,부서번호, 부서명을
급여를 많이 받는 사원부터 출력 -->내림차순
이때, 급여가 확정된 사원에 한함
*/
select e.empno, e.ename, e.sal, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno and e.sal>=1600 and e.sal is not null
order by e.sal desc;
--사번, 사원명, 부서번호, 부서명을 부서번호, 오름차순
select e.empno, e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno
order by d.deptno asc;
--natural join
--문법> from 테이블명1 natural join 테이블명2
--주의> natural join에 사용된 컬럼의 소속테이블은 명시하면 안된다.
--해결방법> 컬럼명만 명시하자
--예시> d.deptno가 아닌 deptno;
--예시> order by d.deptno가 아닌 order by deptno;
--공통된 컬럼에 대해서 소속을 넣으면 안된다.
select e.empno, e.ename, deptno, d.dname
from emp e natural join dept d
order by deptno;
--join using()
--문법> from 테이블명1 join 테이블명2 using(join사용컬럼)
--column part of USING clause cannot have qualifier
--주의> join에 사용된 컬럼의 소속테이블은 명시하면 안된다.
--해결방법> 컬럼명만 명시하자
--예시> d.deptno가 아닌 deptno;
--예시> order by d.deptno가 아닌 order by deptno;
--이 것 또한 사용된 컬럼의 소속테이블은 명시하면 안된다.
select e.empno, e.ename, deptno, d.dname
from emp e join dept d using(deptno)
order by deptno;
--join on
--column ambiguously defined
-->얘는 사용 컬럼 명시를 따로 안하기 때문에 소속을 적어줘야하는듯?e.d.다 된다.
-- order by 절은 소속 명시 안해도 된다.
-- 주의. 테이블명(소속) 명시하자!
select e.empno, e.ename, d.deptno, d.dname
from emp e join dept d on e.deptno = d.deptno
order by d.deptno;
--ANSI 조인(p184)
--join on(p184)
--문법>테이블명 [INNER] JOIN 테이블명 ON 조인조건
--column ambiguously defined
-- 주의. 테이블명(소속) 명시하자!
select e.empno, e.ename, d.deptno, d.dname
from emp e INNER join dept d on e.deptno = d.deptno
order by d.deptno;
--9000, 이순신, DBA, 오늘입사, 급여 7000, 부서 미확정
insert into emp(empno, ename, job, hiredate, sal)
values(9000, '이순신', 'DBA', sysdate, 7000);
commit;
--where절 추가!!(+)왼쪽
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e, dept d
where e.deptno(+) = d.deptno; -->부서쪽이 다 출력된다.부서번호가 다 나와야 하니까 나머지 컬럼에 널을 추가해가면서까지 출력된다.
--안시외부조인
--where e.deptno(+) = d.deptno; 과 동일한 결과 (외부조인!!OUTER 생략가능)
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e RIGHT OUTER join dept d on e.deptno = d.deptno; --> 오른쪽에 있는 테이블이 다 출력 (위와 동일)
--where절 추가!!(+)오른쪽
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno(+); -->사원쪽이 다 출력된다.사원쪽정보가 다 나와야 하니까 부서쪽 나머지 컬럼에 널을 추가해가면서까지 출력된다
--안시외부조인
--where e.deptno = d.deptno(+); 과 동일한 결과 (외부조인!!OUTER 생략가능)
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e LEFT OUTER join dept d on e.deptno = d.deptno; --> 왼쪽쪽에 있는 테이블이 다 출력 (위와 동일).
--에러발생
--a predicate may reference only one outer-joined table
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e, dept d
where e.deptno(+) = d.deptno(+); -->+는 아우터 조인인데 이것은 오직 한쪽에만 조인 가능(+)쓰는 문법은 무조건 이렇게.
--안시 아우터 조인만 가능.
select e.empno, e.ename, e.job, d.deptno, d.dname
from emp e FULL OUTER join dept d on e.deptno = d.deptno; --> 양쪽 다 + 하는것은 FULL로 명시해야한다.여전히 OUTER 생략가능
-- NON-EQUI JOIN 조인
--사번, 사원명, 급여, 급여등급 조회
select e.empno, e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal BETWEEN s.losal AND s.hisal;
--where e.sal >= s.losal AND e.sal <= s.hisal; --같은결과
--self join(p180)
--동일한 테이블을 사용해 조인하는 방법
select e1.empno, e1.ename, e1.mgr, e2.empno, e2.ename
from emp e1, emp e2
where e1.mgr = e2.empno;
--이것도 된다.
--select e1.empno, e1.ename, e1.mgr, e2.empno, e2.ename
--from emp e1 join emp e2
--on e1.mgr = e2.empno;
/*
subquery(서브쿼리 p191)
:서브쿼리란 SQL문장안에서 보조로 사용되는 또 다른 select문을 의미
*/
/
select 컬럼명1,...컬럼명N [AS alias]
from 테이블명 별칭, 뷰명,
~
[where 조건]
[group by 그룹기준]
[having 그룹기준 조건]
[order by 정렬기준 방법]
*/
--20번 부서에 근무하는 사번, 사원명, 급여, 부서번호 조회
select empno, ename, sal, deptno
from emp
where deptno = 20;
--SMITH가 근무하는 부서번호는?
select ename, deptno
from emp
where ename = 'SMITH';
--SMITH와 동일부서에 근무하는 부서번호, 사번, 사원조회(서브쿼리 사용)
select deptno, empno, ename
from emp
--where ename = 'SMITH' or deptno = 20; -->이건 결과는 같은데 ... 서브쿼리 사용 의도에 맞지 않는 구문
where deptno = (select deptno from emp where ename = 'SMITH');
--FORD와 같은 일을 하는 사번, 사원명, 업무 조회-> 1명밖에 없다.
select empno, ename, job
from emp
where job = (select job from emp where ename = 'FORD');
--TURNER와 같은 일을 하는 사번, 사원명, 업무 조회
select empno, ename, job
from emp
where job = (select job from emp where ename = 'TURNER');
--TURNER가 받는 급여보다 많이 받는 사번, 사원명, 급여 조회
--> 해석하면 1500보다 많이 받는 사람 조회
select empno, ename, sal
from emp
where sal > (select sal from emp where ename = 'TURNER')
order by sal asc;
--전체사원들의 평균급여 이상을 받는 사번, 사원명, 업무 조회
--사번, 사원명, 업무조회
--1. 전체사원들의 평균급여를 조회
select avg(sal)
from emp;
select empno, ename, job, sal
from emp
where sal >= (select avg(sal) from emp);
--TURNER와 같은 일을 하는 사원들의 평균급여 이상을 받는 사번, 사원명, 업무 조회
--TURNER가 하는일 조회
--사원명이 TURNER인 업무 조회
select job
from emp
where ename='TURNER';
--TURNER와 같은일을 하는 사원들의 평균급여
-- =>job이 salesman 사원들의 평균급여
select avg(sal)
from emp
where job = 'SALESMAN'; --1400
--사원들의 평균급여 조회
select empno, ename, job, sal
from emp
where 급여가 (평균급여)이상
where 급여가 (1400) 이상
where sal>=(select AVG(sal)
from emp
where job ='SALESMAN');
select empno, ename, job, sal
from emp
where sal >= (select avg(sal) from emp where job = (select job from emp where ename = 'TURNER'))
order by sal asc;
--위의 결과에 부서명을 추가하여 출력하시오
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e, dept d
where sal >= (select avg(sal) from emp where job = (select job from emp where ename = 'TURNER')) and e.deptno = d.deptno
order by sal asc;
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e, dept d
where sal >= (select avg(sal) from emp e1 where e1.job = (select e2.job from emp e2 where e2.ename = 'TURNER')) and e.deptno = d.deptno
order by sal asc;
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e, dept d
where sal >= (select avg(sal) from emp where job = (select job from emp where ename = 'TURNER')) and e.deptno = d.deptno(+)
order by sal asc;
select e.empno, e.ename, e.job, e.sal, d.dname
from emp e LEFT OUTER join dept d on e.deptno = d.deptno
where sal >= (select avg(sal) from emp where job = (select job from emp where ename = 'TURNER'))
order by sal asc;
=================연습 텍스트=====================================================================
/* 조회문법
SELECT { * | 컬럼명 [AS] alias}
FROM 테이블명
[WHERE 조건]
[GROUP BY 그룹기준1,..그룹기준N]
[HAVING 그룹조건]
[ORDER BY 정렬기준1 정렬방법,.. 정렬기준N 정렬방법];
-- 입력문법
INSERT INTO 테이블[(컬럼명,..컬럼명)]
VALUES(값,..값);*/
SELECT * FROM dept;
-- 제약조건사전의 구조확인
DESC USER_CONSTRAINTS;
-- 제약조회
SELECT constraint_name, constraint_type, table_name
FROM USER_CONSTRAINTS;
-제약조건
1)not null : null허용x=>값을 넣어라. 필수입력
2)unique : 유일한 값=>중복허용x
Primary key:pk.식별키. nn+unique이면서 테이블대표, 각 레코드를 구분
-- 주의 : 컬럼타입(문자&날짜는 '')
컬럼크기(숫자&영문 1글자는 1byte,
여기에서는 한글1글자는 3byte(한글은 encoding설정에 따라 달라짐))
INSERT INTO dept(deptno, dname, loc)
VALUES(95,'부서96','경주'); --unique constraint(SCOTT.PK_DEPT) violated
INSERT INTO dept(deptno, dname, loc)
VALUES(196,'부서96','경주');
-- value larger than specified precision allowed for this column
INSERT INTO dept(deptno, dname, loc)
VALUES(96,'최고로잘나가는개발부96','경주');
--value too large for column "SCOTT"."DEPT"."DNAME"(actual:32,maximum:14)
INSERT INTO dept(deptno, dname, loc)
VALUES(96,'최강개발96','경주');
--null입력 => 제약조건에 주의
1)명시적 null입력
2)묵시적 null입력
INSERT INTO dept(deptno, dname, loc)
VALUES(null,null,'');
--cannot insert NULL into ("SCOTT"."DEPT"."DEPTNO")
--1)명시적 null입력
INSERT INTO dept(deptno, dname, loc)
VALUES(97,null,'');
-- commit하여 db에 DML작업내용을 반영
commit;
2)묵시적 null입력 : 명시한 컬럼명에 값을 넣어준다.명시하지않은 컬럼에는 null입력
INSERT INTO dept(deptno)
VALUES(98);
-- 테이블의 모든 컬럼에 value를 넣을 때에는 컬럼명생략 가능
INSERT INTO dept
VALUES(99,'디자인부','인제');
commit;
SELECT * FROM DEPT;
desc emp
-- 9000,이순신,보안,7839
INSERT INTO EMP(empno,ename,job,mgr)
VALUES(9000,'이순신','보안',7839);
-- 문자&날짜는 ''작은따옴표
-- 9001,김구,기획,오늘입사,6000,3000
INSERT INTO EMP(empno,ename,job,hiredate,sal,comm)
VALUES(9001,'김구','기획','2022/11/23',6000,3000);
-- 9002,장보고,어제입사,상사는이순신
INSERT INTO EMP(empno,ename,hiredate,mgr)
VALUES(9002,'장보고','2022/11/21',9000);
-- 9003,단군,2일전 입사
INSERT INTO EMP(empno,ename,hiredate)
VALUES(9003,'단군',sysdate-2);
select * from emp order by empno desc;
-- 현재 날짜 조회
-- 날짜+-숫자 => 날짜타입 리턴
select sysdate-1, sysdate, sysdate+(24/24)
from dual;
*형변환함수(p140)★★★★★
to_number(문자) : 문자->숫자
to_char(숫자,'숫자format'): 숫자->문자,
to_char(날짜,'날짜시간format'): 날짜->문자
to_date(문자,'날짜시간format') : 문자->날짜
to_timestamp(문자,'날짜시간format') : 문자->날짜
*to_char( 날짜,'format' )
날짜시간FORMAT(P141)
YY YYYY:년도
MM MON MONTH:월
D DD DDD:일
HH HH24:시
MI:분
SS:초
select sysdate as 현재, TO_CHAR(SYSDATE,'YYYY-MONTH-DD')
from dual;
select sysdate as 현재,
TO_CHAR(sysdate+(1/24),'YYYY.MON.DD HH24:MI:SS') as "1시간뒤",
TO_CHAR(sysdate+(1/(24*60)),'YYYY.MON.DD HH24:MI:SS') as "1분뒤"
from dual;
select sysdate as 현재,
TO_CHAR(sysdate,'YYYY MM DD DDD HH24 AM')
FROM DUAL;
select sysdate as 현재,
TO_CHAR(sysdate,'YYYY"년" MONTH DD"일"')
FROM DUAL;
select ename,sal,comm,nvl(comm,300),nvl2(comm,sal*2.5,300)
from emp;
select ename,
sal,
comm,
nvl(comm,300),
to_char(sal_13+nvl2(comm,sal_2.5,300),'999,999.99') as "연봉1",
to_char(sal_13+nvl2(comm,sal_2.5,300),'000,000.00') as "연봉2"
from emp;
연봉 = sal_13+커미션
커미션=기존급여의 250% sal_2.5
이때 커미션이 미확정되었으면 300
-- to_number(문자) : 문자->숫자
SELECT TO_NUMBER('100')*99
FROM DUAL;
SELECT empno,ename,sal from emp
where sal=800; --0초
SELECT empno,ename,sal from emp
where sal='800'; --0.002초
SELECT empno,ename,sal from emp
where sal=to_number('800'); --0.001초
SELECT empno,ename,sal from emp
where to_char(sal)='800';--0.001초
to_date(문자,'날짜시간format') : 문자->날짜
to_timestamp(문자,'날짜시간format') : 문자->날짜
-- 오라클에 이미 설정된 형식에 따라 날짜가 출력된다
-- 여기에서는 YY/MM/DD => 80/11/23
select to_date('801123','YYMMDD') from dual;
=> 80.11.23 오후 형식으로 출력하시오
SELECT to_char(to_date('801123','YYMMDD'),'YY.MM.DD PM') from dual;
SELECT to_char(sysdate,'YY.MM.DD') from dual;
SELECT to_char(hiredate,'YY.MM.DD HH24:MI:SS') from emp;
-- 밀리세컨드는 FF자리수로 표현
select to_timestamp('801123 01:30:59:12345',
'YYMMDD HH24:MI:SS:FF6') from dual;
++++++++++++++++++++++++++++++++++++
*수정
UPDATE 테이블명
SET 컬럼명=새값, 컬럼명=새값
[where 조건];
COMMIT;
-- 99번 부서를 정동진으로 변경
UPDATE DEPT
SET LOC='정동진'
WHERE DEPTNO=99;
-- 광주소재의 부서명을 인사부로 변경
UPDATE DEPT
SET DNAME='인사부'
where LOC='광주';
-- 부서명에 92가 포함된 부서의 이름을 회계부로 변경하고 울릉도로 이사
UPDATE DEPT
SET DNAME='회계부', LOC='울릉도'
where DNAME LIKE '%92%';
-- 부서번호가 90이상이면서
부서명에 %가 포함된 부서의 이름을 영업부로, 독도로 변경
UPDATE DEPT
SET DNAME='영업부', LOC='독도'
where DEPTNO>=90 AND DNAME LIKE '%@%%' ESCAPE '@';
-- 부서명이 확정되지 않은 부서는 개발부이고 대전에 위치하시오
UPDATE DEPT
SET DNAME='개발부', LOC='대전'
where DNAME IS NULL;
98인 부서는 소재지가 미확정으로 다시 조정되었다
UPDATE DEPT
SET LOC=''
where DEPTNO=98;
--94번 부서 BYE~~
DELETE FROM DEPT
where DEPTNO=94;
SELECT * FROM DEPT ORDER BY DEPTNO DESC;
/삭제
DELETE [FROM] 테이블명
[where 조건]/
COMMIT;
*table생성
CREATE TABLE 테이블명(
컬럼명 데이터타입,
컬럼명 데이터타입(크기) [CONSTRAINT 제약조건명][제약조건],
컬럼명 데이터타입(크기) [DEFAULT 값] [CONSTRAINT 제약조건명][제약조건]
)[TABLESPACE 테이블스페이스명];
*문자데이터타입
CREATE TABLE ctest(
c1 CHAR(15),
vc1 VARCHAR2(15)
);
INSERT INTO ctest(c1,vc1) values('abc123','abc123');
INSERT INTO ctest(c1,vc1) values('가나','가나');
INSERT INTO ctest(c1,vc1) values('char타입','varchar2타입');
commit;
select c1||vc1 from ctest;
select vc1||c1 from ctest;
*숫자데이터타입
create table ntest(
n1 number,
n2 number(7),
n3 number(7,2)
);
select * from ntest;
insert into ntest values(50/3,50/3,50/3);
insert into ntest values(500/3,500/3,500/3);
insert into ntest values(5000/3,5000/3,5000/3);
insert into ntest values(50000/3,50000/3,50000/3);
insert into ntest values(500000/3,500000/3,500000/3); --에러
*날짜데이터
create table dtest(
d1 date,
d2 timestamp
);
insert into dtest values(sysdate, sysdate);
select * from dtest;
++++++++++++++++++++++++++++++++
p98
INSERT~ SELECT문
INSERT INTO [스키마.]테이블명 (컬럼1, 컬럼2, …)
SELECT 컬럼명,컬럼명
from 테이블명;
● VALUES 절과 함께 값을 일일이 명시하는 대신 SELECT 문을 사용
● 테이블명 다음 컬럼 순서와 SELECT 다음의 컬럼 순서, 타입이 맞아야 함
● 테이블명 다음 컬럼 리스트를 생략할 경우 이 테이블의 모든 컬럼에 값을 넣는다는 의미
create table istest(
eno number(6),
ename varchar2(15),
salary number(7,2)
);
-- 급여가 3000이상되는 사번,사원명,급여 조회
INSERT INTO scott.istest(eno,ename,salary)
select empno,ename,sal
from emp
where sal>=3000;
select eno,ename,salary from scott.istest;
++++++++++++++++++++++++++++++++
p113
*CASE 표현식
CASE WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
…
ELSE 기타값
END;
select ename,empno,sal,
CASE WHEN SAL>=6000 THEN 'A등급'
WHEN sal>=3000 THEN 'B등급'
WHEN sal>=2000 THEN 'C등급'
ELSE '기타등급'
END AS salgrade
from emp
order by sal desc;
-- 자바의 조건여러개있는 else if else문
if(조건1 score>=90){
조건1만족실행코드 "A학접"
}else if(조건2 score>=80){
조건2만족실행코드 "B학점"
}else if(조건n SCORE>=70){
조건n만족실행코드 "C학점"
}else{
모든조건만족x실행코드 "F"
}
++++++++++++++++++++++++++++++++
p114
*조건식 ANY,(SOME은 ANY와 동일하게 사용 및 동작), ALL
SELECT 컬럼명
FROM 테이블명
WHERE 조건;
-- 급여가 2000이거나 3000이거나 5000인 사원명,급여 조회
select ename,sal
from emp
where sal=2000 or sal=3000 or sal=5000;
select ename,sal
from emp
where sal in(2000, 3000, 5000);
-- 아래에서는 2000이상이거나 3000이상 혹은 5000이상 조건
-- => 최저 2000이상이 되는 의미 조건
select ename,sal
from emp
where sal >=any(2000, 3000, 5000);
select ename,sal
from emp
where sal >=some(2000, 3000, 5000);
--급여가 2000이상 and 급여가 3000이상 and 급여가 5000이상
=> 급여가 가장 큰 5000이상
select ename,sal
from emp
where sal >=all(2000, 3000, 5000);
-- 급여 2000 미만 조건
select ename,sal
from emp
where sal <all(2000, 3000, 5000);
-- 급여가 5000미만
select ename,sal
from emp
where sal <any(2000, 3000, 5000);
-- 입사일이 81/02/20 이거나
입사일이 81/04/20 혹은
입사일이 81/09/28인 사원명,입사일을
입사일이 빠른 사원부터 조회
select ename,hiredate
from emp
where hiredate in('81/02/20','81/04/20','81/09/28')
order by hiredate asc;
-- 입사일이 81/09/28(포함)이전에 입사한 사원조회
select ename,hiredate
from emp
where hiredate <=any('81/02/20','81/04/20','81/09/28')
order by hiredate asc;
++++++++++++++++++++++++++++++++
p247
*다중테이블 insert
*조건이 없는 다중테이블 insert all=> unconditional INSERT ALL
INSERT ALL
INTO 테이블 VALUES(컬럼명,..,컬럼명)
INTO 테이블 VALUES(컬럼명,..,컬럼명)
서브쿼리;
create table emp1(
eno number(6), --사원번호
ename varchar2(30), --사원명
pay number(10) --급여
);
create table emp2(
eno number(6), --사원번호
task varchar2(30), --업무
dno number(6) --부서번호
);
select * from emp1;
select * from emp2;
INSERT ALL
INTO emp1 VALUES(EMPNO,ENAME, SAL)
INTO emp2 VALUES(EMPNO,job,deptno)
SELECT EMPNO,ENAME, SAL, job, deptno
FROM EMP;
SELECT * FROM EMP1;
create table emp10(
eno number(6), --사원번호
ename varchar2(30), --사원명
payM number(10), --월급여
payY number(20), --년봉
dno number(2) --부서번호
);
create table emp20(
eno number(6), --사원번호
ename varchar2(30), --사원명
payM number(10), --월급여
payY number(20), --년봉
dno number(2) --부서번호
);
create table empetc(
eno number(6), --사원번호
ename varchar2(30), --사원명
payM number(10), --월급여
payY number(20), --년봉
dno number(2) --부서번호
);
select * from emp10; --3행입력
select * from emp20; --3행입력
select * from empetc;--6행입력
_조건이 있는 다중테이블입력=> conditional INSERT ALL
INSERT ALL
WHEN deptno=10 THEN
INTO emp10 VALUES(empno, ename, sal, sal_13,deptno)
WHEN deptno=20 THEN
INTO emp20 VALUES(empno, ename, sal, sal_13,deptno)
ELSE
INTO empetc VALUES(empno, ename, sal, sal_13,deptno)
SELECT empno, ename, sal, sal*13, job, deptno
FROM EMP
WHERE deptno=10 or deptno=20 or deptno=30;
--EMP10의 모든 데이터를 삭제
DELETE FROM EMP10;
--EMP20의 모든 데이터를 삭제
DELETE FROM EMP20;
--EMPETC의 모든 데이터를 삭제
DELETE FROM EMPETC;
SELECT * FROM EMP10; --1행입력
SELECT * FROM EMP20; --9행입력
SELECT * FROM EMPETC;--2행입력
INSERT ALL
WHEN sal>=3001 THEN
INTO emp10 VALUES(empno, ename, sal, sal_13,deptno)
WHEN sal BETWEEN 1000 AND 3000 THEN
INTO emp20 VALUES(empno, ename, sal, sal_13,deptno)
ELSE
INTO empetc VALUES(empno, ename, sal, sal_13,deptno)
SELECT empno, ename, sal, sal_13, job, deptno
FROM EMP
WHERE deptno=10 or deptno=20 or deptno=30;
_conditional INSERT FIRST
INSERT FIRST
WHEN sal>=3000 THEN
INTO emp10 VALUES(empno, ename, sal, sal_13,deptno)
WHEN sal>=2000 THEN
INTO emp20 VALUES(empno, ename, sal, sal_13,deptno)
ELSE
INTO empetc VALUES(empno, ename, sal, sal_13,deptno)
SELECT empno, ename, sal, sal*13, job, deptno
FROM EMP
WHERE deptno=10 or deptno=20 or deptno=30;
SELECT * FROM EMP10; --2행입력
SELECT * FROM EMP20; --3행입력
SELECT * FROM EMPETC;--7행입력
INSERT ALL
WHEN sal>=3000 THEN
INTO emp10 VALUES(empno, ename, sal, sal_13,deptno)
WHEN sal>=2000 THEN
INTO emp20 VALUES(empno, ename, sal, sal_13,deptno)
ELSE
INTO empetc VALUES(empno, ename, sal, sal_13,deptno)
SELECT empno, ename, sal, sal_13, job, deptno
FROM EMP
WHERE deptno=10 or deptno=20 or deptno=30;
SELECT * FROM EMP10; --2행입력 3000 5000
SELECT * FROM EMP20; --5행입력 3000 5000
SELECT * FROM EMPETC;--7행입력
-- 테이블삭제
drop table 테이블명;
++++++++++++++++++++++++++++++++++++++++++++++++
*함수(4장)
-내장함수
-사용자정의 함수=>PL/SQL
-암묵적함수
-명시적함수
-문자함수(P130)
-숫자함수
-날짜함수
*데이터타입
-문자
-char
-varchar2
-숫자
-number
-날짜
-date
-문자함수(P130)
select initcap('apple banana'),
lower('apple baNANa'),upper('apple banana')
from dual;
*p131
SUBSTR(char, pos, len) : ★★★★★
char의 pos번째 문자부터 len 길이만큼 잘라낸 결과를 반환
pos이 0이 오면 디폴트값인 1, 즉 첫번째 문자를 가르킨다
posdl 음수이면 뒤에서부터 시작,즉 -1이면 가장 마지막 글자의 위치를 의미.
len을 생략하면 문자열의 끝까지 추출한다는 의미
SELECT SUBSTR('I have Big DREAM',0,1), --I
SUBSTR('I have Big DREAM',1,1), --I
SUBSTR('I have Big DREAM',0,5), --I hav
SUBSTR('I have Big DREAM',1,5), --I hav
SUBSTR('I have Big DREAM',3), --have Big DREAM
SUBSTR('I have Big DREAM',-1),--M
SUBSTR('I have Big DREAM',-3) --EAM
FROM DUAL;
*p137
INSTR(str, substr, pos, occur) :
str에서 substr과 일치하는 위치를 반환, pos는 시작위치,
pos는 생략가능. 생략하면 1적용=>첫번째 문자부터 찾겠다
occur은 몇 번째 일치하는지를 명시.
생략가능.생략하면 1적용=>첫번째 등장하는 문자의 위치를 리턴.
--아래는'apple'에서 'a'를 1번째 문자부터 1번째 등장하는 문자의 위치를 리턴.
select INSTR('apple','a',1,1) as "ex1",--1
INSTR('apple','a',1) as "ex2",--1
INSTR('apple','a') as "ex3" --1
from dual;
--'apple'에서 2부터 1번째 등장하는 'a'를 찾아라=>'pple'에서 1번째 등장하는 'a'를 찾아라
select INSTR('apple','a',2,1) as "ex1" --0
from dual;
select INSTR('apple','ap' ,1,1) as "ex1",--1
INSTR('apple','app',1,1) as "ex2",--1
INSTR('apple','apk',1,1) as "ex3",--0
INSTR('apple','afk',1,1) as "ex4",--0
INSTR('apple','A' ,1,1) as "ex5",--0 대소문자까지 일치
--'apple'에서 1번째위치부터 1번째등장하는 'p'의 위치를 리턴
INSTR('apple','p' ,1,1) as "ex6",--2
--'apple'에서 2번째위치부터 1번째등장하는 'p'의 위치를 리턴
INSTR('apple','p' ,2,1) as "ex7",--2
--'apple'에서 1번째위치부터 2번째등장하는 'p'의 위치를 리턴
INSTR('apple','p' ,1,2) as "ex8", --3
--'apple'에서 2번째위치부터 2번째등장하는 'p'의 위치를 리턴
INSTR('apple','p' ,2,2) as "ex9" --3
from dual;
-- '801123-1234567'에서 생년월일 부분 추출=>801123
-- '801123-1234567'에서 성별부분 추출 =>1
select SUBSTR('801123-1234567', 1, 6), --801123
SUBSTR('801123-1234567', 8, 1) --1
from dual;
-- '02)123-4567' 에서 지역번호 추출=>02
-- '031)123-4567 에서 지역번호 추출=>031
create table test(
tel varchar2(15)
);
INSERT INTO test values('02)123-4567');
INSERT INTO test values('031)123-4567');
select * from test;
-- tel에서 지역번호 추출=> 02 031
select SUBSTR(tel,1, 2),--02 03
SUBSTR(tel,1,3)--02) 031
from test;
-- 지역번호는 첫번째부터 ')'앞까지
-- 추출은 SUBSTR(문자열, 위치, 글자수)
-- 추출은 SUBSTR(전번컬럼명, 첫번째, 글자수)
-- 추출은 SUBSTR(tel, 1, 글자수)
-- 글자수 02이면 2, 031이면 3이 되어야 한다=>유동적
-- ')'를 찾아서 그 앞까지 =>')'를 찾아서-1
-- 특정문자의 위치를 찾아라=>INSTR(대상문자,찾는문자,시작위치,몇번째)
-- INSTR(전번컬럼,')',처음부터,1번째등장)
-- INSTR(tel, ')',1 ,1)=>')'의 위치를 리턴받았다
-- => 리턴받은 ')'의 위치-1하면 전번컬럼에서 ')'앞까지를 의미하게 된다
select INSTR(tel,')',1,1) from test; --3 --4
select SUBSTR(tel, 1, INSTR(tel,')',1,1)-1 )
from test;
/*오라클 9i R2부터 WITH절 사용.
임시테이블(가상테이블)로서 사용.
WITH 테이블명 AS (
SELECT쿼리문
)
SELECT쿼리문;
*/
SELECT '02)123-4567' AS t1 FROM DUAL
UNION ALL
SELECT '031)123-4567' AS t1 FROM DUAL;
JDK (1.8) =>1.8
TOMCAT (9) =>9
Oracle SQL Developer (19.2.1) =>19.2.1
JDK (1.8)버전 =>1.8
TOMCAT (9) version =>9
Oracle SQL Developer (19.2.1)을 사용=>
WITH table1 AS (
SELECT '02)123-4567' AS t1 FROM DUAL
UNION ALL
SELECT '031)123-4567' AS t1 FROM DUAL
)
select INSTR(t1,')',1,1) as "1",
SUBSTR(t1, 1, INSTR(t1,')',1,1)-1 ) as "2"
from table1;
--3 --4
select SUBSTR(tel2컬럼명, 1, INSTR(tel2컬럼명,')',1,1)-1 ) from test??;
*P132
SELECT LTRIM('NA IS NA','NA'), RTRIM('NA IS NA','NA')
FROM DUAL;
SELECT length(' I AM.. '),
length(TRIM(' I AM.. ')) FROM DUAL;
SELECT TRIM(' I AM.. ') FROM DUAL;
select Lpad(ename,10,''),Lpad(ename,10,' ') ,Rpad(ename,10,'')
from emp;
p134
REPLACE(char, search_str, replace_str) :
char에서 search_str을 찾아 이를 replace_str로 대체한 결과를 반환
TRANSLATE(expr, from_str, to_str) :
expr에서 from_str에 해당하는 문자를 찾아 to_str로
한 글자씩 바꾼 결과 반환
select replace('나는 너를 모르는데', '나는','iam'),
translate('나는 너를 모르는데','나는','iam')
from dual;
P137
length:글자길이
SELECT length('APPLE'),length('APPLE 12!'),
length('김구'),length('김구 12!')
FROM DUAL;
lengthB:Byte수를 리턴=> 여기에서는 한글1글자당 3byte
SELECT lengthB('APPLE'),lengthB('APPLE 12!'),
lengthB('김구'), lengthB('김구 12!')
FROM DUAL;
++++++++++++++++++++++++++++++++++++++++++
*날짜함수(p138)
-- 오늘날짜 조회
SELECT SYSDATE, systimestamp
FROM DUAL;
select add_months(sysdate,-6), add_months(sysdate,18)
from dual;
select months_between(sysdate, add_months(sysdate,-6))
from dual;
--입사한 달의 근무일수(토,일,공휴일에도 근무가정)
--날짜-날짜의 데이터타입은 숫자
select ename,hiredate, last_day(hiredate), last_day(hiredate)-hiredate
from emp
where deptno=10
order by hiredate asc;
--비교 : 숫자데이터대상의 trunc(), round(값,자릿수기준0)
select trunc(123.456), trunc(456.78) from dual;
select round(123.456,-2), round(123.456,-1),
round(123.456,0), round(123.456,1)
from dual;
--비교 : 날짜데이터대상의 trunc(날짜데이터, FMT), round(날짜데이터, FMT)
--trunc함수는 FMT에 지정된 단위로 절삭
--round함수는 FMT가 년도라면 년도단위로 반온림
FMT가 생략되면 날짜를 가장 가까운 날짜로 반올림
FMT: YEAR,MONTH,DD 등=>P141 날짜변환형식 참고
select sysdate,
trunc(systimestamp,'month'),
to_char(trunc(systimestamp,'month'), 'YYYY.MM.DD HH24:MI:SS'),
trunc(systimestamp,'day'),
to_char( trunc(systimestamp,'day'), 'YYYY.MM.DD HH24:MI:SS')
from dual;
select sysdate,
ROUND(systimestamp,'month'),
to_char(ROUND(systimestamp,'month'),'YYYY.MM.DD HH24:MI:SS'),
ROUND(systimestamp,'day'),
to_char(ROUND(systimestamp,'day'),'YYYY.MM.DD HH24:MI:SS')
from dual;
*TABLE삭제 => AUTO COMMIT되므로 주의.
문법> DROP TABLE 테이블명;
-- scott의 bonus,emp,dept,salgrade 제외하고 전부 삭제
DROP TABLE dtest;
-- 사원번호9000이상인 사원삭제 후 commit;
delete from emp where empno>=9000;
commit;
-- 부서테이블에서 부서번호91이상인 부서삭제 후 commit;
delete from dept where deptno>=91;
commit;
++++++++++++++++++++++++++++++++++++++++++++++
P176
JOIN★★★★★
SELECT 컬럼명 [AS] 별칭, 컬럼명 AS 별칭
FROM 테이블명 별칭, 테이블명 별칭
[WHERE 조건];
select empno,ename,job,deptno
from emp
order by deptno asc;
-- cross join, catasian product(p184)
-- join조건을 명시하지 않는 조인
select empno,ename,job,dname
from emp, dept; --사원.12개행*부서.5개의행=> 60의 행
--equi join(동등조인.p176)
--where절에 =(동등기호)를 이용하여 join조건을 명시
select empno,ename,job,dname
from emp, dept
where emp.deptno=dept.deptno; --12개의 행
--where 사원테이블의 부서번호 부서테이블의 부서번호컬럼의 값이 같다;
--equin조인은 조인조건에 사용되는 값들이 서로 일치=하는 데이터만 select된다
--즉 여기에서는 사원테이블에 부서번호가 null인 사원은 select되지x
--즉 소속부서가 확정되지않는 사원은 제외=>소속부서가 명확한 사원만select
select empno,ename,job,dname
from emp, dept
where emp.deptno=dept.deptno
and
emp.deptno is not null; --12개의 행
-- 에러: column ambiguously defined 발생
-- 해결방법: 조회하는 컬럼의 소속테이블명을 명시하면 된다. 테이블명.컬럼명
select emp.empno, emp.ename, emp.job,
dept.deptno, dept.dname
from emp, dept
where emp.deptno=dept.deptno;
-- 테이블에 별칭을 부여하여 쿼리는 간단,소속분명,이해도향상
select e.empno, e.ename, e.job, 별칭.컬럼명,별칭.컬럼명
d.deptno, d.dname
from emp e, dept d
where e.deptno=d.deptno;
-- from절에 서브쿼리(subquery)가 들어가면 inline view
select e.empno, e.ename, e.job, 별칭.컬럼명,별칭.컬럼명
d.deptno, d.dname
from emp e, dept d, (select 컬럼명,컬럼명 from 테이블명) 별칭
where e.deptno=d.deptno;
-- 10번 또는 20번부서에 근무하는
사원번호,사원명,급여, 부서번호,(부서명)을
부서명 오름차순 정렬하여 조회
select e.empno, e.ename,e.sal,e.deptno, d.dname
from emp e, dept d
where (e.deptno=10 or e.deptno=20)
and
e.deptno=d.deptno
order by d.dname asc;
select e.empno, e.ename,e.sal,e.deptno, d.dname
from emp e, dept d
where e.deptno IN(10,20)
and
e.deptno=d.deptno
order by d.dname asc;
/* 급여가 1600이상인 사원번호,사원명,급여,부서번호,부서명을
급여를 많이 받는 사원부터 출력
(이때, 급여가 확정된 사원에 한함)*/
select e.empno, e.ename,e.sal,e.deptno, d.dname
from emp e, dept d
WHERE e.deptno=d.deptno and e.sal>=1600 and e.sal is not null
order by e.sal desc;
-- 사번,사원명,부서번호,부서명을 부서번호 오름차순 조회
select e.empno, e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno=d.deptno
order by d.deptno asc;
-- natural join조인
-- 문법> from 테이블명1 NATURAL JOIN 테이블명2
-- 주의>natural join에 사용된 컬럼의 소속테이블은 명시하면 안된다
-- 해결방법> 컬럼명만 명시하자
-- 예시> d.deptno가 아닌 deptno;
-- 예시> order by d.deptno가 아닌 order by deptno;
select e.empno, e.ename, deptno, d.dname
from emp e NATURAL JOIN dept d
order by deptno;
-- JOIN USING()
-- 문법> from 테이블명1 JOIN 테이블명2 USING(join사용컬럼)
-- column part of USING clause cannot have qualifier
-- 주의>JOIN에 사용된 컬럼의 소속테이블은 명시하면 안된다
-- 해결방법> 컬럼명만 명시하자
-- 예시> d.deptno가 아닌 deptno;
-- 예시> order by d.deptno가 아닌 order by deptno;
select e.empno, e.ename,deptno, d.dname
from emp e JOIN dept d USING(deptno)
order by deptno;
--ANSI조인(P184)
--참고 ANSI:미국 국립 표준 협회(American National Standards Institute, ANSI)
--ANSI가 제정한 표준 중 가장 유명한 것이 ASCII 코드다.
-- JOIN ON(P184)
-- 문법> 테이블명 [INNER] JOIN 테이블명 ON 조인조건
-- column ambiguously defined
-- 주의. 테이블명을 명시하자
select e.empno, e.ename,d.deptno, d.dname
from emp e INNER JOIN dept d ON e.deptno=d.deptno
order by d.deptno;
-- 9000,이순신,DBA,오늘,7000,부서미확정
INSERT INTO EMP
VALUES(9000,'이순신','DBA',NULL,SYSDATE,7000,NULL,NULL);
COMMIT;
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e, dept d
WHERE e.deptno(+)=d.deptno;
-- WHERE e.deptno(+)=d.deptno;와 동일한 결과
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno;
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e, dept d
WHERE e.deptno=d.deptno(+);
-- WHERE e.deptno=d.deptno(+);와 동일결과
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
--a predicate may reference only one outer-joined table
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e, dept d
WHERE e.deptno(+)=d.deptno(+);
SELECT e.empno, e.ename,e.job, d.deptno, d.dname
from emp e FULL OUTER JOIN dept d
ON e.deptno=d.deptno;
-- NON-EQUI JOIN조인
-- 사번,사원명, 급여, 급여등급 조회
SELECT e.empno,e.ename,e.sal, sg.grade
FROM EMP e,salgrade sg
WHERE e.sal BETWEEN sg.losal AND sg.hisal;
SELECT e.empno,e.ename,e.sal, sg.grade
FROM EMP e,salgrade sg
WHERE e.sal>=sg.losal AND e.sal<=sg.hisal;
-- SELF JOIN(P180)
-- 동일한 테이블을 사용해 조인하는 방법
SELECT e.empno,e.ename,e.mgr,
ta.empno, ta.ename
from emp e, emp ta
where e.mgr=ta.empno;
++++++++++++++++++++++++++++++++
*subquery(서브쿼리 p191)
: 서브쿼리란 SQL문장안에서 보조로 사용되는 또 다른 SELECT문을 의미.
SELECT 컬럼명 [AS alias], 컬럼명,
~
FROM 테이블명 별칭, 뷰명, ~
[WHERE 조건 ~~]
[GROUP BY 그룹기준]
[HAVING 그룹조건]
[ORDER BY 정렬기준 방법]
-- 20번부서에 근무하는 사번,사원명,급여,부서번호 조회
SELECT empno,ename,sal,deptno
FROM EMP
WHERE deptno=20;
-- SMITH가 근무하는 부서번호는?
SELECT deptno
FROM emp
WHERE ename='SMITH';
-- (SMITH와 동일부서)에 근무하는 부서번호,사번,사원명조회
SELECT deptno,empno,ename
FROM emp
WHERE deptno = (SELECT deptno
FROM emp
WHERE ename='SMITH');
-- TURNER와 같은 일은 하는 사번,사원명,업무 조회
SELECT empno,ename,job
FROM EMP
WHERE JOB=(SELECT JOB
FROM EMP
WHERE ENAME='TURNER');
-- TURNER가 받는 급여보다 많이 받는 사번,사원명,급여 조회
-- 급여가 1500보다 많이 받는 사번,사원명,급여 조회
select sal
from emp
where ename='TURNER';
SELECT EMPNO,ENAME,SAL
from emp
where SAL>(select sal
from emp
where ename='TURNER');
-- 전체 사원들의 평균급여 이상을 받는
-- 사번,사원명,업무 조회
--1.전체 사원들의 평균급여를 조회?
SELECT avg(SAL)
FROM EMP; --2455.7692
--2.조회된 평균급여 이상의 사번,사원명,업무 조회
--급여가 2455.7692 이상의 사번,사원명,업무 조회
select empno,ename,job, sal
from emp
where sal>=2455.7692;
select empno,ename,job, sal
from emp
where sal>=(SELECT avg(SAL)
FROM EMP);
-- TURNER와 같은 일은 하는 사원들의 평균급여 이상을 받는
-- 사번,사원명,업무 조회
-- TURNER가 하는 일 조회
-- 사원명이 TURNER인 업무 조회
select job
from emp
where ename='TURNER'; -- SALESMAN
-- TURNER와 같은 일은 하는 사원들의 평균급여
-- => job이 SALESMAN 사원들의 평균급여
select AVG(sal)
from emp
where job='SALESMAN'; --평균급여가 1400
select empno,ename,job, sal
from emp
where 급여가 (평균급여) 이상
where 급여가 (1400) 이상
where sal>=(1400);
where sal>=(select AVG(sal)
from emp
where job=(TURNER가 하는 업무));
where sal>=(select AVG(sal)
from emp
where job=(select job
from emp
where ename='TURNER'));
정리하면
select empno,ename,job, sal
from emp
where sal>=(select AVG(sal)
from emp
where job=(select job
from emp
where ename='TURNER'));
=========================================================================
'DataBase & DBMS' 카테고리의 다른 글
22.12.02 java - DB 연동 및 쿼리 연습 (0) | 2023.02.16 |
---|---|
22.12.01 PL-SQL 사용 문법, JAVA-DB연동/더미데이터생성, 시퀀스 활용 (0) | 2023.02.16 |
22.11.25 scott user를 이용한 PL-SQL 응용 문제 (0) | 2023.02.16 |
22.11.23 다양한 insert문= 고급insert 함수 (0) | 2023.02.16 |
22.11.22 Oracle DB / PL-SQL 예제 쿼리 작성 및 각종 함수 응용 (0) | 2023.02.15 |