Jam's story

[오라클 ] days0 본문

Java

[오라클 ] days0

애플쩀 2022. 4. 7. 16:57
-- HR 계정 접속 --
SELECT 3+3
FROM dual;

-- ORA-00942: table or view does not exist
SELECT *
FROM emp;

-- ORA-00942: table or view does not exist
SELECT *
FROM  arirang;  -- SYS  PUBLIC 시노님 생성
FROM scott.emp;

-- SQL 오류: ORA-01031: insufficient privileges
DELETE FROM arirang
WHERE empno  = 7369;

scott 계정이 생성한 emp 테이블 있다면 
emp 테이블의 소유자는 scott 이다.

1) emp 테이블 사용할 수 있는 권한 부여 받고        <-       [scott] , SYS
2) scott.emp  코딩.



23. hr 계정으로 접속
    employees 테이블에서 first_name, last_name 이름 속에 'ev' 문자열 포함하는 사원 정보 출력
    
FIRST_NAME           LAST_NAME                 NAME                                           NAME                                                                                                                                                                                    
-------------------- ------------------------- ---------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Kevin                Feeney                    Kevin Feeney                                   K[ev]in Feeney                                                                                                                                                                          
Steven               King                      Steven King                                    St[ev]en King                                                                                                                                                                           
Steven               Markle                    Steven Markle                                  St[ev]en Markle                                                                                                                                                                         
Kevin                Mourgos                   Kevin Mourgos                                  K[ev]in Mourgos                                                                                                                                                                         

SELECT t.* , REPLACE( t.name, 'ev', '<span color=blue>ev</span>')
FROM (
        SELECT first_name, last_name
              , first_name || ' ' || last_name name
        FROM employees
       ) t
WHERE t.name LIKE  '%ev%'    ;
 






-- SCOTT 계정 접속 --
-- 찾을 대상 :  subquery [검색] > [statement_subquery]statement_subquery 
-- 9:50 문제 풀기 + 10분 쉬는 시간 
-- 10:00 수업 시작~ 

1. subquery 에 대해 설명하세요 ? 
   ㄱ. 하나의 SQL 문장의 절에 부속된 또 다른 select 문장으로, 
       두 번의 질의를 수행해야 얻을 수 있는 결과를 한 번의 질의로 해결할 수 있는 문장이다
    ㄴ.         > >= < <=      + 오른쪽 ( 서브쿼리 )       X
            IN, SOME, ANY
    ㄷ. 질의가 미지정된 값을 근거로 할 때 유용하다            X
    ㄹ. subquery는 mainquery의 조건으로 사용된다.
       WHERE 조건절  안에   (서브쿼리 )                    X
    ㅁ. subquery의 결과는 main outer query에 의해 사용된다. X
    ㅂ. subquery의 실행 순서는 subquery를 먼저 실행하고, 그 결과를 mainquery에 전달하여 실행한다
    ㅅ.  WHERE , HAVING, INSERT  INTO 절, UPDATE SET 절, SELECT , DELETE FROM 절 서브쿼리를 사용할 수 있다.
    ㅇ. 서브쿼리는 ORDER BY 절을 포함할 수 없다. ( 예외, 인라인 뷰에서는 사용할 수 있다. )
    
    
2. Inline View 에 대해 설명하세요 ?
   FROM 절 뒤에 사용되는 서브쿼리
   FROM 테이블명, 뷰명
        (서브쿼리) 마치 테이블 처럼 사용된다.         
        
3. WITH 절에 대해 설명하세요 ? 
   ㄱ. 사용될 서브쿼리 블록을 미리 선언하여 반복사용
   ㄴ. 형식
   WITH 쿼리이름1 AS ( WITH 절 X , SELECT 문 서브쿼리 ), 
        쿼리이름2 AS ( 서브쿼리 ),
        쿼리이름3 AS ( 서브쿼리 ),
        :
   ㄷ. 하나의 with절에 여러 개의 query block 사용이 가능하다
   ㄹ. 서브쿼리를 사용하면 성능 저하된다.(단점)  +  코딩 간결, 쉽게 ( 장점)
   
