아래와 같이 테이블 tbl이 있다고 가정하면


col

-----

a

ab

b

ba


select * from tbl where col between 'a' and 'b';


사전순으로 a 부터 b까지의 모든 문자열 포함하는 레코드를 찾는다(a와 b 포함).


결과는 아래와 같다.


col

----

a

ab

b

http://yjacket.tistory.com/60


결론은 빈 문자열은 NULL과 같다는 것이다.

다만 주의할 것은

NULL은 비교 대상으로 삼을 수 없는 것과 같이

any expression = '', any expression <> '' 등의 비교는 FALSE 이다


단, '' IS NULL은 TRUE 이다.

패턴 검색을 할 경우, 오라클에서는 LIKE '_' 또는 '%'를 사용하게 되는데

("_"는 한 문자, "%"는 0개 이상의 문자)

한 가지 문제가 있다.

위의 문자를 포함한 데이터를 검색하고 싶을 땐 어떻게 할까?

 

가령 "M_" 로 시작되는 모든 데이터를 검색하고 있다면 말이다.

해답은, 아래의 참고를 보길 바란다.


▶ SQL문

SELECT ename 
FROM emp 
WHERE ename LIKE 'M\_%' ESCAPE '\'
;


ESCAPE 옵션을 사용하면 된다.

ESCAPE로 정한 문자 바로 뒤의 문자는 일반문자로 인식한다.

http://micropilot.tistory.com/1608


아래 사이트가 원본 같음

http://oradim.blogspot.kr/2009/05/oracle-proc-on-windows-with-express.html

정의

데이터베이스 객체로, 시퀀스가 생성할 때 설정된 규칙에 따라 정수를 생성한다. 시퀀스는 행을 식별하는 기본 키 값을 자동적으로 생성하거나, 난수 생성에 사용한다. 기본 값은 1부터 시작하여 1씩 증가하고, 최대 15개까지 만들 수 있다.


시퀀스 생성

CREATE SEQUENCE 시퀀스명

[INCREMENT BY  증가값]

[START WITH       시작값]

[MAXVALUE        최대값]

[CYCLE              반복횟수]


시퀀스의 참조변수

시퀀스의 값을 반환하는 참조변수로 NEXTVAL과 CURRVAL이 있다.

시퀀스명.NEXTVAL : 시퀀스의 현재 값에 '증가값'을 더한 값을 정수로 반환

시퀀스명.CURRVAL : 시퀀스의 현재 값을 정수로 반환



시퀀스의 데이터를 다루는 참조변수 용도

INSERT문에서 VALUES절, SELECT문에서 선택 목록, UPDATE문의 SET절에 사용할 수 있다.

DISTINCT절이 있는 SELECT문, ORDER BY절, GROUP BY절이 있는 SELECT문, 서브 쿼리, 뷰 쿼리에서는 사용할 수 없다.


SQL> SELECT Dept_Seq.NEXTVAL, Dept_ID, Dept_name

    2    FROM Department;


NEXTVAL    DEPT_ID    DEPT_NAME

---------- ---------- -------------

1    컴공        컴퓨터공학과

2    정통        정보통신공학과


SQL>


시퀀스 삭제

DROP SEQUENCE 시퀀스명;


연습문제

다음과 같이 시퀀스를 생성했다.


create sequence seq1

start with 100

increment by 10

maxvalue 200

cycle

nocache;


seq1 시퀀스는 최대값인 200까지 숫자를 생성한 상태이다. 다음 SQL문을 실행하면 어떤 결과가 나올까?


SELECT seq1.nextval FROM dual;


답> 1

 -> start with 가 100이지만 최대값을 찍고나면 다시 1부터 시작.

  • 뷰의 용도
    • 테이블의 접근에 관한 권한 제한하고
    • 개발자나 사용자에게 복잡성을 감추고
    • 칼럼명을 변경하여 단순화할 때 사용


뷰 생성 구문

CREATE VIEW 뷰이름

[(칼럼명1, 칼렴명2, ...)]

AS

