본문 바로가기
DataBase

SQL Statement 정리

by izen8 2011. 4. 5.
반응형
 

SQL Statement 정리

 

■ Create 문

  - 테이블(Table), 인덱스(Index), 시퀀스(Sequence) 만들기 
  - 각 객체 만들기

 ◆ 테이블 만들기

    문법

CREATE TABLE 테이블명 (
    필드명   필드형 [ not null ] 
    [ , 필드명  필드형 [ not null ] ]** )

(필드형 = 필드 데이터형)  (필드 =  컬럼)

필드 데이터형 설명
char(문자수) 문자열
text(문자수) 문자열
int 정수
real 실수
unit 부호없는 정수
date 날짜
time 시간
money 고정소수점 두 자리 사용

사용예

 

  CREATE TABLE Customer ( 
      CustomerId int not null,
      Name char(20) not null,
      NickName char(20) not null,
      Address text(200))  

 ◆ 인덱스 만들기

문법

  CREATE [ UNIQUE ] INDEX 인덱스명 ON 테이블명 ( 
      필드명 [ , 필드명 ] ** )   

사용예

  CREATE UNIQUE INDEX CustomerIndex  ON Customer (CustomerId)

  CREATE INDEX CustomerIndex2 ON Customer (Name, NickName)  


 ◆ 시퀀스 만들기

문법

  CREATE SEQUENCE ON 테이블명 [ STEP 스텝값 ] [ VALUE 초기값 ] 

사용예

  CREATE SEQUENCE ON SEQ_TEST STEP 1 VALUE 5 
  
  SELECT _seq FROM SEQ_TEST

 DROP 문


  - 테이블(Table), 인덱스(Index), 시퀀스(Sequence) 없애기 
  - 테이블이 지원지면 관련된 인덱스와 시퀀스도 함께 없어짐
 
 문법

  DROP TABLE 테이블명
  DROP INDEX 인덱스명 FROM 테이블명
  DROP SEQUENCE FROM 테이블명

사용예

  DROP TABLE Customer 
  DROP INDEX CustomerIndex   FROM Customer
  DROP SEQUENCE FROM Customer 


 INSERT 문


  - 테이블에 데이터를 입력
  - 필드명을 쓰지않으면 모든 필드에 데이터를 입력
 
 문법

  INSERT INTO 테이블명 VALUES (필드값, [필드값])
  INSERT INTO 테이블명 (필드명 [, 필드명]) VALUES (필드값 [, 필드값])

사용예

  INSERT INTO Customer ( name, nick_name) 
    VALUES ( '이기자', '나이겨')

  INSERT INTO Customer VALUES ( 1, '이기자', '나이겨', '지구촌 한국 마을')


 UPDATE 문


  -  WHERE 절로 갱신할 데이터 선택해서 선택된 테이블의 데이터를 갱신
  - 필드명을 쓰지않으면 모든 필드에 데이터를 입력
 
 문법

  UPDATE 테이블명 SET 필드명 = 필드값 [ , 필드명 = 필드값 ]** 
    WHERE절      

사용예

  UPDATE Customer SET NickName='나막가' WHERE CustomerId = 111 

  UPDATE Customer SET NickName='ㅎㅎㅎ' Address = '해왕성촌' WHERE CustomerId = 111 


 DELETE 문


  -  WHERE 절로 삭제할 데이터 선택해서 선택된 테이블의 데이터를 삭제
 
 문법

  DELETE FROM 테이블명
    WHERE절      

사용예

  DELETE FROM Customer WHERE CustomerId = 111 

컬럼명 변경

ALTER TABLE dept RENAME COLUMN name TO deptName;


컬럼 타입수정

ALTER TABLE dept MODIFY ( deptName varchar2(100) [NULL]|[NOT NULL] );


컬럼 삭제

ALTER TABLE dept DROP COLUMN deptName;


컬럼 추가

ALTER TABLE dept ADD ( address varchar2(100) default '' );


컬럼의 제약조건 삭제

ALTER TABLE userTable DROP PRIMARY KEY:
ALTER TABLE userTable DROP CONSTRAINT userTb_fk_userid;


외래키 추가

ALTER TABLE [테이블이름] ADD CONSTRAINT [외래키이름] FOREIGN  KEY ([필드이름]) REFERENCES [참조테이블이름](참조필드이름);


ALTER TABLE userTable ADD CONSTRAINT [userid_fk] FOREIGN KEY (userid) REFERENCES org_user_tb(userid)

 



 SELECT 문

http://blueung.tistory.com/category/


데이터검색

이번 장에서 배울 내용은 데이터 검색어인 SELECT구문입니다. SELECT문은 사용자가 사용하게 되는 가장 흔하고 가장 중요한 SQL의 기본 명령어입니다. 그럼 지금부터 SELECT의 간단한 기본 문형을 통하여 사용자가 원하는 데이터를 검색하는 방법에 대하여 알아볼까요?
  이번 장에서 학습하실 내용은 다음과 같습니다.
SELECT 구문의 기본 문형
정렬 순서의 지정(ORDER BY)
특정 행의 검색(WHERE)
SQL*PLUS의 기능

 
   
 

  학습을 마친 후, 여러분은
