'프로그래밍 기초'에 해당되는 글 57건

  1. 2010.03.02 서브쿼리
  2. 2010.03.01 제약조건(Constraint)
  3. 2010.02.25 Advanced Query
  4. 2010.02.24 Single-Row Functions
  5. 2010.02.24 기본쿼리2
  6. 2010.02.23 기본쿼리 1
  7. 2010.02.22 SQL문 정리
  8. 2010.02.22 Database System
  9. 2010.02.21 헤더파일중복문제
  10. 2010.02.21 extern


여러개의 서브쿼리 결과가 하나 나올때는

=, >, <, >=,<= 을 써야 한다.

결과값이 많을 경우는 In, And , All이 라던지 다른 방법을 사용한다.


SELECT ename,sal
FROM emp
WHERE sal< (SELECT AVG(sal)FROM emp);

월급이 평균이상인 사원을 나열하여라.


select *
from emp
group by deptno;

에러가난다.  select 절에 deptno나 max(sal) 같은 값만 올 수 있다.

 

서브쿼리 사용예제
select deptno, max(sal)
from (select * from emp)
where sal > (select avg(sal) from emp)
group by deptno
having deptno = (select deptno from dept where DNAME =
select Dname from dept where loc = 'NEW YORK'))


 

'프로그래밍 기초 > 오라클' 카테고리의 다른 글

제약조건(Constraint)  (0) 2010.03.01
Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
Posted by 아몰라

테이블 안에서 데이터의 성격을 정의하는 것이 바로 제약조건(Constaint) 이며 테이블 생성 또는 변경시에 특정 컬럼에 조건을 정의할 수 있다. 제약 조건에는 NOT NULL조건, 유일성(UNIQUE), Chek 조건, 기본키, 외래키 조건 이 있다.

- 데이터베이스 성능을 향상시킬 수 있다.
- 선언과 변경이 용이하다.
- 활성화/비활성화 할 수 있다.
- 요구사항과 Rule의 통합적 통제가 가능하다.



NOT NULL

Create Table Employee(
emp_no NUMBER CONSTRAINT Emp_nn_EmpNo NOT NULL,
emp_name VARCHAR2(30),
dept_no NUMBER CONSTRAINT Emp_nn_DeptNo NOT NULL
);
사원번호에 널값이 들어가는걸 허용하지 않겠다는 말이다. 널값이 들어가면 Emp_nn_EmpNo 라는 에러메세지가 뜬다.



UNIQUE

Create Table Employee(
emp_no NUMBER CONSTRAINT Emp_nn_EmpNo NOT NULL,
                          CONSTRAINT Emp_nn_EmpNo UNIQUE
)
유일성을 보장한다는 뜻으로 emp_no 에 10이라는 값이들어가면 또 다시 10이라는 값이 들어갈 수 없다.



CHECK

CREATE TABLE Class(
class_id NUMBER CONSTAINT Class_ck_ClassID
                          CHECK (class_id >= 1 AND class_id <= 10),
class_name VARCHAR2(20) );
class_id가 만약 1이상 10 이하가 아닌 숫자가 들어가면 에러가 발생한다.



DEFAULT

max_amount       NUMBER DEFAULT 2000
                         CONSTRAINT CreditCard_nn_MaxAmnt NOT NULL
만약 max_amount 컬럼 값을 인서트 할때 넣지 않더라도 에러가 나지않는다 기본값을 설정했기때문이다.



기본키 - (NOT NULL + UNIQUE)

CREATE TABLE Loans(
account NUMBER(6, 0),
loan_number NUMBER(6, 0),
cust_id NUMBER(6,0),
CONSTRAINT Loans_pk_al PRIMARY KEY( account, loan_number)
);
이렇게 동시에 2개의 기본키를 지정해 줄 수도 있다.



외래키  - 다른 테이블에 기본키를 참조하는 컬럼

외래키로 선언될 컬럼의 데이터형은 그 키가 참조하는 기본키의 데이터 형과 일치해야 한다.


CREATE TABLE Dept(
dept_no   NUMBER,
dept_name VARCHAR2(10),

외래키 설정 2가지 방법
emp_no      VARCHAR2(6) CONSTRAINT Dept_fk_EmpNo References Employee(emp_no),
(CONSTRAINT Cloth_fk_shop_no FOREIGN KEY (shop_no) REFERENCES Shop)

CONSTRAINT Dept_pk_DeptNo PRIMARY KEY (dept_no)
);




다른 테이블에서 기본키를 참조하고있다.
ALTER TABLE Dept DROP PRIMARY KEY; - 에러가 난다.



외래키에 의해 참조되고 있는 기본키는 삭제될 수 없다.

부득이하게 기본키를 삭제해야 한다면 그 키를 참조하는 외래키를 먼저 삭제한 뒤에 기본키를 삭제한다.

ALTER TABLE Employee DROP CONSTRAINT Employee_FK_Dept_NO;  - 외래키 삭제
ALTER TABLE Dept DROP PRIMARY KEY; -기본키 삭제


'프로그래밍 기초 > 오라클' 카테고리의 다른 글

서브쿼리  (0) 2010.03.02
Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
Posted by 아몰라

Cartesian Product( Join이 될 key를 잡아 주지않았다.)


Select * From emp, dept;

위와 같이 FROM 절에 두 개 혹은 그 이상의 table 명을 기술할 수 있다. 위 문장의 수행 결과 Cartesian Product가 발생하여 s_emp 25 row * s_dept 12 row = 300 row의 결과가 나오게 된다.

