관리 메뉴

I LOVE EJ

표준 Sql 구문정리 2부 본문

Data Base/ANSI Sql

표준 Sql 구문정리 2부

BeOne 2007. 10. 15. 17:21

8.CONTROL USER ACCESS

#DBA(The database administrator) 제공하는 일들

   · Oracle Server 대한 접근을 제공한다.

   · 테이블이나 Sequence 객체에 대한 접근을 허용 또는 제한한다.

   · 데이터 사전에 주고 받는 권한여부를 확인한다.

   · 데이터베이스 객체의 Synonyms 교체 이름을 만든다.

 

SYSTEM PRIVILEGES

시스템 레벨에서 데이터베이스 접근을 제어한다.

 

System Privilege 형태

System Privilege

  

In One’s Own Schema

자신의 영역 내에 테이블을 생성하거나 sequence 생성하는 권한

On all Objects of a Specified Type

모든 영역에도 테이블을 생성하고 모든 테이블이나 view 내용을 변경시킬 있는 권한 

On the System or a User

사용자를 등록하고 접근을 허용하게 하는 권한

 

System Privilege 종류

Class

System Privilege

Operations Permitted

SESSION

CREATE SESSION

데이터 베이스에 접근을 허용

TABLE

CREATE TABLE

자신의 영역 내에 테이블 생성을 허용하고 또한 인덱스의 생성도 허용한다.

TABLE

SELECT ANY TABLE

모든 테이블에 대한 검색 허용

TABLE

ALTER ANY TABLE

모든 테이블에 대한 변경 허용

 . . .

 . . . .

 . . . . . . . .

   · 이밖에도 60가지의 System Privilege 있다.

 

 

GRANT SYSTEM PRIVILGES

DBA SQL GRANT 명령을 사용하여 사용자와 roles에게 System Privileges

주거나 없앨 있다.

Syntax

                         ,                        ,

        GRANT     system_priv        TO        user

                       role                      role 

                                               PUBLIC

 


        WITH ADMIN OPTION

   · system_priv  : 승인되는 시스템권한 ( : CREATE TABLE )

   · TO         : 권한을 부여 받을 대상

   · PUBLIC     : 모든 user 에게 사용 

   · WITH ADMIN OPTION : 부여 받는 사용자에게 승인된 권한에 대해

                제어 권한을 준다.

 

     Example :

 

SQLDBA> GRANT CREATE SESSION, CREATE TABLE TO scott ;

Statement processed.

 

 

INDEXS 확인

     Example :

 

SQL> SELECT *

  2   FROM sys.dba_sys_privs

  3   WHERE grantee IN ( ‘SCOTT’ , ‘LAURA’) ;

 

   · 데이터 사전의 DBA_SYS_PRIVS테이블을 이용해서 system privilege 확인한다.

 

OBJECT PRIVILEGES

객체( 테이블, VIEW, . . )레벨에서 데이터베이스 접근을 제어한다.

 

Object Privilege 형태

Object

Privilege

Table

View

Sequence

Procedure

Snapshots

ALTER

Ú

 

Ú

 

 

DELETE

Ú

Ú

 

 

 

EXECUTE

 

 

 

Ú

 

INDEX

  Ú**

 

 

 

 

INSERT

Ú

Ú

 

 

 

REFERENCE

  Ú**

 

 

 

 

SELECT

Ú

Ú

Ú

 

Ú

UPDATE

Ú

Ú

 

 

 

   · ** 표시된 privilege ROLE에게는 승인될 없다.

 

GRANT OBJECT PRIVILEGES

DBA GRANT명령으로 사용자나 role에게 object privilege 부여할 있다.

Syntax

                            ,

          GRANT      object_priv

                                                 ,                         

                          ALL          (     column     )              

                                                 ,          

          ON                    object TO       user

                   schema.                      role       

                                              PUBLIC         

 


              WITH GRANT OPTION

   · ALL  : 모든 object privilege 부여한다.

   · column : 테이블이나 view 특별한 열에 각각 privilege 부여한다.

             만약 column 없으면 테이블의 모든 열에 부여된다.

   · ON   : privilege 부여될 객체가 있는 영역(Schema)

            만약 기술되지 않으면 Server 객체가 지금 현재 schema

           있다고 생각한다.

   · TO   : 부여 대상

   · PUBLIC : 모든 사용자에게 권한을 준다.

   · WITH GRANT OPTION : 부여받는 사용자에게 승인된 권한에 대해

                제어 권한을 준다.

 

     Example :

 