SELECT 구문을 사용하여 데이터베이스에 저장된 내용을 검색할 수
있습니다.
WHERE절에 사용되는 연산자를 활용할 수 있습니다.
SQL*PLUS  통한 환경 설정 및 출력 형식을 지정할 수 있습니다.

 
   
 

 

 

 

1. select 구문의 기본 문형

 

기본적으로 하나의 SELECT문이 구성되기 위해서는 SELECTFROM절이 반드시 있어야
합니다.
 
SELECT (DISTINCT) 칼럼명 (ALIAS)
 

FROM 테이블명 ;

SELECT  
검색하고자 하는 데이터(칼럼)를 나열함
DISTINCT  
중복행을 제거함
ALIAS  
 
나타날 때 칼럼에 대하여 다른 이름을 부여함
FROM  
 선택한 칼럼이 있는  
테이블을 명시함

SQL 명령어의 작성방법은 다음과 같습니다
 
SQL명령어는 여러 라인에 걸쳐서 입력할 수 있습니다.
SQL명령어는 읽기에 쉽도록 들여쓰기를 할 수 있습니다.
절들은 보기에 좋고 편집이 쉽게 각기 다른 라인에 적는 것이 좋습니다.
하나의 명령어는 여러 라인에 걸치거나 줄여서 적을 수 없습니다.
SQL명령어는 대소문자를 구별하지 않으나, 가능하면 규칙을 정하여 쓰는
것이 효율적입니다.
SQL명령어는 SQL 프롬프트에서 입력하며 다음라인은 라인번호가
나타납니다.
 

SQL명령어의 끝은 세미콜론(;)으로 종료합니다.

 

 


 

 

 

 

 

 
테이블에 있는 모든 데이터를 검색하고 싶은 경우에는 SELECT뒤에 *를 기술함으로써 나타낼 수 있습니다.
 
예제로 익히기
 
 
S_DEPT 테이블에서 모든 데이터를 출력하시오. SQL> SELECT *    
 2 FROM s_dept ;

 
 

 

 

 

 
S_DEPT 테이블에서 모든 데이터를 출력하시오.
 ID     NAME        REGION_ID
----- ------------ ----------             
 101    총무부         1
102    영업부         1
103    영업부         2
104    영업부         3
105    영업부         4
106    영업부         5
110    기획부         1
111    기획부         2
112    기획부         3
113    기획부         4
118    인사부         1
 
11 rows selected.

 

 


 

 


 

 

 

 
테이블의 특정 칼럼의 데이터를 검색하고 싶은 경우에는 SELECT절 뒤에 칼럼을 콤마(,)
구별하여 나열합니다. 이 때 나타나는 순서는 SELECT뒤에 기술한 칼럼의 순서대로 결과가
나타납니다.
 
예제로 익히기
 
 
S_EMP 테이블에서 사원의 이름, 입사일, 급여를 나타내시오. SQL> SELECT  name, start_date, salary
2  FROM  s_emp ;

 
 
S_EMP 테이블에서 사원의 이름, 입사일, 급여를 나타내시오.  
NAME            START_DATE       SALARY
----------     ------------      -------
박구곤          03-MAR-90        5000
손명성          08-MAR-90        3000
이은선          17-JUN-91        3500
서의홍          07-APR-90        3000
김심선          04-MAR-90        3200
. . .
 
25 rows selected.
 
 
 
 
 
  여러분이 보시는 결과는 편집 상 다를 수 있으나 원래 문자나 날짜의
열 머리글(Heading)과 데이터는 왼쪽 맞춤이며 숫자 형식의 열 머리글과
데이터는 오른쪽 맞춤입니다.

 
       

 


 

 

 

 

 

 
데이터를 나타낼 때 산술 연산을 한다거나 출력되는 방식을 변경하고 싶으면 산술 표현식을 사용할 수 있습니다.
산술 표현식에 사용되는 연산자의 종류에는 더하기(+), 빼기(-), 곱하기(*),

 나누기(/), 괄호(( ))가 있습니다.
 
예제로 익히기
 
 
S_EMP 테이블에서 사원의 이름, 연봉을 구하시오.
, 연봉은 급여에 18을 곱하여 계산하시오.

SQL> SELECT  name, salary*18     
 2  FROM  s_emp ;

 
 
S_EMP 테이블에서 사원의 이름, 연봉을 구하시오.
, 연봉은 급여에 18을 곱하여 계산하시오.
 
NAME            SALARY*18
------------    ---------
박구곤          90000
손명성          54000
이은선          63000
서의홍          54000
김심선          57600
전지영          43200
. . .
25 rows selected.

 
 
  이 때 출력된 salary*18 이라는 컬럼은 표시되는 데이터일 뿐 새로 테이블에
