테이블 생성과 삭제

CREATE TABLE 테이블 (
컬럼 데이터_타입 [DEFAULT default값] [컬럼 레벨 제약조건],
컬럼 데이터_타입 [DEFAULT default값] [컬럼 레벨 제약조건],
......
[테이블 레벨 제약조건],
.....
);

 

- 데이터_타입
  : 컬럼에 입력될 데이터의 종류와 크기를 결정한다.
- DEFAULT
  : 입력이 누락됐을 때 기본 입력 값을 정의한다.
  : Default 값을 지정하지 않으면 널 값이 저장된다.
- 컬럼 레벨 제약 조건
  : PK, FK, UK, CHECK, NOT NULL등을 지정한다.
- 테이블 레벨 제약 조건
  : PK, FK, UK, CHECK만 지정한다.
  : NOT NULL은 정의할 수 없다.

 

DROP TABLE 테이블
[CASCADE CONSTRAINT];

PURGE RECYCLEBIN;  //휴지통 비우기

SELECT table_name
FROM user_tables;  //내가 소유하고 있는 table만 보고 싶을 경우

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
[WHERE table_name = '테이블'];  //'테이블' 여기서 따옴표 안 테이블 명은 무조건 대문자로 적기!

 

▶ 테이블 생성에서 이름 규칙
- 문자로 시작한다.
- 30자 이내로 한다.
- 영문, 숫자, _, $, #만을 사용한다.
  (한글 사용은 가능하지만 되도록 사용하지 않는 것이 좋다.)
- 테이블의 이름은 동일한 유저(스키마) 안에서 유일해야 한다.
- 예약어는 사용이 불가능하다.
- 대소문자를 구별하지 않는다.

  (생성할 때 사용한 문자와는 관계없이 모든 이름은 대문자로 정의된다.)
  (테이블 이름은 딕셔너리에 저장되는데, 모두 대문자로 저장된다.)

  (따옴표 안에 있는 대소문자는 구별한다.)


▶ 데이터 타입
- 오라클은 다양한 데이터 타입을 제공한다. 다음은 그 중 많이 사용되는 데이터 타입들이다.
- 문자 타입
  : VARCHAR2, CHAR, LONG, CLOB  (CHAR 타입은 안 써도 된다.)
- 숫자 타입
  : NUMBER
- 날짜 타입
  : DATE
- 이진 타입
  : RAW, LONG RAW, BLOB, BFILE
- ROWID 타입
  : ROWID

 

ROWID : 행이 저장되어 있는 물리적인 위치

SELECT ROWID, eno, ename FROM emp;

ROWID              ENO     ENAME
------------------ ------- ----------
AAASO6AAFAAAAIOAAA 0001    안영희
AAASO6AAFAAAAIOAAB 0201    안영숙
AAASO6AAFAAAAIOAAC 0202    손하늘
AAASO6AAFAAAAIOAAD 0301    이승철
AAASO6AAFAAAAIOAAE 0302    박선경
AAASO6AAFAAAAIOAAF 1001    문시현
AAASO6AAFAAAAIOAAG 1002    김주란

 

예제 1. 다음과 같은 구조의 테이블을 생성한다.(데이터 타입은 입력될 내용에 따라 결정한다.)
* 테이블명 : board
- 컬럼 구성 : no(게시물번호), name(작성자), sub(제목), content(내용), hdate(입력일시)

CREATE TABLE board (
no NUMBER,
name VARCHAR2(50),
sub VARCHAR2(100),
content VARCHAR2(4000),
hdate DATE DEFAULT SYSDATE
);

테이블이 생성되었습니다.


SELECT table_name FROM user_tables
WHERE table_name = 'BOARD';

TABLE_NAME
-------------
BOARD


DESC board;

 이름               널?      유형
 ---------------- -------- ----------------
 NO                           NUMBER
 NAME                         VARCHAR2(50)
 SUB                          VARCHAR2(100)
 CONTENT                      VARCHAR2(4000)
 HDATE                        DATE

COL table_name FORMAT A10
COL column_name FORMAT A10
COL data_type FORMAT A10

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'BOARD';

TABLE_NAME COLUMN_NAM DATA_TYPE  DATA_LENGTH
---------- ---------- ---------- -----------
BOARD      NO         NUMBER              22
BOARD      NAME       VARCHAR2            50
BOARD      SUB        VARCHAR2           100
BOARD      CONTENT    VARCHAR2          4000
BOARD      HDATE      DATE                 7

INSERT INTO board (no) VALUES (1);
1 개의 행이 만들어졌습니다.

COMMIT;
커밋이 완료되었습니다.

SELECT * FROM board;

        NO NAME       SUB        CONTENT    HDATE
---------- ---------- ---------- ---------- ----------
         1                                  2021/11/18

 

▶ 데이터 딕셔너리(Data Dictionary)
데이터 딕셔너리는 데이터베이스의 상태나 내부 운영과 관련된 정보를 저장해주는 테이블이다.


▶ 딕셔너리 이름의 접두어
- DBA_ : 관리자만 검색 가능한 딕셔너리에 붙는 접두어
   (DBA_TABLES, DBA_INDEXES, DBA_TABLESPACES, DBA_DATA_FILES ...)
- ALL_ : 일반 사용자가 검색 가능한 딕셔너리, 접근 가능한 개체에 대한 정보를 담고 있다.
   (ALL_TABLES, ALL_CONSTRAINTS, ALL_INDEXES, ALL_VIEWS, ...)
- USER_ : 일반 사용자가 검색 가능한 딕셔너리, 소유하고 있는 개체에 대한 정보를 담고 있다.
   (USER_TABLES, USER_CONSTRAINTS, USER_INDEXES, USER_VIEWS, ...)

 

 

예제 2. 테이블을 생성하고 데이터를 입력 확인한다.

SQL> CREATE TABLE t1 (no NUMBER(4,2));
테이블이 생성되었습니다.

SQL> INSERT INTO t1 VALUES (12.12);
1 개의 행이 만들어졌습니다.

SQL> INSERT INTO t1 VALUES (1.789);
1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM t1;

NO
----------
12.12
1.79

SQL> INSERT INTO t1 VALUES (123.1);
INSERT INTO t1 VALUES (123.1)
*
1행에 오류:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.

SQL> CREATE TABLE t2 (name VARCHAR2(3));
테이블이 생성되었습니다.

SQL> INSERT INTO t2 VALUES ('AAA');
1 개의 행이 만들어졌습니다.

SQL> INSERT INTO t2 VALUES ('장강');
INSERT INTO t2 VALUES ('장강')
*
1행에 오류:
ORA-12899: "ST"."T2"."NAME" 열에 대한 값이 너무 큼

SQL> INSERT INTO t2 VALUES ('장');
1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM t2;

NAME
----
AAA
장

 

예제 3. 다음 예제를 통해 CHAR와 VARCHAR2의 차이를 이해해 보자

SQL> CREATE TABLE comp(
  2  co1 CHAR(4),
  3  co2 VARCHAR2(4)
  4  );

테이블이 생성되었습니다.

SQL> INSERT INTO comp VALUES ('AA','AA');

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO comp VALUES ('AAAA','AAAA');

1 개의 행이 만들어졌습니다.

SQL> SELECT LENGTHB(co1), LENGTHB(co2) FROM comp;

LENGTHB(CO1) LENGTHB(CO2)
------------ ------------
           4            2
           4            4

SQL> SELECT * FROM comp;

CO1      CO2
-------- --------
AA       AA
AAAA     AAAA

SQL> SELECT * FROM comp WHERE co1='AA';

CO1      CO2
-------- --------
AA       AA

SQL> SELECT * FROM comp WHERE co2='AA';

CO1      CO2
-------- --------
AA       AA

SQL> SELECT * FROM comp WHERE co1=co2;

CO1      CO2
-------- --------
AAAA     AAAA

 

예제 4. 다음 실습을 통해 DATE 타입에 대해서 이해해 보자

CREATE TABLE hd (
 no NUMBER,
 hdate DATE
);

테이블이 생성되었습니다.

SQL> INSERT INTO hd VALUES (1, sysdate);

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM hd;

        NO HDATE
---------- ----------
         1 2021/11/19

SQL> SELECT * FROM hd WHERE hdate = '2021/11/19';

선택된 레코드가 없습니다.

SQL> SELECT no, TO_CHAR(hdate,'YYYY/MM/DD:HH24:MI:SS') FROM hd;

        NO TO_CHAR(HDATE,'YYYY/MM/DD:HH24:MI:SS')
---------- --------------------------------------
         1 2021/11/19:13:21:42
         
SQL> SELECT * FROM hd
  2  WHERE hdate BETWEEN '2021/11/19' AND '2021/11/20';

        NO HDATE
---------- ----------
         1 2021/11/19

SQL> SELECT * FROM hd
  2  WHERE TRUNC(hdate) = '2021/11/19';

        NO HDATE
---------- ----------
         1 2021/11/19
         
SQL> SELECT * FROM hd
  2  WHERE hdate like '2021/11/19%';  // 답은 나오지만 사용하지 말기

        NO HDATE
