명령어의종류
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;

'2015 IT 웹 기반 개발자과정 > SQL' 카테고리의 다른 글

SQL JOIN 예제  (0) 2015.11.23
SQL 입사달별 인원조회, 커미션별 인원조회 [GROUP BY]  (0) 2015.11.20
SQL SELECT 실습  (0) 2015.11.19
SQL 기초 [DDL , DML]  (0) 2015.11.18

+ Recent posts