생성되는 데이터는 아닙니다.
각 산술연산을 하는 경우에도 기본 우선순위가 적용되므로 연산순서를
지정하고 싶으면 괄호를 쓰도록 합니다.

 

 


 

 

 

 

 

 
검색결과를 나타낼때 칼럼에 대한 ALIAS를 지정하여, 나타나는 칼럼의 HEADING을 바꾸어 줄 수 있습니다.
ALIAS는 특별히 산술연산을 수행하는 경우에 유용하게 사용할 수 있습니다.
AS라는 단어는 생략할 수 있으며, ALIAS를 영문으로 부여한 경우에 대소문자를 구별하거나,
ALIAS가 두 단어로 구성된
 경우는  반드시 이중 따옴표(

)를 써야 합니다.
 
예제로 익히기
 
S_EMP 테이블에서 사원의 이름, 연봉을 구하시오.
, 연봉은 급여에 18을 곱하여 계산한다. 또한 계산된 연봉에 대하여 칼럼에
대한 이름을
 연봉으로 표시하시오.

SQL>SELECT name,salary*18 AS 연봉     
    2 FROM s_emp ;

 
   
S_EMP 테이블에서 사원의 이름, 연봉을 구하시오.
, 연봉은 급여에 18을 곱하여 계산한다. 또한 계산된 연봉에 대하여
칼럼에 대한 이름을  연봉으로 표시하시오.
 
NAME            연봉
------------    ---------
박구곤          90000
손명성          54000
이은선          63000
서의홍          54000
김심선          57600
전지영          43200
. . .
 
25 rows selected.

   
많은 경우에 칼럼에 대한 HEADING이 사용자가 쉽게 이해하도록 되어 있지 않기 때문에,
칼럼에 대한 ALIAS를 지정하여 검색된 결과를 보다 쉽게 이해하도록 하는데 사용합니다.
 

 

 

 

 

 

 

 
합성 연산자(||)를 사용하여 칼럼을 다른 칼럼이나 값과 연결하여 하나의 칼럼으로 출력할 수
있습니다.
 
예제로 익히기
 
 
S_EMP 테이블에서 사원의 이름, 직책을 나타내시오.
, 나타나는 형식을 다음 보기와 같이 하시오.
보기) 박구곤 사장

SQL>SELECT name||''||title     
 2  FROM  s_emp ;

 
 
S_EMP 테이블에서 사원의 이름, 직책을 나타내시오.
, 나타나는 형식을 다음 보기와 같이 하시오.
보기) 박구곤 사장
 
NAME ||' '|| TITLE
---------------------
박구곤 사장         
손명성 기획부장   
이은선 영업부장        
서의홍 총무부장       
김심선 인사부장       
전지영 과장        
. . .
 
25 rows selected.

 
   
 
  합성은 어느 데이터 타입의 경우에나 다 가능하며
, 문자나 날짜 타입의 데이터를 합성하는 경우는 반드시

따옴표( )를 써야
합니다.

 
       

 

 

 


 

 

 

 

 

 
SELECT를 한 경우에 기본적으로 테이블에 중복행들이 있더라도 모든 행들에 대하여 결과가
나타납니다. 이 때 DISTINCT라는 키워드를 사용하여 중복되는 행들을 제거할 수 있습니다.
 
예제로 익히기
 
 
S_DEPT 테이블에서 모든 부서의 이름을 나타내시오. SQL>SELECT name     
 2  FROM  s_dept ;

 
 
S_DEPT 테이블에서 모든 부서의 이름을 나타내시오.  
NAME
-------------------------
총무부
영업부
영업부
영업부
영업부
영업부
기획부
. . .
 
11 rows selected.

 
 
S_DEPT 테이블에서 부서의 이름이 어떤 것들이 있는지 부서이름을 한 번씩만
나타내어라.

SQL>SELECT DISTINCT name    
 2 FROM s_dept ;

 
 
S_DEPT 테이블에서 부서의 이름이 어떤 것들이 있는지 부서이름을
한 번씩만 나타내어라.
 
NAME
-------------------------
기획부
영업부
인사부
총무부

 
 
 
  DISTINCT라는 키워드는 항상 SELECT 바로 다음에서 기술합니다.
DISTINCT 뒤에 나타나는 칼럼들은 모두 DISTINCT의 영향을 받습니다.
DISTINCT 뒤에 여러 개의 칼럼이 기술되면 나타나는 행은 칼럼의 조합들이 중복되지 않게 나타납니다.
DISTINCT를 사용하면 나타나는 결과는 기본적으로 오름차순 정렬됩니다.

 
       

 

 

 


2. 정렬순서의 지정(order by)

 

ORDER BY 절을 사용함으로써 나타나는 데이터를 정렬할 수 있습니다.
만약 사용자가 데이터가 나타나는 순서를 지정하지 않으면 기본적으로 데이터는 테이블에
입력되어 있는 순서대로 표시되지만, 같은 SELELCT문에 대하여 Oracle Server에서 처음의
검색결과와 다음의 검색결과를 항상 똑같이 보여주는 것은 아닙니다.

따라서 사용자가 검색한 데이터를 특정순서로 지정하고 보고 싶으면 ORDER BY절을 기술하여야 합니다.
ORDER BY절은 사용할때는 SELECT구문의 가장 마지막에 위치하여야 합니다.
 SELECT (DISTINCT) 칼럼명 (ALIAS)
 FROM 테이블명

 ORDER BY
