머리말 안녕하세요. 저는 지난 10여 년 동안 SQL을 강의하고 지금도 실무에서 SQL을 많이 작성하 고 있습니다. 아마 저뿐만 아니라 많은 분들이 데이터베이스를 공부함에 있어 서 가장 기본적이고 중요한 시작 단계는 SQL을 배우는 단계라고 생각할 것입니 다. 그래서 시중에 SQL과 관련된 책들이 많이 나와 있습니다. 으로써 독자 스스로가 해당 함수나 문법들을 응용할 수 있도록 도와주고 있 습니다. C A 그냥 단순히 문법만 배우고 넘어가는 것이 아니라 다양한 예제들을 풀어 봄 F 1. 많은 예제를 사용하여 활용법을 익히게 하자! E 하는 초보자들을 대상으로 하여 아래와 같은 의도로 집필하였습니다. E 이 책은 SQL과 PL/SQL을 처음 시작하는, 즉 확실한 기초와 응용력을 키우기 원 무조건 이렇게 쓰세요! 가 아니라 원리를 설명함으로써 독자가 고민해서 더 R 좋은 SQL을 작성할 수 있고 더 수준 높은 공부를 스스로 할 수 있도록 도와 P 2. 자세한 원리를 설명하자! 주고 있습니다. 3. 10g / 11g의 최신 함수들이나 특징들을 최대한 반영하자! 다른 SQL 책에서 거의 볼 수 없는 아주 유용한 SQL 내의 정규식 활용하기 등 과 같이 10g와 11g에서의 주요 신기능들이나 함수들을 최대한 반영하고 여 러 가지 다양한 예제를 통하여 학습할 수 있도록 배려하고 있습니다. 4. SQL 튜닝까지 고려하자! 성능을 무시한 SQL을 작성하는 것이 아니라 성능까지 고려한 방법들을 쉽게 풀어 설명하고 실습하고 있습니다. 기초 과정이라 어려운 SQL 튜닝 관련 내 용은 모두 담지 못했지만 이 책을 읽고 나면 다음 단계의 책을 보기에 한결 수월하도록 배려하였습니다. 3
ORACLE 꼭 이 책의 내용들을 다 외울 정도로 공부하여 스스로의 지식으로 만들기 바랍 니다. 마치 작은 씨앗에서 큰 나무가 자라나는 것처럼 이 책 한 권은 작지만 이 책을 다 읽은 후에는 큰 나무가 되기를 바랍니다. 이 책은 SQL 책입니다. 그러나 SQL을 잘 작성하기 위해서는 오라클 아키텍처나 어드민 관련 내용을 알아야 하므로 중요한 일부 내용을 언급했습니다. 하지만 지면 관계상 아키텍처나 어드민을 모두 언급할 수 없어서 이 책에 언급된 오라 클 아키텍처와 어드민 관련 내용과 OS와 네트워크에 대한 내용을 보다 자세하 게 담은 원고를 현재 별도 집필 중이며 2013년에 출간될 예정입니다. 이 책의 감사드립니다 E 픔과 노력과 희생이 있었습니다. P 이 책이 나오기까지 저뿐만 아니라 주위에 계신 많은 분들의 여러 가지 많은 아 R F A C E 특성상 아키텍처를 많이 언급하지 못한 부분 양해 부탁드립니다. 우선 이 책의 모든 내용을 직접 테스트하면서 공부한 아이티윌 오라클 수강생 여러분에게 진심으로 감사드립니다. 또한 여러 가지로 배려해 주고 도와준 아 이티윌의 조인형 사장님, 박승곤 원장님, 모든 직원에게도 감사드립니다. 함께 고민하고 좋은 말과 격려로 힘을 실어준 김영조 강사님께도 깊은 감사를 드립 니다. 현업에서 함께 혹은 다른 곳에서 일하면서 실시간으로 저에게 질문하고 함께 해결 방법을 고민했던 여러 엔지니어들에게도 감사드립니다. 허우 님, 박원범 님, 박상수 님, 김설희 님, 정연권 님, 이윤나 님 등 너무 많아서 일일이 다 열 거할 수 없지만 모든 분들께 많이 감사하고 있다는 점 꼭 전하고 싶습니다. 네이버 prodba 카페(http://cafe.naver.com/prodba)와 다음 ocp 카페 (http://cafe.daum.net/ocp)의 여러 회원에게도 감사드립니다. 부족한 원고 4
를 받아주고 책으로 빛을 보게 해준 생능출판사 관계자 분들께도 진심으로 감 사드립니다. 고향에서 오늘도 저를 위해 기도하는 어머니 이남순 여사님과 형을 대신해서 고향에서 어머니를 모시고 있는 동생 서재수에게 사랑과 감사의 마음을 함께 전하고 싶습니다. 그리고 또 한 분의 소중한 어머니인 정명순 여사님과 닮고 싶 은 김종근 아버님께도 진심으로 감사드립니다. 두 분 덕분에 참 많은 것을 느끼 고 배우게 되었습니다. 그리고 오랜 시간 동안 삶에 대해 조언해 주고 힘내도록 격려해준 김현정 님께도 이 책의 지면을 빌어서 진심으로 사랑과 감사의 마음 을 꼭 전하고 싶습니다. 또 멋진 캐리커처를 선물해 준 김성훈 형님께도 진심으 F E R 서진수 P 2012년 9월 A C E 로 감사드립니다. 5
ORACLE 차례 er Chapt 00 실습을 시작하기 전에 14 er Chapt 01 SELECT 문장을 이용하여 원하는 데이터 가져오기 20 20 2. SELECT 데이터 조회하기 21 er Chapt 1. 문자 함수 53 2. SQL 문장에서 정규식 사용하기(10g부터 추가됨) 67 3. 11g에서 추가된 정규식 함수 85 4. 11g REGEXP_SUBSTR 추가 기능(Sub Expression 사용하기) 87 5. 숫자 함수 88 6. 날짜 함수 90 7. 형 변환 함수 97 O N T N 02 SQL 단일 행 함수 52 E T S 1. DESC 명령어 C 8. 일반 함수 103 er Chapt 03 SQL 복수 행 함수(그룹 함수) 116 6 1. GROUP 함수의 종류 116 2. 특정 조건으로 세부적인 그룹화 하기(GROUP BY 절 사용하기) 120 3. 조건을 주고 검색하기(HAVING 절 사용하기) 123 4. 자동으로 소계 / 합계를 구해주는 함수 124 5. 다른 그룹핑 관련 함수들 살펴보기 127 6. 그룹 함수 연습문제 136 7. 그 외 주요 그룹 함수 138
er Chapt 04 JOIN 148 1. Cartesian Product(카티션 곱) 149 2. EQUI Join(등가 Join) 150 3. Non-Equi Join(비등가 Join) 156 4. OUTER Join(아우터 조인) 161 5. SELF Join 166 6. JOIN 원리 168 er Chapt 2. Sub Query의 종류 179 3. Scalar Sub Query(스칼라 서브쿼리) 187 T 178 N 1. Sub Query란? S 05 Sub Query(서브쿼리) 178 er 192 2. UPDATE 197 3. DELETE 198 4. MERGE 204 O 5. TRANSACTION 관리하기 207 6. DML ERROR LOGGING 하기 208 N 1. INSERT C 06 DML 192 T E Chapt er Chapt 07 DDL 문장과 딕셔너리 214 1. CREATE 명령 214 2. ALTER 명령 268 3. TRUNCATE 명령 273 4. DROP 명령 274 5. DELETE, TRUNCATE, DROP 명령어의 차이점 274 6. 데이터 딕셔너리(Dictionary) 275 7
ORACLE er Chapt 08 제약조건 282 1. 제약조건의 종류 282 2. 각 제약조건의 설정 방법 285 3. 제약조건 관리하기 288 er Chapt 302 2. 인덱스의 생성 원리 305 3. 인덱스 구조와 작동 원리(B-TREE 인덱스 기준) 306 4. 인덱스의 종류 308 5. 인덱스의 주의사항 317 T 6. 인덱스 관리 방법 319 7. 인덱스 활용 예제 323 8. Invisible Index(인비저블 인덱스) - 11g New Feature 329 er Chapt 10 VIEW(View) 334 1. 단순 View(Simple View) 336 O 2. 복합 View(Complex View) 338 C N T E S 1. 인덱스란 무엇인가? N 09 INDEX(인덱스) 302 3. INLINE View(인라인 뷰) 338 4. Materialized View(MVIEW) 341 er Chapt 11 SEQUENCE와 SYNONYM(동의어) 348 1. SEQUENCE(시퀀스) 348 2. SYNONYM(동의어) 358 er Chapt 12 계층형 쿼리(Hierachical Query) 364 8
er Chapt 13 사용자 관리 372 1. User와 Schema(스키마) 알아보기 372 2. PROFILE 관리하기 373 3. PRIVILEGE(권한) 관리하기 380 4. Role(롤) 관리하기 384 er Chapt 390 4. PL/SQL BLOCK 기본 구성 391 5. PL/SQL 블록 작성시 기본 규칙과 권장 사항 392 6. PL/SQL 문 내에서의 SQL 문장 사용하기 393 7. PL/SQL에서의 렉시칼 402 8. PL/SQL에서의 블록 구문 작성 지침 404 9. 중첩된 PL/SQL 블록 작성하기 405 10. PL/SQL에서의 연산자 사용하기 406 T 3. PL/SQL 기본 구조 N 388 E 2. PL/SQL의 런타임 구조 T 388 O N 1. PL/SQL이란? S 14 ORACLE PL/SQL 시작하기 388 er Chapt C 15 PL/SQL 변수 410 1. 개요 410 2. 주요 변수의 종류 411 3. 비 PL/SQL 변수(바인드 변수) 430 er Chapt 16 PL/SQL 제어문 434 1. 조건문(IF 문) 434 2. CASE 문과 CASE 식 439 3. 반복문 442 9
ORACLE er Chapt 17 PL/SQL Cursor(커서) 452 1. SQL 커서란? 452 2. 묵시적 커서(Implicit Cursor) 453 3. 명시적 커서(Explicit Cursor) 454 4. 명시적 커서(Explicit Cursor) 처리 단계 455 5. Cursor FOR Loop 문 활용하기 458 6. 파라미터 Explicit Cursor 462 7. Explicit Cursor와 FOR UPDATE 문장 463 er Chapt 1. PL/SQL 예외란? 468 2. PL/SQL 블록 내의 예외처리부 472 N T S 18 ORACLE EXCEPTION(예외처리) 468 19 ORACLE SUBPROGRAM 482 1. PROCEDURE(프로시저) 483 2. FUNCTION(내장 함수) 493 3. ORACLE PACKAGE(패키지) 499 4. TRIGGER(트리거) 512 C O N T E er Chapt 부록 연습문제, 퀴즈 정답 찾아보기 10 532 551
Welcome to SQL World! SQL 세계로 온 것을 환영합니다. 이 책의 내용을 여행하기 전에 몇 가지 사항을 안내하겠습니다. 1. 이 책은 눈으로만 보는 책이 아니라 눈으로 본 후 손과 머리와 마음으로 이해해야 하는 책입니 다. 리눅스(OEL 5 버전)에 오라클 11g R2 버전을 설치하는 메뉴얼은 분량이 너무 많아서 이 책 에 포함시키지 않고 생능출판사 홈페이지(www.booksr.co.kr)에서 제공하니 다운로드 받아서 실습하기 바랍니다. 은 언어입니다. 여러분이 원하는 것을 오라클에게 해 달라고 말하는 것입니다. 이 책 안에 2. SQL 있는 SQL 문제나 예제들은 저자가 표현한 말입니다. 즉 여러분은 저자가 이 책 안에 적은 SQL 을 외우는 것이 아니라 이 SQL들을 참고하여 새로운 다양한 표현 방법을 만들어야 한다는 것입 니다. 이 방법 저 방법 등으로 다양하게 여러분의 생각을 쿼리로 만들어보는 것이 중요합니다. 말을 빨리 한다고 잘하는 것은 아닙니다. 쿼리도 빨리 짜는 것이 중요한 것이 아닙니다. 또 어 려운 말을 많이 한다고 잘하는 것 또한 아닙니다. 어려운 함수나 기능을 많이 써야 하는 것도 아니라는 뜻입니다. 말을 잘 한다는 것은 상대방이 정확하게 잘 알아들어야 하며 표현도 적절 해야 한다는 의미입니다. 아무쪼록 이런 당연하지만 아주 중요한 주의사항을 꼭 기억하고 이 책을 여행할 것을 부탁합니다. 이 책은 컴퓨터 중에서 어려운 데이터베이스의 SQL 책입니다. 그러나 단지 SQL만 배우기 위한 책이 되기보다는 인생 전체에 대한 쿼리(질문)를 던질 수 있는 책이 되었으면 하는 저자의 바램 으로 거의 모든 장의 마지막에 짧은 생각하는 글 을 담고 있습니다. 어쩌면 SQL 책에 이게 무슨 쓸데 없는 내용이지? 라고 생각하는 사람도 있을 것입니다. 그런 사실을 알기에 이 내용을 넣을 지 말지 고민을 많이 했습니다. 그러나 만약 단 한 사람에게라도 도움이 된다면 충분히 가치가 있을 것 같아서 넣기로 했습니다. 각 장을 공부한 후 머리도 식힐 겸 천천히 읽어 보기 바랍니다. 여러분이 이 책을 선택하는 이유는 당연히 데이터베이스의 SQL을 배우기 위해서일 것입니다. 이 책은 그 목표에 아주 근접하고 훌륭하게 여러분을 인도해 줄 것입니다. 그럼 이제부터 본격적으 로 SQL World로 여행을 떠나겠습니다. Come on! 11
pter Cha 00 실습을 시작하기 전에
Chapter 00 실습을시작하기전에 이책의거의대부분의실습은 oracle 설치시에기본적으로생성되는연습용계정인 scott 계정을사용하며다음과같이접속하여실습하면됩니다. 이책은리눅스 (OEL 5 버전 ) 에 Oracle 11g R2 버전으로구성된실습환경입니다. 리눅스에오라클 11g를설치하는매뉴얼과실습용데이터들은분량관계로이책에포함시키지않고생능출판사홈페이지 (www.booksr.co.kr) 에서제공하니다운로드받아서사용하기바랍니다. 1. DB 가시작되어있는경우연습용계정인 scott 계정으로접속합니다. $ sqlplus scott/tiger ($ 는입력하지말고대소문자구분합니다.) 2. DB가종료되어있는경우 $ sqlplus / as sysdba SQL*Plus: Release 11.2.0.2.0 Production on Mon Nov 28 15:44:06 2011 Copyright (c) 1982, 2010, Oracle. All rights reserved. Connected to an idle instance. 이런메시지가나오면 DB가종료되어있다는의미입니다. SQL> startup DB를시작시키는명령어입니다. ORACLE instance started. ( 중간생략 ) Database opend. SQL> conn scott/tiger 연습용계정으로접속합니다. Connected. 14
00 chapter 실습을시작하기전에 현재접속중인사용자를확인하는방법입니다. SQL> show user ; USER is "SCOTT" 현재접속한계정이름으로 SQL 프롬프트부분을바꾸면더편하게작업할수있습니다. SQL> set sqlprompt "_USER>" SCOTT> 접속할때마다이명령어를수행하기귀찮으면 /home/oracle/login.sql을만든후그파일안에 set sqlprompt "_USER>" 를등록해두면 sqlplus가실행할때마다자동으로반영됩니다. 이책에있는실습을하려면제공된자료중에서 test_data.sql 스크립트가 scott 계정에서수행되어있어야하며방법은아래와같습니다. SCOTT> @/home/oracle/test_data.sql 이파일을리눅스의저디렉터리로보낸후실행하세요. 리눅스와윈도의파일을서로주고받는방법은 winscp를이용하면되고이프로그램을사용해서파일을넘기는방법은홈페이지에서제공하는 OEL 5 기반에 Oracle 11g R2 버전을설치하는매뉴얼에자세하게나와있습니다. 여기까지하면이책을실습할수있는모든준비가끝납니다. 15
ORACLE 오라클 SQL 과 PL/SQL SELECT 문장을배우기전에꼭필요한몇가지용어부터정리하겠습니다. 행 row 열 column 일반용어 이터 이스용어 위그림에서왼쪽은우리가일반적으로사용하는용어들입니다. 자료를쉽고명료하게관리하기위해 표 라는것을만들어서사용하게됩니다. 그리고 표 에서가로를 행 이라고부르고세로를 열 이라고표현합니다. 데이터베이스란대량의데이터를보다잘관리하고운영하기위해사용하는프로그램입니다. 그래서데이터베이스내부에도대량의데이터를저장하기위해 테이블 (Table) 이라는표와유사한형태의객체를만들어서데이터를저장해놓고사용하게됩니다. 이테이블에서가로를 로우 (row) 라고부르고세로를 칼럼 (column) 이라고부릅니다. 데이터를가져오는방법은두가지로언급할수있습니다. 한가지는원하는특정칼럼만가져오는방법 ( 이방법을 Projection이라고도합니다 ) 이있고또한가지는 row를기준으로가져오는방법 ( 이방법을 Selection이라고도합니다 ) 이있습니다. 아래그림으로구분해보겠습니다. profno name id position pay hiredate bonus deptno 1001 조인형 captain 정교수 550 1980-06-23 100 101 1002 박승곤 sweety 조교수 380 1987-01-30 60 101 1003 송도권 powerman 전임강사 270 1998-03-22 101 2001 양선희 lamb1 전임강사 280 2001-09-01 102 2002 김영조 number1 조교수 350 1985-11-31 80 102 2003 주승재 bluedragon 정교수 490 1982-04-29 90 102 16
00 chapter 실습을시작하기전에 3001 김도형 angel1004 정교수 530 1981-100-23 110 103 3002 나한열 naone10 조교수 330 1997-07-01 50 103 3003 김현정 only-u 전임강사 290 2002-02-24 103 4001 심슨 simson 정교수 570 1981-01-31 130 201 4002 최슬기 gogogo 조교수 330 2009-08-30 201 4003 박원범 mypride 조교수 310 1999-12-01 50 202 4004 차범철 ironman 전임강사 260 2009-01-28 202 4005 바비 bobby 정교수 500 1985-09-18 80 203 4006 전민 napeople 전임강사 220 2010-06-28 301 4007 허은 silver-her 조교수 290 2001-05-23 30 301 위테이블은앞으로실습에서사용할테이블중하나인 professor 테이블입니다. 위표에서세로방향으로원하는칼럼만조회하는것을 Projection이라고하고, 가로방향으로원하는로우만조회하는것을 Selection이라고표현합니다. 17
pter Cha 01 SELECT 문장을 이용하여 원하는 데이터 가져오기 1. DESC 명령어 2. SELECT - 데이터 조회하기
Chapter 01 SELECT 문장을이용하여원하는데이터가져오기 우리가원하는데이터를조회할때해당테이블에어떤칼럼이있는지를먼저확인한후원하는칼럼만조회하는경우가많기때문에해당테이블에어떤칼럼이있는지부터확인해보겠습니다. 1. DESC 명령어 DESC 명령어는특정테이블에어떤칼럼이있는지조회하는명령어입니다. Describe의약자입니다. 아래와같이사용합니다. SCOTT>DESC emp ; Name Null? Type ------------------------ ------------------ -------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 20
01 chapter select 문장을이용하여원하는데이터가져오기 앞의결과를테이블로만들면아래와같습니다. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 앞의명령어로칼럼내역을조회한후원하는데이터를 SELECT 하면됩니다. 2. SELECT 데이터조회하기 문법 : SELECT [ 칼럼명또는표현식 ] FROM [ 테이블명, 뷰명 ] ; 연습용테이블인 emp 테이블에서데이터를조회하겠습니다. (1) 모든칼럼조회하기 SCOTT>SELECT * FROM emp ; 이렇게한줄에써도되고다음과같이여러줄에써도됩니다. SELECT 뒤에는원래칼럼이름이오는곳이지만모든칼럼을다조회하고싶은 경우에는위와같이칼럼명대신에 * 를사용해도됩니다. SCOTT>SELECT * 2 FROM emp ; 21
ORACLE 오라클 SQL 과 PL/SQL 단, 키워드인 SELECT, FROM 등은줄을바꾸면아래화면처럼에러가발생합 니다. SCOTT>SELECT * 2 FR 3 OM emp; FR * ERROR at line 2: ORA-00923: FROM keyword not found where expected SQL문은대소문자를구분하지않고입력해도수행되지만원래는구분합니다. 다음실습에서는키워드부분은대문자로입력하겠습니다. 또한 SQL은한줄에전부입력해도되고여러줄에입력해도되지만 SQL 키워드는분리해서는안됩니다. 그리고문장의마지막부분에는반드시 ;( 세미콜론 ) 을입력해주어야합니다. SQL 키워드는오라클에서미리정해놓은단어로 SELECT, FROM, WHERE 등을의미합니다. 참고 : 칼럼길이조정하는방법 결과가하나의화면에조회하기힘들게나오는경우는칼럼의길이를조절해서보면편합니다. 데이터가숫자일경우 형식 : COL empno FOR 9999 의미 : empno라는칼럼의길이를숫자 4자리까지들어가게설정하시오. 데이터가문자일경우 형식 : COL ename FOR a8 의미 : ename이란칼럼의길이를 8바이트까지들어가게설정하시오. 사용예 SCOTT>SET LINE 200 ; SCOTT>COL empno FOR 9999 empno 칼럼이숫자라서숫자 4자리로설정함 SCOTT>COL ename FOR a6 ename이문자라서 6바이트로설정함 22
01 chapter select 문장을이용하여원하는데이터가져오기 SCOTT>COL job FOR a10 SCOTT>COL mgr FOR 9999 SCOTT>COL sal FOR 99999 SCOTT>SET PAGESIZE 50 하나의화면에최대 50줄까지나오게설정함 SCOTT>SELECT * FROM emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------ ------ ------- --------- ---------- ------ ------- ------ 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 ( 중략 ) 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-8 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected. (2) 원하는칼럼만조회하기 SCOTT>SELECT empno, ename 2 FROM emp ; EMPNO ENAME -------- ---------- 7369 SMITH 7499 ALLEN 7521 WARD 7566 JONES 7654 MARTIN 7698 BLAKE ( 이하생략 ) 14 rows selected. 23
ORACLE 오라클 SQL 과 PL/SQL 앞의예처럼 SELECT 뒤에원하는칼럼이름만넣고조회하면됩니다. 조회하기 를원하는칼럼이여러개일경우,( 콤마 ) 로구분하고이름을여러개적어주면됩니다. (3) 표현식을사용하여출력하기표현식 (Expression) 이란칼럼이름이외에출력하기를원하는내용을의미하며 SELECT 구문뒤에 '( 홑따옴표 ) 로묶어서사용하면됩니다. 아래의예를보겠습니다. SCOTT>SELECT name, ' 교수님 ~ 배고파요 ~' 2 FROM professor ; NAME ' 교수님 ~ 배고파요 ~' ---------- -------------------------- 조인형 교수님 ~ 배고파요 ~ 박승곤 교수님 ~ 배고파요 ~ 주승재 교수님 ~ 배고파요 ~ ( 이하생략 ) 위 SELECT 절에서 교수님 ~ 배고파요 ~ 부분을 표현식 이라고도하고 리터럴 (literal) 상수 ( 문자 ) 라고부르기도합니다. (4) 칼럼별칭사용하여출력하기 별칭사용전화면 SCOTT>SELECT studno, name 2 FROM student ; STUDNO NAME -------------- ---------- 9411 서진수 9412 서재수 9413 이미경 24
01 chapter select 문장을이용하여원하는데이터가져오기 9414 김재수 ( 이하생략 ) 앞그림을보면 SELECT 뒤에적은칼럼이름이대문자로바뀌어서출력되는것 을볼수있습니다. 위예에서 studno, name 부분을다른이름으로변경해서 출력해보겠습니다. 별칭사용후화면 SCOTT>SELECT studno " 학번 ", name AS " 이름 ", profno 지도교수번호 2 FROM student ; 학번 이름 지도교수번호 ---------- ---------- ------------ 9411 서진수 1001 9412 서재수 2001 9413 이미경 3002 ( 이하생략 ) 위그림에서처럼출력결과화면에영어로나오던것이한글로보이게됩니다. 이것은원래테이블의칼럼이름이변경된것이아니라출력될때임시로저렇게바꾸어서보여주는것입니다. 이기능을칼럼별칭 (Column Alias) 이라고부릅니다. 이기능을쓰는방법은두가지인데, 한가지는칼럼이름뒤에공백을주고별명을쓰는것이고또한가지는칼럼이름뒤에 as라는키워드를사용한후별명을주는것입니다. 기능상차이는없으므로편한것을사용하면됩니다. 또한별명을줄때반드시 "( 쌍따옴표 ) 로감싸야하는경우도있는데이것은별명에공백이나특수문자, 대소문자구분이필요할경우에는반드시별명부분을 " 별명 " 과같은형태로써야합니다. 25
ORACLE 오라클 SQL 과 PL/SQL Alias 연습문제 1 emp 테이블을사용하여 empno 를사원번호, ename 을사원명, job 을직업으로별 명을설정하여출력하세요. Alias 연습문제 2 dept 테이블을사용하여 deptno 를부서 #, dname 을부서명, loc 를위치로별명을 설정하여출력하세요. (5) DISTINCT - 중복된값을제거하고출력하기데이터를조회하다보면중복된데이터가많이나오는경우가종종있는데경우에따라서는중복된데이터를빼고출력해야할경우가있습니다. 이럴때는 DISTINCT 키워드를사용하면됩니다. 아래의예로살펴보겠습니다. DIstINCt 사용전 DIstINCt 사용 앞의그림에서 DISTINCT 키워드를사용하지않았던왼쪽화면은 20건의로우가조회되지만 DISTINCT 키워드를사용한오른쪽화면에서는중복된데이터를모두제거하고 6건의로우만조회되는것을알수있습니다. DISTINCT 키워드는주의해서사용해야합니다. 다음예제로살펴보겠습니다. 26
01 chapter select 문장을이용하여원하는데이터가져오기 DIstINCt 사용안함 DIstINCt 사용함 두 럼 DIstINCt 사용함 2 1 위 1번그림은 DISTINCT를사용하지않아서총 14건의로우가조회되었습니다. 그리고 2번그림은 deptno 칼럼에만 DISTINCT를사용하여 3건의로우가조회되었습니다. 주의사항은 3번그림인데 deptno 칼럼과 job 칼럼을조회하는데 deptno 칼럼앞에만 DISTINCT 키워드가있습니다. 그러나결과를보면 job 칼럼까지 DISTINCT 키워드가적용된것을알수있습니다. 즉 DISTINCT 키워드는 1개의칼럼에만적어도모든칼럼에적용된다는것을알수있으며, 이로인해뜻하지않게성능저하가발생할수있으므로주의해서사용하기바랍니다. 참고로 oracle 9i 버전까지는 DISTINCT 키워드를만나면정렬을수행해서심각한속도저하가발생했으나, oracle 10g 버전부터는 HASH 알고리즘을사용하는방식으로변경되어서성능이많이향상되었습니다 ( 다음그림참조 : 이그림은실행계획을캡처한화면입니다 ). 27
ORACLE 오라클 SQL 과 PL/SQL DISTINCT 키워드는반드시 SELECT 키워드다음에와야하며그렇지않을경 우아래와같이에러가발생합니다. SCOTT>SELECT deptno, DISTINCT job FROM emp ; SELECT deptno, DISTINCT job * ERROR at line 1: ORA-00936: missing expression (6) 연결 ( 합성 ) 연산자 (Concatenation) 로칼럼을붙여서출력하기데이터를조회하다보면서로다른칼럼을마치하나의칼럼인것처럼연결해서출력해야할경우가종종있습니다. 예를들어, 회원가입을받을때성과이름을다른칼럼으로입력받았지만출력할때는한꺼번에출력하는경우등입니다. 이때아주유용하게사용할수있는연산자가지금부터살펴볼연결연산 28
01 chapter select 문장을이용하여원하는데이터가져오기 자입니다. 연결연산자는바기호를두번 ( ) 사용하면됩니다. 연결연산자미사용 연결연산자사용 SCOTT>SELECT name, position 2 FROM professor; NAME POSITION ----- ------- 16 rows selected SCOTT>SELECT name position 2 FROM professor; NAME POSITION ------------- 16 rows selected 위그림에서왼쪽화면은연결연산자를사용하지않고출력한결과이고오른쪽화면은연결연산자를사용하여두개의칼럼을마치하나의칼럼인것처럼합쳐서출력한화면입니다. 오른쪽화면의 SELECT 문장을보면 표시가사용된것을알수있습니다. 즉연결연산자가하는일은 기호를기준으로왼쪽과오른쪽칼럼을합쳐서하나의칼럼처럼화면에출력해주는것입니다. 연결연산자는하나만사용할수도있고여러개를함께사용할수도있습니다. 그리고연결연산자와리터럴문자를함께많이사용합니다. 다음화면을살펴보겠습니다. 29
ORACLE 오라클 SQL 과 PL/SQL SCOTT>SELECT name ' 님은 ' position ' 입니다 ' 2 FROM professor ; NAME ' 님은 ' POSITION ' 입니다 ' --------------------------------- 조인형님은정교수입니다박승곤님은조교수입니다송도권님은전임강사입니다양선희님은전임강사입니다김영조님은조교수입니다주승재님은정교수입니다김도형님은정교수입니다나한열님은조교수입니다김현정님은전임강사입니다심슨님은정교수입니다 ( 이하생략 ) 위그림에서원래의칼럼은 name과 position뿐이지만그사이에리터럴문자를사용하여함께출력하였습니다. 리터럴문자부분에원하는글자나기호를넣어서원하는대로출력할수있습니다. 연결연산자연습문제 1 학생테이블 (student) 을사용하여모든학생들이 ' 서진수의키는 180 cm, 몸무게는 55 kg 입니다 ' 와같은형식으로출력되도록리터럴문자를추가하고, 칼럼이름은 " 학생의키와몸무게 " 라는별명으로출력하세요. < 결과화면 > 30
01 chapter select 문장을이용하여원하는데이터가져오기 연결연산자연습문제 2 홍길동 ( 교수 ), 홍길동 ' 교수 ' 이렇게나오도록출력하세요. < 결과화면 > (7) 산술연산자사용하기 산술연산자는우리가알고있는 +, -, x, / 를의미하며 SQL 에서도해당연산 자를사용하여조회할수있습니다. 원래이런칼럼은없지만오라클이자동으로계산해서결과를보여줍니다. 산술연산자를사용할때주의사항은기존에알고있는내용과동일하게연산자의우선순위입니다. 예를들어, 더하기와곱하기가같이나오면곱하기가먼저수행되고더하기가나중에수행된다는것입니다. 이런우선순위를조절하려 31
ORACLE 오라클 SQL 과 PL/SQL 면괄호 ( ) 을사용하면됩니다. 아래의화면을보겠습니다. (8) WHERE 절을활용하여원하는조건만조회하기 데이터를조회하다보면원하는데이터만골라서조회할경우가많이있습니다. 그때는 WHERE라는키워드를사용하여원하는조건을알려주면됩니다. 문법 SELECT [ Column or Expression ] FROM [ Table or View ] WHERE 원하는조건 ; 위문법에서보듯이 WHERE 절은반드시 FROM 절아래에와야만합니다. 다음의여러가지예제를통해서 WHERE 절의사용방법을익히도록하겠습니다. 예제 1 emp 테이블에서 10 번부서에근무하는사원의이름과급여와부서번호를출력하 세요. 32
01 chapter select 문장을이용하여원하는데이터가져오기 예제 2 Emp 테이블에서급여 (sal) 가 4000 보다큰사람의이름과급여를출력하세요. 예제 3 Emp 테이블에서이름이 SCOTT 인사람의이름과사원번호, 급여를출력하세요. 위예제 3번에서중요한부분이있습니다. WHERE 절에조건으로주어지는것이숫자일경우는그냥써도조회가되지만문자나날짜를조회할경우에는반드시 ' 조건 ' 처럼홑따옴표로둘러싸야한다는것입니다. 특히문자의경우는대소문자를구분한다는점꼭기억해야합니다. 대소문자를구분하는예를보겠습니다. 33
ORACLE 오라클 SQL 과 PL/SQL 위그림처럼분명히 ename 이 scott 이있으나 DB 에저장될때대문자로저장되 었기때문에 WHERE 절에소문자로조건을주면조회가되지않습니다. 이번에는날짜로조회하겠습니다. 날짜부분을홑따옴표로묶지않아서에러가발생합니다. 위그림에서는 WHERE 절에서날짜부분을홑따옴표로묶어서검색했습니다. 34
01 chapter select 문장을이용하여원하는데이터가져오기 위그림에서는날짜부분을소문자로썼는데도이상없이조회됨을알수있습니다. 검색조건을쓸때숫자이외에는꼭홑따옴표를쓰고대소문자를구분한다는것기억하세요. (9) 다양한연산자를활용하는방법 연산자종류 설명 = 같은조건을검색!=, <> 같지않은조건을검색 > 큰조건을검색 >= 크거나같은조건을검색 < 작은조건을검색 <= 작거나같은조건을검색 BETWEEN a AND b IN(a,b,c) Like Is Null / Is Not Null A AND B A OR B NOT A A와 B 사이에있는범위값을모두검색 A이거나 B이거나 C인조건을검색특정패턴을가지고있는조건을검색 Null 값을검색 / Null이아닌값을검색 A 조건과 B 조건을모두만족하는값만검색 A 조건이나 B 조건중한가지라도만족하는값을검색 A가아닌모든조건을검색 위에서나온연산자들을어떻게활용하느냐가중요합니다. 다음의여러가지예제들을통해연산자를활용하는방법을배우겠습니다. 35
ORACLE 오라클 SQL 과 PL/SQL 예제 1 비교연산자를사용하여 Student 테이블에서키 (height) 가 180cm 보다크거나같 은사람을출력하세요. 주의사항은 >= 에서 > 과 = 사이에공백이들어가면안된다는것과 > 과 = 의순서가바뀌어도안된다는것입니다. 예제 2 Between 연산자를사용하여 Student 테이블에서몸무게 (weight) 가 60kg~80kg 인사람의이름과체중을출력하세요. 주의 BETWEEN 연산자는주의사항이있습니다. 1. 두개의값중에작은값이먼저오고큰값이나중에와야합니다. 2. 두개의값을다포함하여출력됩니다. BETWEEN 연산자대신에위쿼리를다음과같이검색해도됩니다. 36
01 chapter select 문장을이용하여원하는데이터가져오기 위두가지쿼리는결과는같으나 BETWEEN 연산자를사용하는것이쿼리가훨씬더간결해진다는장점이있습니다. 그러나성능측면에서보면 BETWEEN 연산자를사용하는것보다비교연산자를사용하여쿼리를작성하는것을권장합니다. 왜냐하면 BETWEEN 연산자를사용하여쿼리를작성하더라도오라클내부적으로비교연산자로변경해서작업을수행하기때문입니다. 예제 3 IN 연산자를사용하여 Student 테이블에서 101 번학과학생과 201 번학과학생들 을모두출력하세요. 이 SQL 의 WHERE 절부분을 " WHERE deptno1 = 101 OR deptno1 = 201 " 로사용할수도있지만쿼리가너무길어져서간편하게 IN 연산자를사용하는것입니다. 37
ORACLE 오라클 SQL 과 PL/SQL 예제 4 Like 연산자를사용하여 student 테이블에서성이 " 김 " 씨인사람을조회하세요. 위 Like 예제에서 Like 와함께사용되는기호가 % 와 _ 두가지가있으며의 미는아래와같습니다. %: 글자수제한없고어떤글자가와도상관없습니다. _ (Underscore): 글자수는한글자만올수있고어떤글자가와도상관없습니다. 예를들어, 전체이름글자수가 3글자인데성은 김 이고마지막글자가 호 인사람을찾는다면 WHERE name LIKE ' 김 _ 호 ' ; 이렇게검색하면됩니다. 만약검색하고자하는문자에 % 나 _ 가있을경우에는아래와같이 Escape 문자로표시를해주어야합니다. SQL> SELECT employee_id, last_name, job_id 2 FROM employees 3 WHERE job_id LIKE '%SAW_%' ESCAPE 'W' ; 1 IS NULL / IS NOT NULL 연산자를활용하기 Null이란오라클의데이터종류중한가지로어떤값인지모른다는의미입니다. 예를들어, A라는사람의나이가 30살이고 B의나이가얼마인지모른다면 B의나이를 Null이다라고말하는것입니다. 이런특징때문에 Null에는어떤연산을수행해도결과값은늘 Null이나오게됩니다. 앞에서예를든경우처럼 B의나이가얼마인지모르는데 10살을더해도몇살인지모르는건마찬가지라 38
01 chapter select 문장을이용하여원하는데이터가져오기 는뜻입니다. 또 A가 30살이고 B의나이가 Null이라면누가더나이가많은지비교할수도없다는뜻이됩니다. 그래서 Null에는어떤연산을해도결과는 Null이나오게됩니다. 이런특징때문에 Null 값은 = 연산을사용할수없습니다. 이부분이 Null입니다. Null 값을 = 조건을주고검색하면 no rows selected. 라고나오면서값을조회하지못합니다. 그이유는아래와같습니다. 예를들어, bonus가 100인사람을검색하고싶으면 bonus = 100이라고합니다. 이말은 bonus의값이 100과같다는뜻이니까조금표현을바꾸면 100 = 100과같은조건을만족하는데이터를모두조회하라는뜻이됩니다. 그렇다면 bonus가 null인사람을조회하기위해 bonus = null이라고쓴다면이말은 Null = Null이라는의미이며이조건을만족하는데이터를전부조회하라는뜻이됩니다. 언뜻보면맞는표현같지만 A가몇살인지모르고 (Null) B도몇살인지모를때 (Null) A와 B가나이가같다는건알수없는것입니다. 그래서 Null 값을가진데이터가있다하더라고검색할수없게됩니다. 이런이유때문에 Null 값을찾고싶을땐 = 연산자를사용할수없어서별도의연산자가만들어졌고 Null 값을찾고싶을때는 IS NULL, Null 값이아닌 39
ORACLE 오라클 SQL 과 PL/SQL 모든값을찾고싶을때는 IS NOT NULL 을사용하게됩니다. 실무에서 Null 값때문에의도하지않은오류가발생하는경우가많기때문에 Null 값의특징을잘알고있어야합니다. 2 검색조건이두개이상일경우조회하기 예제 1 student 테이블을사용하여 4 학년중에서키가 170cm 이상인사람의이름과학년 과키를조회하세요. 두가지조건을모두만족하는결과를검색할때는 AND 연산자를사용하여조건을적으면됩니다. 40
01 chapter select 문장을이용하여원하는데이터가져오기 예제 2 student 테이블을사용하여 1 학년이거나또는몸무게가 80kg 이상인학생들의이 름과키와학년과몸무게를출력하세요. 두가지조건중한가지만만족하는행을검색하고싶으면 OR 연산자를사용하면됩니다. 예제 3 Student 테이블을사용하여 2 학년중에서키가 180cm 보다크면서몸무게가 70kg 보다큰학생들의이름과학년과키와몸무게를출력하세요. 조건이여러개이고모두만족하는경우 AND 를여러번쓰면됩니다. 41
ORACLE 오라클 SQL 과 PL/SQL 예제 4 Student 테이블을사용하여 2 학년학생중에서키가 180cm 보다크거나또는몸무 게가 70kg 보다큰학생들의이름과학년과키와몸무게를출력하세요. AND 와 OR 조건이동시에나올경우에는우선순위를조심해야합니다. 위예제 4에서는연산자를특히주의해야합니다. 만약괄호부분을빼버리면의도하지않는결과가아래와같이나오게됩니다. 위결과는 2학년중에서키가 180cm보다큰학생과학년에상관없이몸무게가 70kg보다많은학생들의명단을출력하는결과가됩니다. 항상검색조건이여러가지일경우우선순위를주의하면서쿼리를작성하기바랍니다. 42
01 chapter select 문장을이용하여원하는데이터가져오기 일반연산자퀴즈 Professor 테이블에서교수들의이름을조회하여성부분에 ' ㅈ ' 이포함된사람의 명단을아래와같이출력하세요. 1 1 번화면이 professor 테이블에서이름을조회한화면입니다. ORDER BY 라는구문은정렬을해서보여달라는뜻인데뒤에살펴봅니다. 2 번화면이성부분에 ' ㅈ ' 이들어간사람만출력한화면입니다. 2 IN (' 전민 ',' 조인형 ',' 주승재 ') 이렇게하진않을거죠? 이런거였으면퀴즈도안냈을겁니다. (10) ORDER BY 절을사용하여출력결과정렬하기보통데이터가많을경우에는정렬을해서보는경우가많습니다. SQL에서는 ORDER BY라는절을사용하여정렬을하게됩니다. 정렬은오름차순과내림차순두가지의경우가있으며기본값은오름차순이며아래와같습니다. 한글 : 가, 나, 다, 라 영어 : A, B, C, D 숫자 : 1, 2, 3, 4 날짜 : 예전날짜부터시작해서최근날짜로정렬됩니다. 위에서주의할부분은날짜부분입니다. 날짜는최근날짜가더크다는것꼭기억하기바랍니다. ORDER BY 절은 SQL 문장의가장마지막에적어야합니다. 그리고오름차순은 ASC, 내림차순은 DESC로표시해야하며기본값이오름차순이기때문에정렬방식을생략하게되면자동으로 ASC 방식이적용됩니다. 다음의예로여러가지경우를확인하겠습니다. 43
ORACLE 오라클 SQL 과 PL/SQL 예제 1 student 테이블을사용하여 1 학년학생의이름과키를출력하세요. 단, 키가작은 순서대로출력하세요. 1 2 위화면에서왼쪽 1번화면은정렬을하지않고출력한것이고오른쪽 2번화면은오름차순으로정렬한화면입니다. 오른쪽화면에서 ORDER BY height ASC ; 이렇게해야하지만 ASC를생략하면자동으로 ASC로인식하므로위와같은결과가나온것입니다. 예제 2 Student 테이블을사용하여 1 학년학생의이름과키와몸무게를출력하세요. 단, 키는작은사람부터출력하고몸무게는많은사람부터출력하세요. 위의예에서두개의칼럼 ( 키, 몸무게 ) 에동시에정렬이수행되면우선앞에칼럼기준으로먼저정렬을한후뒤칼럼의정렬을수행하게됩니다. 즉앞에칼 44
01 chapter select 문장을이용하여원하는데이터가져오기 럼에같은키가있을경우위에칼럼에서몸무게가무거운사람이먼저나온다는뜻입니다. 예제 3 Student 테이블을사용하여 1 학년학생의이름과생일과키와몸무게를출력하세 요. 단, 생일이빠른사람순서대로정렬하세요. 위의예에서 ORDER BY 절에칼럼이름이아닌숫자 2가나왔습니다. 이는 SELECT 절에서 2번째칼럼인 birthday 칼럼으로정렬하라는의미입니다. 칼럼이름이최대 30bytes까지가능하기때문에긴칼럼이름을사용했을경우아주유용한방법입니다. 예제 4 칼럼의별명을사용한정렬 Student 테이블을사용하여 1 학년학생의이름과키를출력하세요. 단, 이름을오 름차순으로정렬하세요. 45
ORACLE 오라클 SQL 과 PL/SQL 앞예제와같이칼럼의별명을사용하여정렬하는것도가능합니다. 지금까지데이터를보기좋게출력하기위해서정렬을하는방법을살펴보았습니다. 그러나 ORDER BY 구문은 SQL에서정말최대한피해야하는명령어중한가지입니다. 정렬해야하는데이터의양이적을경우는크게상관없지만데이터가많을경우에정렬을한다는것은 DBMS에게큰부담을주는명령어이기때문입니다. 그렇다고해서정렬을하지않는다면데이터를보기가어렵기에 ORDER BY 절을쓰지않고정렬을하는기술들을습득해야합니다. 주로인덱스를활용해서 ORDER BY 구절을사용하지않고정렬을하게됩니다. 보다자세한사항은이책의인덱스부분을참고하기바랍니다. (11) 집합연산자 (Set Operator) 집합이라고하는것은여러건의데이터가모여있다는뜻입니다. 지금까지살펴본산술연산자들은하나의데이터들끼리연산을하는것이었으나지금부터살펴볼집합연산자는여러건의데이터들 ( 집합 ) 을연산하는것입니다. select 1 a B C 집합 1 select 2 C D e = 집합 2 결과 a B C D e 결과 집합연산자는 4 가지종류가있으며각각하는일은아래와같습니다. 연산자종류 UNION UNION ALL INTERSECT MINUS 내용두집합을더해서결과를출력. 중복값제거하고정렬함두집합을더해서결과를출력. 중복값제거안하고정렬안함두집합의교집합결과를출력. 정렬함두집합의차집합결과를출력. 정렬함. 쿼리의순서중요함 46
01 chapter select 문장을이용하여원하는데이터가져오기 앞 4가지의집합연산자를사용할경우에주의사항은아래와같습니다. 첫째, 두집합의 SELECT 절에오는칼럼의개수가동일해야합니다. 둘째, 두집합의 SELECT 절에오는칼럼의데이터형이동일해야합니다. 셋째, 두집합의칼럼명은달라도상관없습니다. 아래의예제들로앞연산자들을하나씩자세하게살펴보겠습니다. 1 UNION / UNION ALL( 두집합을더합니다.) UNION과 UNION ALL 연산자는두집합을더해서결과를출력합니다. 차이점은 UNION은두결과에서중복된값을제거하고출력하고 UNION ALL은중복되는값까지전부다출력한다는점입니다. 그리고 UNION은출력결과를정렬을해서보여주고 UNION ALL은정렬을하지않고그냥보여주게됩니다. 예제 1 Student 테이블과 professor 테이블을참조하여 101 번학과에소속되어있는학생 과교수들의학번 ( 교수는교수번호 ), 이름, 학과번호를출력하세요. 위그림에서왼쪽그림은 UNION 연산자를사용하였고오른쪽그림은 UNION ALL을사용하였습니다. 왼쪽그림은정렬이되어서나왔고오른쪽그림은정렬이안된것보이죠? 만약중복되는데이터가있었다면왼쪽에는안보이고오른쪽에는보일것입니다. 47
ORACLE 오라클 SQL 과 PL/SQL 예제 2 Student 테이블에서 101 번학과와 201 번학과를전공하는학생들의이름을출력 하세요. 위그림에서왼쪽그림은 UNION 연산자를써서중복되는서진수학생의이름이 1회만나오고오른쪽그림은서진수학생이 2번다나옵니다. 즉서진수학생은복수전공자라는의미입니다. 2 INTERSECT 연산자사용하기 INTERSECT 연산자는두집합의교집합부분을찾아내는집합연산자입니다. 예제 stduent 테이블을사용하여 101 번학과와 201 번학과를복수전공하는사람의이름 을출력하세요. 48
01 chapter select 문장을이용하여원하는데이터가져오기 앞의예에서 deptno1 칼럼은 1 전공이고 deptno2 칼럼은 2 전공을의미합니다 ( 복수전공자를구분하기위해서사용합니다 ). 3 MINUS 연산자사용하기 MINUS 연산자는큰집합에서작은집합을빼는집합연산자입니다. 아래의예로사용법및주의사항을살펴보겠습니다. 예제 professor 테이블에서전체직원의급여를 20% 인상하기위한직원명단을출력 하려합니다. 단, 직급이전임강사인사람들은명단에서제외하세요. 위의그림에서왼쪽화면은전체명단 (16명) 이고오른쪽화면은전임강사들이빠진명단 (11명) 입니다. 그리고왼쪽화면을보면 MINUS 연산자도결과값을정렬한다는것을알수있습니다. 즉데이터량이많을경우시간이오래걸린다는뜻입니다. MINUS 연산자는어떤쿼리를먼저쓰는가가아주중요합니다. 즉 3-5와 5-3 이결과가다른것처럼 MINUS 연산자에서도먼저쓰는쿼리결과집합에서나중에오는쿼리를빼기때문에만약에쿼리를바꾸어서작성한다면결과값은오류가될것입니다. 아주중요한내용이므로꼭기억하기바랍니다. 49
ORACLE 오라클 SQL 과 PL/SQL 만약집합연산자를사용할때두개의쿼리의칼럼결과가다르거나데이터형이다르면아래와같은에러가발생하게됩니다. SELECT 절의칼럼개수가다를경우발생하는에러입니다. SELECT 절의칼럼의데이터타입이다를경우발생하는에러입니다. 여기까지 SELECT 문장의가장기본적인문법들과조건검색방법, 일반연산자와집합연산자사용방법등을살펴보았습니다. 다음장에서는 SQL 작성시중요한함수들에대해서살펴보겠습니다. 50
저자와의협의에의해인지를생략합니다. 다양한예제로쉽게배우는오라클 SQL 과 PL/SQL 서진수지음 - 경기도파주시문발동 507-12 파주출판도시대표전화 : (031)955-0761, FAX : (031)955-0768 홈페이지 : http://www.booksr.co.kr 초판인쇄 : 2012. 10. 18 초판발행 : 2012. 10. 26 발행인 : 김승기 발행처 : 생능출판사 신고번호 : 제 406-2005-000002 호 신고일자 : 2005. 1. 21 I S B N : 978-89-7050-752-1(93000) * 파본및잘못된책은바꾸어드립니다. 정가 27,000원