'SQL'에 해당되는 글 2건

  1. 2010.02.24 기본쿼리2
  2. 2010.02.23 기본쿼리 1

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 아몰라
이전버튼 1 이전버튼