럼 이나 표현식 (ASC 또는 DESC);

ASC  조회한 데이터를 오름차순으로 정렬한다.
 기본값으로서 생략할 수 있다.
DESC  조회한 데이터를 내림차순으로 정렬한다.

 

 

 

 
예제로 익히기
 
S_EMP 테이블에서 사원의 이름, 연봉, 직책을 나타내시오.

SQL>SELECT name, salary*18 연봉, title
 2 FROM s_emp
 3 ORDER BY salary*18 DESC ;
NAME        연봉       TITLE
---------   ---------  -------------
박구곤      90000      사장
이은선      63000      영업부장
김심선      57600      인사부장
손명성      54000      기획부장
서의홍      54000      총무부장
김석우      47700      영업대표이사
. . .

25 rows selected.
만약 사용자가 데이터가 나타나는 순서를 지정하지 않으면 기본적으로 데이터는 테이블에
입력되어 있는 순서대로 표시되지만, 같은 SELELCT문에 대하여 Oracle8 Server에서 처음의
검색결과와
 다음의 검색결과를 항상 똑같이 보여주는 것은 아닙니다.
ORDER BY절에는 칼럼명, 표현식, 위치, ALIAS 등 여러 가지 방법으로 순서를 지정할 수
있습니다.
앞의 예제와 똑같은 결과를 얻으면서 표현을 달리하여 나타내 보십시오.

SQL>SELECT name, salary*18 연봉 , title
2  FROM s_emp
 3  ORDER BY 연봉 DESC ;
SQL>SELECT name, salary*18 연봉 , title
2  FROM s_emp
 3  ORDER BY 2  DESC ;
여러 가지 칼럼에 대하여 순서를 지정하고 싶으면 ORDER BY절에 정렬 순서를 주고 싶은
칼럼을 콤마로 구별하여 기술하면 됩니다. 이 때 ORDER BY절에 칼럼을 지정했다고 해서 반드시 그 칼럼이 SELECT뒤에 기술되어야 하는 것은 아닙니다.

SQL>SELECT name, salary*18 연봉 , title
2  FROM s_emp
 3  ORDER BY 연봉 DESC, name ;
NAME            연봉 TITLE
-------------- ----- ------------
박구곤         90000 사장
이은선         63000 영업부장
. . .
김정미         43200 과장
신종필         43200 영업대표이사
이기철         43200 사원
. . .
 
25 rows selected.
 

 

 


3. 특정형의 조건 검색(where)

 

 
사용자는 자신이 원하는 데이터만을 검색하여 보기를 원하는 경우, SELECT구문에서
WHERE을 기술함으로써 원하는 조건에 맞는 데이터만 나타낼 수 있습니다.
SELECT문에 WHERE 절을 기술하는 경우에는 반드시 FROM절 다음에 기술 하여야 합니다.
 SELECT (DISTINCT) 칼럼명 (ALIAS)
 

FROM 테이블명
 

WHERE 조건식
 

ORDER BY 칼럼 이나 표현식 (ASC 또는 DESC);

조건식  
칼럼 이름이나 표현식 상수, 연산자로 구성된다.

WHERE을 사용함으로써 조건에 맞는 특정 행을 선택할 수 있습니다.
기본적인 SELECT문은 SELECT FROM의 두 키워드만 있으면 구성이 되지만
일반적인 경우에 사용자들이 테이블에 있는 모든 데이터를 다 검색하여 볼 필요는 없습니다.

 

 

 

 
WHERE절에 사용되는 연산자의 3가지 부류
그럼, WHERE절에 사용하는 연산자의 부류를 알아봅시다.
 
연산자 설명
논리 연산자 AND 여러조건을 동시에 만족한다
OR 여러조건들 중 어느 하나라도 만족한다
NOT 조건에 대한 반대를 돌려준다
논리 비교 연산자 = 같다
> 보다 크다
>= 보다 크거나 같다
< 보다 작다
<= 보다 작거나 같다
SQL 비교 연산자 BETWEEN a AND b a b사이에 있다(a, b값 포함)
IN (list) list의 값 중 어느 하나와 일치한다
LIKE 문자 형태와 일치한다(%, _ 사용)
IS NULL NULL값을 가졌다

 WHERE  형식   연산자   
 
 WHERE title = '
사원
 WHERE salary BETWEEN 1000 AND  2000

 

 

 

 

 

 

 

 
논리 연산자의 사용의 예를 통해 논리 연산자를 알아봅시다. 우선순위를 알아봅시다.
 
S_EMP 테이블에서 부서번호가 110이나 113에 속하는 사원들 중에서 급여가
2000 이상인 사원들의 이름, 급여, 부서번호를 나타내시오.

SQL>SELECT name , salary , dept_id
2   FROM s_emp
 3   WHERE  (dept_id = 110 OR dept_id =113)
4   AND  salary >= 2000 ;
NAME             SALARY     DEPT_ID
-------------    --------   ------
손명성           3000       110    
전지영           2400       110     
이상헌           2300       113
최순철           2300       113
이기철           2400       110  
 
 
  괄호를 사용하면 우선순위에 관계없이 항상 괄호가 우선합니다.

 
       

