본문 바로가기
Database/Oracle

Oracle 기본02

by IT새내기IM 2023. 6. 8.

◆ MEMBER 테이블 생성

CREATE TABLE MEMBER (

ID VARCHAR2(20),

PASS VARCHAR2(20),

NAME VARCHAR2(10),

GENDER VARCHAR2(6),

AGE NUMBER,

BIRTHDAY VARCHAR2(10),

PHONE VARCHAR2(13),

SIGNDATE DATE

);


ㄴ▣ MEMBER 테이블 구조 변경

CREATE TABLE member (

id VARCHAR2(20),

PASS VARCHAR2(20),

NAME VARCHAR2(10), -- NVARCHAR2(10) --

GENDER VARCHAR2(6), -- NCHAR(1) F:여성 , M:남성 --

AGE NUMBER, -- 삭제 --

BIRTHDAY VARCHAR2(10),

PHONE VARCHAR2(13),

SIGNDATE DATE

-- EMAIL VARCHAR2(100) 추가 -- 

);

 

[아래 구문 실행]

ALTER TABLE MEMBER MODIFY NAME NVARCHAR2(10);

ALTER TABLE MEMBER DROP COLUMN AGE;

ALTER TABLE MEMBER ADD EMAIL VARCHAR2(100);

 

 

 

[수정된 쿼리]

CREATE TABLE member (

id VARCHAR2(20),

PASS VARCHAR2(20),

NAME NVARCHAR2(10),

GENDER NCHAR(1),

BIRTHDAY VARCHAR2(10),

PHONE VARCHAR2(13),

SIGNDATE DATE,

EMAIL VARCHAR2(100)

);


ㄴMEMBER 테이블 - DDL ( insert , update , delete , select )

insert into member(id,pass) values('1111','1111');

select * from member; 

 

insert into member(id,pass) values('2222','2222');

select * from member; 

 

update member set pass='3333' where id='2222';

select * from member; 

 

delete from member where id='2222';

select * from member;

 

commit; //영구 저장되는 영역에 저장

 

<!-- INSERT -->

01. insert into 테이블명 ( 원하는 칼럼들 ) values ( 해당 칼럼에 해당하는 값들 - 순차적으로 매칭 );

ex) insert into member (id,pass) values ('1111','1111'); //위 예제 인용

 

02. insert into 테이블명 values ( 모든 칼럼에 해당하는 값들 ); //칼럼 생략

insert into member values('2222','2222','이순이','F','2002-01-01','010-2222-2222','2023-03-01','2222@2222.com'); //실행

 

<!-- SELECT --> 

03select * from member; //실행

 

04select id,pass from member; //실행 

 

<!-- UPDATE --> 

05update member set​ name='일돌이',email='1111@1111.com' where id='1111'; //실행

06select * from member; //실행 

 

 

07. commit//영구 저장되는 영역에 저장 


● 트랜젝션

 트랜젝션(Transactions) : 하나의 논리적 작업 단위를 구성하는 하나 이상의 sql문

 

 commit : 트랜잭션의 효과를 데이터베이스에 확정하기 

 rollback : 트랜잭션의 효과를 테이터베이스에 취소하기 

 

● 트랜잭션의 사용 이유?

 

사용자, 오라클 서버, 애플리케이션 개발자, DBA 등에게 데이터 일치성을 보장하기 위해서 이다. 

 

● 트랜잭션의 예 

 

 select * from member where id='1111'; 

 

① 

 추가 실행 

 

 첫번째) 기존 Developer 에서

update member set name='일돌이' where id='1111'; //실행 

 

 두번째) 추가 실행한 Developer 에서 

update member set name='홍길동' where id='1111'; //실행

 

 

01. 먼저 첫번째) lock 처리 되면서 다른 사용자(두번째)의 영향을 받지 못하도록 한다. ( 다른 사용자 대기 상태 )

 

02. 임시로 사용되는 영역에서 먼저 테스트 처리를 한다.

 

03첫번째) commit 처리 ( 영구적으로 사용되는 영역에 저장된다. )

04첫번째) rollback 처리 ( 취소 처리된다. ) 

 

05. commit , rollback 둘 중 하나를 실행하면 unlock 처리가 되면서 대기 하고 있던 다른 사용자(두번째)의 쿼리가 시작한다. 

◆ NOTICE 테이블 생성

CREATE TABLE NOTICE(

id NUMBER, 

title NVARCHAR2(200),

content CLOB,

writer NVARCHAR2(20),

signdate TIMESTAMP,

hit NUMBER,

files NVARCHAR2(500)

);


ㄴ▣ 데이타 삽입