SQL> GRANT SELECT, INSERT(id, first_name, dept_id),

  2     UPDATE (first_name)

  3   ON s_emp TO scott;

  4   WITH GRANT OPTION;

Grant succeeded.

 

   · WITH GRANT OPTION 가지고 있으므로 scott 다른 사람에게 s_emp

     테이블의 SELECT, INSERT,UPDATE 권한을 있다.

 

권한의 확인

     Example1 : USER_TAB_PRIVS_MADE

 

SQL> SELECT *

  2   FROM user_tab_privs_made ;

 

   · 데이터 사전의 USER_TAB_PRIVS_MADE테이블을 이용해서 사용자가 만든

     테이블 또는 view등에 어떤 권한이 있는지 확인한다.

 

     Example2 : USER_TAB_PRIVS_RECD

 

SQL> SELECT *

  2   FROM user_tab_privs_recd

  3   WHERE owner = ‘ALICE’

 

   · 데이터 사전의 USER_TAB_PRIVS_RECD테이블을 이용해서 사용자가 가지고

     있는 권한을 확인한다.

 

Object Privileges 제거

SQL REVOKE명령을 이용해서 권한을 없앨 있다.

Syntax

 

REVOKE privilege, privilege . . .

ON object_name

FROM [user1_name,user2_name . . . | PUBLIC | role ]

[CASCADE CONSTRAINT]

 

   · CASCADE CONSTRAINT : 객체에 만들어진 FK 참조를 없앨 것을 요구한다.

 

     Example :

 

 SQL> REVOKE SELECT, INSERT

  2    ON s_dept

  3    FROM scott;

Revoke succeeded.

 

 

CREATE SYNONYMS FOR CONVENIENT ACCESS

편리성을 위해 객체의 이름을 교체하거나 동일한 이름을 만든다.

 

#Public Synonyms

   · DBA 의해 만들어진 Synonym.

   ·모든 사용자가 사용할 있다.

#Private Synonyms

   ·데이터베이스 사용자에 의해 만들어진 Synonym.

   ·오직 만든 사용자만 사용한다.

 

CREATE SYNONYM

Syntax

 

CREATE [PUBLIC] SYNONYM synonym_name

  FOR object_name

 

   · PUBLIC : 모든 사용자가 사용할 있도록 만든다.

 

     Example :

 

SQL> CREATE SYNONYM s_dept

  2   FOR alice.s_dept;

Synoym created.

 

   · alice.s_dept 테이블 이름으로 너무 길기 때문에 s_dept 테이블 이름을

    바꿔 쓴다.

  

SYNONYM 삭제

Syntax

 

DROP SYNONYM synonym_name

 

 

Privileges Grouped by Role

Roles

   · system 또는 object privilege 구성된다.

   · 사용자가 소유하지 않고 어떤 영역(Schema) 있지도 않다.

   · 자기 자신을 제외한 어떤 사용자나 role에게 부여 받을 있다.

   · 인증된 사용자를 위해 사용가능 또는 불가능 상태로 있을 있다.

   · 사용 가능한 상태가 되기 위해 인증의 절차가 요구된다.

 

CREATE ROLE

Syntax

              CREATE ROLE role

                                     NOT IDENTIFIED

                                     IDENTIFIED      BY password

                                                      EXTERNALLY

   · NOT IDENTIFIED  : role 얻은 사용자들이 그것을 사용 가능한 상태로 하기위해

                       Oracle Server에게 입증할 필요가 없다.

   · IDENTIFIED       : role 얻은 사용자들이 그것을 사용 가능한 상태로 하기위해

                       Oracle Server 에게 입증해야 한다.  

   · BY password       : role 사용하기위해 password 써야 한다.

   · EXTERNALLY     : Oracle Server OS 사용하여 사용자가 role 사용할

                       있게 한다.

 

     Example1 :

 

