system, sys 비밀번호 변경 시...

콘솔 창에서

sqlplus "/as sysdba" 입력

SQL> alter user system identified by 새로변경할 패스워드;
SQL> alter user sys identified by 새로변경할 패스워드;

이렇게 해주면 패스워드가 변경되고

바뀐 비밀번호로 접속을 하면 된다.
■ EQUI JOIN

가장 많이 사용하는 조인 방법으로서 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법이다.

FROM 절에 조인할 두 테이블 명을 제시하고, WHERE 조건에 두 테이블에 공통된 컬럼을 조인 조건으로 제시한다.

조인 조건은 테이블 N개를 조인시 N - 1개의 조인 조건을 주어야 한다. 2개 테이블 조인시 조건 1개, 3개시 2개....

SELECT e.ENAME, d.DNAME
FROM EMP e, DEPT d
WHERE E.DEPTNO = D.DEPTNO;

- EQUI JOIN에다가 AND 연산을 추가 할 수 있다.

SELECT E.ENAME, D.DNAME
FROM EMP e, DEPT d
WHERE E.DEPTNO = D.DEPTNO;
AND e.ename='SCOTT';

■ NON-EQUI JOIN

NON-EQUI JOIN은 조인 조건에 특정 범위 내에 있는지를 조사하기ㅐ 위해서 WHERE 절에 조인 조건을 = 연산자 이외의 비교 연산자를 사욯한다.

SELECT e.ename, e.sal, s.grade
FROM EMP e, SALGRADE s
WHERE e.sal >= S.LOSAL AND e.sal <=S.HISAL;

- BETWEEN AND 사용시

SELECT e.ename, e.sal, s.grade
FROM EMP e, SALGRADE s
WHERE e.sal BETWEEN S.LOSAL AND s.hisal;

SELECT e.ename, D.DNAME, E.SAL, s.grade
FROM EMP e, SALGRADE s, DEPT d
WHERE e.deptno = D.DEPTNO 
AND e.sal BETWEEN S.LOSAL AND s.hisal;

■ SELF JOIN 

자신의 테이블만으로는 원하는 결과를 알아 낼 수 없으나 만일 자신과 같은 테이블이 두개 존재한다면 질의가 가능한 경우 마치 같은 테이블이 두개 인 것처럼 자기 자신 테이블과 조인하는 것을 SELF JOIN 이라고 한다. 이 경우 FROM 절에 같은 테이블 이름을 두 번 반복하게 되므로 반드시 테이블 별칭을 사용해야 한다.

SELECT e.ename || '의 매니저는 ' ||  m.ename || ' 입니다'
FROM EMP e, EMP m
WHERE e.mgr = m.empno;

■ OUTER JOIN

외부 조인은 조인 조건에 만족하지 못하였더라도 해당 행을 나타내고 싶을 때 사용한다. 컬럼 값이 NULL일 경우...
외부 조인은 "(+)" 연산자를 사용하여 NULL 값이기에 배제된 행을 결과에 포함시킬 수 있다.

SELECT e.ename || '의 매니저는 ' ||  m.ename || ' 입니다'
FROM EMP e, EMP m
WHERE e.mgr = m.empno(+);

KING의 매니저는 입니다. 라고 나타난다. NULL 값도 표시를 한다.





검색을 아래와 같은 쿼리로 실행할 경우,

SELECT *

FROM
(
SELECT rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <=20
ORDER BY bbsno DESC
)
WHERE rn > 10

낮은 코스트가 나온다

하지만 이 쿼리의 문제점은 데이터 양이 적을 때 풀 스캔을 먹는다는것이다.

- 힌트를 이용하여 강제로 풀스캔을 먹인 경우

SELECT /*+FULL(tbl_bbs)*/ rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <= 20
ORDER BY bbsno DESC

전체 디비를 검색하고 로우넘을 붙이고 마지막에 소팅을 한다. 코스트가 엄청 커진다.

검색 결과를 보면 처음부터 검색하는지 않고 중간에서 부터 결과가 나온다.

- 인덱스의 단점은 : 인덱스를 이용하여 insert나 delete 작업을 하면 떨어진다.

- 인덱스를 타고 싶은데 오라클 옵티마이저가 스스로 판단해서 full scan을 할때도 있기 때문에 로우넘이 꼬이는 경우가 있다. 그래서 hint를 사용하여 무조건 인덱스를 타게 해준다.

※ order by를 사용하지 않는다! 인덱스를 이용하여 아래에서 부터 검색
SELECT
/*+INDEX_DESC(tbl_bbs pk_bbs)*/ //->order by를 사용하지 않고 DESC를 사용해서
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0 
AND rownum <= 20

SELECT
/*+INDEX(tbl_bbs pk_bbs)*/
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0
AND rownum <= 20

1. 테이블 만들면서 복사해오기

CREATE table emp as
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

2. 원래 테이블에다가 select 해서 복사하는 방법

INSERT into emp (empid, name)
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

3. 자가 복사

INSERT into emp (empid, name)
SELECT empid, name FROM EMP