---------- ----------
         1 2021/11/19

 

테이블 생성시 아래와 같이 만든다.

예제 5. 다음에 제시된 테이블을 생성한다. 테이블명이나 컬럼의 이름, 컬럼의 길이는 임의로 정한다.
- 테이블명 : 고객
- 컬럼 : 고객관리번호, 고객명, 주소, 전화
* C:\Users\st04\sql\client.sql 파일 생성

client.sql

DROP TABLE client;

PURGE RECYCLEBIN;

CREATE TABLE client(
  cnum NUMBER,
  cname VARCHAR2(50),
  addr VARCHAR2(200),
  tel VARCHAR2(20)
);

 

@C:\Users\st04\sql\client

SQL> @client
DROP TABLE client
           *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다



휴지통이 지워졌습니다.


테이블이 생성되었습니다.

 

실습

1. 예제를 통해 만들어진 테이블을 확인하고 모두 삭제한다.

SQL> DESC client;
 
이름                        널?      유형
-------------------------- -------- -------------------------
CNUM                                 NUMBER
CNAME                                VARCHAR2(50)
ADDR                                 VARCHAR2(200)
TEL                                  VARCHAR2(20)
 
SQL> DROP TABLE client;
테이블이 삭제되었습니다.

SQL> DESC client;
ERROR:
ORA-04043: client 객체는 존재하지 않습니다.


2. 다음 구조와 같은 테이블을 생성하는 스크립트를 작성하고 실행해본다.
- 테이블명이나 컬럼명, 데이터 타입 등은 입력될 데이터의 성격에 따라 임의로 정할 수 있다.

dept.sql

DROP TABLE dept;

PURGE RECYCLEBIN;

CREATE TABLE dept (
    dno VARCHAR2(2),
    dname VARCHAR2(15),
    loc VARCHAR2(9)
);

SQL> @dept

테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SQL> SELECT table_name, column_name, data_type, data_length
  2  FROM user_tab_columns
  3  WHERE table_name='DEPT';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
DEPT    DNO     VARCHAR2             2
DEPT    DNAME   VARCHAR2            15
DEPT    LOC     VARCHAR2             9

emp.sql

DROP TABLE emp;

PURGE RECYCLEBIN;

CREATE TABLE emp (
    eno VARCHAR2(4),
    ename VARCHAR2(15),
    sex VARCHAR2(4),
    job VARCHAR2(12),
    mgr VARCHAR2(4),
    hdate DATE,
    sal NUMBER,
    comm NUMBER,
    dno VARCHAR2(2)
);

SQL> @emp

테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name='emp'; //대문자로 작성 필수!!
선택된 레코드가 없습니다.

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name='EMP';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
EMP     ENO     VARCHAR2             4
EMP     ENAME   VARCHAR2            15
EMP     SEX     VARCHAR2             4
EMP     JOB     VARCHAR2            12
EMP     MGR     VARCHAR2             4
EMP     HDATE   DATE                 7
EMP     SAL     NUMBER              22
EMP     COMM    NUMBER              22
EMP     DNO     VARCHAR2             2

salgrade.sql

DROP TABLE salgrade;

PURGE RECYCLEBIN;

CREATE TABLE salgrade (
    salgrade NUMBER,
    losal NUMBER,
    hisal NUMBER
);

SQL> @salgrade

테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name='DEPT';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
DEPT    DNO     VARCHAR2             2
DEPT    DNAME   VARCHAR2            15
DEPT    LOC     VARCHAR2             9

 

3. 다음 표에 제시한 테이블을 생성한다.

student.sql

DROP TABLE student;

PURGE RECYCLEBIN;

CREATE TABLE student (
    sno VARCHAR2(10),
    sname VARCHAR2(15),
    sex VARCHAR2(4),
    syear NUMBER,
    major VARCHAR2(15),
    avr NUMBER
);
SQL> @student
테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SQL> SELECT table_name, column_name, data_type, data_length
  2  FROM user_tab_columns
  3  WHERE table_name='STUDENT';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
STUDENT SNO     VARCHAR2            10
STUDENT SNAME   VARCHAR2            15
STUDENT SEX     VARCHAR2             4
STUDENT SYEAR   NUMBER              22
STUDENT MAJOR   VARCHAR2            15
STUDENT AVR     NUMBER              22

professor.sql

DROP TABLE professor;

PURGE RECYCLEBIN;

CREATE TABLE professor (
    pno VARCHAR2(10),
    pname VARCHAR2(15),
    section VARCHAR2(15),
    orders VARCHAR2(15),
    hiredate DATE
);

SQL> @professor
테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SQL> SELECT table_name, column_name, data_type, data_length
  2  FROM user_tab_columns
  3  WHERE table_name='PROFESSOR';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
PROFESS PNO     VARCHAR2            10
OR
PROFESS PNAME   VARCHAR2            15
OR
PROFESS SECTION VARCHAR2            15
OR
PROFESS ORDERS  VARCHAR2            15
OR
PROFESS HIREDAT DATE                 7
OR      E

course.sql

DROP TABLE course;

PURGE RECYCLEBIN;

CREATE TABLE course (
    cno VARCHAR2(10),
    cname VARCHAR2(15),
    st_num NUMBER,
    pno VARCHAR2(10)
);

SQL> @course
테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SQL> SELECT table_name, column_name, data_type, data_length
  2  FROM user_tab_columns
  3  WHERE table_name='COURSE';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
COURSE  CNO     VARCHAR2            10
COURSE  CNAME   VARCHAR2            15
COURSE  ST_NUM  NUMBER              22
COURSE  PNO     VARCHAR2            10

score.sql

DROP TABLE score;

PURGE RECYCLEBIN;

CREATE TABLE score (
    sno VARCHAR2(10),
    cno VARCHAR2(10),
    result NUMBER
);

SQL> @score
테이블이 삭제되었습니다.

휴지통이 지워졌습니다.

테이블이 생성되었습니다.

SQL> SELECT table_name, column_name, data_type, data_length
  2  FROM user_tab_columns
  3  WHERE table_name='SCORE';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
SCORE   SNO     VARCHAR2            10
SCORE   CNO     VARCHAR2            10
SCORE   RESULT  NUMBER              22

 

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name='emp';
선택된 레코드가 없습니다.

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name='EMP';

TABLE_N COLUMN_ DATA_TYPE  DATA_LENGTH
------- ------- ---------- -----------
EMP     ENO     VARCHAR2             4
EMP     ENAME   VARCHAR2            15
EMP     SEX     VARCHAR2             4
EMP     JOB     VARCHAR2            12
EMP     MGR     VARCHAR2             4
EMP     HDATE   DATE                 7
EMP     SAL     NUMBER              22
EMP     COMM    NUMBER              22
EMP     DNO     VARCHAR2             2

 

▶ 그룹 함수

 

* 그룹 함수를 사용하는 경우 고려 사항
- NULL값은 무시된다.
- 반드시 단 하나의 값만을 반환한다.
- GROUP BY 설정 없이 일반 컬럼과 기술될 수 없다.

 

예제 1. 사원의 급여 평균을 검색한다.

SELECT AVG(sal) 평균급여, ROUND(AVG(sal)) 평균급여
FROM emp;

  평균급여   평균급여
---------- ----------
3167.57143       3168

 

예제 2. 사원들에게 지급된 보너스 총합과 보너스 평균을 검색한다.

SELECT SUM(comm) 총액,
ROUND(AVG(comm)) 평균, COUNT(comm) 수령인원,
ROUND(AVG(NVL(comm,0))) 환산평균, COUNT(*) 전체인원
FROM emp;

      총액       평균   수령인원   환산평균   전체인원
---------- ---------- ---------- ---------- ----------
     14780        869         17        704         21
     
     
SELECT COUNT(*) FROM emp
WHERE comm IS NOT NULL;

  COUNT(*)
----------
        17

null 값은 무시가 되기 때문에 위 방식은 문제가 발생한다. 

 

예제 3. 10번 부서원들보다 급여가 높은 사원을 검색한다.

SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal > (SELECT MAX(sal) // 추천!!!
FROM emp
WHERE dno = '10');

SELECT eno 사번, ename 이름, dno 부서번호
FROM emp
WHERE sal > ALL(SELECT sal
FROM emp
WHERE dno = '10');

사번    이름       부서번호
------- ---------- ---------
0001    안영희     01

보통은 위의 두 방식 중 첫번째 방식처럼 사용한다. 단일행 서브쿼리로 사용한다.

 

▶ 그룹 함수와 GROUP BY절

SELECT [DISTINCT/ALL] 컬럼 or 그룹함수, ...
FROM 테이블
WHERE 조건
GROUP BY Group대상
ORDER BY 정렬대상 [ASC/DESC]

- 통계정보를 출력할 경우 같은 정보를 가진 사람끼리 통계정보를 출력하기 위해 GROUP BY 절을 사용한다.

- GROUP BY 절에 있는 컬럼 명을 SELECT절 일반컬럼에 꼭 넣어준다.