insert into notice values(1,'제목','내용','1111','2023-01-01 09:01:02',0,'');

insert into notice values(2,'날씨','좋다','2222','2023-02-02 19:21:34',22,'');

insert into notice (id,title,content,writer,hit) values(3,'점심','라면','1111',16);

insert into notice values(4,'저녁','고기','2222','2023-02-04 18:24:14',100,'');

insert into notice values(5,'야식','치킨','2222','2023-02-04 22:05:45',57,'');

insert into notice values(6,'아침','토스트','1111','2023-02-06 07:08:33',44,'');

insert into notice values(7,'아침','패스','2222','2023-02-06 07:48:17',121,'');

 

commit;

 

select * from notice;

● DAUL 테이블

▶ Dual 테이블의 정의

 

 1. 오라클 자체에서 제공되는 테이블

 2. 간단하게 함수를 이용해서 계산 결과값을 확인 할 때 사용하는 테이블

 

SELECT * FROM DUAL; //오직 한 행, 한 컬럼(dummy)을 담고 있는 테이블 

 

▶ Dual 테이블의 사용 용도

 

 - dual 테이블은 사용자가 함수(계산)를 실행할 때 임시로 사용하는데 적합하다.

 - 함수에 대한 쓰임을 알고 싶을때 특정 테이블을 생성할 필요없이 dual 테이블을 이용하여 함수의 값을 리턴(return)받을 수 있다.

● 산술 연산자 ( + , - , * , / )

● 연산자 : + , - , * , /

01. select hit from notice;

 

02. select hit+1 from notice;

03. select hit+1 as hit from notice;

04. select hit+1 hit from notice; //as 생략 가능

 

04. select 9+2 , 9+'2' , '9'+2 , '9'+'2' from dual; //숫자 연산

 

05. select 9||2 , 9||'2' , '9'||2 , '9'||'2' from dual; //문자 연산
 


● 관계 연산자 ( and , or , between , in , not )

● 연산자 : not , and , or , between , in 

01. select * from notice;

02select * from notice where hit=0 or hit=100;

03select * from notice where hit in(0,100); 

 

04select * from notice where hit not in(0,100); 

05select * from notice where 50<hit and hit<=100;

06select * from notice where hit between 50 and 100; 

 

● 비교 연산자 ( = , != , ^= , <> , > , < , >= , <= , is null , is not null )

● 연산자 : = , != , ^= , <> , > , < , >= , <= , is null , is not null

 

01. select * from notice;

02. select * from notice where writer = '1111';

 

 

03. select * from notice where writer != '1111';

04. select * from notice where writer ^= '1111';

05. select * from notice where writer <> '1111';

 

 

06select * from notice where hit > 99; 

06select * from notice where signdate is null; 

 

07select * from notice where signdate is not null; 

● 패턴 연산자 ( like , % )

● 연산자 : like , % 

insert into member(id,pass,name,gender) values('3333','3333','삼순이','F');

insert into member(id,pass,name,gender) values('4444','4444','최이돌','M'); 

update member set gender='M' where id='1111';

 

01. select * from member; // 전체

02. select * from member where name like '이%'; // '이'로 시작하는 이름

03. select * from member where name like '%이'; // '이'로 끝나는 이름

 

04. select * from member where name like '%%'; // '이' 단어를 포함한 이름 

 

05. select * from member where name NOT like '이%'; // '이' 로 시작이 아닌 이름 

● ROWNUM ( 페이징 )

01. select * from notice;

02. select * from notice where rownum between 1 and 5; //출력

03. select * from notice where rownum between 6 and 10; //출력할 내용이 없음

 

04. select * from (select rownum num,notice.* from notice) where num between 1 and 5// 1페이지

 

05. select * from (select rownum num,notice.* from notice) where num between 6 and 10// 2페이지 

 


● DISTINCT ( 중복된 값 제거 )

01. select * from notice;

02. select DISTINCT writer from notice;

 


● 문자열 함수 ( SUBSTR , CONCAT , TRIM , LOWER , UPPER , REPLACE )

select substr('abcd efg',1,3) from dual; --첫번째 문자열에서 3자리 : abc

select substr('abcd efg',3) from dual; --3번째 자리부터 : cd efg

select substrb('abcd efg',3) from dual; --3byte부터 : cd efg

select substrb('좋은 아침',4) from dual; --4byte부터 : 은 아침

 

01. select * from member; -- 아래와 같이 보여질 수 있도록 값을 변경 ( birthday , phone )

 

<!-- year , month , day 분리해서 볼 수 있도록 출력 --> 

