190528_DAY ANSI JOIN 복습, 서브쿼리, DDL시작
============================= JOIN문제 ============================================
※아래의 문제들을 ANSI JOIN으로 해결하시오.
문제1) 사원들의 이름, 부서번호, 부서이름을 출력
select ename, emp.deptno, dname
from emp inner join dept
on emp.deptno = dept.deptno; -- inner join 들어왔다면 반드시,, 반드시 on이 뒤따라야 함, 공통항목 이어주는
select ename, deptno, dname
from emp inner join dept
using (deptno);
select ename, deptno, dname
from emp natural join dept;
문제2) 부서번호가 30번인 사원들의 이름, 직급, 부서번호, 부서위치를 출력
select ename, job, e.deptno, loc
from emp e inner join dept d --
on e.deptno = d.deptno
where e.deptno = 30; --where 말고 and e.deptno = 30; 으로 해도 같은 결과, 단 동등조건과 추가 조건 나눈다면 where을 사용해야 한다.
select ename, deptno, loc
from emp natural join dept -- natural join은 using 사용하는것과 동일하다.
where deptno = 30;
select ename, deptno, loc
from emp inner join dept
using (deptno)
where deptno = 30;
문제3) 커미션을 받는 사원의 이름, 커미션, 부서이름, 부서위치 출력(커미션 0은 제외)
select ename, comm, dname, loc
from emp natural join dept
where comm <> 0
and comm is not null;
select ename, comm, dname, loc
from emp inner join dept
on emp.deptno = dept.deptno
where comm != 0
and comm is not null;
문제4) DALLAS에서 근무하는 사원들의 이름, 직급, 부서번호, 부서이름을 출력
select ename, job, deptno, dname
from emp natural join dept
where loc = 'DALLAS';
select ename, job, deptno, dname
from emp inner join dept
on emp.deptno = dept.deptno
where loc = 'DALLAS';
문제5) 사원이름에 'A'가 들어가는(포함하는) 사원들의 이름과 부서이름을 출력
select ename, dname
from emp inner join dept
on emp.deptno = dept.deptno
where ename like '%A%';
문제6) 사원이름과 직급, 급여, 급여등급을 출력
select ename, job, sal, grade
from emp inner join salgrade
on sal between losal and hisal;
/*
select ename, job, sal, grade, dept.deptno --오류 내가 ㅠㅠ
from emp left join salgrade
on emp.deptno = dept.deptno
where grade between losal and hisal;
*/
문제7) 사원들의 이름과 그 사원과 같은 부서에 근무하는 사원의 사원명, 부서번호를 출력
===> 자기 이름을 제외한 동료(56행) 정보 출력!!
select e1.ename, e2.ename deptno
from emp e1 inner join emp e2
on e1.deptno = e2.deptno
where e1.ename <> e2.ename; --혹은 e1.empno != e2.empno
/*
select e1.ename, e2.ename e2.deptno --오류 내가 ㅠㅠ
from emp e1 left join dept e2
on e1.deptno = e2.deptno;
where e1.ename != e2.ename;
*/
★<서브쿼리> Sub Query
-
특정 테이블에서 검색된 결과를 다른 테이블에 전달하여 새로운 결과를 검색 할 때 사용.
문제) JAMES 사원이 근무하는 부서이름을 출력 select deptno from emp where ename = 'JAMES'; -- 30번 부서 근무 select dname from dept where deptno = 30; -- 부서명 SALES select dname from dept where deptno = (select deptno from emp where ename = 'JAMES'); 결과) DNAME ---------------------------- SALES --=========================================================================== 문제) FORD사원과 동일한 직책을 가진 사원에 대해 사원번호, 사원명, 급여, 직책을 출력하시오 select empno, ename, sal, job from emp where job = 'ANALYST'; select job from emp where ename = 'FORD'; select empno, ename, sal, job from emp where ename <> 'FORD' and job = (select job from emp where ename = 'FORD'); 결과) EMPNO ENAME SAL JOB ---------- -------------------- ---------- ------------------ 7788 SCOTT 3000 ANALYST --=========================================================================== 문제) MARTIN사원의 급여와 동일하거나 더 많이 받는 사원의 사원명, 급여를 출력 select sal from emp where ename = 'MARIN'; select ename, sal from emp where sal >= ( select sal from emp where ename = 'MARTIN' ); 결과) ENAME SAL -------------------- ---------- ALLEN 1600 WARD 1250 JONES 2975 MARTIN 1250 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 TURNER 1500 FORD 3000 MILLER 1300 --=========================================================================== 문제) DALLAS에서 근무하는 사원의 이름, 부서번호를 출력 select loc from dept where loc = 'DALLAS'; select ename, deptno from emp where deptno = ( select deptno from dept where loc = 'DALLAS' ); select ename, deptno from emp natural join dept where loc = ( select loc from dept where loc = 'DALLAS' ); select ename, deptno from emp inner join dept using (deptno) where loc = ( select loc from dept where loc = 'DALLAS' ); 결과) ENAME DEPTNO -------------------- ---------- JONES 20 FORD 20 ADAMS 20 SMITH 20 SCOTT 20 --===========================================================================
SUB QUERY 문제들 문제) SALES부서에서 근무하는 모든 사원의 이름과 급여, 부서번호를 출력 SELECT deptno FROM dept WHERE dname = 'SALES'; SELECT ename, sal, deptno FROM emp WHERE deptno = ( SELECT deptno FROM dept WHERE dname = 'SALES' ); 결과) ENAME SAL DEPTNO -------------------- ---------- ---------- ALLEN 1600 30 WARD 1250 30 MARTIN 1250 30 BLAKE 2850 30 TURNER 1500 30 JAMES 950 30 --=========================================================================== 문제) 자신의 직속상사가 KING인 사원의 이름과 급여, 직속상사의 사원번호를 출력. SELECT empno FROM emp WHERE ename = 'KING'; SELECT ename, sal, mgr FROM emp WHERE mgr = ( SELECT empno FROM emp WHERE ename = 'KING' ); 결과) ENAME SAL MGR -------------------- ---------- ---------- JONES 2975 7839 BLAKE 2850 7839 CLARK 2450 7839 --=========================================================================== 문제) 평균급여보다 많은 급여를 받은 사원들의 사번, 사원명, 급여를 출력.(급여 내림차순) SELECT AVG(sal) FROM emp; SELECT empno, ename, sal FROM emp WHERE sal >= ( SELECT AVG(sal) FROM emp ) ORDER BY SAL DESC; 결과) EMPNO ENAME SAL ---------- -------------------- ---------- 7839 KING 5000 7902 FORD 3000 7788 SCOTT 3000 7566 JONES 2975 7698 BLAKE 2850 7782 CLARK 2450 --=========================================================================== 문제) 10번 부서의 사원 중 전체(사원) 최대급여를 받는 사원과 동일한 급여를 받는 사원의 사원번호와 사원명을 출력. (문제 조금 이상...) SELECT MAX(sal) FROM emp WHERE deptno = '10'; SELECT empno, ename --열제어 FROM emp WHERE sal >= ( SELECT MAX(sal) FROM emp WHERE deptno = '10' ); SELECT empno, ename --열제어 FROM emp WHERE sal = ( SELECT MAX(sal) FROM emp ) and deptno = 10; 결과) EMPNO ENAME ---------- -------------------- 7839 KING --=========================================================================== 문제) 10번 부서에서 근무하는 사원의 이름과 10번 부서의 부서명을 출력하시오. SELECT a,b,c,d,e,f FROM (SELECT a,b,c FROM test1), (SELECT d,e,f FROM test2); --FROM 뒤에 테이블명(행렬구성)도 올 수 있고 서브쿼리(결과값 행렬)도 위치 할 수 있다. SELECT empno, ename, sal --에러발생 : 서브쿼리에 sal컬럼에 대한 정보가 없기 때문 FROM (SELECT empno, ename FROM emp); SELECT ename, dname FROM emp, (select dname from dept where deptno = 10 ) WHERE deptno = '10'; SELECT ename, (select dname from dept where deptno = 10 ) --아무거나 쓸 수는 없다. --SELECT 옆, WHERE에는 1행 1열 값만 들어갈 수 있고, FROM에는 행렬만 들어가면 관계 없다. FROM emp WHERE deptno = '10'; 결과) ENAME DNAME -------------------- ---------------------------- CLARK ACCOUNTING KING ACCOUNTING MILLER ACCOUNTING --추가 정보 SELECT ename, (SELECT '몸에 좋은 딩꼬' FROM dual ) MSG FROM emp WHERE deptno = '10'; SELECT ename, (SELECT '몸에 좋은 딩꼬', '이것도 될까?' --이건 안된다 1행 2열은 안됨! FROM dual ) MSG FROM emp WHERE deptno = '10'; ORA-00913: too many values --이 오류 발생 --=========================================================================== 문제) BLAKE와 같은 부서에 있는 사원들의 이름과 입사일자, 부서번호를 출력하시오. SELECT ename, hiredate, deptno FROM EMP WHERE deptno = 30; SELECT ename, hiredate, deptno FROM emp WHERE deptno = ( SELECT deptno FROM emp WHERE ename = 'BLAKE' ); 결과) ENAME HIREDATE DEPTNO -------------------- -------- ---------- ALLEN 81/02/20 30 WARD 81/02/22 30 MARTIN 81/09/28 30 BLAKE 81/05/01 30 TURNER 81/09/08 30 JAMES 81/12/03 30 --=========================================================================== 추가) 만약 BLAKE라는 이름을 갖은 신입이 새로 들어왔다면?! --사원추가 (다른 부서에 BLAKE 등장!) INSERT INTO emp ( empno, ename, hiredate, deptno ) values ( 8000, 'BLAKE', sysdate, 20 ); --하고 나서 다시 위~~의 명령어를 다시 입력하면? ORA-01427: single-row subquery returns more than one row --에러 발생! 이렇게 데이터의 크기가 커지면 문제가 발생 할 수 있는 것. --해결방법! SELECT ename, hiredate, deptno FROM emp WHERE deptno = 30 or deptno = 20; SELECT ename, hiredate, deptno FROM emp WHERE deptno in (30,20); --이렇게 줄일 수 있다. --다시 위~~~ 의 명령어로 돌아가서 SELECT ename, hiredate, deptno FROM emp WHERE deptno IN ( SELECT deptno FROM emp WHERE ename = 'BLAKE' ); --실행이 너~ 어어어 무 잘된다! ENAME HIREDATE DEPTNO -------------------- -------- ---------- BLAKE 19/05/28 20 SMITH 80/12/17 20 ALLEN 81/02/20 30 WARD 81/02/22 30 JONES 81/04/02 20 MARTIN 81/09/28 30 BLAKE 81/05/01 30 SCOTT 87/04/19 20 TURNER 81/09/08 30 ADAMS 87/05/23 20 JAMES 81/12/03 30 FORD 81/12/03 20
<다중 행 서브 쿼리>
- 서브쿼리의 결과행이 여러개 ( 2개행 이상 )
- 반드시 다중 행 연산자 ( Multiple Row Operator) 와 함께 사용
※다중 행 연산자
- IN : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참
- su in (10,20,30)
- ANY, SOME : 메인쿼리의 비교조건이 서브쿼리의 결과와 하나이상 일치하면 참.
- ALL : 메인쿼리의 비교조건이 서브쿼리의 결과와 모든 값이 일치하면 참.
- EXISTS : 메인쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참
SELECT *
FROM dept
WHERE exists(SELECT * --서브쿼리 결과
FROM emp
WHERE deptno = 10);
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
--위와 달리! WHERE절을 바꿔보자!
SELECT *
FROM dept
WHERE exists(SELECT *
FROM emp
WHERE deptno = 40); --10이 아니라 40으로!
--이러면 결과 안나온다, 데이터 존재 유무에 따라 SELECT, DELETE, UPDATE, INSERT시 제어하는 역할로 사용.
--서브쿼리의 결과가 있느냐 없느냐만 체크
no rows selected --결과값
사용법)
WHERE EXISTS (서브쿼리)
WHERE NOT EXISTS (서브쿼리)
--===========================================================================
문제)
급여를 3000이상 받는 사원이 소속된 부서와 동일한 부서에 근무하는 사원들의 사원명, 급여, 부서번호를 출력하시오. (여기서 조건은 **급여를 3000이상 받는 사원이 소속된 부서** 조건절로!)
SELECT ename, sal, deptno
FROM emp
WHERE deptno IN (
SELECT deptno
FROM emp
WHERE sal >= 3000
); --20번 부서와 10번 부서의 사람들
ENAME SAL DEPTNO
-------------------- ---------- ----------
FORD 3000 20
ADAMS 1100 20
SCOTT 3000 20
JONES 2975 20
SMITH 800 20
BLAKE 20
MILLER 1300 10
KING 5000 10
CLARK 2450 10
조건서브쿼리)
SELECT deptno
FROM emp
WHERE sal >= 3000;
DEPTNO
----------
20
10
20
--===========================================================================
문제)
부서번호가 30번인 사원들 중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원의 사원명, 급여를 출력.
(ALL 다중 행 연산자 사용!!)
조건서브쿼리)
SELECT SAL
FROM EMP
WHERE DEPTNO = 30;
결과)
SAL
----------
1600
1250
1250
2850
1500
950
SELECT ename, sal
FROM emp
WHERE sal >
(
SELECT SAL
FROM EMP
WHERE DEPTNO = 30
); --에러 발생!
SELECT ename, sal
FROM emp
WHERE sal > ALL --ALL을 쓰자!
(
SELECT SAL
FROM EMP
WHERE DEPTNO = 30
);
SELECT ename, sal
FROM emp
WHERE sal >
(
SELECT MAX(SAL) -- MAX 쓰면 ALL안써도 된다, 하지만 위에서 연습겸 ALL을 사용한 것.
FROM EMP
WHERE DEPTNO = 30
);
결과)
ENAME SAL
-------------------- ----------
JONES 2975
FORD 3000
SCOTT 3000
KING 5000
--===========================================================================
문제) 부서번호가 30번인 사원들 중 급여를 가장 많이 적게 사원보다 더 많은 급여를 받는 사원의 사원명, 급여를 출력(ANY 다중 행 연산자 사용!)
SELECT ename, sal
FROM EMP
WHERE sal >
(
SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
FROM emp
WHERE deptno = 30
);
ORA-01427: single-row subquery returns more than one row -- 에러발생
SELECT ename, sal
FROM EMP
WHERE sal > ALL --모든 데이터중 가장 큰 값
(
SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
FROM emp
WHERE deptno = 30
);
ENAME SAL
-------------------- ----------
JONES 2975
FORD 3000
SCOTT 3000
KING 5000
SELECT ename, sal
FROM EMP
WHERE sal > ANY --모든 데이터중 가장 큰 값, 각 항목보다 커도 좋고(1600보다, 1250보다...)
(
SELECT sal --1600, 1250, 1250, 2850, 1500, 950 들어옴
FROM emp
WHERE deptno = 30
);
ENAME SAL
-------------------- ----------
KING 5000
FORD 3000
SCOTT 3000
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600
TURNER 1500
MILLER 1300
WARD 1250
MARTIN 1250
ADAMS 1100
문제 해답
SELECT ename, sal
FROM EMP
WHERE sal > --모든 데이터중 가장 큰 값, 각 항목보다 커도 좋고(1600보다, 1250보다...)
(
SELECT min(sal) --1600, 1250, 1250, 2850, 1500, 950 들어옴
FROM emp
WHERE deptno = 30
);
ENAME SAL
-------------------- ----------
ALLEN 1600
WARD 1250
JONES 2975
MARTIN 1250
BLAKE 2850
CLARK 2450
SCOTT 3000
KING 5000
TURNER 1500
ADAMS 1100
FORD 3000
MILLER 1300
--===========================================================================
문제1)
SCOTT과 급여가 동일하거나 더 많이 받는 사원의 이름과 급여 출력
SELECT ename, sal
FROM emp
WHERE sal >= any ( --SCOTT가 하나 있으면 >= 도 관계 없지만, 중복되면 any등으로 사용해야 한다.
SELECT sal
FROM emp
WHERE ename = 'SCOTT'
);
ENAME SAL
-------------------- ----------
SCOTT 3000
KING 5000
FORD 3000
--추가
SELECT ename, sal
FROM emp
WHERE sal >= all ( --SCOTT가 하나 있으면 >= 도 관계 없지만, 중복되면 any등으로 사용해야 한다.
SELECT sal
FROM emp
WHERE ename = 'SCOTT'
);
--===========================================================================
문제2)
직급(job)이 사원(CLERK)인 사람이 속한 부서의 부서번호와 부서명, 부서위치를 출력.
SELECT dname, loc
FROM dept
WHERE deptno IN (
SELECT deptno
FROM emp
WHERE job = 'CLERK'
);
DNAME LOC
---------------------------- --------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
--===========================================================================
문제3)
사원명에 'T'를 포함하고 있는 사원들과 같은 부서에서 근무하고 있는 사원의 사원번호 이름을 출력.
SELECT empno, ename
FROM emp
WHERE deptno IN ( -- = 을 쓴다면 모두 만족해야 하는 것, IN을 써야 한다.
SELECT deptno
FROM emp
WHERE ename like '%T%'
);
EMPNO ENAME
---------- --------------------
7902 FORD
7876 ADAMS
7788 SCOTT
7566 JONES
7369 SMITH
8000 BLAKE
7900 JAMES
7844 TURNER
7698 BLAKE
7654 MARTIN
7521 WARD
7499 ALLEN
--===========================================================================
문제4) 부서위치가 NEW YORK인 모든 사원의 이름, 부서번호를 출력
SELECT ename, deptno
FROM emp
WHERE deptno IN ( --NEW YORK이 또 생길 수도 있잖아. 지사라던가... 그래서 IN을 쓰는것이 좋다.
SELECT deptno
FROM dept
WHERE loc = 'NEW YORK'
);
ENAME DEPTNO
-------------------- ----------
CLARK 10
KING 10
MILLER 10
--===========================================================================
문제5) SALES부서의 모든 사원의 이름과 급여출력
SELECT ename, sal
FROM emp
WHERE deptno =
(
SELECT deptno
FROM dept
WHERE dname = 'SALES'
);
ENAME SAL
-------------------- ----------
ALLEN 1600
WARD 1250
MARTIN 1250
BLAKE 2850
TURNER 1500
JAMES 950
--===========================================================================
문제6) KING에게 보고하는 모든 사원의 이름과 급여를 출력
SELECT ename, sal
FROM emp
WHERE mgr IN
(
SELECT empno
FROM emp
WHERE ename = 'KING'
);
ENAME SAL
-------------------- ----------
JONES 2975
BLAKE 2850
CLARK 2450
--===========================================================================
문제7) 자신의 급여가 평균 급여보다 많고 이름에 'S'가 들어가는 사원과
------------------------ ----------
(1번째 조건) (2번째 조건)
---> 1,2번을 동시에 만족하는 사원의 부서
동일한 부서에서 근무하는 모든 사원의 사원번호, 사원명, 급여 출력.
SELECT empno, ename, sal
FROM emp
WHERE deptno IN -- IN 은 = 과 같음 (거으...의?), 여기서는 IN 또는 ANY 또는 ALL이 나와야 한다!
(
SELECT deptno
FROM emp
WHERE ename like '%S%'
and
sal > (SELECT AVG(sal) FROM emp)
);
EMPNO ENAME SAL
---------- -------------------- ----------
7902 FORD 3000
7876 ADAMS 1100
7788 SCOTT 3000
7566 JONES 2975
7369 SMITH 800
8000 BLAKE
-- WHERE 그룹함수() => 에러
-- WHERE sal > avg(sal) 이러면 에러
-- 정상실행 위해서는 서브쿼리로 !
-- WHERE sal > ( SELECT avg( sal )
-- FROM emp) => 정상실행
-- HAVING 그룹함수() => 정상실행
-- HAVING avg(sal) > 2000 => 정상실행
-- HAVING deptno = 10 => 정상실행 왜? 그룹 중 10번 부서만!!
-- HAVING sal > 2000 => 에러? 왜? 10번부서에는 sal속성이 없기 때문에
<DDL.> Data Definition Language : (객체)데이터 정의어
-
객체 : TABLE, VIEW, SEQUENCE, TRIGGER
-
create, drop, alter, rename, truncate
-
DDL은 AUTO 커밋!
<테이블(객체) 생성>
형식)
CREATE TABLE 테이블명
(
컬럼명1 자료형,
컬럼명2 자료형,
컬럼명3 자료형
);
<자료형> 데이터 : 문자, 숫자, 날짜, 이미지등
- CHAR : 주어진 크기만큼 고정길이의 문자 저장 1바이트 ~ 2000바이트
pName char(10)
gildong입력 ---> ' gildong' 이 입력됨 ( 앞에 공백)
- VARCHAR2 : 주어진 크기만큼 가변길이의 문자 저장 1바이트 ~ 4000바이트
pName varchar2(10)
gildong입력 ---> 'gildong' 입력!
- NUMBER(p[,s]) : 정밀도와 스케일로 표현되는 숫자
- 바이트 수 생략 가능
number(7,2) --전체 자릿수 7, 소숫점 이하 2자리까지 표현, 정수는 5자리까지!
--예) no number( 7, 2 ) => 12345.67
--입력 ==>12345 ( O )
--입력 ==>99999 ( O )
--입력 ==>123456 ( X )
--입력 ==>12345.678 ( O ), 입력은 된다, 하지만 저장은 12345.68(올림처리)
--입력 ==>99999.99 ( O )
--입력 ==>99999.992 ( O )
--입력 ==>99999.995 ( X ), 저장 100000.00이기때문에
pName varchar2(10) -- ( O )
pName varchar2 -- ( X )
pAge number(10) -- ( O )
pAge number -- ( O )
- DATE : 날짜 형식 저장
- TIMESTAMP : DATE형의 확장된 형태
- BLOB : 대용량의 바이너리 데이터를 저장, 최대 4GB
- CLOB : 대용량의 텍스트 데이터를 저장, 최대 4GB
- BFILE : 대용량의 바이너리 데이터를 파일형태로 저장, 최대 4GB
CREATE TABLE emp
( );
--ORA-00904: : invalid identifier --에러발생, 이클립스에도 이런식으로 뜬다면 DB의 문제라는것을 파악해야 한다.
--테이블을 생성하기 위해서는 최소 한 개 이상의 컬럼을 정의해야 함!
--===========================================================================
CREATE TABLE emp
(
empno number(4)
);
--ORA-00955: name is already used by an existing object --에러 발생
-- 이미 존재하는 테이블명(객체명)과 같은 이름은 생성 불가!
--===========================================================================
CREATE TABLE 2emp
(
empno number(4)
);
--ORA-00903: invalid table name --에러발생. 부적절한 테이블(식별자)명
-- 식별자 이름규칙이 있다!
-- 첫글자 숫자불가, 예약어불가, 특수문자 불가
--===========================================================================
CREATE TABLE emp2
(
empno number(4)
);
--Table created.
--===========================================================================
SQL> select tname from tab;
TNAME
------------------------------------------------------------
DEPT
EMP
EMP2
SALGRADE
--임포트한 테이블 조회 가능
--===========================================================================
CREATE TABLE emp2
(
empno number(4)
ename VARCHAR(4)
sal number(7,2)
);
--ORA-00907: missing right parenthesis -- 에러발생
--두 개 이상의 컬럼을 정의할 때 그 구분을 위해 ','(콤마)를 사용!
CREATE TABLE emp3
(
empno number(4),
ename VARCHAR(4),
sal number(7,2)
);
--Table created. -- 생성 완료!
SELECT * FROM emp2;
SELECT * FROM emp3;
--no rows selected --조회결과 없음
<서브쿼리를 이용한 테이블 생성>
-
기존 테이블의 구조( 컬럼, 자료형 )와 (행) 데이터를 복사
-
제약(constraint)은 복사에서 제외
-
형식
CREATE TABLE 테이블명 AS 서브쿼리; create table emp4 as select * from emp; --select는 열제어 *(와일드카드)는 모든 행 --Table created. 메시지 desc emp4; desc emp; --NULL? 은 NULL허용 여부 SQL> select count(*) from emp3; COUNT(*) ---------- 0 SQL> select count(*) from emp4; COUNT(*) ---------- 15 SELECT empno, ename, sal FROM emp4; EMPNO ENAME SAL ---------- -------------------- ---------- 8000 BLAKE 7369 SMITH 800 7499 ALLEN 1600 7521 WARD 1250 7566 JONES 2975 7654 MARTIN 1250 7698 BLAKE 2850 7782 CLARK 2450 7788 SCOTT 3000 7839 KING 5000 7844 TURNER 1500 7876 ADAMS 1100 7900 JAMES 950 7902 FORD 3000 7934 MILLER 1300
궁금상자
1. 다중행연산자 이해가 안된다. (IN, ANY, SOME, ALL, EXISTS)
- IN은 OR OR OR... =과 같으나 =보다는 IN을 쓰는것이 좋다. 중복된 값이 있을때에는 = 쓰면 에러가 발생한다.
- ANY랑 SOME은 같은 의미로 사용되는듯 ?
- ALL과 ANY는 아래의 표 참조
- EXISTS는 서브쿼리 값 있으면 반환
2. 서브쿼리는 SELECT문 내의 또다른 SELECT문 정도?, 데이터 가공 위해, 선생님의 수업시간 설명 참조. SELECT INSERT UPDATE DELETE 에서 사용 SELECT리스트 FROM절 WHERE절에도 조건에 따라 사용 가능
3. CHAR VARCHAR VARCHAR2
아래 표 참조
VARCHAR와 VARCHAR2차이 없으나, 오라클에서는 VARCHAR2 사용 권장, 오라클에서 VARCHAR 타입은 추후 다른 용도로 사용한다고 함
컬럼 > ANY | 가장 작은 값보다 크다, ? | > MIN |
컬럼 < ANY | 가장 큰 값보다 작다, ? | <MAX |
컬럼 > ALL | 가장 큰 값보다 크다, 최대값 반환 | > MAX |
컬럼 < ALL | 가장 작은 값보다 작다, 최소값 반환 | < MIN |
CHAR | VARCHAR | VARCHAR2 |
---|---|---|
고정형 | 가변형 | 가변형 |
2000byte | 4000byte4 | 000byte |
'클라우드 기반 웹 개발자 과정 공부 > DB' 카테고리의 다른 글
190530_DAY36 트랜잭션, 무결성제약조건, 데이터 딕셔너리 (0) | 2019.05.30 |
---|---|
190529_DAY35, <복습>, <DDL>, <DML> (0) | 2019.05.29 |
190527_DAY33 decode, case , join (0) | 2019.05.27 |
190524_Day32 DB3 복습 및 진도 (0) | 2019.05.24 |
190523_Day31 DB2 (0) | 2019.05.23 |