4. 자료 사전( Data Dictionary ) 란 ?  user_    all_    dba_  V$_   뷰
5. ROLE 이란 ?
   ㄱ. 롤생성 -> 권한 부여 롤 -> 롤 계정
6. 스키마( Schema ) 란 ?

7. LIKE 연산자에 대해서 설명하세요 ? 
   WHERE  컬럼명 LIKE  '와일드카드  % _'  ESCAPE 
   
8. REGEXP_LIKE() 함수에 대해서 설명하세요 ? 
    LIKE 연산자 차이점 : 정규표현식
    
    REGEXP_LIKE( 컬럼명 , '정규표현식', 'i' 파라미터 )

9. 어제까지 배운 [Oracle 함수]를 적고 설명하세요 .
   1) 기능  2) 매개변수  3) 리턴값(리턴자료형)
   ㄱ. NVL( expr1, expr2) , NVL2( , , ) ***
   ㄴ. SUBSTR( 문자열, postition[, length] )
                       0 , 1  첫번째 문자부터
                       -n 음수  뒤에서부터 n번째
   ㄷ. UPPER( 컬럼명 또는 문자열 )
   ㄹ. TO_CHAR( 날짜형 , 'RRRR' 또는 'YYYY') 년도      '2010'   '01'
       EXTRACT( YEAR FROM hiredate ) 년도             2010     1
   ㅁ. REGEXP_LIKE ()
   ㅂ. CONCAT()      ||
   ㅅ. MOD() 나머지 구하는 함수                   % X
   
10. insa 테이블에서 사원들이 속한 부서명을 중복되지 않게 아래와 같이
    부서명 오름차순 정렬( ASC )해서 출력하세요.
    [출력결과]
BUSEO          
---------------
개발부
기획부
영업부
인사부
자재부
총무부
홍보부
-- SELECT 절 키워드 :  AS 별칭, ALL, DISTINCT  중복 배제
SELECT DISTINCT buseo  -- , name , ssn
FROM insa
ORDER BY buseo ASC;


11. insa 테이블에서 70년대생 남자사원만 아래와 같이 주민등록번호로 정렬해서 출력하세요.
NAME                 RRN           
-------------------- --------------
문길수               721217-1******
김인수               731211-1******
김종서               751010-1******
허경운               760105-1******
정한국               760909-1******
최석규               770129-1******
지재환               771115-1******
홍길동               771212-1******
산마루               780505-1******
장인철               780506-1******
박문수               780710-1******
이상헌               781010-1******
김정훈               790304-1******
박세열               790509-1******
이기상               790604-1******

15개 행이 선택되었습니다. 

-- 키워드 대문자 권장, 테이블명, 컬럼명 소문자 권장
-- 남자 1/3/5/7/9
-- JAVA : gender % 2  == 1            나머지 구하는 연산자 %
-- Oracle : MOD(SUBSTR(ssn, -7, 1) , 2 )  = 1
SELECT name
--       , ssn
       , CONCAT( SUBSTR( ssn, 0,8 ), '******')   rrn 
FROM insa
--\.
--. 모든 문자   naver.com
WHERE REGEXP_LIKE( ssn, '^7.{6}[13579]' ) 
--WHERE REGEXP_LIKE( ssn, '^7\d{5}-[13579]' )   
--WHERE REGEXP_LIKE( ssn, '^7\d\d\d\d\d-[13579]' )   
--WHERE REGEXP_LIKE( ssn, '^7[0-9][0-9][0-9][0-9][0-9]-[13579]' )   
--WHERE REGEXP_LIKE( ssn, '^7[0-9][0-9][0-9][0-9][0-9]-[13579][0-9][0-9][0-9][0-9][0-9][0-9]' )   
--WHERE REGEXP_LIKE( ssn, '^7[0-9][0-9][0-9][0-9][0-9]-1[0-9][0-9][0-9][0-9][0-9][0-9]' )   -- 11:05 수업시작
--WHERE ssn LIKE '7_____-1%'
--WHERE REGEXP_LIKE( ssn, '^7' ) AND MOD(SUBSTR(ssn, -7, 1) , 2 )  = 1
--WHERE ssn LIKE '7%';
--WHERE SUBSTR( ssn, 0, 1) = '7';
ORDER BY rrn ASC;
-- WHERE 70대생 AND 남자 조건절;