대부분의 SELECT 문장에서는 위와 같이 두 table을 Cartesian Product 하지는 않는다. 예를 들어, s_dept의 PK인 id와 s_emp의 FK인 dept_id 가 같은 row끼리만 업무적으로 의미 있는 data 이므로 WHERE 절에 두 table을 연관시키기 위한 condition을 기술해 준다. 이렇게 두 개 이상의 table을 연관시키는 것을 Join이라고 하며 WHERE 절 내용을 Join condition이라고 한다.

SQL> SELECT * FROM s_emp, s_dept WHERE s_dept.id = s_emp.dept_id;
SQL> SELECT * FROM s_dept, s_emp WHERE s_dept.id = s_emp.dept_id;


< JOIN >

최종적으로 얻고자 하는 data가 여러 개의 table에 흩어져 있는 경우, 또는 최종적으로 얻고자 하는 data를 가져오기 위해 여러 table을 연관시켜야 하는 경우 Join을 사용한다.
대부분의 경우 한 table의 Primary Key와 다른 table의 Foreign Key를 사용하여 join condition을 작성하게 된다.
Join condition이 빠지면 Cartesian product가 발생하므로 유의하여야 한다.



Equijoin  (기본조인)

emp.deptno = dept.deptno Equijoin  이퀄로 평가될수 있는 조인



Non - Equejoin  ( =  외에 연산자를 사용)

  select e.ename,e.sal, s.grade  
  from emp e, salgrade s
  where e.sal between s.losal and s.hisal
* order by s.grade




Outer Join



(+)Null값이 존재하는 테이블에 붙여준다.

  1  select d.dname, e.ename
  2  from  dept d, emp e
  3* where d.deptno = e.deptno(+)

SQL> /

DNAME          ENAME
-------------- ----------
ACCOUNTING     CLARK
ACCOUNTING     KING
ACCOUNTING     MILLER
RESEARCH       JONES
RESEARCH       FORD
RESEARCH       ADAMS
RESEARCH       SMITH
RESEARCH       SCOTT
SALES          WARD
SALES          TURNER
SALES          ALLEN
SALES          JAMES
SALES          BLAKE
SALES          MARTIN
OPERATIONS


SQL> select ename, dname from emp e, dept d
  2  where e.deptno(+) = d.deptno(+);
where e.deptno(+) = d.deptno(+)
                  *
2행에 오류:
ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다

정리
Outer join operator는 하나의 SELECT 문 안에서 하나의 table에만 사용할 수 있으며 아래와 같은 구조를 갖는다.
SELECT table.column, table.column
FROM table1.table2
WHERE table1.column(+) = table2.column;

(+) 연산자는 조인 조건의 필요한 곳에 붙이도록 한다. 어느 쪽에 붙이느냐 에 따라 의미가 변하므로 올바른 위치에 붙여야 한다.

위의 outer join 경우, table1에 matching 되는 row가 없는 table2의 모든 row에 대해서 Oracle은 table1의 select list 값들을 모두 NULL로 return해준다.


Self Join(같은 테이블끼리 join 한다.)


Self join의 경우 동일한 table 명이 2개 이상 사용되므로 반드시 table alias를 사용한다.



사원의 이름과 매니저의 이름을 출력하시오.

 SELECT worker.last_name ||' works for '|| manager.last_name
FROM s_emp worker, s_emp manager
WHERE worker.manager_id=manager.id;




'프로그래밍 기초 > 오라클' 카테고리의 다른 글

서브쿼리  (0) 2010.03.02
제약조건(Constraint)  (0) 2010.03.01
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
Posted by 아몰라

Character Functions

1. CONCAT : 문자열 결합
CONCAT('Hello', 'World') → 'HelloWorld'
'Hello' || 'World' → 'HelloWorld' (문자열 겹합과 동일)

2. SUBSTR : 문자열 추출
SUBSTR('HelloWorld', 6) → 'World'
 - 왼쪽에서 6번째부터 끝까지 추출
SUBSTR('HelloWorld', 6, 3) → 'Wor'
 - 왼쪽에서 6번째 부터 3글자 추출
SUBSTR('HelloWorld', -4, 2) → 'or'
 - 인덱스가 음수인 경우 오른쪽에서 부터 4칸 계산

3. LENGTH : 문자열의 길이 리턴
LENGTH('HelloWorld') → 10

4. INSTR : 문자의 index 값을 리턴
INSTR('HelloWorld', 'W') → 6
INSTR('HelloHello', 'H') → 1 (왼쪽에서 첫번째 문자 검색함)
INSTR('HelloHello', 'H', 1, 2) → 6 (첫번째 인자는 검색 시작 위치를, 두번째 인자 값은 반복 횟수를 나타냄)

5. ~PAD : 문자열 패딩
   ↑ 채울 위치 (L / R)
LPAD('abc', 6, '*') → 'abc***' (전체 6글자에서 남는 위치는 '*'로 채운다)
RPAD('abc', 6, '*') → '***abc' (전체 6글자에서 남는 위치는 '*'로 채운다)

6. REPLACE : 문자 대체
REPLACE('011-546-2456', '-', '.') → '011.546.2456

7. ~TRIM : Garbage한 문자 제거
LTRIM('aaababaaa', 'a') → 'babaaa'
RTRIM('aaababaaa', 'a') → 'aaabab'
TRUM('a' from 'aaababaaa') → 'bab'
TRIM('             bab          ') → 'bab' (지우고 싶은 문자가 공백인 경우 인자를 명시 하지 않으면 됨)





