< 기본 > 

 

DESC 테이블;    - 테이블의 구조를 검색

 

 

SELECT 컬럼1, 컬럼2 FROM 테이블;

 

 

SELECT * FROM tab;

<==  원래는 select table_name from user_tables (all_tables)  줄여서만든것

 

 

SELECT 수식 FROM dual;   - 칼럼과 무관한 수식계산가능

 

 

SELECT 컬럼1 as "별명", 컬럼2 as "별명",... FROM 테이블;
   =  SELECT 컬럼1 별명1, 컬럼2 별명2;

 

 

SELECT 수식 [as 별명],... FROM 테이블;

ex) SELECT eno 사번, ename 이름, sal*12 "년간 급여" FROM emp;

 

 

 

NVL (<컬럼명>, <치환값>)   -  널값을 치환
    ex) SELECT eno 사번, ename 이름, sal*12+nvl(comm,0) 년봉 FROM emp;

 

 

 

 

 SELECT 컬럼 || '문자열' || ...... FROM 테이블;    - 하나의 문자열을 생성

SELECT ename || '의 년봉은 '|| sal*12+nvl(comm,0)||'입니다.' FROM emp;    --> 오류
SELECT ename || '의 년봉은 '|| ( sal*12+nvl(comm,0) ) ||'입니다.' FROM emp;     -->  ok 
     이유??   연산순서오류(연산자우선순위) 때문에      (  ...' '|| sal 부터 연산함. > 그다음 *12  )

 

 

 

 

 

SELECT [DISTINCT | ALL] 컬럼, 컬럼, ...  FROM <테이블>;
    - DISTINCT : 중복된 출력값은 한번만 출력,   ALL : 모두출력(기본값)

 

 

 

 

 

 set line <숫자> - 전채 출력 넓이 지정
set pages <숫자> - 헤더 출력할 행의 단위를 지정
col <컬럼명> format a<숫자> - 컬럼의 폭 지정
   (단, 숫자값의 칼럼은 바꾸면 값이 ######으로 나온다. 다시 접속하면 된다. )

 

 

 

SELECT [DISTINCT/ALL] {*| 컬럼, ... }

FROM 테이블

WHERE 조건[{관계연산자 조건(AND, OR, NOT}....]

ORDER BY 정렬대상 [ASC/DESC], 정렬대상 [ASC/DESC].... ;

 

'조건' 대로 검색

위 순서를 지켜야 한다.

가능한 ' avr * 4.5/4.0 < 1.8 ' 보다 ' avr < 1.8*4.0/4.5 ' 로 하자.

(왼편을 작게. 시스템이 빨라질 가능성이 높다.)

 

WHERE ㅁㅁㅁ OR ㅁㅁㅁ AND ㅁㅁㅁ;     ---> AND 부터 연산
WHERE (ㅁㅁㅁ OR ㅁㅁㅁ) AND ㅁㅁㅁ;    ---> OR 부터 연산

 

 

 

 

SELECT [DISTINCT/ALL] {* | 컬럼, ... }

FROM 테이블

WHERE 컬럼

LIKE '비교 문자열' [{관계연산자 조건}....] (ESCAPE '');

 

 WHERE 절에 사용되는 문자전용의 비교연산자
 문자열의 일부만으로 검색
 _(?), %(*) 사용 ( _ 한개의 문자, % 문자열 )
        와일드문자사용하려면 ESCAPE 'ㅁ' 사용

( ex) LIKE '%이#%%' ESCAPE '#'    -->  '이%'가 포함된 문자열  )

          LIKE '김%'; 보다 LIKE '%하늘'; 이  --> 성능이안좋다. %를 앞에 두면 index를 할 수가 없다. 가능하면 문자열로 시작.

 

 

 


SELECT [DISTINCT/ALL]{* | 컬럼, ... }

FROM 테이블

WHERE 컬럼

BETWEEN 값1 AND 값2 ;

 

 칼럼의 값이 <값1 ~~ 값2 사이>의 값을 선택
 많이 사용하는 것이 좋다.

 

 

  


SELECT [DISTINCT/ALL]{* | 컬럼, ... }

FROM 테이블

WHERE 컬럼

IN (값1, 값2...) ;

 

하나라도 일치하는값 있으면 검색
      BETWEEN..AND..보다 더욱 유용함, 판독성 매우 우수, 더욱 빠름

 

 

 

 

< JOIN >

SELECT 테이블명1.컬럼명, ...테이블명2.컬럼명, ...

FROM 테이블명1, 테이블명2

WHERE 조인조건  AND  일반조건
( FROM ~ 테이블명 작은것을 먼저 쓰는게 좋다. )

  ( 일반조건 부터 해주는것이 좋다. )
   ( FROM에서 alias명 정하면, 테이블명 적으면 안된다! alias명으로만 적용됨 )

        
등가조인  :  = , 같은값찾아 조인
비등가조인 :  부등호를 통해 조인   ex) WHERE sal*1.1 between losal and hisal;

 

 

 

 