12. insa 테이블에서 70년대 12월생 모든 사원 아래와 같이 주민등록번호로 정렬해서 출력하세요.

NAME                 SSN           
-------------------- --------------
문길수               721217-1951357
김인수               731211-1214576
홍길동               771212-1022432

  ㄱ. LIKE
  ㄴ. REGEXP_LIKE()
  
SELECT name , ssn
FROM insa
--WHERE ssn LIKE '7_12%'
WHERE REGEXP_LIKE( ssn , '^7\d12' )
ORDER BY ssn ASC;

13. LIKE 연산자의 ESCAPE 옵션에 대해서 설명하세요. ( 어제 수업 X )
    1)  wildcard(  %  _ )를 일반 문자처럼 쓰고 싶은 경우에는 [ESCAPE 옵션]을 사용
    ㄱ. dept 테이블 조회
    SELECT *
    FROM dept;
    ㄴ. dept 테이블의 구조 확인
    DESC dept;
    
    이름     널?       유형           
------ -------- ------------ 
DEPTNO NOT NULL NUMBER(2)        필수입력   2자리 숫자
DNAME           VARCHAR2(14)               14바이트 문자열
LOC             VARCHAR2(13)               13바이트 문자열

     ㄷ. 새로운 부서를 추가 : DML - INSERT 문 + 커밋[COMMIT], ROLLBACK 트랜잭션 처리 
     INSERT INTO dept ( deptno, dname, loc ) VALUES ( 100, 'QC100%T', 'SEOUL' );
     오류 보고 -
     ORA-01438: value larger than specified precision allowed for this column
                                            정밀도
                                            p
                                            scale  s
     
     INSERT INTO dept ( deptno, dname, loc ) VALUES ( 40, 'QC100%T', 'SEOUL' );
     오류 보고 -
     ORA-00001: unique constraint (SCOTT.PK_DEPT) violated
                유일성  제약조건                    위배된다.
                PK == Primary Key
   
   
    INSERT INTO dept ( deptno, dname, loc ) VALUES ( 50, 'QC100%T', 'SEOUL' );
     -- 1 행 이(가) 삽입되었습니다.
    COMMIT; 
     [형식]
     INSERT INTO 테이블명 ( 컬럼명,,, ) VALUES ( 컬럼값,,, );
     COMMIT;
     
     ㄹ. 확인
     SELECT *
     FROM dept;
     
     ㅂ. 데이터 수정 : DML - UPDATE 문 +  COMMIT
     30번 부서의 부서명을 ( SALES   -> SA%LES )로 수정
     
     [형식]
     UPDATE 테이블명
     SET    수정할컬럼=수정할값,수정할컬럼=수정할값,수정할컬럼=수정할값,,,
     [WHERE 조건식];
     
     UPDATE dept
     SET    dname = 'SA%LES'
     WHERE  deptno = 30;   -- WHERE 조건절이 없으면 모든 행(레코드)가 수정..
     COMMIT;
     ROLLBACK;
    
     ㅂ. 확인
     SELECT *
     FROM dept;
     
     -- CreateReadUpdateDelete == CRUD
     ㅅ. 40 부서를 삭제 : DML - DELETE 문  + COMMIT              / [ TRUNCATE 문 ]
        INSERT INTO dept VALUES (  40,	'OPERATIONS',	'BOSTON' ); 
        COMMIT;
       [형식]
       DELETE FROM 테이블명 -- WHER 조건절이 없으면  모든 레코드(행) 삭제
       WHERE   조건식;  loc   PK
       
       DELETE dept
       WHERE deptno = 40;
       
       ROLLBACK; 

       오라클 세션( SESSION ) =  사용자 로그인-> 로그아웃
       오라클 인스턴스( INSTANCE ) = ??

     ㅇ. 12:05  수업시작~   ESCAPE 옵션 
     문제) dept 테이블에서 부서명(dname)에    '%' 문자를 포함하는 부서 정보를 출력(조회)
       ㄱ. LIKE 연산자 사용
       SELECT *
       FROM dept
       -- '%와일드카드       %한문자               %와일드카드'
       --                  와일드카드 제외
       WHERE dname LIKE '%\%%' ESCAPE '\';
     
       ORA-00904: "DNAME": invalid identifier
      
     문제) 50번 부서는 삭제     
     문제) 30번 부서명   'SALES' 로 수정
     
     DELETE FROM dept
     WHERE deptno = 50;
     
     UPDATE dept
     --SET dname = 'SALES'
     SET dname = REPLACE( dname, '%', '')
     WHERE deptno = 30;
     
     COMMIT;
     
     -- JAVA :   "SA%LES"  -> "SALES"            "SA%LES".replace("%","")
     -- Oracle : REPLACE( "SA%LES" ,"%","")
     
     -- * 모든 컬럼 출력
     -- SELECT  deptno, dname, loc , REPLACE( 'SA%LES' ,'%','')
     -- SELECT  dept.*, REPLACE( 'SA%LES' ,'%','')
     SELECT  d.*, REPLACE( 'SA%LES' ,'%','')
     FROM dept d
     WHERE dname LIKE '%\%%' ESCAPE '\';
     
     -- ORA-00923: FROM keyword not found where expected 
     
     문제) dept 테이블에서 부서명에   'r' 문자열 포함하면 부서번호를 1증가 시키는 쿼리 작성하세요..
     