SELECT문;


  • 뷰 생성시 고려사항
    • 칼럼명 생략하면, SELECT문에 기술한 칼럼명으로 대체됨
    • 함수나, 수식, 리터럴 등이 사용되면 별명을 사용하거나, 칼럼명을 기술해야 됨
    • SELECT문에 사용하는 테이블의 기본 키, NOT NULL 칼럼을 포함시켜야 데이터의 추가나, 수정이 가능
    • 뷰 생성시 SELECT문에 GROUP BY절, HAVING절, ORDER BY절과 그룹함수, 수식 등을 사용할 수 있음

  • 뷰를 통한 데이터의 트랜잭션이 가능하게 하려면
    • GROUP BY절, DISTINCT, 그룹함수 등을 사용한 뷰가 아니어야 한다.
    • 하나의 테이블에서 생성된 뷰이어야 한다.
    • 수식이 사용된 필드는 수정, 삭제 할 수 없다.
    • 기본 키, NOT NULL로 설정된 칼럼이 모두 포함되어야 한다.


  • WHERE절의 IN, EXISTS, BETWEEN 사용 시에...
    • 내부에 LIKE, TO_DATE 와 같은 함수를 사용하지 못 하는 듯...
  • 집합연산 사용 시에...
  • select id, name "Last Name"

    from a

    where cid =10

    union

    select id CUST_NO, name

    from a

    where cid=30;

    위와 같은 SQL문이 있다고 가정했을 때


    아래 세 개의 ORDER BY절은 에러 없이 정상 동작하지만

    ORDER BY 2, id

    ORDER BY 2, 1

    ORDER BY "Last Name"


    다음 ORDER BY절은 에러가 발생한다.

    ORDER BY CUST_NO


    확실하진 않지만 첫 번째 select 문의 alias만 쓸 수 있는 것 같다

테이블 생성

create table p (

  pdtno number(3) not null,

  pdtname varchar2(25),

  qty number(6, 2),

  constraint pdtnopk primary key(pdtno)

);


create table pc (

  pdtno number(3) not null,

  constraint pdtnofk foreign key(pdtno) references p(pdtno)

);


이렇게 하면 pc(pdtno)가 p(pdtno)를 참조한다.

따라서 p 테이블의 레코드는 맘대로 삭제도 못 함.

그러나 pc 테이블을 다음과 같이 생성하면,


create table pc (

  pdtno number(3) not null,

  constraint pdtnofk foreign key(pdtno) references p(pdtno) on delete cascade

);


p 테이블의 레코드를 삭제하면 pc 테이블의 레코드가 연쇄적으로 삭제된다.


on delete cascade 이외에 on delete set null 라는 제약도 있다.

부모 레코드가 삭제되면 자식 레코드가 null이 된다.

테이블 정의

create table proj (

  task_id varchar2(3),

  based_on varchar2(3),

  task_in_charge varchar2(10)

);


데이터 삽입

insert into proj values('P01', '', 'KING');

insert into proj values('P02', 'P01', 'KOCHAR');

insert into proj values('P03', '', 'GREEN');

insert into proj values('P04', 'P03', 'SCOTT');


OUTER JOIN 쿼리 수행

SELECT p.task_id, p.based_on, d.task_in_charge

FROM proj p FULL OUTER JOIN proj d

ON (p.based_on = d.task_id);


SELECT p.task_id, p.based_on, d.task_in_charge

FROM proj p LEFT OUTER JOIN proj d

ON (p.based_on = d.task_id);


SELECT p.task_id, p.based_on, d.task_in_charge

FROM proj p RIGHT OUTER JOIN proj d

ON (p.based_on = d.task_id);


결과

TASK_IDBASED_ONTASK_IN_CHARGE
P02P01KING
(null)(null)KOCHAR
P04P03GREEN
(null)(null)SCOTT
P03(null)(null)
P01(null)(null)
 Record Count: 6; Execution Time: 4ms View Execution Plan  link
TASK_IDBASED_ONTASK_IN_CHARGE
P02P01KING
P04P03GREEN
P03(null)(null)
P01(null)(null)
 Record Count: 4; Execution Time: 4ms View Execution Plan  link
TASK_IDBASED_ONTASK_IN_CHARGE
P02P01KING
P04P03GREEN
(null)(null)KOCHAR
(null)(null)SCOTT
 Record Count: 4; Execution Time: 64ms View Execution Plan  link

http://sqlfiddle.com


다양한 데이터베이스를 제공한다.

짱 좋다.

+ Recent posts