연산자의 우선순위
우선 순위    
1  
모든 비교 연산자(논리비교, SQL비교)
2  
AND
3  
OR

 

 


 

 


 

 

 

 
논리 비교 연산자의 사용예를 살펴봅시다.
 
S_EMP 테이블에서 입사일이 91 1 1일 이전인 사원에 대하여 사원의 이름,
입사일, 부서번호를 나타내시오.

SQL> SELECT name, start_date , dept_id
2  FROM s_emp
 3  WHERE   start_date <  '01-JAN-91' ;
NAME      START_DATE     DEPT_ID
--------  -------------  -------
박구곤    03-MAR-90      118
손명성    08-MAR-90      110
서의홍    07-APR-90      101
김심선    04-MAR-90      118
김정미    14-MAY-90      111
신기웅    07-APR-90      112
. . .

10 rows selected.
 
 
  문자와 날짜값에 대해서는 반드시 ‘ ’ 를 써야 합니다
문자값을 쓸 경우에는 대소문자가 구별이 됩니다.
기본적인 날짜 형식은 ‘DD-MON-YY’입니다.

 
       

 

 


 

 

 

 

 

 
BETWEEN ~ AND ~
 
BETWEEN ~ AND ~ 연산자를 사용할 때는 작은 값을 앞에 쓰고 큰 값을 뒤에 써야 사이의 값이 나옵니다.

 
S_EMP 테이블에서 사원의 급여가 100만원에서 150만원사이에 있는 사람에
대하여 사원의 이름, 급여를 나타내시오.

SQL>SELECT name , salary
2  FROM s_emp
 3  WHERE   salary BETWEEN 1000 AND 1500;
NAME           SALARY
------------   ------
서정주         1200
이용호         1100
위의 문제와 똑같은 결과를 얻는 SELECT 구문은 다음과 같습니다.
SQL>SELECT name , salary
2  FROM s_emp
 3  WHERE   salary >= 1000  AND   salary <= 1500;

 

 

 

 
IN
 
 
S_EMP 테이블에서 부서번호가 110번이나 113번인 부서에 속한 사원들에
대하여 사원의 이름과 직책, 부서번호를 나타내시오.

SQL>SELECT name, title , dept_id
2  FROM s_emp
 3  WHERE   dept_id IN (110,113) ;
NAME         TITLE            DEPT_ID
--------     -------          ---------                                
손명성       기획부장         110
전지영       과장             110
이상헌       과장             113
최순철       과장             113
이기철       사원             110
구원상       사원             110
. . .
 
9 rows selected.
위의 문제와 똑같은 결과를 얻는 SELECT 구문은 다음과 같습니다.
SQL>SELECT name, title , dept_id
2  FROM s_emp
 3  WHERE   dept_id = 110  OR  dept_id = 113 ;

 

 

 

 
LIKE
 
% 0개서부터 여러 개까지의 문자열을 나타내는 와일드카드 (wildcard)이고
_ 는 단 하나의 문자를 나타내는 와일드카드입니다.
와일드 카드를 일반문자처럼 쓰고 싶은 경우에는 ESCAPE 옵션을 사용합니다.
 
name 이라는 칼럼에 X_Y라는 문자열을 포함한 데이터를 찾으시오.

WHERE   name LIKE '%X\_Y%'  ESCAPE '\'
 
S_EMP 테이블에서 91년도에 입사한 사원에 대하여 사원의 이름, 입사일,
직책을 나타내시오.

SQL>SELECT name, start_date , title
2  FROM s_emp
 3  WHERE   start_date LIKE '%91' ;
NAME         START_DATE    TITLE
-----------  ------------  -------------      
이은선       17-JUN-91     영업부장
전지영       18-JAN-91     과장
최순철       27-FEB-91     과장
김석우       18-FEB-91     영업대표이사
신종필       09-OCT-91     영업대표이사
서정주       09-FEB-91     사원
. . .

11 rows selected.
    위의 문제와 똑같은 결과를 얻는 SELECT 구문은 다음과 같습니다.
    SQL>SELECT name, start_date , title
3  WHERE   star BETWEEN '01-JAN-91' AND  '31-DEC-91'  ;

 

 

 

 
IS NULL
 
 
S_CUSTOMER 테이블에서 담당 영업사원이 없는 고객의 고객번호, 이름,
신용등급을 나타내시오.

SQL>SELECT id , name , credit_rating
2  FROM s_customer
 3  WHERE   sales_rep_id IS NULL  ;
ID      NAME             CREDIT_RA
------  -------------    -------       
207     고정환           양호

 

 


 

 


 

 

 

 
어떤 경우에는 사용자가 원치 않은 데이터를 조건식을 통하여 제외하는 경우가 있습니다.
이 때 각 연산자에 부정식을 써서 데이터를 제거할 수 있습니다.
 