4. DB백업 방식!

SELECT 'insert into emp2 (empid, name) values (' || employee_id || ',''' ||  first_name || ''');' FROM hr.employees

- SQLGate에서 실행

셀 전체 복사
insert into emp2 (empid, name) values (100,'Steven');
....
insert into emp2 (empid, name) values (107, 'Gietz');

메모장에 붙여 넣기 하고 맨 마지막에 commit; 추가 한다.

aaa.sql 파일로 만든다. C 드라이브에 저장.

- slq 접속.
sql>@C:\\aaa.sql 을 실행한다.

※ 만약에 셀 전체를 해서 SQLGate에서 sql 창을 새로 열어서 복사하고 실행하면 실행 속도가 오래 걸린다!

■ system 계정으로 로그인 해서 user01 만든다.

(SQLGate 사용 또는 오라클 데이타베이스 홈페이지 접속 해서 실행)

CREATE USER USER01 IDENTIFIED BY USER01;

//DBA 권한 부여

GRANT CONNECT, DBA TO USER01;


■ 로그아웃 후 USER01 계정으로 접속한다.

- hr 계정의 employees에서 불러온다.
SELECT employee_id, first_name, last_name
FROM hr.employees;

- first_name과 last_name을 합쳐서 불러온다.
SELECT employee_id, first_name || last_name
FROM hr.employees

- first_name과 last_name 사이에 공백을 넣어서 불러온다.
SELECT employee_id, first_name || '' ||last_name
FROM hr.employees

- first_name과 last_name을 합친 컬럼 명을 name으로 ALIAS(별칭) 한다. name 앞에 AS가 생략됨.(AS name)
SELECT employee_id, first_name ||' ' ||  last_name
name
FROM hr.employees

- emp라는 테이블을 만들면서 hr 계정의 employees 테이블의 데이터들도 불러온다.
CREATE table emp as
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

- emp 테이블의 데이터 양을 두배로 늘린다. 실행후 107개가 214개가 되어 있음을 확인 할 수 있다.
INSERT INTO emp (empid, name)
SELECT employee_id empid, first_name ||' ' ||  last_name name
FROM hr.employees

검색을 테스트 하기 위해 기본적으로 100만건 이상의 자료가 있어야 공부하는데 도움이 된다.

그래서 쉽게 DB에 자료를 증가시키는 방법을 사용한다.

INSERT와 SELECT의 조인문을 이용해서 자가복사를 통해 데이터를 증가 시킨다.

SQL>INSERT INTO 테이블명 SELECT (NUMSEQ.NEXTVAL : 넘버 시퀀스가 있을 경우), 필드명, 필드명 .... FROM 테이블명;

이렇게 쿼리문을 입력하고 계속 실행해주면 10개가 20개, 20개가 40 개씩 배로 늘어나게 된다.

몇번만 해주면 쉽게 백만건을 넣을 수 있다.

이제 쿼리문 연습을 해보자.


 SQL(Structured Query Language)은 관계형데이터베이스(RDB:Relational Database)의 관계형 데이터베이스 관리 시스템에서 자료의 검색과, 관리, 질의, 수정, 삭제 등의 작업을 하는 컴퓨터 언어이다. 대부분의 데이터베이스 관리 프로그램들이 SQL을 표준으로 채택하고 있기 때문에, 문법의 큰 차이는 없다.

■ SQL문의 종류

- 데이터 정의(DDL:Data Definition Language)
: 데이터 정의어. 데이터베이스의 논리적 구조를 정의하는 언어로, 객체 생성 및 변경시 사용하고, 데이터 딕셔너리(Data Diactionary)에 저장된다.

* 명령문
CREATE(데이터베이스 객체 생성)
ALTER(데이터베이스 객체 변경)
DROP(데이터베이스 객체 삭제)
RENAME(데이터베이스 객체이름 변경)
TRUNCATE(데이터베이스 객체의 저장 공간 삭제)


- 데이터 조작어(DML:Data Manipulation Language)
:  데이터 조작어로 데이터 변경시 사용하는 언어이다. 데이터 검색(Retrieval), 추가(Insert), 삭제(Delete), 갱신(Update) 작업을 한다.

* 명령문
INSERT(데이터 입력)
UPDATE(데이터 수정)
DELETE(데이터 삭제)

- 데이터 제어어(DCL:Data Control Language)
: 데이터 제어어로 데이터에 대한 접근 권한 부여등의 데이터베이스 시스템의 트랜잭션을 관리하기 위해 사용.

* 명령문
GRANT(데이터베이스에 대한 일련의 권한 부여)
REVOKE(이미 부여된 데이터베이스 객체의 권한을 취소)

- 기타

질의어(DQL:Data Query Language)
: SELECT(데이터 검색시 사용)

트랜잭션 처리어(TCL:Transaction Control Language)
: COMMIT(트랜잭션의 정상적인 종료처리), ROLLBACK(트랜잭션 취소), SAVEPOINT(트랜잭션내에 임시 저장점 설정) 


+ Recent posts