--     JAVA : int n = 10;
--     1증가       n++      ++n       n=n+1   n += 1
        
       UPDATE dept
       SET deptno = deptno + 1      -- 11/21/31/41
       WHERE REGEXP_LIKE( dname , 'r' , 'i' );
       
       -- ORA-02292: integrity constraint (SCOTT.FK_DEPTNO) violated - child record found
       --            무결성     제약조건(FK)  위배된다.
       --             자식  레코드(행) 찾았다. 


      SELECT *
      FROM dept;
      
10	ACCOUNTING	NEW YORK
20	RESEARCH	DALLAS
30	SALES	CHICAGO
40	OPERATIONS	BOSTON

    SELECT *
    FROM emp;
      
      parent          deptno (참조)              child
      dept 테이블                    emp 테이블
      부모테이블의 부서번호            자식테이블의 부서번호(외래키,FK) 컬럼에서 참조

     관계형 데이터 모델
     
     개체  - 관계(연관성)-    개체
     릴레이션
     테이블
     부모테이블               자식테이블
     dept                    emp
     deptno(PK)              deptno 참조키, 외래키, FK
                             empno PK 고유키
     
-- 14:00 수업시작~     
14. emp 테이블에서
    pay(sal+comm)  1000 이상~ 3000 이하 받는  
    30부서원을 제외한 모든 사원들만 
    ename을 기준으로 오름차순 정렬해서 조회하는 쿼리를 작성하세요.  
    ㄱ. with 절 사용  
WITH  temp AS 
(
   SELECT  deptno, ename,      sal+NVL(comm,0) pay  
   FROM emp 
   WHERE deptno != 30
)
SELECT t.*
FROM  temp t
WHERE  t.pay BETWEEN 1000 AND 3000;
    
    ㄴ. inline view 사용

SELECT t.*
FROM (
           SELECT  deptno, ename,      sal+NVL(comm,0) pay  
           FROM emp 
           WHERE deptno != 30
      ) t
WHERE     t.pay BETWEEN 1000 AND 3000;
    
    
    ㄷ. 일반 쿼리 사용.

    DEPTNO ENAME             PAY
---------- ---------- ----------
        10 MILLER           1300
        10 CLARK            2450
        20 JONES            2975
        20 FORD             3000
        
SELECT  deptno, ename,      sal+NVL(comm,0) pay  
FROM emp       
WHERE ( sal+NVL(comm,0) BETWEEN 1000 AND 3000 )    AND     deptno != 30
ORDER BY ename ASC;