( self join + outer join )
동일 테이블을 별명을 이용해 다른 테이블인 것처럼 구현하여 join

 

 

SELECT 별명1.컬럼1, ..별명2.컬럼2, ...
FROM 테이블 별명1, 테이블 별명2
WHERE 조건
AND 조인 조건(+); 

   
자기를 참조하는 것이 아닌, 2개의 테이블이 있다고 생각해야한다.

 

 

( outer join )  ' + ' 기호는 데이터가 부족한 쪽에 기술

==> + 없는 테이블부터 읽는다.

 

 

 

 

 

<서브쿼리>
(단일 행 서브쿼리)
SELECT [DISTINCT/ALL]{*|<컬럼명>,...}
FROM 테이블명
WHERE 컬럼명 <단일행 연산자> (SELECT 문장 : Sub query문)

 


(다중 행 서브쿼리)
요구사항을 확실히알고 써야한다.
SELECT [DISTINCT/ALL]{*|<컬럼명>,...}
FROM 테이블명
WHERE 컬럼명 <다중행 연산자> (SELECT 문장 : Sub query문)

 IN(이 중 아무거나 하나만 일치하면 참)  /  ANY(하나이상 있으면 참)  /  ALL(모든 나열된 값과 조건맞아야함)

      사실 좀 뒤에 배울 MAX, MIN 쓰는것이 훨씬 좋다.

 

 

(다중 열 서브 쿼리)
SELECT [DISTINCT/ALL]{*|<컬럼명>,...}
FROM 테이블
WHERE (컬럼1, 컬럼2, ... ) IN (SELECT 문장 : Sub query문)

 

 

 

 <집합연산자>

(합집합)
SELECT 문장
UNION ALL
SELECT 문장

UNION 하면 정렬 후 중복된것 제외하면서 보여준다.(->느리다.)
UNION ALL은 그냥 모두 보여준다.( 중복허용, 빠르다. )

    

(교집합)
SELECT 문장
INTERSECT
SELECT 문장

    

 

(차집합)
SELECT 문장
MINUS
SELECT 문장

 

 

 

< 단일행함수 >
(문자함수)
LOWER(문자열)   -  소문자로 변환
UPPER(문자열)   -  대문자로 변환
INITCAO(문자열)  -  첫문자만 대문자,  나머지는 소문자.   주로 영어문장만들때
CONCAT(문자열1,문자열2)  -  두 개의 문자열연결   ( || 이 훨씬 좋다.)
SUBSTR(문자열, 시작위치, 출력문자개수) 지정된위치의 문자열을 반환
LANGTH(문자열)  -  길이를 반환
INSTR(문자열, 검색문자, [시작위치,[횟수]])  -  지정된문자의 위치를리턴
TRIM([leading | trailing | both] 제외문자 FROM 문자열)  -  접두어나 접미어 잘라낸다. 
제외문자 지정하지않으면 공백문자잘라낸다.
LPAD,RPAD(문자열,출력폭,채움문자)  -  출력폭만큼 빈부분에 문자를 채운다.
TRNASLATE(문자열,검색문자,치환문자)  -  '문자단위' 치환된값 리턴
REPLACE(문자열, 검색문자열,치환문자열)  -  '문자열단위' 치환된값 리턴

 