- 카디널리티: 값의 종류 (ex. 성별은 카디널리티 낮음, 이름은 카디널리티 높음)

 

예제 4. 업무별 평균 급여, 평균 연봉과 부서별 평균 연봉을 검색한다.

SELECT job 업무, ROUND(AVG(sal)) 평균_급여,
ROUND(AVG(sal*12+NVL(comm,0))) 평균_연봉
FROM emp
GROUP BY job;

업무     평균_급여  평균_연봉
------- ---------- ----------
분석          2900      35500
지원          3803      47467
개발          2782      34282
모델링        4300      51883
경영          4800      57600
회계          2380      28790

 

SELECT d.dno 부서번호, dname 부서명,
ROUND(AVG(sal*12+NVL(comm,0))) 평균_연봉
FROM dept d, emp e
WHERE d.dno = e.dno
GROUP BY d.dno, dname
ORDER BY d.dno;

부서번호  부서명   평균_연봉
--------- ------- ----------
01        총무         49833
02        회계         27990
10        ERP          42664
20        ISP          38768
30        ITEA         43323
40        CRM          25200

dno만 그룹바이 해도 되지만 dname를 한 이유는 select절의 일반컬럼에 dno, dname 둘다 있기 때문에 dname도 그룹바이절에 적어준다.

 

예제 5. 부서별로 급여 평균의 최대 값과 최소 값을 검색한다.

SELECT dno 부서번호,
MAX(AVG(sal)) 최대평균, MIN(AVG(sal)) 최소평균
FROM emp
GROUP BY dno;
SELECT dno 부서번호,
       *
1행에 오류:
ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

SELECT MAX(AVG(sal)), MIN(AVG(sal))
FROM emp
GROUP BY dno;

MAX(AVG(SAL)) MIN(AVG(SAL))
------------- -------------
         4070          2100

dno로 그룹바이해도 select 절에 컬럼이 하나씩밖에 안나오는 그룹함수를 적었기 때문에 select 절에 dno를 뺀다.

 

예제 6. 그룹 대상 컬럼과 그룹 함수를 이용한 검색 결과 확인

SELECT dno 부서번호, COUNT(*) 인원수
FROM emp
WHERE job != '개발'
GROUP BY dno, job;

부서번호      인원수
--------- ----------
10                 1
02                 1
20                 1
20                 1
01                 1
01                 2
02                 4

부서번호      인원수
--------- ----------
10                 1
30                 1
10                 2
20                 1

 

예제 7. 각 부서별 최소 급여를 받는 사원의 정보를 검색한다.

SELECT d.dno, dname, eno, ename, sal
FROM emp e, dept d
WHERE d.dno=e.dno
AND (d.dno, sal) IN (SELECT dno, MIN(sal)
FROM emp
GROUP BY dno)
ORDER BY d.dno;

DNO     DNAME   ENO     ENAME             SAL
------- ------- ------- ---------- ----------
01      총무    0202    손하늘           3510
02      회계    0309    김선유            900
10      ERP     0269    권나현           2600
20      ISP     2002    제갈민           1520
30      ITEA    2007    이초록           1989
40      CRM     2008    윤고은           2100

 

실습
1. 각 학과별 학생 수를 검색한다.

SELECT major 학과, COUNT(sno)
FROM student
GROUP BY major;

학과    COUNT(SNO)
------- ----------
화학            17
유공            18
생물            17
식영            19
물리            16


2. 화학과와 생물학과 학생 4.5 환산 평점의 평균을 각각 검색한다.

SELECT major 학과, TO_CHAR(AVG(avr*4.5/4), '90.99') "4.5 환산평균"
FROM student
WHERE major IN ('화학', '생물')
GROUP BY major;

학과    4.5 환산평균
------- ------------
화학      2.45
생물      2.76


3. 부임일이 10년 이상 된 직급별(정교수, 조교수, 부교수) 교수의 수를 검색한다. ♠♠♠

SELECT orders 직위, COUNT(orders) "부임일이 10년 이상 교수 수"
FROM professor
WHERE (TO_CHAR(sysdate, 'YYYY')-TO_CHAR(hiredate, 'YYYY')+1)>=10
GROUP BY orders;

직위    부임일이 10년 이상 교수 수
------- --------------------------
조교수                           7
정교수                           8
부교수                           9


4. 과목명에 화학이 포함된 과목의 학점수 총합을 검색한다.

SELECT cname 과목이름, SUM(st_num) 학점수총합
FROM course
WHERE cname LIKE '%화학%'
GROUP BY cname;

과목이름     학점수총합
------------ ----------
무기화학              2
환경화학              2
일반화학실험          2
일반화학              3
핵화학                3
식품화학              3
유기화학              3


5. 화학과 학생들의 기말고사 성적을 성적순으로 검색한다. //같은 사람이 여러번 나오는데... 어떻게 하징... 평균내야하나...

SELECT major 학과, s.sno 학번, sname 이름, TO_CHAR(AVG(result), 90.99) 기말고사평균성적
FROM student s, score r, course c
WHERE major = '화학'
AND s.sno=r.sno AND r.cno=c.cno
GROUP BY major, s.sno, sname
ORDER BY TO_CHAR(AVG(result), 90.99) DESC;

학과    학번    이름       기말고사평균
------- ------- ---------- ------------
화학    915301  정동상      73.30
화학    925306  김재백      73.15
화학    905302  정욱상      72.85
화학    925305  황현정      72.63
화학    945303  남궁경아    70.86
화학    945314  이철윤      70.59
화학    915304  권보수      69.50


6. 학과별 기말고사 평균을 성적순으로 검색한다.

SELECT major 학과, TO_CHAR(AVG(result), 90.99) 기말고사평균
FROM student s, score r, course c
WHERE s.sno=r.sno AND r.cno=c.cno
GROUP BY major
ORDER BY TO_CHAR(AVG(result), 90.99) DESC;

학과    기말고사평균
------- ------------
식영     69.99
유공     69.56
화학     69.44
물리     68.92
생물     67.93


7. 30번 부서의 업무별 연봉의 평균을 검색한다.
(단 출력 양식은 소수이하 두 자리까지 통일된 형식으로 출력한다.)

SELECT dno 부서번호, job 업무,  TO_CHAR(AVG(sal*12+NVL(comm,0))) 평균연봉
FROM emp
WHERE dno = 30
GROUP BY dno, job;

부서번호  업무    평균연봉
--------- ------- -----------
30        모델링  51600
30        개발    39184


8. 물리학과 학생 중에 학년별로 성적이 가장 우수한 학생의 평점을 검색한다.

SELECT major 학과, syear 학년, TO_CHAR(MAX(avr), 90.99) 성적
FROM student
WHERE major = '물리'
GROUP BY major, syear
ORDER BY syear;

학과          학년 성적
------- ---------- ------------
물리             1   3.20
물리             2   3.22
물리             3   4.00
물리             4   3.33


9. 학년별로 환산 평점의 평균값을 검색한다.

(단 출력 양식은 소수이하 두 자리까지 통일된 양식으로 출력한다.)

SELECT syear 학년, TO_CHAR(AVG(avr*4.5/4), 90.99) 성적
FROM student
GROUP BY syear
ORDER BY syear;

      학년 성적
---------- ------------
         1   3.13
         2   2.97
         3   3.08
         4   2.85


10. 화학과 1학년 학생 중 평점이 평균 이하인 학생을 검색한다.

SELECT major 학과, syear 학년, sno 학번, sname 이름, TO_CHAR(avr, 90.99) 성적
FROM student
WHERE major='화학' AND syear=1
AND avr <= (SELECT AVG(avr) FROM student
WHERE major='화학' AND syear=1);

학과          학년 학번    이름       성적
------- ---------- ------- ---------- ------------
화학             1 945303  남궁경아     2.36
화학             1 945314  이철윤       2.22

 

▶ 단일 행 함수에서 사용하는 날짜 출력 형식

 

▶ 단일 행 함수에서 사용하는 숫자 출력 형식

 

▶ 변환 함수

출력포멧 지정할때 TO_CHAR

날짜 형식 입력할때 TO_DATE 꼭 입력하기

 

 

예제 1. 현재 날짜를 다양한 형식으로 출력해보자

SELECT TO_CHAR(sysdate, 'YYYY/MM/DD') 날짜,
TO_CHAR(sysdate, 'YYYY/MM/DD:HH24:MI:SS') 날짜,
TO_CHAR(sysdate, 'YY/MM/DD:HH:MI:SS AM') 날짜
FROM dual;

날짜                    날짜                    날짜
----------------------- ----------------------- -----------------------
2021/11/15              2021/11/15:16:23:55     21/11/15:04:23:55 오후


SELECT TO_CHAR(sysdate, 'DD Month YYYY') ToDay FROM DUAL;

TODAY
---------------
15 11월 2021


SELECT TO_CHAR(sysdate, 'DAY Mon YY') ToDay FROM DUAL;

TODAY
---------------
월요일 11월 21