select employee_id, concat(first_name, last_name) NAME, job_id, length(last_name) , instr(last_name, 'a')  "Contains 'a'?"
from employees
where substr(job_id, 4) = 'REP';
EMPLOYEE_ID NAME JOB_ID LENGTH(LAST_NAME) Contains 'a'?
174 EllenAbel SA_REP 4 0
176 JonathonTaylor SA_REP 6 2
178 KimberelyGrant SA_REP 5 3
202 PatFay MK_REP 3 2


Number Functions

1. ROUND : 소수점 이하 2자리 까지 표현 한다. 소수점 3째 자리에서 반올림
ROUND(45.926, 2) → 45.93
ROUND(45.926, 1) → 45.9
ROUND(45.926, 0) or ROUND(45.926) → 46 (Default 값이 0이므로 0은 생략 할 수 있다.)
ROUND(45.926, -1) → 50 (음수 인자는 반올림을 할 자릿수를 나타낸다. -1은 정수 첫번째 자리를 나타낸다.)
ROUND(45.926, -2) → 0 (반올림 할 숫자가 없기 때문에 0을 리턴)

2. TRUNC : 원하는 부분 밑으로 소수점 이하를 자른다. 인자값 만큼 소수점 이하 자리를 유지 시킨다.
TRUNC(45.926, 2) → 45.92
TRUNC(45.926, 1) → 45.9
TRUNC(45.926, 0) or TRUNC(45.926) → 45
TRUNC(45.926, -1) → 40
TRUNC(45.926, -2) → 0

* Default Date 형식 바꾸기
alter session set nls_date_format = 'YYYY-MM-DD'
session 대신 system을 하면 default 값을 변경할 수 있지만 권한을 가지고 있는 dba만 변경 가능

날짜 Data에 대한 연산은 덧셈이나 뺄셈만 가능
(곱셉이나 나눗셈은 안됨)

date - date = 상수
date + date (x) 실행 안됨
sysdate + 1/24 = 한시간 뒤 시간
sysdate + 5/1440 = 5분 뒤 시간

select last_name, (sysdate-hire_date)/7 as WEEks
from employees
where department_id = 90;
LAST_NAME WEEKS
King 1175.08442
Kochhar 1056.94156
De Haan 884.084418



Data Type Conversion


select salary * '12' (문자를 곱해도 에러 없이 실행이 잘됨. 문자 12가 숫자로 변환된다.)
from employees
암시적인 데이타 변환이 성능에 안좋게 영향을 미칠 수 있다.

            TO_NUMBER                 TO_CHAR
NUMBER            CHARACTER            DATE
             To_CHAR                    To_DATE

select to_char(sysdate, 'yyyy-mm-dd')
from dual;
왼쪽에 있는 날짜 데이터를 포맷에 맞추어 출력
TO_CHAR(SYSDATE,'YYYY-MM-DD')
2009-12-23