15. insa테이블에서 ssn 컬럼을 통해서 year, month, date, gender 출력

  SSN          YEAR MONTH DATE GENDER  
---------- ------ ---- ----- -----
771212-1022432	77	12	12	1
801007-1544236	80	10	07	1
770922-2312547	77	09	22	2
790304-1788896	79	03	04	1
811112-1566789	81	11	12	1
:
60개 행이 선택되었습니다. 

-- 식별자(별칭)로 키워드 사용 ? 
SELECT ssn
    , SUBSTR( ssn, 0, 2) year
    , SUBSTR( ssn, 3, 2) month
    , SUBSTR( ssn, 5, 2) "DATE"  -- date 예약어,   date 날짜 자료형
    , SUBSTR( ssn, -7, 1) genger
    , SUBSTR( ssn, -1, 1) genger
FROM insa;


--ORA-00923: FROM keyword not found where expected

16. emp 테이블에서 입사년도 컬럼에서 년,월,일 찾아서 출력
    ㄱ. 년도 찾을 때는 TO_CHAR() 함수 사용
    ㄴ. 월 찾을 때는 SUBSTR() 함수 사용
    ㄷ. 일 찾을 때는 EXTRACT() 함수 사용
    
ENAME      HIREDATE YEAR MONTH DATE
---------- -------- ---- -- --
SMITH      80/12/17 1980 12 17
ALLEN      81/02/20 1981 02 20
WARD       81/02/22 1981 02 22
JONES      81/04/02 1981 04 02
MARTIN     81/09/28 1981 09 28
BLAKE      81/05/01 1981 05 01
CLARK      81/06/09 1981 06 09
KING       81/11/17 1981 11 17
TURNER     81/09/08 1981 09 08
JAMES      81/12/03 1981 12 03
FORD       81/12/03 1981 12 03
MILLER     82/01/23 1982 01 23

12개 행이 선택되었습니다. 

-- JAVA : Date, Calendar, LOcalDate, LocalDateTime 
-- ORACLE : DATE, TIMESTAMP
-- TO_CHAR( 날짜컬럼,  '형식(formatt)' [,NLS PARAM] );
SELECT ename , hiredate 
      , TO_CHAR( hiredate, 'YYYY' ) year
      , SUBSTR( hiredate, 4, 2 ) month
      , EXTRACT( DAY FROM hiredate ) "DATE"
FROM emp;

-- [ RR과 YY 기호의 차이점 ] --
    '97/01/12'       '03/12/21'
RR   1997/01/12      2003/12/21
YY   2097/01/12      2003/12/21
         2000년대(SYSDATE)

문제) 현재 시스템의 날짜/시간 정보를 얻어오는 코딩.
JAVA : Date d = new Date();       d.toLocalString()
       Calendar c = Calendar.getInstance();  c.toString()

Oracle :   SYSDATE  함수   
--  2000년대 /  21세기
SELECT SYSDATE , TO_CHAR( SYSDATE, 'CC')
FROM   dept;  -- 4개의 행(레코드)


17. emp 테이블에서 직속상사(mgr)가 없는  사원의 정보를 조회하는 쿼리 작성.

     EMPNO ENAME             MGR
---------- ---------- ----------
      7839 KING                0
SELECT empno, ename, NVL( mgr , 0 ) MGR      
FROM emp
WHERE mgr IS NULL;  -- IS NULL/ IS NOT NULL    SQL연산자
WHERE mgr = null;      
      
18. 모든 롤( ROLE ) 확인
19. RESOUCE 롤의 모든 권한 확인
20. scott 계정이 부여받은 롤 확인

21. YY와 RR의 차이점에 대해서 설명하세요 . 

22. emp 테이블에서 사원이름에   'la' 문자열을 포함하는 사원 정보 출력
   ㄱ. LIKE 사용
   WHERE ename LIKE '%la%';
   WHERE ename LIKE '%' || UPPER('la')  || '%';
   WHERE ename LIKE   UPPER('%la%') ;  -- ***** 좋은 코딩 ****
   WHERE ename LIKE   '%LA%'  ;
   
   ㄴ. REGEXP_LIKE() 사용
   WHERE REGEXP_LIKE( ename , 'la' , 'i');
   
    DEPTNO ENAME     