(숫자,날짜형함수)
ROUND(숫자,n),ROUND(날짜,형식)  -  n자리까지 반올림 or 형식에맞추어 반올림한 날짜를 반환
TRUNC(숫자,n),Trunc(날짜,형식)  -  n자리미만 절삭 or 형식에맞추어 절삭한 날짜를 반환
MOD(m,n)  -  m/n 나머지
POWER(m,n)  -  m의 n승
MONTHS_BETWEEN(날짜1, 날짜2)  -  두 날짜의 달 수 차이
ADD_MONTHS(날짜, n)  -  날짜+n달
NEXT_DAY(날짜,요일)  -  날짜 이후 지정된 요일에 해당하는 날짜
LAST_DAY(날짜)  -  날짜를 포함한 달의 마지막날짜
SYSDATE  -  현재 시간과 날짜

 

(변환함수)
TO_CHAR(날짜,출력형식), TO_CHAR(숫자,출력형식)  -  지정된형식으로 출력물을 조절
TO_DATE(문자,해석형식)  -  데이터를 날짜형으로 해석
(날짜)
YYYY - 네자리년도  /  YY - 두자리년도  /  RR - 두자리년도  /  MM -  두자리월  
MONTH - ex)MARCH,APRIAL  /  MON - ex)MAR,APR  /  DD - 두자리일  /  DAY - ex)MONDAY,SUNDAY
DY - ex)MON,SUN  /  HH24 - 24시간표시  /  HH(HH12) - 12시간표시  /  MI - 분  /  SS - 초
/ SSSSSS - 하루를 초로 환산  /  AM,PM - 오전,오후
(숫자)
9 - 숫자의출력폭  /  0  - 선행제로표기여부  /  $ - 달러화  /  L - 지역화폐  /  . - 소수점위치
/ , - 쉼표위치  /  MI - '-'기호를 오른쪽에표기  /  EEEE - 실수표기법

 

 


<GROUP>
SELECT [DISTINCT/ALL] 컬럼명 or 그룹함수, ...
FROM 테이블
WHERE 조건
GROUP BY Group대상
HAVING <그룹 함수 포함 조건>
ORDER BY 정렬대상 [ASC/DESC]

 

-HAVING : 그룹함수포함하는 조건을 기술

 

(그룹함수)
MAX(컬럼명) - 최대값반환  /  MIN(컬럼명) - 최소값  /  AVG(컬럼명) - 평균값  /  COUNT(컬럼명|*) - 행의수
SUM(컬럼명) - 합  /  STDDEV(컬럼명) - 표준편차  /  VARIANCE(컬럼명) - 분산

 

 

 

 

 

<DML>

Date Manipulation Language

 

undo에 저장되어서, rollback가능

INSERT INTO <테이블명> [(<컬럼명>,<컬럼명>,...)]
VALUES (<값>,<값>,...);
모든컬럼선택시 - 안적으면 된다. (하지만 다 적어서하자.)


UPDATE <테이블명>
SET <컬럼명> = <값|수식>,<컬럼명> = <값|수식>,...
[WHERE <조건>];
WHERE생략 - 모든행의 컬럼값 수정
주로 pk에 쓰인다.


DELETE FROM <테이블명>
[WHERE <조건>];
행단위 데이터삭제
WHERE생략 - 모든행삭제
물리적인공간은 변화없다. - 변환하려면? DROP, TRUNCATE

 

COMMIT    -   작업완료
ROLLBACK   -   작업취소

 

 

 

 

 < DDL >

Data Definition Language

 

CREATE TABLE 테이블 (
컬럼 데이터_타입 [DEFAULT default값] [컬럼 레벨 제약조건],
컬럼 데이터_타입 [DEFAULT default값] [컬럼 레벨 제약조건],
......
[테이블 레벨 제약조건],
......
);

 

 

 

DROP TABLE 테이블
[CASCADE CONSTRAINT];

 

 

 

 

< CONSTRAINT >

 

