명령어의종류
DQL
(데이터검색조회)
-------------------------------------------------------------------------
SELECT 칼럼명[ALIAS] , 테이블명[ALIAS].*
FROM 테이블명[ALIAS]
WHERE 조건식; => 조건식에서 AND 가 OR보다 우선순위가 높다
SELECT 칼럼명[ALIAS], 칼럼명 + 수식 [ALIAS]
FROM 테이블명;
* from dual; => junk table
----------------------------------------------------------------------------------------------------
FROM => WHERE => SELECT 순으로 진행
----------------------------------------------------------------------------------------------------
SELECT COUNT(*) : 테이블의 한 컬럼에 대한 레코드 개수 출력(NULL 은 개수포함 안됨)
FROM 테이블명;
----------------------------------------------------------------------------------------------------
SELECT COUNT(칼럼명) : 조건식에 맞는 컬럼에 대한 레코드 개수 출력
FROM 테이블명;
WHERE 조건식;
----------------------------------------------------------------------------------------------------
SELECT MAX(컬럼명) : 최대값 => 단, 집합함수이므로 최대값에 해당하는 다른 레코드는 출력불가
, MIN(컬럼명) : 최소값
, ROUND(AVG(컬럼명), 2) : 평균값
FROM 테이블명;
----------------------------------------------------------------------------------------------------
SELECT 컬럼1, 컬럼2, .....
, CASE WHEN 컬럼1 >= 20000 THEN '출력값1' if
WHEN 컬럼1 >= 10000 THEN '출력값2' else if(여러 개 가능)
ELSE '출력값3' else
END AS "ALIAS"
FROM 테이블명;
----------------------------------------------------------------------------------------------------
CREATE SEQUENCE 시퀀스명; : 시퀀스 생성
CREATE SEQUENCE 시퀀스명 : 시퀀스 생성 후 시작숫자 및 증가숫자 설정
START WITH 숫자
INCREMENT BY 숫자;
ALTER SEQUENCE 시퀀스명 : 시퀀스 증가숫자 변경
INCREMENT BY 숫자;
INSERT INTO 테이블명(NO, 컬럼2, 컬럼3) : INSERT에 적용하면 자동으로 다음수 입력
VALUES(SEQUENCE명.NEXTVAL, '컬럼2값', 컬럼3값);
ALIAS 의 사용
1. SELECT 컬럼명 AS ALIAS사용: SELECT ID AS 아이디
2. SELECT 컬럼명 ALIAS사용 : SELECT ID 아이디
3.ALIAS에서 이중부호("")의 사용은 공백이나 대소문자 구분시 사용한다
4.테이블에도 ALIAS를 사용할 수 있다
(테이블명[ALIAS])
=> 칼럼명 선택시 테이블명.칼럼명 으로 사용 가능
*단, 테이블명에 ALIAS를 사용한 경우 ALIAS.칼럼명만 사용가능
산술 연산자의 사용
1. 종류: +, -, *, /, ( )
합성 연산자의 사용
1. 2개의 수직바(||)를 사용한다.
2. 칼럼과 문자 또는 다른 칼럼과 연결시킨다.
3. 문자 표현식의 결과에 의해 새로운 칼럼의 결과를 보여준다.
<SQL> 연산자의 사용
1. BETWEEN a AND b : a와b 사이의 값을 찾습니다.
2. IN( list ) : list에 나열되는 값 중하나만 일치되면 됩니다.
3. LIKE ‘비교문자열’ : 비교문자열과 형태가 일치하면 됩니다.
% : 0개이상의어떤문자를의미합니다.
예> name like ‘김%’;
_ : 1개인단일문자를의미합니다.
예> name like ‘김_ _’;
%,_ 둘다 같이 중복사용 가능
* %t% 처럼 앞에 %를 사용할 경우 indexing이 안되어 느릴 수 있음, 사용을 지양
4. IS NULL : NULL값을추출합니다.
IS NOT NULL : NULL이 아닌 값을추출합니다.
5. NVL(칼럼명, 반환값)[ALIAS] : NULL을 지정한 VALUE로 반환하는 함수
* 칼럼명과 반환값의 데이터 타입이 다를경우 TO_CHAR()함수를 사용가능
6. 부정논리 연산자 !=, ^=, <>
7. 부정 SQL 비교 연산자
NOT BETWEEN A AND B
NOT IN ( list )
NOT LIKE ‘비교문자열’
SELECT[DISTINCT] 칼럼명[ALIAS] : 중복값 제거
FROM테이블명
ORDER BY 칼럼명 또는 표현식[ASC or DESC]
----------------------------------------------------------------------
-ASC : 조회한 데이터를 오름차순으로 정렬한다( 디폴트값 생략가능)
-DESC : 조회한 데이터를 내림차순으로 정렬한다.
-ORDER BY 절은 SQL문에서 마지막에 위치한다.
-컬럼 ALIAS명의 사용이 가능하다.
ORDER BY 는 가장 마지막에 실행됨
WHERE => SELECT => ORDER BY
SELECT 컬럼명1, 컬럼명2 FROM 테이블명
WHERE 조건식
ORDER BY 정렬기준 컬럼명;
ex) SELECT * FROM EMPLOYEES : 출력 기대값은 salary별로 정렬해서 10개값을 출력
WHERE ROWNUM <= 10 : BUT 정렬이 가장 마지막에 실행되므로 ROWNUM 10개를 먼저 가져와서 SALARY별로 정렬,
ORDER BY SALARY;
SELECT * FROM ( : 정렬이 먼저 일어나도록 서브쿼리 이용
SELECT * FROM EMPLOYEES
ORDER BY SALARY)
WHERE ROWNUM <= 10;
----------------------------------------------------------------------
집합 함수
SELECT 그룹화할 열 이름1, 그룹화할 열 이름 2, 집계함수 : GROUP BY절도 열 위치를 지정하여 그룹화할 수 있다
FROM 테이블 명
WHERE 조건절
GROUP BY 1, 2
그룹화 데이터 필터링하기
WHERE => GROUP BY => 집합함수 => HAVING
: HAVING은 WHERE 조건절과 마찬가지로 조건을 주는 역할을 한다. 차이는 HAVING은 그룹화된 변수에 대해 조건을 준다는 것이다
SELECT 그룹화할 열 이름1, 집계함수
FROM 테이블 명
WHERE 조건절
GROUP BY 열 이름1
HAVING 집계 함수 조건;
----------------------------------------------------------------------
ex)
SELECT E.* : rownum값을 인식하기 위해 ALIAS 사용하기
FROM( WHERE문이 SELECT문보다 먼저 실행되기 때문
SELECT ROWNUM RNUM, EMPLOYEES.*
FROM EMPLOYEES) E
WHERE RNUM BETWEEN 6 AND 10;
----------------------------------------------------------------------
paging 쿼리
SELECT E.*
FROM(
SELECT ROWNUM RNUM, E1.*
FROM (SELECT *
FROM EMPLOYEES ORDER BY SALARY DESC)
E1
WHERE ROWNUM <=10 -- PAGE * (화면에 보여줄 개수), 글목록이 10만개라면 과부하, 성능 높이기 위해 일부값만
) E 질문 : 페이지가 넘어갈 때마다 rownum값이 늘어나는데 결국 과부하가 될거 같지 않음???
WHERE RNUM BETWEEN 6 AND 10;
SELECT RN, E1.SALARY, FIRST_NAME, LAST_NAME
FROM(
SELECT ROWNUM RN, E.*
FROM
(SELECT * FROM EMPLOYEES ORDER BY SALARY DESC) E
WHERE ROWNUM <=10 : RN 을 안쓰고 ROWNUM을 사용한 이유는 SELECT절의 ALIAS정의가 WHERE절보다 늦게 실행되기 때문,
) E1; 즉, WHERE 문 실행때는 RN이라는 ALIAS가 존재하지 않음
--WHERE RN BETWEEN 5 AND 7;
----------------------------------------------------------------------
ROW_NUMBER() OVER([PARTITION BY 컬럼명] ORDER BY 컬렴명)
RANK() OVER([PARTITION BY 컬럼명] ORDER BY 컬렴명) 순위가 중첩됨
PARTITION BY : 위치/ 순위를 지정하는 그룹 설정
ORDER BY : 어떤 항목에 대해 위치/순위 지정;
ex)
SELECT 컬럼명1, 컬럼명2, 컬럼명3,
ROW_NUMBER() OVER(PARTITION BY 그룹화할 컬럼명 ORDER BY 정렬기준 컬럼명)
FROM 테이블명;
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID
, ROW_NUMBER() OVER (ORDER BY EMPLOYEE_ID DESC) RNUM
FROM EMPLOYEES;
SELECT EMPLOYEE_ID, FIRST_NAME, DEPARTMENT_ID
, ROW_NUMBER() OVER ( PARTITION BY DEPARTMENT_ID ORDER BY EMPLOYEE_ID DESC) RNUM
FROM EMPLOYEES;
----------------------------------------------------------------------
-NULL값은 오름차순일 경우 가장 마지막에 내림차순은 맨 처음온다.
-날짜형 데이터는 오름차순일 경우 가장 빠른 날이 먼저 출력된다.
-기본적인 정렬방식은 오름차순이다.
----------------------------------------------------------------------
=========================================================================
DML
(데이터조작어)
-------------------------------------------------------------------------
INSERT INTO 테이블명(컬럼명,.....)
VALUES(값,......);
INSERT INTO 테이블명
VALUES(값,.....마지막 값); => 반드시 칼럼의 순서및 갯수와 일치해야함
-------------------------------------------------------------------------
DELETE [FROM] 테이블명 => where 안쓸경우 truncate 와 동일 효과
[WHERE조건]; => 조건식에 부합하는 레코드 삭제
-------------------------------------------------------------------------
UPDATE 테이블명
SET 컬럼명 = 변경할값.....
[WHERE조건];
=========================================================================
=========================================================================
DDL
(데이터정의어)
-------------------------------------------------------------------------
CREATE :
CREATE TABLE 테이블명(
칼럼명1 DATATYPE [DEFAULT 형식],
칼럼명2 DATATYPE [DEFAULT 형식],
. . . .
);
-------------------------------------------------------------------------
ALTER : add, modify, drop
ALTER TABLE 테이블명
1. ADD ( 추가할 칼럼명1 DATATYPE [DEFAULT 형식]
, 추가할 칼럼명2 DATATYPE [DEFAULT 형식] ...
);
2. MODIFY 수정할 칼럼명 DATATYPE [DEFAULT 형식];
3. RENAME COLUMN 기존 칼럼명 TO 수정할 칼럼명;
3. DROP COLUMN 삭제할 칼럼명;
-------------------------------------------------------------------------
RENAME 테이블명 TO 바꿀 테이블명
-------------------------------------------------------------------------
DROP TABLE 테이블명;
-------------------------------------------------------------------------
TRUNCATE TABLE 테이블명;
-------------------------------------------------------------------------
DESCRIBE 테이블명;
DESC 테이블명;
-------------------------------------------------------------------------
TCL
(트랜잭션제어어)
COMMIT, ROLLBACK,
SAVEPOINT
=========================================================================
함수
TO_CHAR(날짜, '포맷문자') yy(년) m(월) d(일) h(시) mi(분) s(초)
TO_CHAR(숫자, '포맷문자') 9(자리수) 0(비어있는 자리 0으로 채움)
,(액수 표현시 3자리마다 , 붙임)
.(실수의 자리수표시)
-------------------------------------------------------------------------
UPPER('abc') : 대문자로 변경
LOWER('ABC') : 소문자로 변경
LENGTH('ABC') : 글자 수 반환
SUBSTR('abc',시작, 반환개수) : 시작하는 수부터 반환개수 만큼 문자열 반환
TRIM(' trim a ') : 좌우 공백 제거
REPLACE('abc', 'a', 'b') : abc 문자열에서 a를 b로 바꿈
INSTR('abcc','c') : c가 처음으로 시작하는 인덱스 반환 // 없으면 0반환
ROUND(123.456, 2) : 소수점 이하 2째짜리까지 표시하고 반올림
(123.456, 0) : 소수점 이하 표시 안함, 반올림
(123.456, -1) : 정수 일의자리 표시, 반올림
TRUNC() : 사용법은 ROUND와 동일, 단 버림
-------------------------------------------------------------------------
ADD_MONTHS(SYSDATE, X) : 현재날짜에서 X개월 더함 //해가 바뀌면 연도+
X가 음수도 가능하다
LAST_DAY(날짜) : 날짜의 마지막 날짜를 반환 ex) 2015.11.31
=> day 만 출력하고 싶다면
TO_CHAR(LAST_DAY(날짜), DD) 마지막 날
NEXT_DAY('날짜', '요일') : 가장 가까운 요일의 날짜 반환
TO_DATE('20151103', 'YYYYMMDD') : 날짜형으로 반환
=========================================================================
JOIN
1) INNER JOIN : 교집합의 의미
| A1 | B1 | C1 | + | C1 | D1 | E1 |
| A2 | B2 | C2 | | C3 | D3 | E3 |
==> | A1 | B1 | C1| D1 | E1 |
-------------------------------------------------------------------------
2) LEFT OUTER JOIN
==> | A1 | B1 | C1 | D1 | E1 |
| A2 | B2 | C2 |NULL|NULL|
-------------------------------------------------------------------------
3) RIGHT OUTER JOIN
==> | A1 | B1 | C1 | D1 | E1 |
|NULL|NULL| C3 | D3 | E3 |
-------------------------------------------------------------------------
4) FULL OUTER JOIN
==> | A1 | B1 | C1 | D1 | E1 |
| A2 | B2 | C2 |NULL|NULL|
|NULL|NULL| C3 | D3 | E3 |
-------------------------------------------------------------------------
ex)
SELECT A.컬럼1, B.컬럼1, A.컬럼2(A와 B테이블의 공유키)
FROM 테이블A a, 테이블B b
WHERE a.컬럼2 = b.컬럼2[(+)];
SELECT A.컬럼1, B.컬럼1, A.컬럼2(A와 B테이블의 공유키)
FROM 테이블A a INNER JOIN 테이블B b
ON a.컬럼2 = b.컬럼2;