---------- ----------
        30 BLAKE     
        10 CLARK    

23. hr 계정으로 접속
    employees 테이블에서 first_name, last_name 이름 속에 'ev' 문자열 포함하는 사원 정보 출력
    
FIRST_NAME           LAST_NAME                 NAME                                           NAME                                                                                                                                                                                    
-------------------- ------------------------- ---------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Kevin                Feeney                    Kevin Feeney                                   K[ev]in Feeney                                                                                                                                                                          
Steven               King                      Steven King                                    St[ev]en King                                                                                                                                                                           
Steven               Markle                    Steven Markle                                  St[ev]en Markle                                                                                                                                                                         
Kevin                Mourgos                   Kevin Mourgos                                  K[ev]in Mourgos                                                                                                                                                                         



-- 3:06 수업 시작~
--확인 --
SELECT *
FROM dept;

-- 부서 추가       50 ,  아름다운부서 , 서울
INSERT INTO dept ( deptno, dname, loc ) VALUES ( 50, '아름다운부서' , '서울');
오류 보고 -
ORA-12899: value too large for column "SCOTT"."DEPT"."DNAME" (actual: 18, maximum: 14)

DESC dept;
DNAME           VARCHAR2(14)   14바이트 문자열   한글 4문자 

한글 6문자 == 18바이트
한글 1문자 ==  3바이트

-- VSIZE() 함수
SELECT VSIZE('아')  -- 3바이트
, VSIZE('아름다운부서') -- 18바이트
, VSIZE('a')          -- 1바이트   알파벳 대소문자    한 문자는 1바이트    
FROM dual;

--강사님 
--UPPER() 오라클 함수를 사용할 때
--꼭 %랑 문자열이랑 따로 둔 다음에 더해야하나요?
--제가 22번에서 UPPER('%la%') 이렇게 했었는데 답은 잘 출력되어서요


-- 문제) dept 테이블  40,50,60,70 부서 삭제
for( int i=40; i<=70; i+=10)  PL/SQL
{
    DELETE FROM dept WHERE deptno = i;
}
DELETE FROM dept WHERE deptno = 50;
DELETE FROM dept WHERE deptno = 60;
DELETE FROM dept WHERE deptno = 70;
COMMIT;
--
DELETE FROM dept
WHERE deptno = 40 OR deptno = 50 OR deptno = 60 OR deptno = 70;
--
DELETE FROM dept
WHERE deptno IN ( 40, 50, 60, 70 );
--
DELETE FROM dept
WHERE deptno BETWEEN 40 AND 70;


-- 문제) insa 테이블에서 연락처(tel)가 없는 사원은 '연락처 등록 안됨' 출력하는 쿼리를 작성하세요. 
SELECT num, name, tel
        , NVL( tel , '연락처 등록 안됨')
        , buseo
FROM insa
WHERE tel IS NULL;

-- 문제) insa 테이블에서 num, name, tel 컬럼 출력할 때 연락처(tel) 없는 사람은 X, O 출력
--       ( 개발부 만 출력 )
--       NVL2( expr1, expr2, expr3 ) 함수 알고 있는 있나? 
SELECT num, name 
        , NVL2( tel, 'O', 'X' ) tel
FROM insa
WHERE buseo LIKE '%개발%';


-- [ 오라클 연산자 ] 
-- [ 오라클 함수   ]
-- [ 오라클 자료형 ]
         LOB 자료형
         CLOB 자료형

1. 비교 연산자 : where 절에서 사용               숫자, 날짜, 문자    true, false,  null
                >  >=  <  <=   != ^=  <>   =
-- SELECT 3 > 5;    -- MS SQL 
SELECT 3 > 5 
FROM dept;      
    --  LOB 자료형은 비교연산자를 사용할 수 없지만, PL/SQL에서는 CLOB 데이터를 비교할 수 있다.

     -- ANY, SOME, ALL   SQL 연산자  X

