< 기본 >
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절에서 많이 사용)