SELECT TO_CHAR(sysdate, 'DY Mon YY') ToDay FROM DUAL;

TODAY
---------------
월 11월 21


SELECT TO_CHAR(sysdate, '"오늘은 "YYYY"년 "MM"월 "DD"일 입니다."') 날짜
FROM DUAL;


날짜
-----------------------
오늘은 2021년 11월 15일
 입니다.

 

예제 2. 10번 부서 사원의 입사일을 다음의 형식으로 검색한다.
'XXX 사원의 입사일은 XXXX년 XX월 XX일입니다.'

SELECT ename||' 사원의 입사일은 '||
TO_CHAR(hdate, 'YYYY"년 "MM"월 "DD"일 입니다."') 입사일
FROM emp
WHERE dno = '10';

입사일
------------------------------------------------------
문시현 사원의 입사일은 1991년 02월 01일 입니다.
남궁연호 사원의 입사일은 1993년 12월 13일 입니다.
김선유 사원의 입사일은 1998년 10월 17일 입니다.
권나현 사원의 입사일은 2015년 05월 21일 입니다.
김진성 사원의 입사일은 2008년 03월 13일 입니다.

 

예제 3. 다양한 형식으로 숫자를 출력해 보자

SELECT TO_CHAR(12345.678, '999,999.99999') num FROM dual;

NUM
----------------------------
  12,345.67800
  
  
SELECT TO_CHAR(12345.678, '099,999.999') num FROM dual;

NUM
------------------------
 012,345.678
 
 
 SELECT TO_CHAR(12345.678, '9,9999.9') num FROM dual; //소수 이하 자리수를 부족하게 지정하면 반올림 된다.

NUM
------------------
 1,2345.7
 
 
 SELECT TO_CHAR(12345.678, '9,999.9') num FROM dual;

NUM
----------------
########


SELECT TO_CHAR(1234, '$999,999') num FROM dual;

NUM
------------------
   $1,234
   
   
SELECT TO_CHAR(1234, 'L999,999') num FROM dual;

NUM
------------------------------------
          ₩1,234
          

SELECT TO_CHAR(-1234, '999,999MI') num FROM dual;

NUM
----------------
  1,234-
  
  
SELECT TO_CHAR(123456789, '9.999EEEE') num FROM dual;

NUM
----------------------
  1.235E+08

 

예제 3. 10번 부서 사원의 보너스가 급여의 몇 퍼센트 인지 검색한다.
- 급여는 월간 급여이고 보너스는 연간 보너스이다.
- 보너스가 NULL인 경우 0으로 환원해서 검색한다.

SELECT eno 사번, ename 이름,
TO_CHAR(NVL(comm,0)/(sal*12)*100, '90.99')||'%' 급여_비율
FROM emp
WHERE dno='10';

사번    이름       급여_비율
------- ---------- --------------
1001    문시현       0.96%
2001    남궁연호     0.42%
3001    김선유       0.78%
0269    권나현       6.09%
0401    김진성       2.60%

 

예제 4. 1992년 이전에 입사한 사원의 정보를 검색해 보자

SELECT eno 사번, ename 이름, hdate 입사일
FROM emp
WHERE hdate < TO_DATE('19920101','YYYYMMDD');

사번    이름       입사일
------- ---------- ----------
0001    안영희     1991/01/01
0201    안영숙     1991/02/01
0202    손하늘     1991/12/01
0302    박선경     1991/03/02
1001    문시현     1991/02/01

 

실습

1. 학생의 평균 평점을 다음 형식에 따라 소수점 이하 두 자리까지 검색한다.
  'XXX 학생의 평균 평점은 x.xx입니다.'

SELECT sname||' 학생의 평균 평점은 '||TO_CHAR(avr, '9.99')||'입니다.' "학생들의 평균평점"
FROM student;

학생들의 평균평점
----------------------------------------------------------------------------------------------------
정동상 학생의 평균 평점은   .95입니다.
유태지 학생의 평균 평점은  3.28입니다.
정욱상 학생의 평균 평점은  1.44입니다.
정욱주 학생의 평균 평점은   .95입니다.
정남윤 학생의 평균 평점은  3.23입니다.
한현석 학생의 평균 평점은  2.45입니다.
김용서 학생의 평균 평점은  1.48입니다.


SELECT sname||' 학생의 평균 평점은 '||TO_CHAR(avr, '90.99')||'입니다.' "학생들의 평균평점" 
FROM student;
// 앞에 0 출력해주기위해

학생들의 평균평점
----------------------------------------------------------------------------------------------------
정동상 학생의 평균 평점은   0.95입니다.
유태지 학생의 평균 평점은   3.28입니다.
정욱상 학생의 평균 평점은   1.44입니다.
정욱주 학생의 평균 평점은   0.95입니다.
정남윤 학생의 평균 평점은   3.23입니다.
한현석 학생의 평균 평점은   2.45입니다.
김용서 학생의 평균 평점은   1.48입니다.


2. 교수의 부임 일을 다음 형식으로 검색한다.
  'XXX 교수의 부임일은 YYYY년 MM월 DD일입니다.'

SELECT pname||' 교수의 부임일은 '||TO_CHAR(hiredate, 'YYYY"년 "MM"월 "DD"일 입니다."') "교수 부임일"
FROM professor;

교수 부임일
----------------------------------------------------------------------------------------------------
송강 교수의 부임일은 2002년 08월 12일 입니다.
시진영 교수의 부임일은 1991년 02월 01일 입니다.
장청아 교수의 부임일은 2003년 05월 20일 입니다.
이초아 교수의 부임일은 2010년 07월 06일 입니다.
문규식 교수의 부임일은 2005년 02월 11일 입니다.
이규진 교수의 부임일은 1998년 10월 07일 입니다.
이준영 교수의 부임일은 1991년 10월 04일 입니다.


3. 교수 중에 3월에 부임한 교수의 명단을 검색한다.

SELECT pname "3월에 부임한 교수이름", hiredate 부임일
FROM professor
WHERE TO_CHAR(hiredate, 'MM')= '03';

3월에 부임한 교수이름          부임일
------------------------------ ----------
하영진                         2004/03/02


4. 화학과 1학년 학생들의 4.5 환산 평점을 다음 형식에 따라 소수점 이하 두 자리까지 검색한다.
'XXX 학생의 4.5 환산 평점은 x.xx입니다.'

SELECT major 학과, syear 학년, 
sname||' 학생의 4.5 환산 평점은 '||TO_CHAR(avr*4.5/4, '90.99')||'입니다.' "4.5 환산 평점"
FROM student
WHERE major='화학'
AND syear = 1;


학과          학년   4.5 환산 평점
------- ---------- ----------------------------------------------------
화학             1  김람석 학생의 4.5 환산 평점은   4.01입니다.
화학             1  남궁경아 학생의 4.5 환산 평점은   2.66입니다.

 

단일 행 함수의 종류
- 문자 함수
- 숫자 함수
- 날짜 함수
- 변환 함수
- 일반 함수

 

▶ 문자 함수

* 대소문자 변환 함수

 

예제 1. ERP 부서가 있는 지역을 검색한다.

SELECT loc ERP_부서_지역
FROM dept
WHERE LOWER(dname)='erp';

ERP_부서_지역
------------------
서울

 

 

예제 2. 'XX 부서는 XX에 위치합니다.' 형식으로 부서 정보를 검색한다.

SELECT INITCAP(dname) || ' 부서는 ' || loc || '에 위치합니다.' 부서_위치
FROM dept;

부서_위치
-------------------------------------
총무 부서는 서울에 위치합니다.
회계 부서는 서울에 위치합니다.
Erp 부서는 서울에 위치합니다.
Isp 부서는 부산에 위치합니다.
Itea 부서는 광주에 위치합니다.
Crm 부서는 대전에 위치합니다.
Pos 부서는 에 위치합니다.

 

* TRIM(ename) : ename 컬럼의 앞 뒤ㅣ 공백 제거

 

 

예제 3. 부서의 명과 위치를 하나의 컬럼으로 검색한다.

SELECT CONCAT(dname,' '|| loc) CONCAT
FROM dept;

CONCAT
----------------
총무 서울
회계 서울
ERP 서울
ISP 부산
ITEA 광주
CRM 대전
POS

 

예제 4. 부서명과 문자열의 길이를 출력한다.

SELECT dname, LENGTH(dname), LENGTHB(dname)
FROM dept;

DNAME   LENGTH(DNAME) LENGTHB(DNAME)
------- ------------- --------------
총무                2              6
회계                2              6
ERP                 3              3
ISP                 3              3
ITEA                4              4
CRM                 3              3
POS                 3              3

 

예제 5. substr 함수를 이용해서 컬럼에 일부 내용만을 검색한다.

SELECT ename, SUBSTR(ename,2),
SUBSTR(ename,-2),
SUBSTR(ename,1,2),
SUBSTR(ename,-2,2)
FROM emp;