SQLDBA> CREATE ROLE acct_pay

       2> INDENTIFIED BY bicentennial ;   

 

   · password ‘bicentennial ’ 가진 acct_pay ROLE 만든다.

 

     Example2 :

 

SQLDBA> CREATE ROLE manager

       2> IDENTIFIED EXTERNALLY ;

 

SQLDBA> GRANT CREATE SYNONYM, CREATE TABLE

       2> TO manager ;

 

SQLDBA> GRANT manager TO kevin;

 

   · manger ROLE 만들고 ROLE 권한들을 주고 권한들을 kevin에게 준다.

 

9. PERFORM COMPUTATIONS WITH DATA

다양한 수학 연산식 표준 SQL 함수를 사용하여 데이터를 변경 표현할 있다.

 

#데이터로 계산하는 다양한 작업

   · 수학 연산자를 사용하여 수치를 계산한다.

   · 가로를 사용하여 계산 순서를 정한다.

   · NVL 이용하여 NULL값을 처리한다.

   · DATE연산과 DATE함수를 이용하여 DATE 계산한다.

   · TO_CHAR 이용하여 DATE값을 다른 형태로 표현한다.

   · 다양한 문자함수를 이용해서 문자열을 조작한다.

   · 그룹함수를 이용하여 그룹별로 계산한다.

   · GROUP BY HAVING절을 이용하여 그룹별로 검색한다.

 

수를 갖고 계산 수행

     Example :

 

SQL> SELECT last_name, salary, commission_pct,

  2   salary * commision_pct / 100 COMMISSION

  3   FROM s_emp

  4   WHERE title = ‘Sales Representative’

  5    AND salary * commission_pct / 100 > 200

  6   ORDER BY salary * commission_pct / 100;

 

   · 위에서 쓰인 연산자의 우선순위는 수학에서와 같다.

 

Numeric Function으로 계산 수행

Numeric Function

  

  

ROUND (value,n)

소수점을 기준으로 n번째 자리에 가장 가까운 값을 취한다.

TRUNC (value,n)

소수점을 기준으로 n 번째 자리에서 버림의 값을 취한다.

MOD (m,n)

m n으로 나눈 나머지 값을 취한다.

 

     Example1 :

 

SQL> SELECT last_name, salary, salary / 22 , ROUND ( salary/22, 2 )

  2   FROM s_emp

  3   WHERE dept_id = 50; 

 

   · salary / 22 값이 113.6363 경우 ROUND(salary/22) 113.64 된다.

    

     Example2 :

 

SQL> SELECT last_name, salary, salary / 22 , TRUNC ( salary/22, 2 )

  2   FROM s_emp

  3   WHERE dept_id = 50; 

 

   · salary / 22 값이 113.6363 경우 TRUNC(salary/22) 113.63 된다.

 

NULL값에 대한 계산 수행 ( NVL )

NULL값을 가지고 곱하기,나누기, NULL NULL 더하기 연산의 결과는 NULL 된다.

Syntax

 

NVL (expr1, expr2)

 

   · expr1 NULL 가지면 expr2 값으로 대치시킨다.

     Example :

 

SQL> SELECT last_name, salary, NVL(commission_pct, 0),

  2   salary * NVL(commision_pct ,0) / 100 COMMISSION

  3   FROM s_emp

  4   WHERE  salary >= 1500

 

   · commission_pct 값이 NULL 이면 0으로 대치한다.

 

DATE 계산 수행

DATE 연산

 

Date + number

Date로부터 number 후의 날짜 계산

Date – number

Date로부터 number 전의 날짜 계산

Date – date

date 사이의 계산

 

     Example1:

 

SQL> SELECT last_name, start_date, start_dat + 90 “$REVIEWS$”

  2  FROM s_emp

  3  WHERE dept_id = 42 ;

 

   · 처음 시작일에서 부터 90 후의 날짜를 보여준다.

 

Date Function

  

  

SYSDATE

현재 날짜와 시간