연산자 설명
논리 비교 연산자 !=, ^=, <> 같지 않다
NOT 컬럼이름  
=
같지 않다
NOT 컬럼이름 > 보다 크지 않다
SQL 비교 연산자 NOT BETWEEN a AND b a b사이에 있지 않다
(a, b값 포함하지 않음)
NOT IN (list) list의 값과  
일치하지 않는다
NOT LIKE 문자 형태와 일치하지 않는다
IS NOT NULL NULL값을 갖지 않았다

 
 
 
  있다, 없다의 값을 비교할 때는 IS NULL, IS NOT NULL 연산자를 써야 합니다.
비교할 때 =NULL이라든지 , =
‘’등을 쓰지 않도록 주의합시다. 

 
       

 

 


4. SQL*PLUS의 기능

 

 
SQL*PLUS 명령어는 Oracle 데이터베이스와 연관되어 작용하는 명령어는 아니며, 사용자가 보다 효율적으로 SQL을 활용할 수 있도록 환경을 제공하는 Oracle에서 만든 일종의 TOOL입니다. 그럼 지금부터 다양한 SQL*PLUS명령어를 활용하여 명령어를 편집하거나, 환경을 설정하는
각 종 기능을 살펴볼까요?
SQL*PLUS 명령어의 기본부류는 다음과 같습니다.
 
파일 편집 및 실행: EDIT , START
환경 설정: SET
표시 형식: COLUMN
변수 사용: &, ACCEPT
기타: DESC, HELP

그럼 지금부터 하나씩 자세히 알아볼까요?

 

 


 

 

 

 

 

 
버퍼에 있는 명령어 편집하기
종류에는 다음과 같은 것들이 있습니다.
명령어   
A(PPEND) text line의 끝에 text를 추가함
C(HANGE)/old/new oldnew로 바꿈
DEL n n line을 지움
I(NPUT) text 다음 line text를 추가함
L(IST) 전체 문장을 보여줌
n text n line전체를 text 
바꿈
R(UN) buffer에 있는 문장을 실행함(/ 와 같음)
EDIT buffer에 있는 문장을 파일로 부름(afiedt.buf)

편집 명령어에 대한 사용의 예
SQL>SELECT name , dept-id
2  FROM s_emp ;
SELECT name , dept-id
                 *
ERROR at line 1:
ORA-00904: invalid column name
SQL>c/-/_
1* SELECT name , dept_id
SQL>list
1  SELECT name , dept_id
2* FROM s_emp
SQL>run
1  SELECT name , dept_id
2* FROM s_emp
 
NAME              DEPT_ID
---------------   -------
박구곤            118
손명성            110
이은선            102
서의홍            101
김심선            118
전지영            110
. . .
 
25 rows selected.

 

 


 

 

 
파일에 있는 명령어 편집하기
종류에는 다음과 같은 것들이 있습니다.
명령어   
SAVE a buffer에 있는 내용을 a.sql 파일로 저장
GET a 파일 a에 있는 내용을 buffer로 부름
START a (=@a) 파일 a를 실행함
! UNIX Shell로 나들이
!vi a.sql 파일 a.sql vi편집기로 부름

편집 명령어에 대한 사용의 예
SQL>SELECT name,salary
2    FROM s_emp ;
SQL> save a
    Created file a
SQL>!vi a.sql
    SELECT name,salary
    FROM s_emp
    /
    ~
"a.sql" 3 줄, 32
vi 편집 명령어를 이용하여 WHERE salary >= 3000을 추가한후
저장하고 나옴
SQL> start a
NAME           SALARY
-------------  ---------
박구곤         5000
손명성         3000
이은선         3500
서의홍         3000
김심선         3200

 

 


 

 

 

 

 

 
SQL*PLUS를 사용한 환경설정은 SET명령어로 기술하게 됩니다.
문형은 다음과 같습니다.
SET 환경변수 값

환경변수의 종류는 다음과 같은 것들이 있습니다.
환경변수   
COLSEP (text) 칼럼이 표시될 때 칼럼 간의 구별 문자
기본값은 공백
FEEDBACK (off|on) 선택된 행이 몇 행인지를 표시함
기본값은 6행 이상인 경우에 on
HEADING (off|on) 칼럼에 대한 HEADING를 표시함
기본값은 on
LINESIZE (n) 한 라인 당 표시되는 문자의 수
기본값은 80
PAGES (n) 한 페이지 당 표시되는 라인수
기본값은 24
PAUSE (off|on|text) ENTER」키를 누를 때마다 화면이 지나감
기본값은 off
TIMING (off|on) SQL문장이 처리되는데 걸리는 시간을 표시
기본값은 off

   
 
  SET 환경이 어떻게 설정되어 있는지 보는 명령어는 SHOW입니다.
전체가 어떻게 설정되어 있는지 보고 싶은 경우는 SHOW ALL입니다.
자신이 쓰는 환경을 항상 맞추고 싶으면 login.sql 파일에 SET환경을
설정하면 됩니다.

 
       

SET 명령어에 대한 사용의 예
SQL>SET HEADING OFF
SQL>SET COLSEP '+'
SQL>SET TIMING ON
SQL>SET PAUSE '엔터키를 누르세요'
SQL>SELECT name, dept_id
2   FROM s_emp ;
 
엔터키를 누르세요
 
박구곤                   +       118
손명성                   +       110
이은선                   +       102
. . .
안은경                   +       103
김석우                   +       104
엔터키를 누르세요
 