02. select name,birthday,substr(birthday,1,4) y,substr(birthday,6,2) m,substr(birthday,9,2) d from member;

 

<!-- 연락처가 '010'으로 시작되는 정보를 출력 -->

03select name,phone from member where phone like '010%'; // 패턴 연산자

04select name,phone from member where substr(phone,1,3) = '010'; // substr() 이용

 

 

<!-- 생년월일중 '01'월과 '12'월만 출력 -->

05select name,birthday from member where SUBSTR(birthday,6,2) = '01' or SUBSTR(birthday,6,2) = '12';

06select name,birthday from member where SUBSTR(birthday,6,2) IN('01','12'); 

 

 

== 기타 함수 ==

select CONCAT('좋은','데이') from dual; -- 문자열 합치기

 

select LTRIM('  좌측공백 없애기  ') from dual;

select RTRIM('  우측공백 없애기  ') from dual;

select TRIM('  양측공백 없애기  ') from dual;

 

select LOWER('ABC def') from dual; --소문자로 변환

select UPPER('ABC def') from dual; --대문자로 변환

 

select REPLACE('i am a boy','boy','girl') from dual; -- i am a girl 출력

-- 첫 항 문자열에서 두번째 항에 존재하는 문자열이 있다면 세번째 항에 있는 문자열로 변경 처리

 

select LPAD('abcde',10) from dual; -- 왼쪽부분에 빈공간 처리 (10자리 만들기) : "     abcde"

select LPAD('abcde',10, '-') from dual; -- 왼쪽부분에 빈공간 '-' 처리 (10자리 만들기) : "-----abcde"

select RPAD('abcde',10) from dual; -- 오른쪽부분에 빈공간 처리 (10자리 만들기) : "abcde     "

select RPAD('abcde',10, '-') from dual; -- 오늘쪽부분에 빈공간 '-' 처리 (10자리 만들기) : "abcde-----"

 

select INITCAP('i am a boy') from dual; -- 단어의 첫 글짜마다 대문자 처리 : I Am A Boy

● 날짜 함수

01. select SYSDATE,SYSTIMESTAMP FROM DUAL;

 

 

02. ALTER SESSION SET NLS_DATE_FORMAT= 'YYYY-MM-DD HH24:MI:SS'; -- 실행 

 

03. select SYSDATE,SYSTIMESTAMP FROM DUAL; 

 

select TO_CHAR(SYSDATE, 'YYYY') from dual; -- 2023

select TO_CHAR(SYSDATE, 'MM') from dual; -- 04

select TO_CHAR(SYSDATE, 'DD') from dual; --13

 

select TO_CHAR(SYSDATE, 'HH24') from dual; --15

select TO_CHAR(SYSDATE, 'MI') from dual; --52

select TO_CHAR(SYSDATE, 'SS') from dual; --47

 

select EXTRACT(MONTH FROM SYSDATE) from dual; -- 4 (한자리)

select EXTRACT(SECOND FROM SYSTIMESTAMP) from dual; --47.276 (소수점)

 

select SYSDATE,ADD_MONTHS(SYSDATE,1) FROM DUAL; -- 한달 후 날짜 

 

select 

SYSDATE, --현재날짜  

SYSDATE + 100, --현재날짜 +100일

SYSDATE - 100 --현재날짜 -100일

from dual;

ㄴ▣ Time Zone

01. select sysdate, systimestamp from DUAL;

 

02. select * from v$timezone_names;

03. select tz_offset('asia/seoul') from dual; //+09:00

 

● 숫자 함수

01. select SIGN(10) , SIGN(-10) , SIGN(0) from dual; -- 양수,음수,0 반환

 

02. select ROUND(3.14),ROUND(3.64) from dual; -- 소수점 첫번째 자리에서 반올림한 정수 반환

 

03. select ROUND(1.23456, 2),ROUND(1.23456, 3) from dual;

 

04select TRUNC(17/5) 몫, MOD(17,5) 나머지 from dual; 

05select POWER(5,2) 제곱, SQRT(25) 제곱근 from dual; 

 

● 변환 함수 ( TO_CHAR , TO_DATE , TO_NUMBER )

 


 

 숫자,날짜  문자 : TO_CHAR() 

 문자  날짜 : TO_DATE()

 문자  숫자 : TO_NUMBER()

 

01. 숫자 > 문자

 

-- 3자리마다 쉼표 처리 , 마침표 뒤는 소수점 의미

-- 좌측 항의 길이보다 우측 항의 길이가 같거나 커야한다.

 

① select to_char(1234567, '9,999,999') from dual; --좌,우측항의 길이가 같을 때