2. 논리 연산자  : where 절에서 사용   AND, OR, NOT 연산자       true, false, null

3. SQL 연산자  :    [NOT] IN ( list )
                   [NOT] BETWEEN a AND b
                   [NOT] LIKE
                   IS [NOT] NULL
    ANY, SOME, ALL  SQL연산자 + 비교연산자
    
    NOT EXISTS          SQL연산자       where      ( 상관(Correlated )서브쿼리  존재하면 true 반환)
    == NOT IN

4. NULL 연산자   - IS NULL,   IS NOT NULL

5. 연결 연산자     ||              CONCAT()

6. 산술 연산자   +  -  *   /             나머지 함수 MOD()

  의문점 ?   dual 
SELECT  5 + 3 
        , 5 - 3
        , 5 * 3
        , 5 / 3   -- 1.66666666666666666666666666666666666667           JAVA : 1
        , MOD(5,3)   -- %    MOD() 함수
FROM dual;
--FROM dept;

SELECT -- 5 / 0   -- ORA-01476: divisor is equal to zero
       --  5.0 / 0
       -- MOD( 5, 0 ) -- 5
       MOD( 5.0 , 0 )  -- 5
FROM dual;

***  [ dual 이란 ? ] ***
4:05 수업시작~
1. SYS 관리자계정이 소유하고 있는 테이블( 오라클 표준 테이블 )
2. 행 1개 , 컬럼 1개인 dummy 테이블
    DESC dual;
    DUMMY 컬럼    VARCHAR2(1) 
3. 일시적으로 날짜연산, 산술연산할 때 자주 사용.

SELECT SYSDATE, CURRENT_DATE  -- 22/04/07	22/04/07
         , CURRENT_TIMESTAMP
FROM sys.dual;

4. 스키마.테이블명( sys.dual ) -> PUBLIC 시노님( sysnoym )설정했기 때문에
SELECT SYSDATE
FROM dual;
5. dual 테이블은 오라클 설치하면 자동으로 만들어지는 테이블이다.

오라클 함수 :  루트4 == 2 == sqrt(4)         

-- 시노님( SYNONYM ) 이란?
1. HR 접속해서  
   SELECT *
   FROM emp;
2. [PUBLIC] 생략하면 Private 시노님
【형식】
	CREATE [PUBLIC] SYNONYM [schema.]synonym명
  	FOR [schema.]object명;
3. PUBLIC 시노님은 모든 사용자가 접근 가능하기 때문에 생성 및 삭제는 오직 DBA만이 할 수 있다.

4.  PUBLIC 시노님의 생성 순서
1) SYSTEM/SYS 권한으로 접속한다.
2) PUBLIC 옵션을 사용하여 시노님을 생성한다.
3) 생성된 시노님에 대해 객체 소유자로 접속한다. 
4) 시노님에 권한을 부여한다.
GRANT SELECT ON emp  TO HR;
-- Grant을(를) 성공했습니다.

-------------------------------------------------------------
--  FLOOR() 함수와 ROUND() 함수의 차이점
-- MOD       : n2 - n1 * FLOOR (n2 / n1)    절삭함수
-- REMAINDER : n2 - n1 * ROUND (n2 / n1)    반올림함수

-- JAVA   반올림 Math.round() , 절삭(내림) Math.floor()  , 절상(올림)  Math.ceiling()

SELECT MOD(5,2)           -- *****
     , REMAINDER(5,2)
FROM dual;

7. SET(집합) 연산자
  ㄱ. UNION 연산자     - 합집합
SELECT deptno, empno, ename, job  
FROM emp
WHERE deptno = 20
UNION
SELECT deptno, empno, ename, job  
FROM emp
WHERE job = 'MANAGER';

-- 3명
20	7566	JONES	MANAGER  ***
30	7698	BLAKE	MANAGER
10	7782	CLARK	MANAGER

-- 3명
20	7369	SMITH	CLERK
20	7566	JONES	MANAGER  ***
20	7902	FORD	ANALYST
  
  ㄴ. UNION ALL 연산자 - 합집합 + ALL
  ㄷ. INTERSECT 연산자 - 교집합
  ㄹ. MINUS 연산자     - 차집합






