박성규                   +       105
신종필                   +       106
이기철                   +       110
. . .
25 rows selected.
 
Elapsed: 00:00:19.70

 

 

 

 

 

 

 
칼럼의 HEADING나 폭, 표시형식을 바꾸는 경우에는 COLUMN명령어를 사용할 수 있습니다.
문형은 다음과 같습니다.
 
COL(UMN) 칼럼이나 ALIAS  
옵션

옵션의 종류는 다음과 같습니다.
  
  
CLE(AR) 칼럼에 지정된 형식을 지움
FOR(MAT) 형식) 칼럼에 대한 표시 형식과 폭을 바꿈
HEADING text 칼럼에 대한 HEADING를 지정함

COLUMN명령어에 대한 사용의 예
SQL>COL name HEADING ‘사원이름’ FORMAT A10
SQL>COL salary FORMAT $9,999,999
SQL>COL salary CLEAR
   
 
  SQL을 사용하여 표시형식을 바꾸는 경우는 변환함수(TO_CHAR)
이용하고, SQL*PLUS를 사용하여 표시형식을 바꾸는 경우는
COLUMN 명령어를 사용하면 됩니다.
지정된 형식을 다 지우고 싶은 경우는 CLEAR COLUMNS
사용합니다.

 
       

 

 


 

 

 

 

 

 
&변수 사용
사용자가 원하는 데이터를 사용할 때마다 입력하고 싶은 경우에 치환변수를 사용할 수 있는데 사용 시에는 &기호를 이용합니다.
&기호의 사용의 예
SQL>SELECT id,name,dept_id
2  FROM s_emp
3  WHERE dept_id = &부서번호 ;
Enter value for 부서번호: 112
old   3: WHERE dept_id = &부서번호
new   3: WHERE dept_id = 112
 
ID     NAME            DEPT_ID
------ -----------     -------                                        
8      신기웅          112
20     윤정숙          112
21     장현철          112
   
 
  변수가 문자나 날짜데이타를 받아들이는 경우는 ‘&변수명을 사용하는
것이 좋습니다.
&&기호를 사용하면 한번 입력받은 변수값을 다시 적용할 수 있습니다.
&기호를 이용하여 값뿐만 아니라 조건, 칼럼명, 테이블명, 전체
SELECT구문도 받을 수 있습니다.

 
       

 

 


 

 

 
ACCEPT를 사용한 변수
사용자가 SELECT구문을 사용하기 전에 미리 변수를 설정해 놓는 경우에 ACCEPT를 사용할 수 있습니다.
문형은 다음과 같습니다.
  
ACCEPT 변수명 데이터 타입 FORMAT PROMPT text HIDE

변수명 값을 저장할 변수명
데이터 타입 NUMBER, CHAR, DATE 중에서 지정
FORMAT A10, 9,999 등의 표시 형식 지정
PROMPT text 사용자가 데이터를 입력할 때 보여주는 문장
HIDE password 등을 지정 시 화면에 보이지 않도록 함

ACCEPT에 대한 사용의 예
SQL>ACCEPT p_salary NUMBER PROMPT ‘급여 입력 :’
SQL>ACCEPT pswd CHAR PROMPT 'Password : ' HIDE

 

 


 

 

 

 

 

 
그 외의 다른 SQL*PLUS명령어는 다음과 같은 것들이 있습니다.
명령어   
DESC 테이블의 구조를 확인
HELP 도움말을 지원함

DESC는 특정 테이블에 대한 칼럼명, 데이터 타입 등을 표시하는 SQL*PLUS명령어로
다음과 같이 사용할 수 있습니다.
SQL> DESC s_dept
 
Name       Null?      Type
---------- ---------- -------
ID         NOT NULL   NUMBER(7)
NAME       NOT NULL   VARCHAR2(25)
REGION_ID             NUMBER(7)
HELP명령어를 이용하여 도움말을 지원받을 수 있는데 어떤 항목들이 제공되는지 전체를
참조하는 명령어는 HELP TOPICS입니다. (Oracle7에서는 HELP INDEX입니다.)
SQL>help topics
SQL>help select
 
  SQL> help select
 
SELECT
------
 
Use this command to retrieve data from one or more tables, object
tables, views, object views, or snapshots.
 