ENAME      SUBSTR(ENAME,2)  SUBSTR(ENAME,-2) SUBSTR(ENAME,1,2 SUBSTR(ENAME,-2,
---------- ---------------- ---------------- ---------------- ----------------
안영희     영희               영희             안영             영희

 

예제 6. 다양한 방법으로 'a'가 나오는 위치를 출력한다.

SELECT INSTR('database','a'),
	INSTR('database','a',3),
	INSTR('database','a',1,3)
FROM dual;

INSTR('DATABASE','A') INSTR('DATABASE','A',3) INSTR('DATABASE','A',1,3)
--------------------- ----------------------- -------------------------
                    2                       4                         6

 

예제 7. TRIM 함수를 이용 다양한 방법으로 문자열을 검색한다.

SELECT TRIM('남' from '남기남'),
TRIM(leading '남' from '남기남'),
TRIM(trailing '남' from '남기남'),
TRIM(' 남기남 ')
FROM dual;

TRIM(' TRIM(LEADING TRIM(TRAILIN TRIM('남기남')
------ ------------ ------------ ------------------
기     기남         남기         남기남

 

예제 8. 이름과 급여를 각각 10 컬럼으로 검색한다.

SELECT RPAD(ename, 10, '*'), LPAD(sal, 10, '*')
FROM emp;

RPAD(ENAME,10,'*')  LPAD(SAL,10,'*')
------------------  -------------------
안영희****           안영숙****
******4800           ******3900

 

예제 9. 부서명의 마지막 글자를 제외하고 검색한다.

SELECT dname, SUBSTR(dname, 1, LENGTH(dname)-1) dname
FROM dept;

DNAME   DNAME
------- -------
총무    총
회계    회
ERP     ER
ISP     IS
ITEA    ITE
CRM     CR
POS     PO

 

 

* 문자 치환 함수

 

 

예제 10. 형식이 비슷한 TRANSLATE와 REPLACE를 동일한 치환을 통해 비교해 보자

SELECT TRANSLATE('World of Warcraft', 'Wo', '--') Translate,
REPLACE('World of Warcraft', 'Wo', '--') Replace
FROM dual;

TRANSLATE                          REPLACE
---------------------------------- ----------------------------------
--rld -f -arcraft                  --rld of Warcraft

 

실습 (모두 단일 행 함수를 이용한다.)

1. 이름이 두 글자인 학생의 이름을 검색한다.

SELECT sno 학번, sname 이름
FROM student
WHERE LENGTH(sname) = 2;

학번    이름
------- ----------
925301  김환
945604  권현
938204  최현


2. '강' 씨 성을 가진 학생의 이름을 검색한다.

SELECT sno 학번, sname 이름
FROM student
WHERE SUBSTR(sname, 1, 1) = '강';

학번    이름
------- ----------
915605  강은혜
915601  강태용
925602  강아영


3. 교수의 지위를 한글자로 검색한다.(ex. 조교수 → 조)

SELECT pno 교수번호, pname 이름, SUBSTR(orders, 1, 1) 지위
FROM professor;

교수번호  이름       지위
--------- ---------- -------
1001      송강       정
1004      시진영     부
1006      장청아     부
1007      이초아     조
1008      문규식     조
1010      이규진     정
1009      이준영     정


4. 일반 과목을 기초 과목으로 변경해서 모든 과목을 검색한다. (ex. 일반화학 → 기초화학)

SELECT cno 과목번호, REPLACE(cname, '일반', '기초') 과목이름
FROM course;

과목번호  과목이름
--------- ------------
1211      기초화학실험
1212      기초화학
1213      유기화학
1214      무기화학
1216      환경화학
1217      고분자화학
1218      생화학

과목번호  과목이름
--------- ------------
1220      기초물리
1223      자기학
1226      양자물리학
1227      이학수학
1228      위상수학
2357      유기물리학
2358      식물학


5. 만일 입력 실수로 student 테이블의 sname 컬럼에 데이터가 입력될 때 문자열 마지막에 공백이 추가 되었다면 검색할 때 이를 제외하고 검색하는 SELECT문을 작성한다.

SELECT sno 학번, TRIM(trailing FROM sname) 이름, 
LENGTH(sname) 공백제거전, LENGTH(TRIM(trailing FROM sname)) 공백제거후
FROM student;

학번    이름       공백제거전 공백제거후
------- ---------- ---------- ----------
915301  정동상              3          3
905301  유태지              3          3
905302  정욱상              3          3
915303  정욱주              3          3
923903  정남윤              3          3
923904  한현석              3          3
933901  김용서              3          3


6. 직원의 연봉을 10자리로 검색한다. 단 공백은 임의의 채움 문자로 채워 넣는다.

SELECT eno 사번, ename 이름, LPAD(sal*12+NVL(comm,0), 10, '#') 연봉
FROM emp;

사번    이름       연봉
------- ---------- ---------------
0201    안영숙     #####48800
0202    손하늘     #####43100
0301    이승철     #####40800
0302    박선경     #####39600
1001    문시현     #####54520
1002    김주란     #####49530


7. 학생의 이름을 검색한다. 단 성이 '심'인 학생은 성을 '사마' 로 바꾸어 검색한다.

SELECT sno 학번, sname 원래이름, REPLACE(sname, '심', '사마') 변경이름
FROM student;

학번    원래이름   변경이름
------- ---------- ----------
925603  최지현     최지현
925604  김가원     김가원
935601  독고현아   독고현아
935602  윤희주     윤희주
935604  권석현     권석현
935605  한지우     한지우
945601  심정용     사마정용

학번    원래이름   변경이름
------- ---------- ----------
913904  이호란     이호란
923901  서윤훈     서윤훈
923902  김호야     김호야
914503  김대현     김대현
914504  심빈경     사마빈경
948201  이창지     이창지
948202  김성지     김성지

 

집합 연산자

집합 연산자의 종류

 

SELECT ...
[UNION ALL | UNION | INTERSECT | MINUS]
SELECT ...

 

* 카디널리티 (튜플 수 : 열)

* 데이터베이스 성능 : 마지막 데이터를 읽는 시간

 

※ 데이터 검색시 데이터 타입이 다를 경우 NULL을 검색조건에 넣어준다.

SELECT eno, ename, NULL hiredate, comm, sal
FROM emp
UNION
SELECT pno, pname, hiredate, NULL,NULL
FROM professor
ORDER BY hiredate;

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1030    김동평     2002/02/15
1001    송강       2002/08/12
1006    장청아     2003/05/20
1038    하영진     2004/03/02
1008    문규식     2005/02/11
1033    박삭광     2005/07/14
1029    주동평     2006/01/26

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1016    호연작     2009/10/21
1007    이초아     2010/07/06
1017    최무송     2011/01/24
0001    안영희                         0       4800
0120    김경현                      2500       4000
0201    안영숙                      2000       3900
0202    손하늘                       980       3510

 

예제 1. 2000년 이후에 입사한 사원과 부임한 교수의 명단을 검색한다.

union all - 중복 포함

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate >= '2000/01/01'
UNION ALL
SELECT eno, ename, hdate
FROM emp
WHERE hdate >= '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
1001             송강       2002/08/12
1006             장청아     2003/05/20
1007             이초아     2010/07/06
1008             문규식     2005/02/11
1012             이영준     2000/05/18
1016             호연작     2009/10/21
1027             임충원     2001/06/03

 

union - 중복 제거

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate > '2000/01/01'
UNION
SELECT eno, ename, hdate
FROM emp
WHERE hdate > '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
0269             권나현     2015/05/21
0309             김선유     2011/01/03
0401             김진성     2008/03/13
0702             김민지     2017/01/09
0801             천유정     2000/10/09
1001             송강       2002/08/12
1006             장청아     2003/05/20

 

예제 2. 제갈씨 성을 가진 사원 중에 지원 업무를 하지 않는 사원을 검색한다.

SELECT eno, ename, job
FROM emp
WHERE ename LIKE '제갈%'
MINUS
SELECT eno, ename, job
FROM emp
WHERE job = '지원';

ENO     ENAME      JOB
------- ---------- -------
2002    제갈민     개발

 

예제 3. 화학, 물리학과 학생들 중에 학점이 3.0 이상인 학생을 검색한다.

SELECT sno 학번, sname 이름, major 학과, avr 성적 
FROM student
WHERE major IN ('화학','물리')
INTERSECT
SELECT sno, sname, major, avr FROM student
WHERE avr >= 3;

학번    이름       학과          성적
------- ---------- ------- ----------
905301  유태지     화학          3.28
914502  문수보     물리          3.33
914504  심빈경     물리          3.33
924501  권석복     물리             4
924505  서찬호     물리             3
925301  김환       화학          3.58
934504  갑서진     물리          3.22

 

실습

1. 화학과 학생과 교수를 검색한다. (집합 연산자를 이용한다.)

SELECT sno 번호, sname 이름, major 학과
FROM student
WHERE major = '화학'
UNION
SELECT pno, pname, section
FROM professor
WHERE section = '화학';

번호    이름       학과
------- ---------- -------
1001    송강       화학
1004    시진영     화학
1006    장청아     화학
1007    이초아     화학
1008    문규식     화학
905301  유태지     화학
905302  정욱상     화학


2. 정교수의 명단과 모델링이 업무인 직원의 이름, 입사일(부임일)을 검색한다.

SELECT pno 번호, pname 이름, hiredate 입사일, orders 직위_업무
FROM professor
WHERE orders = '정교수'
UNION
SELECT  eno, ename, hdate, job
FROM emp
WHERE job = '모델링';

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1001    문시현     1991/02/01 모델링
1001    송강       2002/08/12 정교수
1002    김주란     1992/03/03 모델링
1003    양선호     1995/02/21 모델링
1009    이준영     1991/10/04 정교수
1010    이규진     1998/10/07 정교수
1021    왕사진     1997/02/17 정교수

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1029    주동평     2006/01/26 정교수
1030    김동평     2002/02/15 정교수
1033    박삭광     2005/07/14 정교수
1035    장관용     1985/07/28 정교수

BETWEEN..AND 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ... 
FROM 테이블 WHERE 컬럼 BETWEEN 값1 AND 값2 (컬럼 >= 값1 AND 컬럼 <= 값2) 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......


예제 1. 다음 조건에 맞는 사원을 검색한다.
- 급여가 1000에서 2000 이내인 사원

SELECT * FROM emp 
WHERE sal BETWEEN 1000 AND 2000; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
0702    김민지     남  회계    0301     2017/01/09       1100         60 02

- 10, 20번 부서 사원

SELECT * FROM emp 
WHERE dno BETWEEN '10' AND '20'; #between을 문자에 쓰지 않기 > 좋지 않음 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10

BETWEEN을 문자열에 사용하면 답은 나오지만 좋지 않다. (IN 사용)

예제 2. 1992년에서 1996년 사이에 입사한 사원을 검색한다.

SELECT * FROM emp 
WHERE hdate BETWEEN '1992/01/01' AND '1996/12/31' 
ORDER BY hdate;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0301    이승철     남  회계    0001     1992/02/01       3400          0 02
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
2008    윤고은     여  개발    0001     1992/03/03       2100            40
2003    정의찬     남  개발    0202     1992/03/03       4350            30
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
1003    양선호     남  모델링  0201     1995/02/21       4300            30


예제 3. 급여가 2000에서 1000 사이인 사원을 검색한다.

SELECT * FROM emp 
WHERE sal BETWEEN 2000 AND 1000; 

선택된 레코드가 없습니다.

BETWEEN은 앞에 오는 값이 뒤에 값보다 작아야 한다.

 

 

IN 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ... 
FROM 테이블 
WHERE 컬럼 IN (값1, 값2 ...) (컬럼=값1 OR 컬럼=값2 OR ....) 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

= 값이 여러개 있을 경우에 사용

값 여러개 중에 하나만 맞아도 사용 가능


예제 4. 다음 조건에 맞는 사원을 검색한다.
- 개발이나 관리 업무를 담당하는 사원

SELECT * FROM emp 
WHERE job IN ('개발', '관리') 
ORDER BY job; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2008    윤고은     여  개발    0001     1992/03/03       2100            40
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
2003    정의찬     남  개발    0202     1992/03/03       4350            30

- 10, 20번 부서 사원

SELECT * FROM emp 
WHERE dno IN ('10', '20') 
ORDER BY dno; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20


예제 5. 결과가 동일한 두 개의 SQL문을 비교해 보자

SELECT * FROM emp 
WHERE dno BETWEEN '10' AND '20' AND job = '개발'; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20

 

실습

1. 평점이 3.0에서 4.0 사이의 학생을 검색한다.

SELECT * FROM student 
WHERE avr BETWEEN 3.0 AND 4.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
905301  유태지     남           4 화학          3.28
923903  정남윤     남           3 생물          3.23
948204  서창동     남           1 식영          3.21
945302  김람석     남           1 화학          3.56
913902  황진혜     여           4 생물          3.15
933904  임영현     여           2 생물          3.98
915604  정성현     남           4 유공          3.34


2. 1999년에서 2001년까지 부임한 교수의 명단을 검색한다.

SELECT * FROM professor 
WHERE hiredate BETWEEN '1999/01/01' AND '2001/12/31' 
ORDER BY hiredate; 

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1018    김응전     물리    조교수  1999/02/18
1013    하영진     물리    부교수  1999/04/19
1012    이영준     물리    부교수  2000/05/18
1027    임충원     생물    조교수  2001/06/03


3. 화학과와 물리학과, 생물학과 학생을 검색한다.

SELECT * FROM student 
WHERE major IN ('화학', '물리', '생물');

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
923903  정남윤     남           3 생물          3.23
923904  한현석     남           3 생물          2.45
933901  김용서     남           2 생물          1.48


4. 정교수와 조교수를 검색한다.

SELECT * FROM professor 
WHERE orders IN ('정교수', '조교수'); 

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1007    이초아     화학    조교수  2010/07/06
1008    문규식     화학    조교수  2005/02/11
1010    이규진     물리    정교수  1998/10/07
1009    이준영     물리    정교수  1991/10/04
1016    호연작     물리    조교수  2009/10/21
1018    김응전     물리    조교수  1999/02/18


5. 학점수가 1학점, 2학점인 과목을 검색한다.

SELECT * FROM course 
WHERE st_num IN (1, 2); 

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
1211    일반화학실험          2 1001
1214    무기화학              2 1004
1216    환경화학              2 1006
1218    생화학                2 1008
1227    이학수학              2 1017
1228    위상수학              2 1018
2365    전자기학              2 1029


6. 1, 2 학년 학생 중에 평점이 2.0에서 3.0 사이인 학생을 검색한다.

SELECT * FROM student 
WHERE syear IN (1, 2) AND (avr BETWEEN 2.0 AND 3.0) 
ORDER BY syear; 

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
948203  황보우리   여           1 식영          2.83
945605  오경운     남           1 유공          2.99
945604  권현       남           1 유공          2.89
945602  차정혜     여           1 유공          2.73
943901  최혜원     여           1 생물          2.54
948201  이창지     남           1 식영           2.9
945303  남궁경아   여           1 화학          2.36


7. 화학, 물리학과 학생 중 1, 2 학년 학생을 성적순으로 검색한다.

SELECT * FROM student 
WHERE major IN ('화학', '물리') AND syear IN (1, 2) 
ORDER BY avr DESC;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
945302  김람석     남           1 화학          3.56
934504  갑서진     여           2 물리          3.22
944503  곽득용     남           1 물리           3.2
935304  최홍승     남           2 화학             3
925309  오우재     여           1 화학          2.99
925306  김재백     남           2 화학          2.78
944511  김형진     여           1 물리          2.76


8. 물리, 화학과 학생 중 4.5 환산 평점이 3.5에서 4.0 사이인 학생을 검색한다.

SELECT * FROM student 
WHERE major IN ('물리', '화학') AND ((avr*4.5/4) BETWEEN 3.5 AND 4.0);

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
905301  유태지     남           4 화학          3.28
914502  문수보     남           4 물리          3.33
944503  곽득용     남           1 물리           3.2
934504  갑서진     여           2 물리          3.22
914504  심빈경     남           4 물리          3.33


9. 물리, 화학과 학생의 정보를 학년별 성적순으로 검색한다.

SELECT * FROM student 
WHERE major IN ('물리', '화학') 
ORDER BY syear, avr DESC;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
945302  김람석     남           1 화학          3.56
944503  곽득용     남           1 물리           3.2
925309  오우재     여           1 화학          2.99
944511  김형진     여           1 물리          2.76
945303  남궁경아   여           1 화학          2.36
945314  이철윤     남           1 화학          2.22
944512  서동조     남           1 물리          1.99


10. 물리, 화학과 교수 중에 1999년에서 2000년 사이에 부임한 교수의 정보를 직위별로 검색한다.

SELECT * FROM professor 
WHERE section IN ('물리', '화학') AND (hiredate BETWEEN '1999/01/01' AND '2000/12/31') 
ORDER BY orders;

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1013    하영진     물리    부교수  1999/04/19
1012    이영준     물리    부교수  2000/05/18
1018    김응전     물리    조교수  1999/02/18

 

관계 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM  테이블  
WHERE 조건 [관계 연산자 조건 ...]
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

 

예제 1. 다음 각 조건에 맞는 데이터를 검색한다. 

- 20번 부서 사원 중에 급여가 2000 이상인 사원을 검색한다.

SELECT * FROM emp
WHERE dno = '20'
AND sal >= 2000; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

- 20번 부서 사원 중에 급여가 2000 이상이고 모델링 업무를 담당하는 사원을 검색한다.

SELECT * FROM emp
WHERE dno = '20'
AND sal >= 2000
AND job = '모델링';  

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20

 

예제 2. 다음 두 문장을 실행하고 결과를 해석해 보자.

SELECT * FROM emp
WHERE dno = 10 OR sal > 1600 AND comm > 600;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0201    안영숙     여  지원    0001     1991/02/01       3900       2000 01
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01
1001    문시현     남  모델링  0201     1991/02/01       4500        520 10
2001    남궁연호   남  개발    0202     1993/12/13       3950        200 10
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10

우선순위가 AND가 OR보다 높기 때문에 답이 맞는지 확인이 어렵다.

괄호를 포함시켜 우선순위를 표시해준다.

SELECT * FROM emp
WHERE (dno = 10 OR sal > 1600) AND comm > 600;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0201    안영숙     여  지원    0001     1991/02/01       3900       2000 01
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

 

 

LIKE 연산자

SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
FROM  테이블
WHERE 컬럼 LIKE '비교 문자열' 
ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......;

 

 

예제 3. 다음 조건에 맞는 사원을 검색한다.

- 김씨 성을 가진 사원

SELECT * FROM emp
WHERE ename LIKE '김%'; 

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
1002    김주란     여  모델링  0201     1992/03/03       4100        330 20
0309    김선유     남  회계    0302     2011/01/03        900         90 02
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0702    김민지     남  회계    0301     2017/01/09       1100         60 02
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10
0120    김경현     남  지원    1002     1999/09/05       4000       2500 20

- 이름이 '하늘'인 사원

SELECT * FROM emp
WHERE ename LIKE '%하늘';

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
0202    손하늘     여  지원    0001     1991/12/01       3510        980 01

- 성과 이름이 각각 한 글자인 사원을 검색한다.

SELECT * FROM emp
WHERE ename LIKE '__';

선택된 레코드가 없습니다.

 

예제 4. 이름에 '%' 문자가 포함된 사원을 검색한다.

SELECT eno, ename
FROM emp
WHERE ename LIKE '%#%%' ESCAPE '#'; 

선택된 레코드가 없습니다.

 

실습

1. 화학과와 물리학과 학생을 검색한다. 

SELECT *
FROM student
WHERE major = '화학' OR major = '물리';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
915304  권보수     남           4 화학          2.32
915305  최정희     여           3 화학           .58
925306  김재백     남           2 화학          2.78

 

2. 화학과가 아닌 학생 중에 1학년 학생을 검색한다. 

SELECT *
FROM student
WHERE major != '화학' AND syear = 1;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
948203  황보우리   여           1 식영          2.83
948204  서창동     남           1 식영          3.21
943901  최혜원     여           1 생물          2.54
943902  하정자     남           1 생물          3.25
943903  유지아     여           1 생물          1.99
943905  유태지     남           1 생물          2.98
944511  김형진     여           1 물리          2.76

 

3. 화학과 3학년 학생을 검색한다. 

SELECT *
FROM student
WHERE major = '화학' AND syear = 3;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915305  최정희     여           3 화학           .58
925302  이지영     여           3 화학          1.68
925301  김환       여           3 화학          3.58
925305  황현정     여           3 화학          2.98

 

4. 평점이 2.0에서 3.0 사이인 학생 검색한다. 

SELECT *
FROM student
WHERE avr > 2.0 AND avr < 3.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
923904  한현석     남           3 생물          2.45
915304  권보수     남           4 화학          2.32
948203  황보우리   여           1 식영          2.83
925306  김재백     남           2 화학          2.78
933902  김현수     남           2 생물          2.48
933903  정승동     남           2 생물          2.99
945303  남궁경아   여           1 화학          2.36

 

5. 교수가 지정되지 않은 과목 중에 학점이 3학점인 과목을 검색한다. 

SELECT *
FROM course
WHERE pno IS NULL AND st_num = 3;

선택된 레코드가 없습니다.

 

6. 화학 관련된 과목 중 학점수가 2학점 이하인 과목을 검색한다.

   (화학 관련 과목은 과목명에 화학이 들어간 과목을 의미한다.) 

SELECT *
FROM course
WHERE cname LIKE '%화학%' AND st_num <= 2;

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
1211    일반화학실험          2 1001
1214    무기화학              2 1004
1216    환경화학              2 1006
1218    생화학                2 1008
2369    무기화학실험          2

 

7. 화학과 정교수를 검색한다. 

SELECT *
FROM professor
WHERE section LIKE '화학' AND orders LIKE '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12

 

8. 화학과 학생 중에 성이 권씨인 학생을 검색한다.  

SELECT *
FROM student
WHERE sname LIKE '권%';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915304  권보수     남           4 화학          2.32
925601  권운각     남           3 유공           2.9
924501  권석복     여           3 물리             4
935604  권석현     여           2 유공          2.99
945604  권현       남           1 유공          2.89

 

9. 부임일이 1995년 이전인 정교수를 검색한다. 

SELECT *
FROM professor
WHERE hiredate < '1995/01/01' AND orders LIKE '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1009    이준영     물리    정교수  1991/10/04
1035    장관용     식영    정교수  1985/07/28

 

10. 성과 이름이 각각 한글자인 교수를 검색한다. 

SELECT *
FROM professor
WHERE pname LIKE '__';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1022    이준       생물    부교수  1989/05/05

조건 검색

SQL> SELECT [DISTINCT | ALL] 컬럼, 컬럼 ...
     FROM  테이블
     WHERE 조건
     ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC].......

 

예제 1. 다음 각 조건에 맞는 정보를 검색

- 사원 중에 급여가 4000 이상인 사원의 명단

SELECT eno 사번, ename 이름, sal 급여
FROM emp
WHERE sal >= 4000;

사번    이름             급여
------- ---------- ----------
0001    안영희           4800
1001    문시현           4500
1002    김주란           4100
1003    양선호           4300
2003    정의찬           4350
0120    김경현           4000

- 이름이 '문시현'인 사원의 정보

SELECT *
FROM emp
WHERE ename = '문시현';

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1001    문시현     남  모델링  0201     91/02/01       4500        520 10

- 10번 부서 이외 부서 사원의 명단

SELECT * FROM emp
WHERE dno != 10;

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
0001    안영희     여  경영             91/01/01       4800          0 01
0201    안영숙     여  지원    0001     91/02/01       3900       2000 01
0202    손하늘     여  지원    0001     91/12/01       3510        980 01
0301    이승철     남  회계    0001     92/02/01       3400          0 02
0302    박선경     여  회계    0301     91/03/02       3300          0 02
1002    김주란     여  모델링  0201     92/03/03       4100        330 20
1003    양선호     남  모델링  0201     95/02/21       4300            30

 

예제 2. 잘못된 조건 검색 (문자타입인데 숫자타입으로 검색)

SELECT * FROM emp
WHERE dno=10; #dno 칼럼음 문자타입

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1001    문시현     남  모델링  0201     91/02/01       4500        520 10
2001    남궁연호   남  개발    0202     93/12/13       3950        200 10
3001    김선유     남  분석    1001     98/10/17       3200        300 10
0269    권나현     여  분석    0301     15/05/21       2600       1900 10
0401    김진성     남  회계    1001     08/03/13       3200       1000 10

 

예제 3. 연봉이 30,000 이상인 사원의 이름을 검색한다 검색

SELECT eno 사번, ename 이름, sal*12+NVL(comm,0) 연봉
FROM emp
WHERE sal*12+NVL(comm,0) >= 30000;

사번    이름             연봉
------- ---------- ----------
0001    안영희          57600
0201    안영숙          48800
0202    손하늘          43100
0301    이승철          40800
0302    박선경          39600
1001    문시현          54520
1002    김주란          49530

 

예제 4. 보너스가 200 이하인 사원을 검색

SELECT eno 사번, ename 이름, comm 보너스
FROM emp
WHERE comm <= 200;

사번    이름           보너스
------- ---------- ----------
0001    안영희              0
0301    이승철              0
0302    박선경              0
2001    남궁연호          200
0309    김선유             90
0702    김민지             60

보너스가 없는 사람은 NVL을 사용해 0으로 변경해 보너스가 NULL인 사람도 검색하도록 다음과 같이 검색한다.

SELECT eno 사번, ename 이름, comm 보너스
FROM emp
WHERE NVL(comm,0) <= 200;

사번    이름           보너스
------- ---------- ----------
0001    안영희              0
0301    이승철              0
0302    박선경              0
1003    양선호
2001    남궁연호          200
2003    정의찬
2008    윤고은

 

예제 5. 입사일이 1996년 이후인 사원의 정보를 검색

SELECT * FROM emp
WHERE hdate >= '1996/01/01';

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
3002    권아현     여  분석    1002     2001/01/29       2900            20
0309    김선유     남  회계    0302     2011/01/03        900         90 02
3001    김선유     남  분석    1001     1998/10/17       3200        300 10
0702    김민지     남  회계    0301     2017/01/09       1100         60 02
0269    권나현     여  분석    0301     2015/05/21       2600       1900 10
0401    김진성     남  회계    1001     2008/03/13       3200       1000 10

 

널과 비교 연산
 - 널은 결정된 값이 아님으로 '=', '<' 등의 비교 연산자를 사용할 수 없다. 

 - 널에 대한 직접적인 검색은 다음과 같이 특별한 연산자를 이용한다.

  IS NULL : 널을 검색한다.

  IS NOT NULL : 널이 아닌 값를 검색한다.

 

예제 6. 보너스 컬럼이 널인 사원를 검색

SELECT *  FROM emp
WHERE comm IS NULL;  # comm = NULL 절대 안됨!!!

ENO     ENAME      SEX JOB     MGR      HDATE           SAL       COMM DNO
------- ---------- --- ------- -------- -------- ---------- ---------- ----
1003    양선호     남  모델링  0201     95/02/21       4300            30
2003    정의찬     남  개발    0202     92/03/03       4350            30
2008    윤고은     여  개발    0001     92/03/03       2100            40
3002    권아현     여  분석    1002     01/01/29       2900            20

 

실습

1. 화학과 학생을 검색한다. 

SELECT * FROM student
WHERE major = '화학';

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905301  유태지     남           4 화학          3.28
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
915304  권보수     남           4 화학          2.32
915305  최정희     여           3 화학           .58
925306  김재백     남           2 화학          2.78

 

2. 평점이 2.0 미만인 학생을 검색한다. 

SELECT * FROM student
WHERE avr < 2.0;

SNO     SNAME      SEX      SYEAR MAJOR          AVR
------- ---------- --- ---------- ------- ----------
915301  정동상     남           4 화학           .95
905302  정욱상     남           4 화학          1.44
915303  정욱주     남           4 화학           .95
933901  김용서     남           2 생물          1.48
915305  최정희     여           3 화학           .58
935303  김완창     남           2 화학           .34
913903  정도정     남           4 생물           .15

 

3. 권현 학생의 평점을 검색한다. 

SELECT sno 학번, sname 이름, avr 평점
FROM student
WHERE sname = '권현';

학번    이름             평점
------- ---------- ----------
945604  권현             2.89

 

4. 정교수의 명단을 검색한다. 

SELECT * FROM professor
WHERE orders = '정교수';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1010    이규진     물리    정교수  1998/10/07
1009    이준영     물리    정교수  1991/10/04
1021    왕사진     생물    정교수  1997/02/17
1029    주동평     생물    정교수  2006/01/26
1030    김동평     유공    정교수  2002/02/15
1033    박삭광     유공    정교수  2005/07/14

 

5. 화학과 소속 교수의 명단을 검색한다. 

SELECT * FROM professor
WHERE section = '화학';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12
1004    시진영     화학    부교수  1991/02/01
1006    장청아     화학    부교수  2003/05/20
1007    이초아     화학    조교수  2010/07/06
1008    문규식     화학    조교수  2005/02/11

 

6. 송강 교수의 정보를 검색한다. 

SELECT * FROM professor
WHERE pname = '송강';

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1001    송강       화학    정교수  2002/08/12

 

7. 학년별로 화학과 학생의 성적을 검색한다. 

SELECT major 학과, syear 학년, sno 학번, sname 이름, avr 성적
FROM student
WHERE major = '화학' 
ORDER BY syear;

학과          학년 학번    이름             성적
------- ---------- ------- ---------- ----------
화학             1 945302  김람석           3.56
화학             1 925309  오우재           2.99
화학             1 945314  이철윤           2.22
화학             1 945303  남궁경아         2.36
화학             2 935304  최홍승              3
화학             2 935301  이준혜           1.99
화학             2 925306  김재백           2.78

 

8. 2000년 이전에 부임한 교수의 정보를 부임일순으로 검색한다. 

SELECT * FROM professor
WHERE hiredate < '2000/01/01'
ORDER BY hiredate ASC;

PNO     PNAME      SECTION ORDERS  HIREDATE
------- ---------- ------- ------- ----------
1035    장관용     식영    정교수  1985/07/28
1032    이유당     유공    부교수  1988/11/01
1022    이준       생물    부교수  1989/05/05
1004    시진영     화학    부교수  1991/02/01
1009    이준영     물리    정교수  1991/10/04
1031    김서령     식영    부교수  1991/10/09
1036    성현수     유공    부교수  1993/07/13

 

9. 담당 교수가 없는 과목의 정보를 검색한다. 

SELECT * FROM course
WHERE pno IS NULL;

CNO     CNAME            ST_NUM PNO
------- ------------ ---------- -------
2369    무기화학실험          2

 

10. 보너스가 급여의 10% 이상인 사원을 검색한다.

SELECT * FROM emp
WHERE comm >= sal*1.1;

ENO     ENAME      SEX JOB     MGR      HDATE             SAL       COMM DNO
------- ---------- --- ------- -------- ---------- ---------- ---------- ----
2002    제갈민     남  개발    0202     1996/04/30       1520       2000 20
2007    이초록     남  개발    0001     1992/09/05       1989       2300 30

 

SQL 페이지, 글자 포멧 설정

SET LINE ##
COL 컬럼 [FORMAT A## | CLEAR | ...]
SET PAGES ##

ex)

set line 100

col ename format a10 : ename 글자 포멧 10글자 지정 (문자 컬럼만 지정

col sal clear : 글자 포멧 지정한 것을 원래로 돌리기

set pages 10 : 한 페이지 열줄 지정

 

메모장을 열고 다음과 같이 인코딩 값을 변경시켜 login.sql을 만든다.

 

인코딩을 ANSI (euc) 로 저장한다.

 

sql 을 실행해 다음과 같이 두개 중 하나를 입력한다. sql을 실행할 때마다 입력한다.

sql> @login.sql

sql> @login

 

잘 적용된 것을 확인할 수 있다.

 

login.sql

SET LINE 100
SET PAGES 10
ALTER SESSION SET nls_date_format='YYYY/MM/DD';


COL grade FORMAT A7
COL 평가점수 FORMAT A9
COL sno FORMAT A7
COL 학번 FORMAT A7
COL sname FORMAT A10
COL 이름 FORMAT A10
COL major FORMAT A7
COL 전공 FORMAT A7
COL pno FORMAT A7
COL 교수번호 FORMAT A9
COL pname FORMAT A10
COL 교수이름 FORMAT A10
COL section FORMAT A7
COL 학과 FORMAT A7
COL orders FORMAT A7
COL 지위 FORMAT A7
COL cno FORMAT A7
COL 과목번호 FORMAT A9
COL cname FORMAT A12
COL 과목이름 FORMAT A12
COL 과목명 FORMAT A12
COL eno FORMAT A7
COL 사번 FORMAT A7
COL ename FORMAT A10
COL sex FORMAT A3
COL 성별 FORMAT A3
COL job FORMAT A7
COL 부서 FORMAT A7
COL 업무 FORMAT A7
COL dname FORMAT A7
COL 부서명 FORMAT A7
COL loc FORMAT A5
COL 근무처 FORMAT A5
COL dno FORMAT A7
COL 부서번호 FORMAT A9

 

SELECT

형식

SELECT [ 컬럼, 컬럼, ... | * ]  
FROM  테이블;

- [ ; ] 로 끝내기

- 대소문자 구별 X

- 반드시 출력 결과 존재

 

테이블 구조 검색

DESC 테이블;

- 컬럼의 이름, 데이터 타입 확인

 

테이블 목록 검색

SELECT * FROM tab;  # tab : 가상 테이블

- 현재 스키마(shema)의 모든 테이블 목록 검색 (스키마 = 유저)

 

수식 검색

SELECT 수식
FROM  dual;

 

* 테이블은 2차원 배열과는 다르다.

 

 

예제

select * from tab;

실행 결과

 

DESC emp;

실행 결과

 

SELECT * FROM emp;

실행 결과

 

DESC dept;

실행 결과

 

 

SELECT * FROM dept;

실행 결과

 

SELECT eno, ename, job FROM emp;

실행 결과

 

 

SELECT eno, ename, sal FROM emp;

실행 결과

 

SELECT 2+3 FROM dual;

실행 결과

 

 

실습

1. student, course, professor, score table의 구조 검색

DESC student;
DESC professor;
DESC course;
DESC score;

각각 실행한다.

실행 결과

 

2. 모든 학생의 정보를 검색

SELECT * FROM student;

실행 결과 (아래 정보 생략)

 

3. 모든 교수의 정보를 검색

SELECT * FROM professor;

실행 결과

 

4. 모든 과목의 정보를 검색

SELECT * FROM course;

실행 결과 (아래 정보 생략)

 

5. 기말고사 시험 점수를 검색

SELECT * FROM score;

실행 결과 (아래 정보 생략)

 

6. 학생들의 학과와 학년을 검색

SELECT sno, sname, major, syear FROM student;

실행 결과 (아래 정보 생략)

 

7. 각 과목의 이름을 검색

SELECT cname FROM course;

실행 결과 (아래 정보 생략)

 

8. 모든 교수의 직위를 검색

SELECT pno, pname, orders FROM professor;

실행 결과 (아래 정보 생략)

 

9. 각 과목의 학점수와 담당교수 번호를 검색

SELECT cno, cname, st_num, pno FROM course;

실행 결과 (아래 정보 생략)

 

10. 각 학생들이 속한 학과와 학년을 검색

SELECT sno, sname, major, syear FROM student;

실행 결과 (아래 정보 생략)

+ Recent posts