select to_char(sysdate, 'DD-Month, YYYY')
from dual;
select to_char(sysdate, 'DD-Month-YYYY', 'NLS_DATE_LANGUAGE=korean') (원하는 언어로 출력 가능)
from dual;                                                                                 french
TO_CHAR(SYSDATE,'DD-MONTH-YYYY','NLS_DATE_
23-12월-2009

* NLS : National Language Support




Sample Format Elements of Valid Date Formats

WW - 연중 몇주차
W - 월 몇주차
DDD - 연중 몇일째
DD - 월중 몇일째
D - 주중 몇일째

select to_char(sysdate, 'WW W DDD DD D')
from dual;
TO_CHAR(SYSDATE,'WWWDDDDDD')
51 4 357 23 4

select to_char(to_date('1981-10-01', 'YYYY-MM-DD'), 'DAY')
(to_date 안의 함수 안에서 날짜 형식을 지정해 주어야 인식이 된다.)
from dual;
TO_CHAR(TO_DATE('1981-10-01
THURSDAY

7일의 표시
dd : 07
fmdd : 7
ddsp : seven
ddspth : seventh (서수형 표시)

select to_char(sysdate, 'yyyy')
from dual;
TO_CHAR(SYSD
2009
오늘 날짜에서 연도만 추출
to_char 함수는 실제로 날짜를 추출 하는 역할을 많이 한다. 동시에 문자 데이터로 변환

정수 부분이 표시할 공간이 부족할 경우 오버 플로우로 ###으로 대치되어 나오지만
소수 부분은 오버 플로우가 없이 표시할 공간이 부족한 경우 반올림 되어 나온다.

select last_name, hire_date
from employees
where hire_date = to_date('May   24, 1999', 'fxMonth   DD, YYYY');
LAST_NAME HIRE_DATE
Grant 24-MAY-99
빈 공간까지 정확하게 체크 (fx 옵션) - 주로 패스워드 체크 할때 사용된다.



RR Format






년도를 4자리로 쓸때는 아무 문제 없지만 YY 입력후 82년을 넣으면 오라클은 2082년으로 인식하고
RR사용시 82라 넣어도 문제가 발생하지 않는다. 하지만 RR은 나중에 문제를 일으킬 요소가 있으므로
YYYY 네자리로 쓰는 것을 권한다.



현재가 2003년 일 때 다음 문장들을 실행하여 결과를 확인하시오.
SQL> SELECT TO_CHAR(TO_DATE('30/01/01','YY/MM/DD'),'YYYY') FROM dual ;
(* 결과가 2030으로 나타난다.)
SQL> SELECT TO_CHAR(TO_DATE('30/01/01','RR/MM/DD'),'YYYY') FROM dual;
(* 결과가 2030으로 나타난다.)
SQL> SELECT TO_CHAR(TO_DATE('80/01/01','YY/MM/DD'),'YYYY') FROM dual;
(* 결과가 2080으로 나타난다.)
SQL> SELECT TO_CHAR(TO_DATE('80/01/01','RR/MM/DD'),'YYYY') FROM dual;
(* 결과가 1980으로 나타난다.)

현재의 시각을 1999년으로 설정한 후 위의 문장들을 실행하여 결과를 확인하시오.


Date Functions


SYSDATE

 

현재의 오늘 일자를 리턴, Oracle가 설치된 시스템 컴퓨터 날짜를 가진다.

 

 SYSDATE       그 자체가 현재 일자/시간값을 가진다.    

   



SELECT SYSDATE FROM dual;

 

>> 05/03/13

  

 

SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM dual;

 

>> 2005-03-13 16:26:30

 

 

 

 

LAST_DAY

 

나머지 값을 구하는 함수

  

LAST_DAY(date)       date 일자의 해당 마지막 일자를 가리킨다.

 

 

 

SELECT LAST_DAY(SYSDATE) FROM dual;

 

>> 05/03/31

 

 

 

SELECT TO_CHAR(LAST_DAY(SYSDATE), 'YYYY-MM-DD HH24:MI:SS') FROM dual;

 

>> 2005/03/31 16:34:40

 

 

 

MONTHS_BETWEEN

 

두 날짜 사이의 기간을 월 단위로 계산

 

 

MONTHS_BETWEEN(data1,data2)   data1 data2 기간을 월 단위를 리턴

 

date1 date2보다 클 경우 양수의 결과가 나오는 것을 주의        

 

 

 

SELECT MONTHS_BETWEEN('2002/01/13', '2001/05/13') FROM dual;

 

>> 7

 

 

 

SELECT MONTHS_BETWEEN('2002/01/13', '2002/05/13') FROM dual;

 

>> -4

 

 

 

SELECT MONTHS_BETWEEN(SYSDATE, '2005/09/13') FROM dual;

 

>> -6

 

 

 

 

ADD_MONTHS

 


해당일 기준으로 해서 이후/이전 날짜로 바꾼다.

 

ADD_MONTHS(data1,n)   data1일을 기준으로 n개월 후를 리턴

 

 

 

SELECT ADD_MONTHS('2002/01/13', 12) FROM dual;

 

>> 03/01/13

 

 

 

SELECT ADD_MONTHS('2002/01/13', -1) FROM dual;

 

>> 01/12/13

 

 

 

SELECT ADD_MONTHS(SYSDATE, 12) FROM dual;

 

>> 06/03/13

 

 

 

NEXT_DAY

 


해당 일을 기준으로 주어진 요일이 처음 오는 날짜를 리턴

 

NEXT_DAY(data,요일)   date를 기준으로 [요일]에 해당하는 바로 다음

 

일을 리턴한다. 요일은 아래같이 참조가능하다.                    

 

일요일 - 1, 월요일 - 2 .......토요일 - 7                         

 

 

 

SELECT NEXT_DAY(SYSDATE, '일요일') FROM dual;

 

>> 05/03/20

 

 

 

SELECT NEXT_DAY('2005/03/15', 7) FROM dual;

 

>> 05/03/19

 


출처 http://forceocp.tistory.com/

'프로그래밍 기초 > 오라클' 카테고리의 다른 글

제약조건(Constraint)  (0) 2010.03.01
Advanced Query  (0) 2010.02.25
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
SQL문 정리  (0) 2010.02.22
Posted by 아몰라

WHERE


WHERE 절을 사용하지 않으면 FROM 절에 명시된 table의 모든 row를 조회하게 된다.

Table 내의 특정 row만 선택하고 싶을 때 WHERE 절에 조건식(condition)을 써준다.

Oracle server는 Table의 row를 하나씩 읽어 WHERE 절의 조건식을 평가하여 TRUE로 만족하는 것만을 선택한다.

Condition을 평가한 결과는 TRUE, FALSE, NULL 중의 하나이다.

emp 테이블에 ename 이 SMITH이면 즉 TRUE이면 해당 행을 띄워줘라.

select *
from emp
where ename = 'SMITH'



Date값은 현재 session의 nls_date_format에 맞춰 표현해 준다.

형식에 맞게

                      맞지않게

이렇게 포맷이 맞지않으면 오류가 난다.



비교 연산자 중에서 같지 않음을 나타내는 <> 연산자는 모든 운영체제에서 사용 가능하며, 운영 체제 종류에 따라 != 나 ^= 도 사용될 수 있다.


EMP테이블 열이름 - EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO

DEPT테이블 열이름 -   DEPTNO, DNAME          LOC

<문제>

사번이 7788인 사원의 이름과 급여를 출력하시오.
급여가 3000 이 넘는 직종을 출력하시오
PRESIDENT 를 제외한 사원들의 이름과 직종을 출력하시오.
BOSTON 지역에 있는 부서의 번호와 이름을 출력하시오.

Date 값에 대해 조건을 줄 때는 현재 session의 NLS_DATE_FORMAT에 맞춰 주도록 한다.
SQL> SELECT value FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT';
SQL> ALTER SESSION SET nls_date_format = 'DD-MON-RR';
SQL> SELECT empno, ename FROM emp WHERE hiredate >= '01-JAN-82';
SQL> ALTER SESSION SET nls_date_format = 'RR/MM/DD';
SQL> SELECT empno, ename FROM emp WHERE hiredate >= '82/01/01';



IN
select * from emp
where sal in(800, 1500, 3000) 800, 1500, 3000인 값들을 찾아줌

ANY
 select * from emp
 where sal <ANY(800, 1500) 800보다 작은 행들 1500보다작은 행들을 찾아줌

ALL
 select * from emp
where sal >ALL(800, 1500)  1500보다 큰 행들을 찾아준다.


ANY와 ALL 연산자의 앞에 비교연산자가 반드시 함께 쓰여야 한다.
IN 연산자는 =ANY 연산자와 같은 결과이다.
NOT IN 연산자는 <>ALL 연산자와 같은 결과이다.

BETWEEN

select *
from emp
where sal between 1000 and 2000  1000과 2000사이의 sal이 있는 값을 가져와라.

LIKE

 select *
 from emp
 where ename like 'S%'  대문자 S로 시작하는 사람

 select *
 from emp
 where ename like '%S'  대문자 S로 끝나는 사람

 
  1 select *
  2  from emp
  3* where comm = NULL
SQL> /
선택된 레코드가 없습니다.
SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select *
  2  from emp
  3* where comm is NULL
SQL> /
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
10 개의 행이 선택되었습니다.

comm = NULL 은 허용 안되고 comm is NULL로 하여야 한다. 반대일때는 coom is NOT NULL


 1  select *
 2  from emp
 3* where hiredate like '%03%'  //03 뒤에 NULL값이 오므로 정상적으로 03이 검색된다.
SQL> /
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
SQL> ed
file afiedt.buf(이)가 기록되었습니다
  1  select *
  2  from emp
  3* where hiredate like '%03' //찾는 값이 맨 앞에 03이 아니면 꼭 시작할 때 %붙여주자.
SQL> /
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20




정리
Wildcard ‘%’는 0개 이상의 문자를 대표한다.
Wildcard ‘_’는 1개의 문자를 대표한다.
Wildcard 문자를 일반 문자로 사용하고 싶을 때 ESCAPE 문자를 사용한다. ESCAPE 문자 바로 뒤에 사용된 wildcard 문자는 일반 문자로 인식된다.
Column의 Null여부를 판단할 때는 반드시 ‘IS NULL’ 혹은 ‘IS NOT NULL’ 연산자를 사용해야 한다.




연산자 우선순위




논리 연산 진리표




ORDER BY


ORDER BY 절에 정렬의 기준이 되는 column을 여러 개 명시할 수 있다. Oracle은 첫 번째 column으로 정렬한 다음, 그 column 값이 같은 row들에 대해서는 두 번째 column값으로 정렬을 해준다.

오름차 순(ASC) 정렬이 default이며, 내림차 순으로 정렬하고자 할 때는 DESC 라는 옵션을 명시해 준다.

ORDER BY 절에 column 명 대신 positional notation을 사용할 수도 있다. Position number는 SELECT절의 column 순서를 의미한다.

  1  SELECT *
  2  FROM emp
  3* order by sal desc, ename
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7369 SMITH      CLERK           7902 80/12/17        800                    20


sal을 기준으로 내림차순하여 정렬하고 그 다음 ename을 기준으로 오름차순 정렬한다.


SQL> SELECT ename, sal FROM emp ORDER BY 2 DESC, 1;
두번째 열을 내림차순으로 첫번째 열을 오름차순으로 정렬한다.


'프로그래밍 기초 > 오라클' 카테고리의 다른 글

Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
SQL문 정리  (0) 2010.02.22
Database System  (0) 2010.02.22
Posted by 아몰라

ed  - 전에 실행한 버퍼에 들어간 명령문을 edit한다.


set linesize 1000;
set pagesize 1000;  사이즈 변경


버퍼에 있는 내용 실행   /


SQL문 작성시 유의사항

SQL문은 대소문자를 가리지 않는다.
data값은 대소문자를 가린다.




연산자 우선순위

단항 +, -  이항 * , /, + , -
- 괄호를 사용하여 연산자 우선순위를 조정할 수 있다.


NULL

Null이란 아직 값을 알 수 없는 상태 또는 의미가 없는 상태를 표현한다.

Null은 0이나 space 등과는 다르다.

산술 연산 수식에 Null인 값이 하나라도 포함되어 있다면 결과값은 항상 Null이 된다. (s_no + NULL) = NULL
     (s_no + 0) = s_no
Not Null이나 PRIAMARY KEY 제약 조건을 갖는 column은 NULL일 수 없다.

Oracle Database에서 Null인 column은 Length가 0 으로 data를 위한 물리적 공간을 차지 하지 않는다.



NULL값 처리 함수 - NVL(expr1, expr2)

다음은 사번과 커미션을 출력하면서 커미션이 없는 사원의 경우 NULL이 아니라 0으로 출력하도록 하는 문장이다.
Select empno, ename, NVL(comm, 0) comm FROM emp;

다음은 매니저가 없는, 즉 최고 직급의 사원인 경우 'No Manage'라고 출력하도록 하는 문장이다.
Select NVL(mgr, 'No Manager') FROM emp;
에러가 난다! mgr이 숫자형이기 때문에 문자열을 넣기때문에 오류가 난다.


Alias - 열에 이름을 임의로 정해준다.


alias는 SELECT 절에 expression을 사용할 때 유용하다.

column명이나 expression 바로 뒤에 명시하거나 column명과  alias사이에 AS를 끼워 넣어 사용한다.

Double Quotation("  ")을 사용하여 alias내에 공백이나 특수문자를 포함할 수 있다.

SQL> SELECT sal*12 Annual_Salary FROM emp;
SQL> SELECT sal*12 Annual Salary FROM emp; (* Error 발생) 띄어쓰기
SQL> SELECT sal*12 "Annual Salary" FROM emp;
SQL> SELECT sal*12 AS "Annual Salary" FROM emp;



연결연산자(||)

문자열들을 연결하여 하나의 결과 문자열을 만들어 낸다.
문자열에 NULL을 연결시키면 원래의 문자열이 그대로 된다.

SQL> SELECT empno||ename||hiredate FROM emp;
(* number나 date 값은 default 형태의 character 값으로 자동 변환된 후 연결된다.)


Literals

Literal은 상수 값을 의미한다.
Character literal은 작은 따옴표로 묶어서, Number literal은 따옴표 없이 그냥 써서 표현한다.
Character literal을 작은 따옴표로 묶어 주어야 Oracle server가 keyword나 object 이름과 구별 할 수 있다.

SQL> SELECT ename|| ' ' || sal FROM emp;
SQL> SELECT ename || ' is working as a ' || job FROM emp;

literal이나 literal들의 연산결과를 출력해 볼 때는 sys사용자 소유의 dual이라는 dummy table(가상테이블)을 활용한다.

SQL> SELECT 'Korea Fighting' FROM dual;
SQL> SELECT 10 + 20 FROM dual;
SQL> SELECT 'Red' ||' '|| 'Devil' FROM dual;


dual table을 이용하여 server의 현재 시각이나 현재 접속중인 DB 사용자를 조회해 볼 수 있다.
SQL> SELECT sysdate, user FROM dual;


ALL | DISTINCT

ALL이 default로 조회된 결과를 모두 return 해준다.
SELECT job FROM emp; (ALL은 안써도 Default로 되어있다.)

DISTINCT는 조회 결과 중 중복된 row들은 하나의 결과만 return하도록 해준다. 
SELECT DISTINCT job FROM emp;



CASE - IF-THEN-ELSE와 비슷한 logic을 제공한다.


select ename, sal, deptno, (case deptno
when 10 then sal *1.1
when 20 then sal *1.2
else sal*10 end) result
from emp

deptno가 10이면 sal * 1.1 20이면 .......case 문을 result로 alias 하였다.

'프로그래밍 기초 > 오라클' 카테고리의 다른 글

Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
SQL문 정리  (0) 2010.02.22
Database System  (0) 2010.02.22
Posted by 아몰라
NUMBER(l,d) -일반적인 숫자 데이터를 저장한다. l는 저장할 수 있는 최대 자릿수이고, d는 소수점 이하 자리 수를 가리킨다.

CHAR(size) - size에서 지정하는 만큼, 2000byte까지 고정 길이 문자열 데이터를 저장한다.

VARCHAR2(size) - size에서 지정하는 만큼, 4000byte까지 가변 문자열 데이터를 저장한다.

DATE - BC 4712년 1월 1일부터 AD 4712년 12월 31일까지의 날짜를 저장한다.

LONG - 2GB의 문자까지 문자열 데이터를 저장할 수 있다.

BLOB - 이진(Binary) LOB 데이터 타입으로서 이진 데이터를 4GB까지 저장한다.

CLOB - 문자 LOB 데이터 타입으로 4GB의 문자열을 저장한다.

BFILE - Read-Only 이진(Binary)데이터를 저장하는 이진(Binary)파일 타입으로, 데이터베이스 외부에 저장된다.




CREATE TABLE -
데이터를 저장하고 검색하기 전에 선행 되어야 할 일이 데이터베이스 개체의 구축이다. 이 구문으로 테이블을 생성한다.

desc 문으로 생성된 테이블의 정의와 구조를 확인해 보았다.


INSERT - 위에서 생성한 테이블에 데이터를 넣을때 쓰인다.



이렇게 생성되었다. 여기서 select 문으로 확인해 보겠다.

잘 등록이 되었다.

이번에는 여러개를 등록해보고 s_class 에는 값을 안쓰고 등록해보자.


값의 수가 충분하지 않다고 나온다.

이럴때는 아래 처럼 하면 되는데 대신 처음에 생성할때 NOT NULL로 데이터형을 지정을 했는지 안했는지가 중요하다.
NOT NULL로 했다면 당연히 값을 안넣으면 삽입되지 않는다.



SELECT - 기존에 생성한 테이블의 데이터를 검색하는 SQL문으로서 가장 많이 쓰인다.
필수부분과 선택부분으로 나뉜다.

필수부분

SELECT : 무엇을 보고 싶은지를 (테이블의 컬럼 이름) 명시한다.
FROM : 보고 싶은 데이터를 어디로부터 얻을 걷인지를 (하나 또는 둘 이상의 테이블 이름) 명시 한다.

선택부분

WHERE : 검색할 데이터의 검색 조건을 지정한다.
ORDER BY : 검색결과 반환되는 행의 정렬을 위해 사용된다.



여태 만든 테이블을 전체검색과 부분검색으로 검색하였다.

아래와 같이 조건을 걸어서 검색 할 수 있다.


s_no 가 3이상이거나 s_class가 2보다 작을시 student테이블에 있는 데이터들을 s_no를 기준으로 오름차순정렬하여
보여준다.



UPDATE- 테이블 안의 데이터를 수정할때 사용한다.



s_name이 성훈인 행의 s_no 를 3으로 바꿔준다.
s_name을 기준으로 오름차순으로  정렬하여서 바뀐 데이터를 확인해보았다.


DELETE - 사용하지 않는 데이터를 삭제한다.

s_no 이 1인 데이터를 삭제한다.


ALTER TABLE - 기존의 테이블의 정의와 구조를 수정한다.

처음에 오류가 나는 이유는 NOT NULL로 바꿀려는데 기존의 값중에 NULL인 값이 있기 때문에 오류가 난것이다.
그러므로 ALTER하려는 구조가 기존의 데이터와 일치하지않으면 사용할 수 없다는 것이다.
즉, 기존에 존재하는 데이터는 보호된다!


아래를 보면 바뀌었다.


DROP - 기존의 테이블을 삭제한다.


'프로그래밍 기초 > 오라클' 카테고리의 다른 글

Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
Database System  (0) 2010.02.22
Posted by 아몰라

Database의 정의

어느 한 조직의 여러 응용 시스템들이 공용할 수 있도록 통합, 저장된 운영 data의 집합


Database의 특징

실시간 접근성 (Read-time accessiblility)  : 사용자의 요구에 대한 즉각적인 응답
계속적인 변화(Continuous evolution) : 삽입, 삭제, 갱신 작업이 수시로 발생
동시 공용(Concureent sharing) : 여러 사용자가 동시에 자기가 원하는 data에 접근 가능
내용에 의한 참조(Content reference) : 물리적 주소가 아닌 data에 대한 참조

DBMS의 정의

사용자와 Database 사이에 위치하여 사용자의 요구에 따라 Database를 조작하고 제어하는 기능을 제공하는 소프트웨어

DBMS의 장점

  • data의 독립성 및 중복 최소화
  • 응용 프로그램의 개발 시간 단축
  • data의 무결성과 보안 보장
  • 표준화되고 일관된 data 관리 기능
  • data 동시 사용가능
  • data 회복 가능
DBMS의 단점

  • 시스템 자원 요구로 운영비 증대
  • 고급 프로그래밍 필요로 자료 처리의 복잡화
  • 장애 발생 대비를 위한 복잡한 Back up과 Recovery 작업 필요




DBMS의 기능

정의 기능 : Database의 논리적, 물리적 구조를 정의할 수 있는 기능
조작 기능 : 사용자가 Database 내의 data를 조작할 수 있도록 하기 위한 기능
제어 기능 : Database가 항상 정확하고 올바른 data를 유지하도록 하기 위한 기능



Data Language

Database를 정의, 조작, 제어하기 위하여 사용자와 Database 시스템 간에 사용하는 통신 수단으로 SQL이 하나의 예이다.

- data 정의어(DDL)
- data 조작어(DML)
- data 제어어(DCL)


DBA의 역할

- Database 설계와 운영 : Database 구성 요소 결정, schema 정의, 저장 구조와 접근 방법 설정, 보안 및 권한 부여 정책 결정, 백업, 회복 절차 수립 등의 작업 수행
- 행정 및 불평 해결 : 사용자의 요구를 받아 분석하고 불만을 해소
- 시스템 감시 및 서능 분석 : 시스템 이용도, 병목 현상, 이용 패턴, data 사용 추세, 각종 통계 등의 분석 작업 수행

DB Machine

- Database 시스템의 성능을 향상시키기 위해 사용하는 후위 컴퓨터
- 대용량의 data에 대한 빠른 처리를 위해 사용됨




스키마(Schema)

- Database의 논리적 정의


3단계 스키마

External 스키마 - 각 사용자의 입장에서 본 Database의 구조
                    - 사용자마다 서로 다른 Database 스키마를 가짐
                    - 개념 스키마에 대한 서브 스키마

Conceptual 스키마 - 조직 전체의 입장에서 본 Database의 구조
                        - 한 개의 스키마만 존재하며, 서로 다른 사용자가 공유
                        - data 객체(개체, 관계), 제약조건에 대한 명세를 유지

Physical 스키마 - 저장 장치의 입장에서 본 Database 구조
                     - 각 data 객체의 저장 구조를 표현함
                     - 내부 레코드의 형식
                     - 인덱스의 유무
                     - 저장 data 항목의 표현 방법


출처 - 선문비트









'프로그래밍 기초 > 오라클' 카테고리의 다른 글

Advanced Query  (0) 2010.02.25
Single-Row Functions  (0) 2010.02.24
기본쿼리2  (0) 2010.02.24
기본쿼리  (1) 2010.02.23
SQL문 정리  (0) 2010.02.22
Posted by 아몰라


#pragma는 단순히 define나 include와 같이 #으로 시작되는 전처리문의 하나입니다.

대단한 용법은 아닙니다.

다만 편의성과 기능성을 제공해 주죠.

현재 자신이 사용하고 있는 컴파일러가 이녀석을 지원해 준다면

이전글에서 헤더파일 중복문제 해결을 위한 방법보다 좋은 성과를 보여줄 겁니다.

이전글의 내용이 생각나지 않는 분을 위해 이곳에 이전글의 핵심 내용을 간단히 보여 드리죠.

 

// 헤더 파일의 제일 첫 부분
01: #ifndef HDR_H     // 헤더 파일명을 대문자한 매크로가 정의되어 있지 않으면
02: #define HDR_H    
// 헤더 파일명 매크로를 정의한다

......                // 헤더 파일 본 내용이 여기 들어갑니다

03: #endif            // ifndef HDR_H 에 매치됩니다

 

위와 같이 헤더 파일을 작성하게 되면 다음과 같은 과정이 일어나게 됩니다.

컴파일러와 역지사지해서 생각해 보겠습니다.

1. 처음으로 헤더 파일이 포함될 때, 컴파일러(좀 더 정확히 말하면 프리프로세서)가

01 라인을 만나게 되면 HDR_H 매크로가 정의되어 있지 않으므로 02 라인을 해석하게 됩니다.
2. 02 라인을 만나면 이제 HDR_H 매크로를 정의하게 됩니다.
3. 다음에 다시 같은 헤더 파일이 포함될 때는 HDR_H이 정의되어 있기 때문에

모든 헤더 파일의 내용을 스킵하게 됩니다. 즉, 포함되지 않는 효과가 생기게 됩니다.

 

이러한 방법을 include guard (포함 보호)라고 합니다.

이 방법도 무척 훌륭한 방법입니다.

다만 사용자 입장에서 실수할 여지가 많다는 겁니다.

매크로 이름의 충돌가능성등 말이죠.

물론 어지간한 프로젝트에서는 이런 일은 발생하기 어려울 겁니다 ^^a...

그리고 include guard는 한번 읽은 헤더파일도 일단 헤더파일의 내용을 다 읽어야 합니다.

시간낭비고 컴파일러 컴력 낭비(ㅡㅡ;) 이고 효율낭비이죠.

 

pragma는 이러한 면에서 확실히 뛰어납니다.

이녀석의 경우는 각 파일별로 프리프로세서가 include한 상태를 기억하고 있어서

한번만 include한다면 이후로 다시 읽어야하는 지루한 일은 안한다는 겁니다.

 

오~ pragma녀석... 무척좋군~

하시는 분도 있을겁니다.

하지만 안타깝게도 이녀석은 표준이 아닙니다.

즉, 이녀석을 사용하여 프로그램을 짠다면 다른 어떠한 환경에서는

이녀석을 지원해주지않는일을 보게 될 겁니다.

그 외에도 문제가 있지만 가장 큰 문제는 표준이 아니라는 점이죠.

 

그럼 이제 슬슬 고민이 되겠죠?

도대체 어떤놈을 써란말이야~~!!

결론은 이겁니다. 내부 포함보호와 외부 포함보호를 적절히 활용하라.

이전에 헤더파일 중복 문제해결방법은 내부 포함보호방법이었죠.

 

#ifndef HDR_H
#include "hdr1.h"
#endif

 

요런방법이 외부 포함 보호방법입니다.

이 방법을 사용하면 include guard의 문제점인 컴파일 속도측면에서의

비효율성 문제를 극복할 수 있습니다.

 

기억하세요.

손쉽고 편한 pragma 를 사용하여 이식성을 한껏 낮추는 것 보다는

내부 - 외부 포함 보호 방법을 적절히 활용하여 헤더파일 중복을 막는것이

더 올바른 자세란 것을요.


출처 - http://blog.naver.com/khercules

'프로그래밍 기초 > C' 카테고리의 다른 글

extern  (0) 2010.02.21
Posted by 아몰라
2010. 2. 21. 02:32
 

프로그램이 만들어지는 과정에는

전처리기 - 컴파일 - 링킹 - 실행파일생성 이런 단계로 이루어져있다.


전처리기
는 앞에 #이 붙은 것들을 처리하는데

특정 함수나 변수가 있는 라이브러리들을 끌어올때 사용한다.


컴파일
은 라이브러리를 참고해서 각각 특정언어로 작성된 코드들을

기계어코드인 오브젝트파일로 바꾸어준다.

extern 키워드는 선언한 변수나 함수가 현재 파일에는 없고 다른곳에 정의된

것이라는 것을 컴파일러에 알려주는 목적으로 사용된다.


마지막으로 링킹과정은 생성된 오브젝트들을 연결을 시켜서 하나의

실행파일로 만드는 과정이다.


컴파일 과정에서 에러가 나지 않았지만 링킹과정에서 에러가 발생하는 경우가 많이 있는데

그것을 컴파일때에 함수 정의나 변수가 없더라도 다른곳에서 선언되었다고 컴파일러가 묵시적으로 이해를 하는데,

링킹과정에서 그 함수, 변수를 못찾아서 에러가 발생하는 경우이다.
(extern으로 .h파일에 변수를 명시적 선언했지만 c파일에서 실질적으로 선언하지 않은경우)

 

extern 으로 선언된 변수는 컴파일러에게 요 변수가 다른곳에서 정의되어 있다는 것을 알려준다.

컴파일 타이밍에 메모리에 잡히지 않고  단지 컴파일러에게 이러한 변수가 있으니 현재 파일을 컴파일 할때 에러를 보내지 말라고 알려주는역할을 한다.

'프로그래밍 기초 > C' 카테고리의 다른 글

헤더파일중복문제  (0) 2010.02.21
Posted by 아몰라
이전버튼 1 2 3 4 5 6 이전버튼