ADD_MONTHS

(START_DATE,n)

START_DATE에서 부터 n 후의 날짜

LAST_DAY

(START_DATE)

START_DATE 포함된 달의 마지막

NEXT_DAY

(SDAY,DAY)

START_DATE에서 돌아오는 가장 가까운

날짜(DAY 요일 표기)

MONTHS_BETWEEN

(SDATE,NDATE)

SDATE에서 NDATE사이의 달수

(소수로 표시)

 

     Example2 :

 

SQL> SELECT last_name, start_date,

  2   ADD_MONTHS(start_date, 6) “$REVIEWS$”

  3   FROM s_emp

  4   WHERE dept_id = 45;

 

   · start_date 27-FEB-91이면 ADD_MONTHS(start_date,6) 27-AUG-91 된다.

     Example3 :

 

SQL> SELECT last_name, start_date,

  2   NEXT_DAY(SYSDATE, ‘THURSDAY’) PAYDAY

  3   FROM s_emp;

 

   · SYSDATE 5-FEB-99이고 FRIDAY이면 NEXT_DAY(start_date, ‘THURSDAY’)

     11-FEB-99 된다.

 

     Example4 :

 

SQL> SELECT id, start_date,

  2   MONTHS_BETWEEN(SYSDATE, start_date) “MONTHS TENURE”

  3   FROM s_emp;

 

   · SYSDATE 14-OCT-93이고 start_date 03-MAR-90이면

     MONTHS_BETWEEN(SYSDATE, start_date) 45.372553 된다.

 

REFORMAT DATES

Date Formats

 

   

DD

달의 날짜 (1 ~ 31)

DY

날의 이름을 3자로 표현 (ex : MON, TUE,…)

DAY

날의 이름을 9자리에 표현 (ex : MONDAY)

DDSP

달의 날짜를 대문자로 표현 (ex : TWELVE)

MM

달의 표현 (ex : March = 03)

MON

달의 이름을 3자로 표현 (ex : JAN)

MONTH

달의 이름을 9자리에 표현 (ex : JANUARY)

YY

자리 년도 표기 (ex : 99)

YYYY

자리 년도 표기 (ex : 1999)

HH:MI:SS

(::) 표기 (ex : 10:00:00)

fm

문자나 숫자사이의 여분의 공간을 없앤다.(ex : 09 -> 9)

HH24

24시간 표기

TH

서수 표기 (ex : 4TH)

AM or PM

오전 또는 오후 표기

 

TO_CHAR함수로 날짜 표기형태 변환

함수는 데이터를 출력할 때의 출력형태를 변환시킨다.

Syntax

 

TO_CHAR (date_value, format_mask)

 

   · date_value  : date 데이터 타입의 또는 상수

   · format_mask : 날짜의 표기형태

 

     Example1 :

 

SQL> SELECT id, TO_CHAR(date_ordered, ‘MM/YY’) ORDERED

  2  FROM s_ord

  3  WHERE sales_rep_id = 11;

 

   · date_ordered 02/99 형태로 출력된다.

   

     Example2 :

 

SQL> SELECT last_name,

  2   TO_CHAR(start_date, ‘fmDD “of” Month YYYY’) HIREDATE

  3  FROM s_emp

  4  WHERE dept_id = 45;

 

   · start_date 10 of February 1999 형태로 출력된다.

 

TO_DATE함수로 날짜 표기형태 변환

함수는 데이터를 입력할 때의 입력형태를 변환시킨다.

Syntax

 

TO_DATE (character_value, format_mask)

 

   · character_value  : character 데이터 타입의 또는 상수

   · format_mask : 날짜의 표기형태

 

     Example1 :

 

SQL> INSERT INTO s_emp ( id, last_name, start_date, dept_id)

  2  VALUES (s_emp_id.NEXTVAL, ‘Smith’,

  3    TO_DATE(‘070393083000’,’MMDDYYHHMISS’),50);

 

     Example2 :

 