CREATE TABLE 테이블 (
컬럼명 데이터_타입 CONSTRAINT 제약_조건_이름 PRIMARY KEY,
  ......

 

CREATE TABLE 테이블 (
  .....
CONSTRAINT 제약_조건_이름 PRIMARY KEY (컬럼));

 

 

CREATE TABLE 테이블 (
컬럼명 데이터_타입 CONSTRAINT 제약_조건_이름 ( FOREIGN KEY )
REFERENCES 참조할_테이블 (참조할_컬럼)
[ON DELETE CASCADE],
  ......

 

CREATE TABLE 테이블 (
.....
CONSTRAINT 제약_조건_이름 FOREIGN KEY (컬럼)
REFRENCES 참조할_테이블 (참조할_컬럼) [ON DELETE CASCADE]);

 

 

CREATE TABLE 테이블 (
컬럼 데이터_타입 CONSTRAINT 제약_조건_이름 UNIQUE,
......

 

CREATE TABLE 테이블 (
......
CONSTRAINT 제약_조건_이름 UNIQUE (컬럼));

 

 

NOT NULL
컬렘 레벨 정의, ~KEY 넣는 부분에 적으면 된다.

 


CHECK
CHECK (조건)
데이터의 조건을 정의. ~KEY 넣는 부분에 적으면 된다.
WHERE과 형식이 동일

 

 

CREATE TABLE 테이블명 ( 컬럼 ... )
AS (SELECT 문장 : sub query 문);

 

 

 

<제약조건관리>

 

ALTER TABLE <테이블명>
ADD CONSTRAINT <제약 조건명> <제약 조건 타입>
( <제약조건타입>은 동일 )


ALTER TABLE <테이블명>
MODIFY <컬럼명> CONSTRAINT <제약 조건명> NOT NULL


ALTER TABLE <테이블명>
DROP CONSTRAINT <제약조건명> [CASCADE] << 이런식으로 써라

 

ALTER TABLE <테이블명>
DISABLE CONSTRAINT <제약 조건명> [CASCADE]
-  일시적으로 CONSTRAINT 정지

 

 

ALTER TABLE <테이블명>
ENABLE CONSTRAINT <제약 조건명>
-  비활성된 CONSTRAINT을 활성화
pk,uk활성화되면 index생성

 

 

 

< INDEX >

 CREATE INDEX 인덱스이름
ON 테이블 (컬럼명 | 함수 | 수식);
2개이상넣을때, 첫번째인덱스만 참조(2번째부터는 첫번째인덱스정렬이후 사용)

 

DROP INDEX 인덱스이름;

 

 

< VIEW >

 CREATE [OR REPLACE][FORCE | NOFORCE] VIEW 뷰명 (컬럼명 ... )
AS <SELECT 문장>
[WITH CHECK OPTION [CONSTRAINT constrant_name]]
[WITH READ ONLY [CONSTRAINT constrant_name]];

 

 => CREATE VIEW ~ 쓰면 된다. (DROP VIEW때문)

OR REPLACE : 뷰를 수정(뷰를 삭제하고 새로생성)
FORCE  : 기반 테이블이 없어도 뷰가 생성 (기본값 NOFORCE)
WITH CHECK OPTION  : 뷰에 의해 검색가능한 행만 DML작업가능하게 제약
WITH READ ONLY  : 뷰를 통해서는 SELECT만 가능하도록 제한

 

 

 

< SEQUENCE >

CREATE SEQUENCE 시퀀스명
[ START WITH 시작값
INCREMENT BY 증가값
{ MAXVALUE 상한값 | NOMAXVALUE }
{ MINVALUE 하한값 | NOMINVALUE }
{ CYCLE | NOCYCLE }
{ CACHE cache개수 | NOCACHE } ];

 

(옵션)
START WITH : 할당을 시작하는 값(default MINVALUE)
INCREMENT BY : 생성되는 값의 증가치(default 1)
MAXVALUE : 상한값 (default NOMAXVALUE)
MINVALUE : 하한값 (default NOMINVALUE)
CYCLE : 상한값까지 생성한 이후 다시 하한값부터 재생성할것인지 여부.
실제로 쓰는 일없다. (default NOCYCLE)
CACHE : 메모리에 미리 생성될 값의 개수 (default 20)

 

 

ALTER SEQUENCE 시퀀스명
[ start with 빼고 위와 동일 ];

 


DROP SEQUENCE 시퀀스명;

 


...<시퀀스명>.nextval ...
...<시퀀스명>.currval ...

nextval : 시퀀스로부터 유일한 값을 할당받는다.

currval : 시퀀스로부터 마지막으로 할당 받은 값을 다시 할당받는다.
nextval 이후에만 사용가능  (current약자인듯)
  (아무곳이나 들어갈 수 있다. 주로 INSERT 문의 vALUES절이나 UPDATE의 SET절에서 많이 사용)