아래와 같이 테이블 tbl이 있다고 가정하면
col
-----
a
ab
b
ba
select * from tbl where col between 'a' and 'b';
결과는 아래와 같다.
col
----
a
ab
b
아래와 같이 테이블 tbl이 있다고 가정하면
col
-----
a
ab
b
ba
select * from tbl where col between 'a' and '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로 정한 문자 바로 뒤의 문자는 일반문자로 인식한다.
[출처] oracle sql - escape 지정|작성자 제이슨
[출처] oracle sql - escape 지정|작성자 제이슨
정의
데이터베이스 객체로, 시퀀스가 생성할 때 설정된 규칙에 따라 정수를 생성한다. 시퀀스는 행을 식별하는 기본 키 값을 자동적으로 생성하거나, 난수 생성에 사용한다. 기본 값은 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 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
테이블 생성
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_ID | BASED_ON | TASK_IN_CHARGE |
---|---|---|
P02 | P01 | KING |
(null) | (null) | KOCHAR |
P04 | P03 | GREEN |
(null) | (null) | SCOTT |
P03 | (null) | (null) |
P01 | (null) | (null) |
TASK_ID | BASED_ON | TASK_IN_CHARGE |
---|---|---|
P02 | P01 | KING |
P04 | P03 | GREEN |
P03 | (null) | (null) |
P01 | (null) | (null) |
TASK_ID | BASED_ON | TASK_IN_CHARGE |
---|---|---|
P02 | P01 | KING |
P04 | P03 | GREEN |
(null) | (null) | KOCHAR |
(null) | (null) | SCOTT |
http://sqlfiddle.com
다양한 데이터베이스를 제공한다.
짱 좋다.