SQL> INSERT INTO s_ord(id,customer_id,date_ordered,date_shipped)

  2   VALUES (s_ord_id.NEXTVAL,205,SYSDATE,

  3   TO_DATE (‘July 01, 2001’,‘Month dd, yyyy’));

 

   · 위의 start_date date-shipped character 타입이다.

 

문자열의 조작

SQL문장 안에 있는 문자열을 조작하는 연산자 함수들이 있다.

 

     Example1: 두개의 문자열을 연결하는 연산자 ( || )

 

SQL> SELECT first_name || ‘ ’ || last_name “Employee Names”

  2   FROM s_emp

  3   WHERE dept_id = 41;

 

   · first_name 문자열과 last_name 문자열을 연결시켜 출력한다

   · 출력 : KilDong Hong

 

     Example2: 문자만 대문자로 변환하는 함수 ( INITCAP )

 

SQL> SELECT last_name, salary

  2   FROM s_emp

  3   WHERE INITCAP(title) = ‘President’;

 

 

     Example3: 모든 문자를 대문자로 변환하는 함수 ( UPPER)

 

SQL> SELECT first_name, last_name

  2   FROM s_emp

  3   WHERE UPPER(last_name) = ‘PATEL’;

 

 

     Example4: 모든 문자를 소문자로 변환하는 함수 ( LOWER)

 

SQL> SELECT first_name, last_name

  2   FROM s_emp

  3   WHERE LOWER(last_name) = ‘%ski%’;

 

 

     Example5: 부분 문자열을 얻는 함수 ( SUBSTR )

 

SQL> SELECT name

  2   FROM s_product

  3   WHERE SUBSTR(name,4,3) = ‘Ace’;

 

   · name이라는 문자열에서 넷째 자리부터 3자리 문자열을 가져온다.

   · 뒤의 3 빠지면 넷째 자리부터 끝까지를 의미한다.

 

     Example6: 문자열의 길이를 결정하는 함수( LENGTH)

 

SQL> SELECT last_name

  2   FROM s_emp

  3   WHERE LENGTH(last_name) = 6;

 

 

그룹함수의 조작

그룹함수에는 AVG,MAX,MIN,SUM,COUNT등이 있다.

COUNT(*) 제외한 모든 그룹함수는 NULL값을 무시한다.

 

     Example1: AVG, SUM, MIN, MAX

 

SQL> SELECT AVG(salary) aveage, MAX(salary) maximum,

  2    MIN(salary) minimum, SUM(salary) sum

  3   FROM s_emp

  3   WHERE UPPER(title) LIKE ‘SALES%’;

 

   · salary 대한 평균, 최대값, 최소값, 합을 취한다.

   · AVG SUM함수는 NUMBER,CHAR,VARCHAR2 수를 저장할 있는

    데이터 타입에 대해서 사용되어질 있다.

   · MAX MIN 함수는 모든 데이터 타입에 대해서 사용되어질 있다.

 

     Example2: 전체 레코드의 수를 계산하는 그룹함수 ( COUNT(*) )

 

SQL> SELECT COUNT(*) “Total Employee”

  2   FROM s_emp;

 

   · COUNT(*)함수는 중복된 데이터나 NULL 가지 데이터도 포함한다.

    

     Example1: NULL값을 제외한 레코드 수를 계산하는 그룹함수( COUNT)

 

SQL> SELECT COUNT(commission_pct) “Employee with Commission”

  2   FROM s_emp;

 

 

레코드에 대한 그룹화

SELECT 문장에 GROUP BY HAVING 절을 사용하여 특정 레코드를 그룹화 하여

보여줄 있다.

Syntax

 

SELECT column_name [,column_name]

FROM table_name

WHERE condition

GROUP BY group_by_expression

HAVING condition

 

   · group_by_expression : 그룹화 하고 싶은 ()

   · condition          : WHERE 절은 특정 레코드에 관한 조건이고 HAVING절은

               특정 그룹의 조건이다.

 

     Example1 :

 

SQL> SELECT title, 12* AVG(salary) “ANNUAL SALARY”,

  2    COUNT(*) “NUMBER OF EMPLOYEES”

  3   FROM s_emp

  4   GROUP BY title

  5   HAVING COUNT(*) > 2;

 

   · title 같은 레코드들을 그룹화하고 그룹의 레코드 수가 2 이상인 그룹의 

     정보를 보여준다. 

    

     Example2 :

 