SELECT
   [ DISTINCT | ALL ]
   { *
   | { [ schema. ]{ table | view | snapshot } .*
     | expr [ [ AS ] c_alias ] }
   [, { [ schema. ]{ table | view | snapshot } .*
 
      | expr [ [ AS ] c_alias ] } ] ...
FROM
   { [ schema. ]
     { table [ PARTITION ( partition_name ) | @dblink ]
     | [ view | snapshot ] [ @dblink ] }
   [ t_alias ]
   | [ THE ] ( subquery )
   [ t_alias ]
   | TABLE ( nested_table_column )
. . .
 
 

 

 


 

 

 
SELECT 기본 구문의 4가지 절
 
SELECT
FROM
WHERE
ORDER BY

WHERE절에서 사용하는 연산자의 종류
 
논리연산자 : AND , OR , NOT
논리비교연산자 : = , > , < ,  >= , <= , <>
SQL비교연산자 : BETWEEN~ AND ~ , IN , LIKE , IS NULL

 

 

 


 

사원테이블에서 각 직책들이 무엇이 있는지를 나타내시오.
, 같은 직책에  대해서는 한번만 표시하시오.
SELECT DISTINCT title
FROM s_emp;
   
사원테이블에서 커미션을 받는 사원에 대한 사번, 급여, 커미션을 나타내시오.
, 사번에 대한 오름차순 정렬을 하시오.
 
SELECT id,salary,commission_pct
FROM s_emp
WHERE commission_pct IS NOT NULL
ORDER BY id ;
 
   
부서번호가  110번이나 113번인 사원들중에서 급여가 200만원이상인 사람에 대한
이름, 직책, 급여, 부서번호를 나타내시오.
 
SELECT name , title , salary , dept_id
FROM s_emp
WHERE dept_id IN (110,113) AND salary >= 2000
 
   


 

 

DISTINCT Keyword의 역할로 옳은 것은?
테이블에서 중복된 행을 구별한다.
칼럼이 가진 유일한 값을 구별한다.
테이블에서 중복된 칼럼을 제거한다.
테이블에서 중복된 행을 제거한다.
 
 
  DISTINCT는 중복된 행(row)을 제거하여 한번씩만 데이터를 출력하기 위한 Keyword입니다.

 

  다음과 같은 SQL문이 있다.
 SELECT id , (2*cost)/(2*sale_price) +10  price  FROM product ; 
만약 product 테이블에 있는 cost sale_price 칼럼이 1보다 다 크다면 이 경우 ()
제거하면
  

그 결과는 어떻게 될까?
문장은 Syntax eror가 발생한다.
아까와 같은 결과값이 나온다.
price 값은 더 작게 계산된다.
price값은 더 크게 계산된다.
 
 
  이 경우는 0.5, 2 1보다 각각 작은 값과 큰 값을 직접 입력해서 해 보시면
결과를 이해하실 수 있습니다.

 

다음 중 결과값이 다르게 출력되는 하나는 어느 것인가?
WHERE dept_id =110 OR dept_id = 113 AND salary >= 2000
WHERE (dept_id =110 OR dept_id = 113) AND salary >= 2000
WHERE dept_id =110 AND salary >= 2000
OR dept_id = 113 AND salary >= 2000 
WHERE dept_id IN(110, 113) AND salary >= 2000
 
 
  위에서 설명된 연산자의 우선 순위에 따라 a의 경우만 부서가 113이고 급여가 2000이상이라는 조건이 먼저 검색되어 결국 110부서에는 급여가 2000미만인
사원이 포함되게 됩니다. 따라서 나머지와 결과가 같지 않지요.

 

다음과 같은 SELECT문의 결과 출력되는 데이터는?
SELECT name FROM s_emp WHERE name LIKE '_a%';
a로 시작하는 이름
a A로 시작하는 이름
두번째 문자가 a인 이름
위치에 상관없이 a를 포함하는 이름
 
 
   _  %가 다 Wild Card 이므로 결국 두번째 문자가  소문자 a 인 경우만  
거르게 됩니다.

 

다음 중 S_EMP 테이블에서 commission_pct 칼럼이 null인 경우만 검색하는 경우  
옳은 것은 ?
SELECT name, commission_pct
FROM s_emp
WHERE commission_pct = NULL ;
SELECT name, commission_pct
FROM s_emp
WHERE commission_pct IS NULL ; 
SELECT name, commission_pct
FROM s_emp
WHERE commission_pct = '' ;
SELECT name, commission_pct
FROM s_emp
WHERE commission_pct = 0 ;
 
 
  NULL값을 검색하는 경우는 반드시 IS NULL 연산자를 사용하여야 합니다.

 

다음 SELECT 문장에서 Column Header로 출력되는 것은?
SELECT  id , name  "Employee"   FROM  s_emp;
id, employee
Id, Employee
ID, Employee
ID, EMPLOYEE
 
 
  기본적으로 칼럼의 heading은 대문자로 출력되며, "  "를 사용한 경우는
"  " 안의 문자열 그대로 화면에 출력되게 됩니다.

 

select a||' ' ||b||' '||c "Item Amount" 인 경우의 헤더의 개수는 ?
1
2
3
4
 
 
  ||는 연결 연산자이므로 a, b, c가 다 연결되어 Alias "Item Amount"
되었으므로 결국Header는 하나가 됩니다.

 

다음과 같은 문장에서 ORDER BY 절과 같은 결과를 갖는 구문은?
SELECT   id, name, salary
FROM      s_emp
ORDER BY id, name, salary DESC;
ORDER BY 1 DESC, 2,3
ORDER BY 1,2, DESC 3
ORDER BY 1 ASC ,2 ,3
ORDER BY 1 ASC , 2, 3 DESC
 
  ORDER BY에서 정렬 기준이 생략되면 ASC 이며 , ORDER BY 절에는
칼럼명 대신 SELECT 에 기술한 칼럼의 순서번호를 사용할 수 있습니다.

 

반응형

댓글