-- SYS 계정 접속 --
-- 최고 관리자(DBA) 계정
CREATE PUBLIC SYNONYM  arirang
  	          FOR scott.emp;
-- SYNONYM ARIRANG이(가) 생성되었습니다.

DROP PUBLIC SYNONYM arirang;
-- SYNONYM ARIRANG이(가) 삭제되었습니다.

-- ORA-00942: table or view does not exist
SELECT *
FROM emp;

-- 스키마.테이블명
SELECT *
FROM scott.emp; -- 권한 O  스키마.객체명  불편하더라..-> 시노님 ( 다른 이름 간단하게 지정 )

 

롤생성 ->권한 부여 롤 - >롤 계정 

like 연산자 

칼럼명 like '패턴' 

보통 where 절에 사용 

where 칼럼명 like '와일드카드 %_ ' escape 

 

regexp_like() 

regexp_like(칼럼명 , '정규표현식' , 'i'  파라미터) 

 

이제까지 배운 오라클 함수 

ㄱ.NVL ()  NVL2()  

null 값을 지정된 값으로 변환하는것 

ㄴ. substr (문자열, position , [, length]) 

잘라내고자하는 칼럼명 

0, 1- >첫번째 문자부터 

-n  ->뒤에서 n번째 

ㄷ. upper(칼럼명 또는 문자열)

ㄹ. to_char (날짜형 ,'RRRR' or 'YYYY')  =문자로 반환 '2010' 

extract( year from hiredate ) =숫자로 반환 2010

ㅁ. regexp_like()

ㅂ. concat() 

ㅅ. is null /is not null

 

SELECT : ALL , AS, DISTINCT

select distinct busio, name

from insa

order by buseo asc;

 

 

select name, 

concat(substr(ssn,0,8), '******')rrn 

from insa

where regexp_like(ssn,'^7.{6}-[13579]')

여기서 .은 모든 문자를뜻한다. 

where regexp_like(sssn,'^7\d{5}-[13579]')

where regexp_like(sssn,'^7\d\d\d\d\d-[13579]')

where regexp_like(sssn,'^7[0-9][0-9][0-9][0-9][0-9]-[13579]')

where regexp_like(ssn,'^7') and mod(substr(ssn,-7,1),2)=1

where

where ssn like '7%' 

where substr(ssn, 0,1)='7'; 

order by rrn asc;

(where 70년대생and 남자  조건절 ; )

 

NAME                 RRN           
-------------------- --------------
문길수               721217-1******
김인수               731211-1******
김종서               751010-1******
허경운               760105-1******
정한국               760909-1******
최석규               770129-1******
지재환               771115-1******
홍길동               771212-1******
산마루               780505-1******
장인철               780506-1******
박문수               780710-1******
이상헌               781010-1******
김정훈               790304-1******
박세열               790509-1******
이기상               790604-1******

 

 

mod(데이터, 나누기) 
데이터 / 나누기를 수행해 나머지 값을 출력
dept 테이블 조회 

select *

from dept;

number(2) 2자리문자열
varchar2(14) 14바이트 문자열 
DML - 새로운 부서를 추가 insert+commit, rollback 트랜잭션 처리를 해야한다. 

INSERT INTO 테이블명(칼럶명,,, ) VALUES (칼럼값,,, ) ;

COMMIT; 

INSERT INTO dept(deptno, dname, loc  ) VALUES (100, 'qc100%t' ,' seoul' )

//오류 

ORA-01438: value larger than specified precision allowed for this column

 

 

update문 써보기 


update 테이블명 
set 수정할 칼럼 =수정할값 
[where 조건식]

 

delete문 

delete 테이블명 --where 조건이 없으면 모든 레코드 삭제 

where 조건 

CRUD
create read update delete 

 

'Java' 카테고리의 다른 글

오라클 days08  (0) 2022.04.14
오라클 days06  (0) 2022.04.11
[오라클]days03  (0) 2022.04.06
days02 오라클  (0) 2022.04.06
순서도 그리기  (0) 2022.04.02
Comments