SQL> SELECT title, SUM(salary) PAYROLL,

  2   FROM s_emp

  3   WHERE title NOT LIKE ‘VP%’

  4   GROUP BY title

  5   HAVING SUM(salary) > 5000;

  6   ORDER BY SUM(salary);

 

   · GROUP BY HAVING절은 WHERE 바로 다음에 온다.

   · title ‘VP%’ 형태가 아닌 레코드를 가져온 title 같은 레코드들을

    그룹화 하고 봉급의 합이 5000보다 그룹들을 봉급에 따라 오름차순 정렬한다.

 

10. DISPLAY DATA FROM MULTIPLE TABLES

 JOIN VIEW로써 여러 테이블로부터 결과를 결합시킬 있다.

 

#두개 이상의 테이블 검색

   · JOIN (WHERE절의 조건) 결과 검색

   · OUTER JOIN 이용한 결과의 확장

   · SLEF JOIN 이용한 검색

   · VIEW 테이블을 생성하여 다중 테이블 참조

 

WHERE절의 조건에 의한 단순 JOIN

Syntax

 

SELECT table.column, table.column . . .

FROM table1,table2 . . .

WHERE table1.column = table2.column

 

   · SELECT 뒤에는 검색할 테이블의 필드 이름들을 나열한다.

   · FROM 뒤에는 JOIN 테이블들을 나열한다

   · WHERE 뒤에는 JOIN 조건이 온다. 만약 조건이 복잡하면 JOIN

     테이블의 특정 레코드를 검색한다.

 

     Example1 :

 

SQL> SELECT s_emp.last_name, s_emp.dept_id, s_dept.name

  2   FROM s_emp, s_dept

  3   WHERE s_emp.dept_id = s_dept.id;

 

   · s_emp테이블의 dept_id s_dept테이블의 id 같은 레코드를 JOIN하고

     s_emp테이블에서 last_name dept_id s_dept테이블에서 name 검색한다.

 

     Example2 :

 

SQL> SELECT s_emp.last_name, s_emp.dept_id, s_dept.name

  2   FROM s_emp, s_dept

  3   WHERE s_emp.dept_id = s_dept.id

  4   AND s_emp.last_name = ‘Menchu’;

 

   · Example1 결과에 s_emp테이블의 last_name ‘Menchu’ 레코드를 검색한다.

 

일치하지 않는 데이터를 포함한 OUTER JOIN

Outer Join으로 직접 일치하지 않는 레코드를 포함해서 검색할 있다.

Syntax

 

SELECT table.column, table.column . . .

FROM table1, table2 . . .

WHERE table1.column = table2.column(+)

 

      or

SELECT table.column, table.column . . .

FROM table1, table2 . . .

WHERE table1.column(+) = table2.column

   · WHERE 절의 조건으로 테이블들을 JOIN하고 (+) 있는 쪽의 테이블 내용은

     모두 포함해서 검색하도록 한다.

 

     Example :

 

SQL> SELECT s_customer.id “Customer ID”,

  2     s_customer.name “Customer Name”,

  3     s_ord.id “Order ID”

  4   FROM s_customer, s_ord

  3   WHERE s_customerid = s_ord.customer_id(+);

 

 

Customer ID  Customer Name                 Order ID

- - - - - - - - -   - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - -

       201   Unisports                           97

       202   OJ Athletics                         98

       203   Delhi Sports                         99

       204   Womansports                       100

       204   Sweet Rock Sports

       205   Muench Sports                      101

       . . .    . . . . . . . . . . . .                      . . .

 

   · 위에서 s_ord테이블에 서로 일치하는 customer_id 없어도

     s_customer테이블의 Customer ID Customer Name 보여준다.

 

같은 테이블 사이의 SELF JOIN

하나의 물리적 테이블을 서로 다른 이름으로 별칭을 주어 JOIN한다.

     Example :

 

