Jam's story
[오라클 ] days0 본문
-- 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 |