일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Jexcel
- 인테리어그림
- MySQL
- JavaScript
- 소득세
- oralce
- 갑근세
- HTML
- Administrator
- samba
- 블로그 조회수
- IIS
- 즐겨찾기 추가
- 블루수국그림
- 에덴미술
- 블로그 방문자 늘리기
- CVS
- Adobe pdf reader
- CSS
- 국민연금
- 블로그 수익화
- Vista
- MSSQL
- PHP
- Eclipse
- 블로그 조회수 늘리기
- JSP
- Jrun
- .NET
- flash
- Today
- Total
I LOVE EJ
표준 Sql 구문정리 2부 본문
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
· 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
· 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
· 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 |