② select to_char(1234567, '999,999') from dual; --좌측항이 길 때 

③ select to_char(1234567, '99,999,999,999') from dual; -- 우측항이 길 때 

 --왼쪽 공백란이 생긴다.

④ select TRIM(to_char(1234567, '99,999,999,999')) from dual; -- TRIM()함수 이용 

⑤ select TRIM(to_char(1234567, '99,999,999,999.99')) from dual; --소수점 2자리 표현 

 

 

⑥ select TRIM(to_char(1234567, '99,999,999,999')) || '원' from dual; --원 

 

 

02. 날짜 > 문자 

 

⑥ select TO_CHAR(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual; 

 

select TO_CHAR(sysdate, 'yyyy') from dual; --2023

select TO_CHAR(sysdate, 'RRRR') from dual; --2023

select TO_CHAR(sysdate, 'yy') from dual; --23

select TO_CHAR(sysdate, 'year') from dual; --twenty twenty-three

 

select TO_CHAR(sysdate, 'mm') from dual; --04

select TO_CHAR(sysdate, 'mon') from dual; --4월

select TO_CHAR(sysdate, 'month') from dual; --4월

 

select TO_CHAR(sysdate, 'dd') from dual; --14

select TO_CHAR(sysdate, 'day') from dual; --금요일

select TO_CHAR(sysdate, 'ddth') from dual; --14th

 

select TO_CHAR(sysdate, 'am') from dual; --오전

select TO_CHAR(sysdate, 'fm') from dual; --null

 

select TO_CHAR(sysdate, 'hh24') from dual; --09

select TO_CHAR(sysdate, 'mi') from dual; --02

select TO_CHAR(sysdate, 'ss') from dual; --16

 

02.  문자 > 날짜

select TO_DATE('2023-04-14') from dual;

select TO_DATE('2023-04-14 09:11:22', 'YYYY-MM-DD HH24:MI:SS') from dual; 

 

02.  문자 > 숫자

select to_number('2023') from dua

 

● 집계 함수 

▣ order by ( asc , desc )

▣ select * from member; 

 

01ORDER BY 칼럼명 ASC or DESC

 

① select id,pass,name,birthday from member order by birthday asc; 

 

② select id,pass,name,birthday from member order by birthday desc; 

▣ group by ( sum , min , max , count , avg )

▣ select * from notice; 

 

 

① select writer,sum(hit) from notice group by writer; --writer 별 총 조회수

 

 

② select writer,min(hit) from notice group by writer; --writer 별 최저 조회수

 

③ select writer,max(hit) from notice group by writer; --writer 별 최고 조회수

 

 

 select writer,avg(hit) from notice group by writer; --writer 별 총 조회수 

 

 

 select writer,count(*) from notice group by writer; --writer 별 총 작성수

 

 

⑥ select writer,count(*) from notice group by writer HAVING count(*) > 3; --group by 절에서 조건은 HAVING 이용 

 

● 순위 함수 ( row_number , rank , dense_rank )

 select * from notice; 

 

01. 정렬 관련 쿼리문

 

① select * from notice order by hit; --hit 칼럼 오름차순으로 정렬

 

 

② select ROWNUM num,notice.* from notice order by hit;

③ select * from (select ROWNUM num,notice.* from notice) order by hit;

 

④ select ROW_NUMBER() OVER (order by hit desc) num, notice.* from notice;

 

 

⑤ update notice set hit=44 where id=5; --조회수 변경

commit; --실행 

⑥ select RANK() OVER (order by hit desc) num, notice.* from notice; --순위 출력 : 공동 4위 2건이니 다음은 6위

 

 select DENSE_RANK() OVER (order by hit) num, notice.* from notice; --순위 출력 : 공동 4위 상관없이 다음은 5위

 

⑧ select DENSE_RANK() OVER (PARTITION by writer order by hit) num, notice.* from notice; --작성자 별 순위 

 

 

● 서브 쿼리 ( 선택 칼럼 기준 졍렬 후 페이징 처리 )

 select ROW_NUMBER() OVER (order by hit) num, notice.* from notice; --조회수 오름차순 졍렬 후 전체 목록

 select * from (select ROW_NUMBER() OVER (order by hit) num, notice.* from notice) where num between 1 and 5; -- 1페이지 

 

 select * from (select ROW_NUMBER() OVER (order by hit) num, notice.* from notice) where num between 6 and 10; -- 2페이지 

 

 

'Database > Oracle' 카테고리의 다른 글

Oracle 03 Spinrg 연동 및 설정  (0) 2023.06.09
Oracle 기본01 설정잡기  (0) 2023.06.08

댓글