SQL> SELECT worker.last_name || ‘works for ’ || manager.last_name

  2   FROM s_emp worker, s_emp manager

  3   WHERE worker.manager_id = manager.id

 

   · s_emp 테이블을 각각 worker manager 두개로 구별하여 JOIN했다.

   · 논리적으로 각기 다른 테이블처럼 생각한다.

 

JOIN 결과의 테이블 생성

일반적으로 JOIN 결과는 테이블 이름이 없다. CREATE TABLE 사용하여

두개 이상의 테이블로부터 새로운 테이블을 얻을 있다.

VIEW 테이블은 실제 데이터를 가지고 있지 않고 테이블 구조만 가지고 있다.

 

     Example :

SQL> CREATE VIEW empdeptvu AS

  2     SELECT s_emp.last_name,

  3             s_emp.dept_id,

  4             s_dept.name

  5   FROM s_emp, s_dept

  6   WHERE s_emp.dept_id = s_dept.id;

 

 View createc.

   · 새로 생성된 테이블의 이름은 empdeptvu가되고 필드는 last_name,dept_id,name 된다.

 

11.PASS VALUES BETWEEN QUERIES

Query Subqueries 사용함으로써 얻어진 결과를 가지고 작업을 있다.

 

#Subqueries

   · Subqueries =,<>,>,>=,<,<= 등의 Single-row연산자들로 Query 개의

     레코드를 전달할 있다.

   · Subqueries IN등의 Multi-row연산자들로 Query 여러 개의  레코드를

     전달할 있다.

   · AND OR 논리 연산자를 이용해 여러 개의 Subqueries Query안에

     있다.

 

Nest Queries that Return One Row

Nesting SELECT 문장을 이용한 Subquery로부터 얻어진 개의 레코드에 의해

검색하고자 하는 레코드를 제한 있다.

Syntax

 

SELECT column_name, [, column_name]

FROM table_name

WHERE expression operator

       ( SELECT statements)

 

   · operator  : 비교연산자( = , <> , > , IN . . .)

 

     Example :

 

SQL> SELECT last_name, title

  2   FROM s_emp

  3   WHERE title =

  4          ( SELECT title

  5           FROM s_emp

  6           WHERE last_name = ‘Smith’);

 

   · 위의 예제에서 결과가 이상이면 Error 된다.

   · 결과가 둘이상이면 = IN으로 바꿔야 한다.

 

Nest Queries that Return Multiple Rows

Nesting SELECT 문장을 이용한 Subquery로부터 얻어진 여러 개의 레코드에 의해

검색하고자 하는 레코드를 제한 있다.

 

     Example1 :두개이상의 결과에대한ERROR

 

SQL> SELECT id, last_name, dept_id

  2   FROM s_emp

  3   WHERE dept_id =

  4          ( SELECT dept_id

  5           FROM s_emp

  6           WHERE UPPER(last_name) = ‘PATEL’);

 

ERROR:

ORA-01427 : single-row subquery returns more than one row

   · Subquery 결과가 두개 이상이므로 ERROR 된다

 

     Example2 : IN 사용

 

SQL> SELECT id, last_name, dept_id

  2   FROM s_emp

  3   WHERE dept_id IN

  4          ( SELECT dept_id

  5           FROM s_emp

  6           WHERE UPPER(last_name) = ‘PATEL’);

 

 

Nest Multiple Queries

 AND OR 논리 연산자를 이용해 여러 개의 Subqueries Query안에

있다.

 

     Example1 :두개이상 Subqueries

 

SQL> SELECT id, last_name, salary, dept_id

  2   FROM s_emp

  3   WHERE dept_id IN ( SELECT dept_id

  4                     FROM s_emp

  5                     WHERE name = ‘Sales’)

  6   OR dept_id IN    ( SELECT id

  7                   FROM s_dept

  8                   WHERE region_id = 2);

 

   · dept_id 두개의 Subqueries 결과와 모두 비교하여 검색을 제한한다.

'Data Base > ANSI Sql' 카테고리의 다른 글

오라클 vs MS SQL 함수 비교  (0) 2007.10.15
표준 Sql 구문정리 1부  (0) 2007.10.15