상세 컨텐츠

본문 제목

데이터베이스시작

데이터베이스

by 김일국 2010. 4. 22. 15:42

본문

//=================================================================================================

#작업01

 

데이터베이스에서 반드시 알아야 할 사항 10가지


1. 설치 및 환경구성

 a. http://www.microsoft.com/korea/msdn/studio/express
 i. http://www.oracle.com/technology/software/product/database/index.html

 b. SQL 서버 -속성 - 보안 탭 - Windows 인증 -> SQL Server 인증으로 변환 - 다시 시작(마우스우측버턴)

 c. SQL 서버의 최고관리자 아이디인 sa 사용자의 암호설정 또는 로그인 허용
 i. 서버 - 보안 탭 - sa 사용자 - 속성 - 상태 - 로그인

 d. SQL Server 인증으로 다시 로그인

 e.설치 후 로그인 관련된 이슈
 i. 서버:
 1) (local): SQL Server 정식 버전 설치 시 기본   ->    .(쩜)==(local)==컴퓨터명
 2) (local)\SQLEXPRESS: SQL Server Express 설치시 기본
 3) (local)\다른 인스턴스이름:설치 과정에서 다른이름으로 설치되었을
   때 ??? SQL서버 구성 관리자에서 확인 가능

2. 데이터베이스 : 실제 데이터가 저장되는 물리적인 공간/캐비넷
 닷넷코리아 모든 정보 => dotnetkoreaMDF  ... DB
 옥션 모든 정보 => auctionMDF

 DB명 : dotnetkorea
 
  파일명  
 MDF dotnetkoreaMDF      Primary Data File : 실제 데이터
 LDF dotnetkorea_logLDF  Log Data File 로그(DB정보)
 NDF *NDF               Secondary Data File : 확장할 때만 사용

* 하나의 큰 파일이 여러개의 물리적인 파일로 쪼갤 수 있다


3.로그인 사용자

 a. sa(System Administrator) : SQL 서버의 모든 데이터베이스 주인(Owner)
 b. 로그인 사용자 : 아이디/암호 -> 특정 DB에 권한 부여 => db owner
 i. 아이디 : MyUid
 ii. 암호 : MyPwd
 iii. 데이터베이스 : Mydatabase
 iV. 권한 : db owner

4. 원격 접속 : OLE DB 접속 연습 :  데이터베이스 연결문자열 생성

 a. UDL(원격접속테스트) 파일을 사용해서 4가지 ... 서버/데이터베이스/아이디/암호/  
  설정테스트
---------------------------------------------------------------------------


테스트1

1. 서버 (local)\SQLEXPRESS

2. DB
 AAA

3. UID/PwD
 UID : AAA
 PwD : 1234

4. OLE DB

AAA.UDL
데이터베이스연결문자열
ConnectonString

 

테스트2
---------------
1. 서버 (local)\SQLEXPRESS

2. DB
 Naver

3. UID/PwD
 UID : Naver
 PwD : 1234

4. OLE DB

Naver.UDL
데이터베이스연결문자열
ConnectonString


이상,

1분, 1분, 1분... 총 4분 밖에 안걸린다.
==============================================================

 

5. 테이블 : 데이터베이스에서 실제로 데이터가 표(Table)형태로 저장되는 공간

 a. Memos 테이블 설계(관리도구(EM)/쿼리편집기(QA))

6. SQL 문               (SQL Server, Oracle 똑같다)

 a. DML(Data Manipulation Language)  데이터 처리/조작 언어

 i) Insert문 입력
 ii) Select문 출력
 iii) Update문 수정
 iv) Delete문 삭제

 b. DDL(Data Definition/Description Language) 데이터 정의/기술 언어

 i) Create문 구조생성
 ii) Alter문 구조수정 // Alter 블럭 씌운 후 [Shift]+[F1] 키 ---> 도움말
 iii) Drop문 구조삭제

* 하나의 테이블에 6개 예시문
1) 입력/출력/상세/수정/삭제/검색

7. T-SQL, PL SQL : SQL 구문내에서 사용하는 간단한 프로그래밍 문법


8. SQL 객체 테이블 뷰 인덱스 저장프로그램

 a. 테이블
 
 b. 뷰

 c. 저장 프로시져  -> SQL 구문을 프로그래밍화(간단한 명령어로 대체)
          i. 긴 명령어를 간단한 구문으로 대체
          ii. 복잡 또는 여러개의 SQL문을 묶어서 하나의 저장프로시저로 호출 가능

---------------------------------------------------------------

9. DTS : 데이터변환서비스(데이터가져오기/내보내기) : 로컬 DB <-> 원격 DB

 Export/Input

10. 백업/복원

 

 

//=================================================================================================

#작업02

 

오라클 설치
->

[1] 고정IP에서만 설치됨 ... (버츄얼PC 에서 자동-> 수동으로 변환)

[2] 데이터베이스 이름 orcl
[3] 아이디 orcl
[4] sys

 

 


시작할 때 알아두면 좋은 SQLPLUS 명령어  
 
1. 최고관리자 권한으로 접속하기
C:\>sqlplus system/orcl

2. 빠져나오기
SQL> exit

3. 최고관리자 권한인 sys로 로그인 하기
C:\>sqlplus sys/orcl as sysdba

4. 잠겨있는 hr 사용자 사용 허용 : system, sys와 같은 최고관리자 권한으로
SQL> alter user hr account unlock;

5. hr 사용자의 암호를 hr로 변경
SQL> alter user hr identified by hr account unlock;

6. 중지되어져 있는 오라클 엔진 가동
C:\>sqlplus sys/orcl as sysdba
SQL> startup

7. 다른 사용자로 접속하려면(connect)… sys에서 system으로...
SQL> conn system/orcl

8. scott 사용자의 암호를 scott로 변경
SQL> alter user scott account unlock;
SQL> alter user scott identified by scott account unlock;

9. 현재 내가 접속중인 사용자 이름
SQL> show user
USER은 "HR"입니다

10. 현재 접속중인 사용자가 관리할 수 있는 SQL개체 목록 나열
SQL> select * from tab;
 

*
안될 때 네이버 지식인
http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10110&eid=7x1
/EjFcjE34Sdv7Kcp3ss6KMrC3wYR9&qb=T1JBLTAxMDM0OiBPUkFDTEUgbm90IGF2YWlsYWJsZQ==


C:\>sqlplus "/as sysdba"
SQL> startup

 

 


* SQL PLUS 에 접속하는 3가지 방법

1)콘솔 프로그램: 시작 - cmd

 sqlplus 아이디/암호

2) Windows 프로그램 오라클 응용프로그램개발- SQL PLUS

3) Web 응용프로그램

 http://localhost5560/sqlplus
   또는
 http://컴퓨터명:5560/sqlplus

 

 

 

//=================================================================================================

#작업03

 

1. 설치

 .\SQLEXPRESS

2. 데이터베이스

 abc

3. 로그인사용자

 abc 데이터베이스에 접속할 수 있는 계정
 아이디 : abc
 암호 : 1234
  권한 : db_owner


4. ODBC 및 OLE DB 설정 : 데이터베이스 연결문자열

 ODBC -> 요건 옛날 꺼 요즘은 안씀

 abc.UDL 파일로 4가지 테스트
  server == Data source
  db == Initial Catalog
  uid == User ID
  pwd == Password

Provider=SQLOLEDB.1;
Persist Security Info=False;
User ID=abc;
Initial Catalog=abc;
Data Source=(local)\SQLEXPRESS


5. 테이블 : 닷넷코리아 / 한줄메모장과 동일한 기능을 구현하고자 한다면...
 한줄메모장

    필드명    데이터형식    제약조건
  ==================================
  - 번호 ... 정수형,    자동증가
  - 이름 ... 문자열
  - 이메일 ... 문자열,    널허용
  - 메모(제목) ... 문자열
  - 작성일 ... 날짜형   디폴트 ... GetDate()
  - IP주소 ... 문자열

 식별자(기본키)
  - 유일한 값(UNIQUE)
  - 해당 레코드를 구분짓는 필드

 

//=================================================================================================

#작업04


테스트(1~6)

www.zzz.com 의 데이터는 어디에 보관할꺼냐? -> SQL

1. 설치

 .\SQLEXPRESS  또는 (local)\SQLEXPRESS

2. 데이터베이스

 zzz

3. 로그인사용자

 zzz 데이터베이스에 접속할 수 있는 계정
 아이디 : zzz
 암호 : 1234
  권한 : db_owner


4. ODBC 및 OLE DB 설정 : 데이터베이스 연결문자열

 zzz.UDL 파일로 4가지 테스트
  server == Data source
  db == Initial Catalog
  uid == User ID
  pwd == Password

Provider=SQLOLEDB.1;
Persist Security Info=False;
User ID=zzz;
Initial Catalog=zzz;
Data Source=(local)\SQLEXPRESS


5. 테이블 : 닷넷코리아 / 한줄메모장과 동일한 기능을 구현하고자 한다면...
 한줄메모장

    필드명    데이터형식    제약조건
  ==================================
  - 번호 ... 정수형,    자동증가
  - 이름 ... 문자열
  - 이메일 ... 문자열,    널허용
  - 메모(제목) ... 문자열
  - 작성일 ... 날짜형   디폴트 ... GetDate()
  - IP주소 ... 문자열

 식별자(기본키)
  - 유일한 값(UNIQUE)
  - 해당 레코드를 구분짓는 필드

--------------------------------------------------

* Select문

 Select      필드명리스트
  From      테이블리스트
  Where      필드에 대한 조건
  Group By     집계함수 이외의 필드 출력시
  Having    집계함수할 필드의 조건처리
  Order By      정렬조건 처리

 


* 테이블 구조 삭제
Drop Table dbo.Memos
Go

 


 

//=================================================================================================

#작업05

 

오라클 명령어
교재 59페이지

* 명령어는 SQL이나 ORCL이나 다 똑같다

--[1] hr 사용자로 로그인
C:\>sqlplus hr/hr

--[2] hr 사용자가 관리하는 테이블 목록 나열
select * from tab;

--[3] employees 테이블에 있는 모든 데이터(레코드)출력
SQL> select * from employees;

--[4] employees 테이블의 내용 중 employee_id, last_name 만 출력
select employee_id, last_name from employees;

--[5] 성이 'King'인 사용자의 사번과 입사일
select employee_id, hire_date from employees where last_name='King';

--[6] 연봉이 $10,000 이상인 사람의 사번, 이름 출력
select employee_id, last_name
from employees
where salary >= 10000;

--[7] 연봉이 10,000이상 20,000 이하인 사람의 사번 출력
select employee_id, last_name
from employees
where salary >= 10000 and salary <= 20000 ;
select employee_id, last_name
from employees
where salary between 10000 and 20000;

--[8] 직무가 'FI_MGR' 또는(or) 'FI_ACCOUNT' 사원 정보 출력
select employee_id, last_name
from employees
where job_id = 'FI_MGR' or job_id = 'FI_ACCOUNT';
select employee_id, last_name
from employees
where job_id in ('FI_MGR', 'FI_ACCOUNT');

--[9] 커미션을 받는 사람의 사번 출력
select employee_id
from employees
where commission_pct is not null; -- commission = null이 아님

--[10] 97년도에 입사한 사원의 정보 출력
select employee_id
from employees
where hire_date between '97/01/01' and '97/12/31';
select employee_id
from employees
where hire_date like '97%'; -- 97로 시작하는 모든것(%)

--[11] 성이 '~in'으로 끝나는 사원
select last_name
from employees
where last_name like '%in';


--[12] 사원 테이블에서 연봉이 10000이상일때, 높은 순서대로 출력
-- ASC : 오름차순 정렬 : 1, 2, 3순, 가나다 순, ABC순, 작은것부터 큰 순, 생략가능(기본값)
-- DESC : 내림차순 정렬 : 3,2,1순
select employee_id, salary
from employees
where salary >= 10000
order by salary desc;

--[13] 2000년 이후 입사한 사원을 최근 입사일 순으로 출력
select employee_id, hire_date
from employees
where hire_date >= '00/01/01'
order by hire_date desc;

--[14] 사원들의 연봉의 평균 : Avg() 함수 사용
Select Avg(salary) From employees

--[15] 사원들의 급여 평균 출력시 부서 번호까지 출력(부서별)
-- 집계함수(avg(),sum())이외의 필드에 대해서는 group by로 묶어라
select department_id, avg(salary)
from employees
group by department_id;

--[16] 부서별 급여 평균이 10000이상인 사원정보의 부서명, 급여평균 출력
-- 집계함수 결과에 대한 조건 처리는 Having절에서 처리한다.
select department_id, avg(salary)
from employees
group by department_id
having avg(salary) >= 10000;

--[17] Select문 전체 모양
Select     필드명리스트
From       테이블리스트         ... JOIN on 도 있음
Where      필드에 대한 조건
Group By   집계함수 이외의 필드 출력시
Having     집계함수할 필드의 조건처리
Order By   정렬조건 처리

 

 

//=================================================================================================

#작업06


오라클 명령어

--[1] 최고관리자로 접속하여 scott 사용자의 암호를 scott로 변경
C:\>sqlplus system/orcl
SQL> alter user scott identified by scott account unlock;

--[2] scott 사용자로 로그인
SQL> conn scott/scott

--[3] scott 사용자가 관리하는 테이블 목록
SQL> select * from tab;

--[4] 특정 테이블의 구조(필드 리스트/데이터형식/제약조건) : desc
SQL> desc dept;

--[5] dept 테이블에 모든 정보(레코드)를 출력
SQL> select * from dept;

--[6] 모든 필드가 아닌, 필요한 필드 내용만 출력
SQL> select deptno, dname, loc from dept;

--[7] 각각의 필드명에 별칭을 주어서 출력
SQL> select deptno as "부서번호" from dept;
SQL> select deptno "부서번호" from dept; -- as 생략가능

--[8] 사원들의 직업명을 중복 제거 후 출력
SQL> select distinct job from emp;

--[9] 급여가 3000 이상인 사원 정보 출력
SQL> select empno, ename, sal from emp
  2  where sal >= 3000;

--[10] 이름이 'SCOTT' 사원의 정보 출력
SQL> select empno, ename, sal from emp where ename = 'SCOTT';

--[11] 1985년도 이후로 입사한 사원 정보
SQL> select empno, ename, hiredate from emp
  2  where hiredate >= '1985/01/01';

--[12] and : 부서번호가 10이고 그리고 직업이 'MANAGER'인 사원
SQL> select ename from emp where deptno = 10 and job = 'MANAGER';

--[13] or : 부서번호가 10이거나 또는 직업이 'MANAGER'인 사원
SQL> select ename from emp where deptno = 10 or job = 'MANAGER';

--[14] not : 부서번호가 10이 아닌 사원
SQL> select deptno, ename from emp where not (deptno = 10);
SQL> select deptno, ename from emp where deptno <> 10;

--[15] 급여가 1000~3000 사이인 사원
SQL> select ename, sal from emp
  2  where sal >= 1000 and sal <= 3000;
SQL> select ename, sal from emp
  2  where sal between 1000 and 3000;

--[16] 급여가 1300 또는  1500 또는 1600인 사원 정보 출력
SQL> select ename, sal from emp
  2  where sal = 1300 or sal = 1500 or sal = 1600;
SQL> select ename, sal from emp
  2  where sal in (1300, 1500, 1600);

--[17] 이름이 'K'로 시작하는 사원
SQL> select empno, ename from emp
  2  where ename like 'K%';

--[18] 이름이 'K'로 끝나는 사원
SQL> select empno, ename from emp
  2  where ename like '%K';

--[19] 이름에 'K'가 들어가는 사원
SQL> select empno, ename from emp
  2  where ename like '%K%';

--[20] 2번째에 A가 들어가는 사원
SQL> select empno, ename from emp
  2  where ename like '_A%';

--[21] 커미션을 받지 않는 사원
SQL> select empno, ename, comm from emp
  2  where comm is null;

--[22] 커미션을 받는 사원
SQL> select empno, ename, comm from emp
  2  where comm is not null;

--[23] 사번의 정순(ASC;Ascending;오름차순)으로 출력
SQL> select empno, ename
  2  from emp
  3  order by empno asc; -- asc 생략 가능

--[24] 사번을 기준으로 역순(DESC;Descending;내림차순) 출력
SQL> select empno, ename
  2  from emp
  3  order by empno desc;

 


오라클 명령어 : 집계 함수

합계 : sum()
     SQL> select sum(sal) from emp;
카운트 : count()
     SQL> select count(*) from emp;
평균 : avg()
     SQL> select avg(sal) from emp;
최대값 : max()
     SQL> select max(sal) from emp;
최소값 : min()
     SQL> select min(sal) from emp;
    
Group by 절 : 직업별 급여 평균
SQL> select job, avg(sal)
  2  from emp
  3  group by job;

Having 절 : 직업별 급여 평균(단, 급여 평균 2000이상)
SQL> select job, avg(sal)
  2  from emp
  3  group by job
  4  having avg(sal) >= 2000;

Select
From Join on
Where
Group By
Having
Order By

 

* 다른점

첫(n)번째  프로그램 언어 -> n-1 규칙(0부터 카운트)
           데이터베이스  -> n 규칙 (1부터시작)

데이터베이스 -> 영1바이트, 한 2바이트
시 샵         -> 유니코드 ... 영한 모두 2바이트


"세계문자 표준 - 유니코드"
현재 유니코드 표준은 24개 언어를 지원하기 위해 34,168개의 개별 코드문자를 담고 있는데,
이 문자들은 세계 주요 언어로 작성된 문자들을 모두 충족시키기에 충분하며,
심지어 여러가지 언어로 작성된 고문서(古文書)까지도 지원할 수 있다.
현재 아직 포함되지 않은 몇 가지 현대 언어를 추가하기 위한 작업이 진행중이다.
유니코드 표준은 버전 1.0 이며 다음의 사이트에서 구해볼 수 있다.
또한, 현재 가장 널리 퍼진 스크립트 및 텍스트 코드인 아스키와 엡시딕을 참조하기 바란다.

ASCII (American Standard Code for Information Interchange) ; 아스키
아 스키는 컴퓨터나 인터넷상에서 텍스트 파일을 위한 가장 일반적인 형식이다.
아스키 파일에서는 각각의 알파벳이나 숫자 그리고 특수문자들이 7 비트의 2 진수
(7개의 0 또는 1의 조합으로 이루어진 스트링)로 표현되며, 총 128개의 문자가 정의되어 있다.
유닉스나 도스 기반의 운영체계(윈도우 NT는 제외)는 텍스트 파일을 표현하는데 있어
아스키를 사용한다. 윈도우 NT의 경우에는 유니코드라고 하는 새로운 코드를 사용하며,
IBM의 System 390 서버들은 엡시딕이라고 부르는 자신들만의 고유한 8 비트 코드체계를 사용한다.
따라서 서로 다른 운영체계 간에 어떤 파일을 교환하기 위해서는 코드 변환 프로그램이 필요하게 된다.
아스키는 미국규격협회인 ANSI에 의해 개발되었다.
 

//=================================================================================================

#작업07


오라클 - 함수

--[1] 샘플 테이블
SQL> select * from dual;

--[2] 임시 연산 결과 출력
SQL> select 1234*1234 from dual;

--[3] 반올림 : round()
SQL> select round(12.3456, 3) from dual;

--[4] 소문자 : lower()
SQL> select lower('RedPlus') as "소문자" from dual;

--[5] 대문자 : upper()
SQL> select upper('RedPlus') as "대문자" from dual;

--[6] 단어 첫자만 대문자 : InitCap()
SQL> select initcap('red plus') as "첫자만" from dual;

--[7] 문자열 연결 : concat()
SQL> select concat('red', 'plus') from dual;

--[8] 문자열 길이 : length(), lengthb()
SQL> select length('RedPlus'), lengthb('레드플러스')
     from dual;
--[9] 문자열 추출 : substr()
SQL> select substr('RedPlus', 1, 3) from dual;

--[10] 인덱스 추출 : instr()
SQL> select instr('RedPlus', 'Plus') from dual;

--[11] 자리 채우기 : lpad(), rpad()
SQL> select lpad('RedPlus', 10, '@') as "자리채우기" from dual;
SQL> select rpad('RedPlus', 10, '@') as "자리채우기" from dual;

--[12] 공백(특정 문자) 제거 : trim()
SQL> select trim(' ' from ' Red Plus ') from dual;

--[13] 절대값 : abs()
SQL> select abs(-10) as "절대값" from dual;

--[14] 소수 버리기 : floor()   // ceil() 절상 <-> 절하 floor()
SQL> select floor(12.34) from dual;

--[15] 원하는 위치까지 삭제 : trunc()
SQL> select trunc(12.3456, 3) from dual;

--[16] 나머지 : mod()
SQL> select mod(3, 5) from dual;

--[17] 날짜 : sysdate
SQL> select sysdate from dual;

--[18] 개월수 구하기 : months_between()
SQL> select ename, months_between(sysdate, hiredate)
  2  from emp where deptno = 10;

--[19] 개월수 더하기 : add_months()
SQL> select add_months(sysdate, 4) from dual;

--[20] 다가올 요일에 해당하는 날짜 :
     next_day(sysdate,'일요일')
SQL> select next_day(sysdate, '일요일') from dual;

--[21] 이번달/특정달의 마지막 일수 : last_day()
SQL> select last_day(sysdate) from dual;

--[22] 문자열 변환 : to_char()
SQL> select to_char(sysdate, 'yyyy-mm-dd') from dual;

--[23] 날짜형 변환 : to_date()
SQL> select to_date('2008/01/01', 'yyyy/mm/dd') from dual;

--[24] Null값 처리 : nvl()
SQL> select ename, nvl(comm, 0) from emp;

--[25] switch문 : decode()
SQL> select ename, decode(deptno, 10, 'Accounting'
  2  , 20, 'Research', 30, 'Sales') from emp;
SQL> select ename, decode(deptno, 10, 'Accounting'
  2  , 20, 'Research', '기타') from emp;

--[26] if~else문 : case~when
SQL> select ename, deptno,
  2  case
  3     when deptno = 10 then 'Accounting'
  4     when deptno = 20 then 'Research'
  5     when deptno = 30 then 'Sales'
  6  end dname
  7  from emp;

------------------------------------------------------------


//=================================================================================================

#작업08

 

1. Data Sourse/(또는)Server
 .\SQLEXPRESS

2. DataBase/(또는)Initial Catalog : ADO(ActiveX Data Object)의 닷넷버전 =>
 ADO.NET : 데이터 처리관련 모든 명령어(클래스)의 집합
 a. DB : WebADONET
 i) localhost/WebADONET 관련 모든 데이터저장

3. Login
 a. UID/User ID : WebADONET
 b. PWD : WebADONET
 c. Role: db_owner

4. OLE DB(현재)/ODBC(예전기술)

 a. C# <-> OLE DB/ODBC(미들웨어:중개인) <-> DB    // SQL Server는 직접 접속(지네들 기술)

 b. WebADONET UDL 파일 테스트 => ConnectionString

5. Table : 실제 데이터가 저장되는 공간
 Memos 테이블
 * 번호, 이름, 이메일, 메모(제목), 작성일, IP주소

6. SQL구문 

 a. DDL : Create, Alter, Drop
 b. DML : I S U D

 

 

* CTRL + R : 출력문 인터페이스 on
  CTRL + D + F5 : 출력문 인터페이스 'Table 형식'으로 출력
  CTRL + T + F5 : 출력문 인터페이스 '문자 형식'으로 출력

 

 

1. DBMS(Database Management System) 설치 및 환경구성
     a. http://www.microsoft.com/korea/msdn/vstudio/express/
          i. http://www.oracle.com/technology/software/products/database/index.html
     b. SQL서버 - 속성 - 보안 탭 - Windows 인증 -> SQL Server 인증으로 변환 - 다시 시작
     c. SQL 서버의 최고 관리자 아이디인 sa 사용자의 암호 설정 또는 로그인 허용
          i. 서버 - 보안 탭 - sa 사용자 - 속성 - 상태 - 로그인 허용 선택
     d. SQL Server 인증으로 다시 로그인
     e. 설치 후 로그인 관련된 이슈
          i. 서버 :
               1) (local) : SQL Server 정식 버전 설치 시 기본, .(쩜)==(local)== 컴퓨터명
               2) (local)\SQLEXPRESS : SQL Server Express 설치 시 기본
               3) (local)\다른인스턴스이름 : 설치 과정에서 다른 이름으로 설치되었을 때??? SQL 서버 구성 관리자에서 확인 가능
2. 데이터베이스 : 실제 데이터가 저장되는 물리적인 공간/캐비넷
     닷넷코리아 모든 정보 => dotnetkorea.MDF
     옥션 모든 정보 => auction.MDF
    
     DB명 : dotnetkorea
          파일명 :
               dotnetkorea.MDF     Primary Data File : 실제 데이터
               dotnetkorea_log.LDF     Log Data File : 로그(DB정보)
               *.NDF     Secondary Data File : 확장할 때만 사용
     DB명 : MyDatabase
3. 로그인 사용자 : 특정 DBMS에 있는 데이터베이스의 주인
     a. sa(System Administrator) : SQL 서버의 모든 데이터베이스의 주인(owner)
     b. 로그인 사용자 : 아이디/암호 -> 특정 DB에 권한 부여 => db_owner
          i. 아이디 : MyUid
          ii. 암호 : MyPwd
          iii. 데이터베이스 : MyDatabase
          iv. 권한 : db_owner
4. 원격접속테스트 : OLE DB 접속 연습 : 데이터베이스 연결 문자열 생성
     a. UDL 파일을 사용해서 4가지(서버/데이터베이스/아이디/암호) 설정 테스트
5. 테이블 : 데이터베이스내에 실제로 데이터가 표(Table) 형태로 저장되는 공간
     a. Memos 테이블 설계(관리도구(EM)/쿼리편집기(QA))
          i. Scott이 관리하는 테이블
          ii. Hr이 관리하는 테이블
6. SQL 문
     a. DML(Data Manipulation Language) : 데이터 처리/조작 언어
          i. Insert문 : 입력
          ii. Select문 : 출력
          iii. Update문 : 수정
          iv. Delete문 : 삭제
     b. DDL(Data Definition/Description Language) : 데이터 정의/기술 언어
          i. Create문 : 구조 생성
          ii. Alter문 : 구조 수정
          iii. Drop문 : 구조 삭제
7. T-SQL : SQL 구문내에서 사용하는 간단한 프로그래밍 문법

8. 개체 : SQL 개체
     a. 테이블
     b. 뷰
     c. 저장프로시저 : SQL 구문을 프로그래밍화(간단한 명령어로 대체)
          i. 긴 명령어를 간단한 구문으로 대체
          ii. 복잡 또는 여러개의 SQL문을 묶어서 하나의 저장프로시저로 호출 가능
9. DTS : 데이터변환서비스(데이터가져오기/내보내기) : 로컬 DB <-> 원격 DB

10. 백업/복원

 

 


--[1] 한줄 메모장(Memos) 테이블 설계
Create Table dbo.Memos
(
     Num Int Identity(1, 1) Primary Key,          --번호
     [Name] VarChar(25) Not Null,               --이름
     Email VarChar(100) Null,                    --이메일
     Title VarChar(150) Not Null,               --메모
     PostDate DateTime Default(GetDate()),          --작성일
     PostIP VarChar(15) Null                    --IP주소
)
Go
--[2] Alter 문 : 관리도구
--[3] Drop문 : 구조 삭제
Drop Table dbo.Memos
Go


--실습 70번 7번====================================
--[2] SQL 예시문 6가지 작성
--[a] 입력 예시문 : Insert문 : FrmMemoWrite.aspx
Insert Memos
Values
(    
     '레드플러스', 'h@h.com', '레드플러스입니다.'
     , GetDate(), '127.0.0.1'
)
--[b] 출력 예시문 : Select문 : FrmMemoList.aspx
Select * From Memos Order By Num Desc
--[c] 상세 예시문 : Select문 : FrmMemoView.aspx?Num=???
Select * From Memos Where Num = 1
--[d] 수정 예시문 : Update문 : FrmMemoModify.aspx
Begin Tran
     Update Memos
     Set
          Name = '백두산',
          Email = 'h@h.com',
          Title = '백두산입니다.',
          PostIP = '127.0.0.1'
     Where
          Num = 1
--RollBack Tran
Commit Tran

--[e] 삭제 예시문 : Delete문 : FrmMemoDelete.aspx
Begin Tran
     Delete Memos
     Where Num = 3
--RollBack Tran
Commit Tran

--[f] 검색 예시문 : Select문 : FrmMemoSearch.aspx
-- Memos에서 이름이 레드플러스이거나 또는
-- 이메일에 'r'가 들어가는 자료의 모든 필드
-- 번호의 역순으로 검색
Select Num, Name, Email, Title, PostDate
From Memos
Where
     Name = '레드플러스'
     Or
     Email Like '%r%'
Order By Num Desc

--실습 70-(9)번 타이핑 : 저장 프로시저
--[1] 입력 저장프로시저 : 입력 구문을 저장프로시저화~
Create Procedure dbo.WriteMemo
(
     @Name VarChar(25),
     @Email VarChar(100),
     @Title Varchar(150),
     @PostIP VarChar(15)
)
As
     Insert Memos(Name, Email, Title, PostIP)
     Values (@Name, @Email, @Title, @PostIP)
Go
-- 입력 구문 : Insert문
Insert Into Memos(Name, Email, Title, PostIP)
Values ('길동', 'h@h.com', '안녕', '127.0.0.1')
Go
-- 입력 저장프로시저 : WriteMemo
WriteMemo '홍길동', 'h@h.com', '방가', '127.0.0.1'
Go

-- 출력 저장 프로시저
Create Proc dbo.ListMemo
As
     Select * From Memos Order By Num Desc
Go
-- 실행
Execute ListMemo
Go
Exec ListMemo
Go
ListMemo
Go
--상세
Create Procedure dbo.ViewMemo
(
     @Num Int
)
As
     Select * From Memos Where Num = @Num
Go
-- 실행
ViewMemo 5
Go
-- 수정
Create Proc dbo.ModifyMemo
     @Name VarChar(25),
     @Email VarChar(100),
     @Title VarChar(150),
     @PostIP VarChar(15),
     @Num Int
As
     Update Memos
     Set
          Name = @Name,
          Email = @Email,
          Title = @Title,
          PostIP = @PostIP
     Where
          Num = @Num
GO
-- 5번 레코드의 이름 등을 변경
ModifyMemo '백두산', 'b@b.com', '안녕', '127.0.0.1', 5
Go

-- 삭제 저장프로시저
Create Proc dbo.DeleteMemo
     @Num Int
As
     Delete Memos Where Num = @Num
Go
-- 실행 : 5번 레코드 삭제
DeleteMemo 5
Go

-- 검색 : 동적쿼리문->정적쿼리문
--[1] 이름에서 '길' 자가 들어가는 레코드 검색
Select * From Memos Where Name Like '%길%'
Go
--[2] 실행할 구문을 SQL변수에 넣어놓고, Exec() 함수로 실행
--[A] 문자열 500자 저장가능한 변수 선언
Declare @strSql VarChar(500)
--[B] 변수 초기화 : Set 절 사용 : 작은따옴표 하나를 표현->두개로
Set @strSql = '
          Select * From Memos Where Name Like ''%길%''
     '
--[c] 지대로 구문이 만들어졌는지 출력문인 Print로 확인
Print @strSql
--[d] 문자열 변수에 저장된 명령어 모양(?)을 실제로 실행 : Exec()
Exec(@strSql)
Go
--[3] 검색어 및 검색필드를 매개변수화
Declare @SearchField VarChar(10) -- 검색할 필드 : Name, Title
Set @SearchField = 'Title'
Declare @SearchQuery VarChar(50) -- 검색어
Set @SearchQuery = '안녕'
Declare @strSql VarChar(500)
Set @strSql = '
          Select * From Memos
          Where ' + @SearchField + ' Like ''%' + @SearchQuery + '%''    
     '
Print @strSql
Exec(@strSql)
Go
--[4] 저장 프로시저화 : 동적쿼리문=> 해킹때문에 => 정적쿼리문
Create Proc dbo.SearchMemo
     @SearchField VarChar(10),
     @SearchQuery VarChar(50)
As
--     Declare @SearchField VarChar(10) -- 검색할 필드 : Name, Title
--     Set @SearchField = 'Title'
--     Declare @SearchQuery VarChar(50) -- 검색어
--     Set @SearchQuery = '안녕'
     Declare @strSql VarChar(500)
     Set @strSql = '
          Select * From Memos
          Where ' + @SearchField + ' Like ''%' + @SearchQuery + '%''
          Order By Num Desc    
          '
     Print @strSql
     Exec(@strSql)
Go
-- 실행
SearchMemo 'Name', '길' --  이름에서 '길'자 들어가는 모든 레코드
Go
SearchMemo 'Title', '안녕' -- Title에서 '안녕' 들어가는 레코드
Go

--[!]타이핑한 SearchMemo 저장프로시저를 정적쿼리문으로변경
Create Proc dbo.SearchMemo
     @SearchField VarChar(10),
     @SearchQuery VarChar(25)
As
     Set @SearchQuery = '%' + @SearchQuery + '%'
     Select * From Memos
     Where
          (
               Case @SearchField
               When 'Name' Then Name
               When 'Title' Then Title
               Else @SearchQuery
               End
          )    
          Like
          @SearchQuery
     Order By Num Desc
Go


-- 교재 실습70, 7번 (page 309)

 


 

//=================================================================================================

#작업08

 

http://www.ado.net/ 사이트에서 사용되는 모든

 


닷넷 레벨에서 6개 웹폼을 만들어 보자…
(교재와  현재 타이핑시 차이점은 ConnectionString부분)

1. 입력 : FrmWrite.aspx : 실습 75번 : 327페이지
     a. Connection - Command - 파라미터추가 - .ExecuteNonQuery()
          i. 인라인 SQL문 방식 : C#코드에 Insert/Select 구문들어옴...
          ii. SQL 파라미터 방식 : Named 매개변수 방식 : 들어올 데이터 부분을 @기호로 변수처리화...
          iii. 저장 프로시저 방식 : 추천

2. 출력 : FrmList.aspx : 실습 76번...
     a. 커넥션-커멘드-데이터어댑터-데이터셋-그리드뷰

3. 상세 : FrmView.aspx?Num=???
     식별자/Primary Key(기본키) 요청
     a. 커넥션-커멘드-데이터리더-일반컨트롤에 바인딩

4. 수정 : FrmModify.aspx?Num=??? : 실습 78번
     a. 상세 + 입력 패턴
          i. Page_Load : 상세 패턴 적용
               1) 예전에 작성했던 정보를 각각의 컨트롤에 읽어오기. 단, 처음에 한번만 읽어오기
               2) Page_Load(), ReadData()는 View.aspx.cs와 동일하다, 다만, 레이블 5개를 텍스트박스 3개로 변경...
          ii. btnModify_Click : 입력 패턴 적용
               1) FrmWrite.aspx.cs의 btnWrite_Click()의 모든 코드를 그대로 btnModify_Click()에 붙여넣기한 후, 저장프로시저 이름을 WriteMemo에서 ModifyMemo로 그리고, 파라미터를 1개(@Num) 추가, 마지막으로 결과 메시지 변경

5. 삭제 : 입력 패턴과 동일 : 
     a. 커넥션 -> 커멘드 -> 파라미터 추가 -> ExecuteNonQuery()

6. 검색 : 출력 패턴
     a. 커넥션 -> 커멘드 -> 파라미터 추가 -> 데이터어댑터 -> 데이터셋 -> 그리드 컨트롤…
    

 

 

컨트롤 기반으로 6가지 패턴 다루기 
작성일:  2008/06/05 오후 3:52:15 
 
컨 트롤 기반
     입력 : FormView + SqlDataSource
     출력 : GridView + SqlDataSource
     상세 : DetailsView + SqlDataSource
     수정 : FormView + SqlDataSource
     삭제 : FormView + SqlDataSource
     검색(Like=>SP) : GridView + SqlDataSource(SP)
데이터소스(Datasource) 속성을 제공하는 컨트롤
DropDownList / ListBox / …
Repeater : 모든 모양을 사용자가 정의
DataList : 표형태 제공
GridView : 표형태 제공
 

 

 

//=================================================================================================

#작업09

 

소프트웨어 개발 단계에 따른 간단한 모듈(공지사항) 작성하기 
작성일:  2008/06/09 오후 12:50:13 
 
간단한 모듈(공지사항) 작성하기
     (소프트웨어 개발 단계)
1. 계획
     a. 사이트에서 일반적으로 보여지는 공지사항 기능 구현
     b. Windows Server + SQL Server + .NET FrameworkV3.5
2. 분석
     a. 벤치마킹 : 자주 가는 사이트의 공지사항을 분석
          i. 5개 이상의 사이트를 분석/비교=>공통점을 뽑아내자.
     b. 신규모듈 : 기존에 없었던 기능이라면, 비슷한 기능에서 확장하자.
3. 설계 : DB 설계 레벨 => 테이블
     a. 개념적 설계 : 노트와 연필, 브레인스토밍
          i. 구현하고자하는 내용에 대해서 최대한 많은 정보 뽑아내자.
          ii. 필요없는 데이터 제외
          iii. 식별자 : 대부분 번호 필드를 새롭게 만든다.
              
     b. 논리적 설계 : ER-Win / Visio 도구
          공지사항
               필드(컬럼)명     데이터형식     크기     제약조건
               번호       Int         Primary Key
               제목       VarChar     150     Not Null
               내용       Text          Null
               작성자     Int         
               시작일     datetime         
               종료일     datetime         
               작성일     datetime         
     c. 물리적 설계 : SSMS에서 테이블/저장프로시저
          i. 데이터베이스
               1) Announcement
          ii. 로그인사용자
               1) Ann / 1234
          iii. UDL 파일 테스트
               1) Ann.UDL
          iv. 테이블
               1) Announcements
          v. 6개 예시문
               1) 입력
               2) 출력
               3) 상세
               4) 수정
               5) 삭제
               6) 검색
          vi. 저장프로시저
               1) WriteAnn
               2) ListAnn
               3) ViewAnn
               4) ModifyAnn
               5) DeleteAnn
               6) SearchAnn
4. 구현
5. 테스트
6. 유지보수
 

 

 


--[!] 공지사항 응용 프로그램용 테이블 및 저장 프로시저 설계

--[1] 테이블
Create Table dbo.Announcements
(
     ItemID Int Identity(1, 1) Primary Key,     -- 번호
     Title VarChar(150) Not Null,               -- 제목
     [Description] Text Null,                    -- 내용
     CreatedByUser Int Default(0),               -- 작성자(기본:0)
     CreatedDate DateTime Default(GetDate()),-- 작성일
     PublishDate DateTime Null,                    -- 공지 시작일
     [ExpireDate] DateTime Null                    -- 공지 종료일
)
Go
--[2] 6개 예시문
Insert Into Announcements(Title, Description)
Values('신상품이 등록되었습니다.', '상품에 대한 설명...')
Go
Select * From Announcements Order By ItemID Desc
Go
Select * From Announcements Where ItemID = 1
Go
Update Announcements
Set Title = '상품이 추가되었습니다.',
     Description = '안녕하세요.',
     PublishDate = '2008/06/10',
     ExpireDate = '2008/06/30'
Where ItemID = 1
Go
Delete From Announcements Where ItemID = 1
Go
Select * From Announcements
Where Title Like '%상품%' Or Description Like '%설명%'
Go

--[3] 6개 저장 프로시저
Create Proc dbo.WriteAnn
     @Title VarChar(150),
     @Description VarChar(8000) -- *** Text=>VarChar(8000)
As
     Insert Into Announcements(Title, Description)
     Values(@Title, @Description)
Go
--Exec WriteAnn '신상품이 등록', '상품 설명...'
--Go
Create Proc dbo.ListAnn
As
     Select * From Announcements Order By ItemID Desc
Go
--ListAnn
--Go
Create Proc dbo.ViewAnn
(
     @ItemID Int
)
As
     Select * From Announcements Where ItemID = @ItemID
Go
--ViewAnn 5
--Go
Create Proc dbo.ModifyAnn
     @Title VarChar(150),
     @Description VarChar(8000),
     @PublishDate DateTime,
     @ExpireDate DateTime,
     @ItemID Int
As
     Update Announcements
     Set Title = @Title,
          Description = @Description,
          PublishDate = @PublishDate,
          ExpireDate = @ExpireDate
     Where ItemID = @ItemID
Go
Create Proc dbo.DeleteAnn
     @ItemID Int
As
     Delete From Announcements Where ItemID = @ItemID
Go
--DeleteAnn 5
--Go
--[a] 동적 쿼리문
Create Proc dbo.SearchAnn
     @SearchField VarChar(15),     -- 검색필드
     @SearchQuery VarChar(15)     -- 검색어
As
     Declare @strSql VarChar(255)
     -- 변수 처리 : 바뀔부분 -> ' + 해당변수 + '
     Set @strSql = '    
     Select * From Announcements
     Where
          ' + @SearchField + '
          Like
          ''%' + @SearchQuery + '%''
          Order by ItemID Desc
     '
     Exec(@strSql)
Go
Execute SearchAnn 'Title', '상품'
Go
Execute SearchAnn 'Description', '대한'
Go
--[!] SQL 인젝션 공격
--SearchAnn '1=1;Drop Table Announcements--', '메롱'
--Go
--[b] 정적 쿼리문
Alter Proc dbo.SearchAnn
     @SearchField VarChar(15),     -- 검색필드
     @SearchQuery VarChar(15)     -- 검색어
As
     Set @SearchQuery = '%' + @SearchQuery + '%'
     Select * From Announcements
     Where
          (
               Case @SearchField
                    When 'Title' Then Title
                    When 'Description' Then Description
                    Else @SearchQuery
               End
          )
          Like
          @SearchQuery
     Order By ItemID Desc
Go

 

//=================================================================================================

#작업10

 

----------------------------------------------------------------------

오라클 SQL 구문 : Select문 : 조인 및 서브 쿼리

Select
From
     Join
     on
Where
Group By
Having
Order By

--[0] hr 사용자로 접속
sqlplus hr/hr
--[1] 테이블 목록
Select * From tab;
--[2] 특정 테이블의 구조를 보고자한다면…
Desc 테이블명;
--[3] 성이 'King' 사용자의 정보 출력
Select * From employees Where last_name = 'King';
--[4] 부서가 80, 90인 사용자의 부서 정보 추력
Select * From departments
Where department_id in (90, 80);
--[!] 한 개 이상의 테이블(부서(부서명)/사원(사번))에서 데이터 조회 : 조인/서브쿼리
--[5] 성이 'King' 사용자의 부서명 출력
--[가] 첫 번째 모양
Select departments.department_name,
    employees.employee_id
From    employees           -- 첫번째 테이블
Join    departments        -- 두번째 테이블
On                         -- 조건절
    employees.department_id = departments.department_id
    And
    last_name = 'King';
--[나] 두 번째 모양
Select  departments.department_name, employees.employee_id
From employees,           -- 첫번째 테이블
        departments          -- 두번째 테이블
Where                         -- 조건절
    employees.department_id = departments.department_id
    And
    last_name = 'King';
--[6] 성이 'King'인 사용자의
     사번(employees),
     부서명(departments),
     직무(job)를 출력
--[가] 첫 번째 방식
Select
    employees.employee_id,
    departments.department_name,
    jobs.job_title
From
     employees -- 첫 번째 테이블
Join                    -- 세 번째 테이블
     jobs
On                      -- 두 번째 테이블과 세 번째 테이블의 조건
     employees.job_id = jobs.job_id
Join
     departments -- 두 번째 테이블
On                     -- 첫 번째 테이블과 두 번째 테이블의 조건
     employees.department_id = departments.department_id
And last_name = 'King';
--[나] 두 번째 방식
Select
    employees.employee_id,
    departments.department_name,
    jobs.job_title
From
     employees, jobs, departments
Where
     employees.job_id = jobs.job_id
     And
     employees.department_id = departments.department_id
     And
     last_name = 'King'
;
--[7] 테이블명을 줄여서 표기
Select  d.department_name, e.employee_id
From employees e,           -- 첫번째 테이블
        departments d         -- 두번째 테이블
Where                           -- 조건절
    e.department_id = d.department_id
    And
    last_name = 'King'
;
--[!]서브쿼리
--[8] 사원 중 평균 급여보다 큰 급여를 받는 사원리스트
Select *
From employees
Where
     salary > (Select Avg(salary) From employees) -- 평균 급여
;
--[9] 직무별 가장 많은 급여를 받는 사원 정보 출력
Select employee_id, last_name, job_id, salary
From employees
Where (job_id, salary) In
     (
     Select job_id, Max(salary)  -- 직업별 최대 급여
     From employees
     Group By job_id
     )
;

 

//=================================================================================================

#작업11


--------------------------------------------------------------------

오라클 SQL문 : 테이블 생성/수정/삭제

Create/Alter/Drop Table 구문

Scott 사용자로 접속

--[1] create 문 : 테이블 생성
SQL> create table emp1
  2  (
  3     empno number(4),
  4     ename varchar2(20),
  5     sal number(7,2)
  6  );

--[!] 테이블의 구조 보기 : desc emp1;

--[2] 기존 테이블과 동일하게 테이블 만들기
SQL> create table emp2
  2  as
  3  select * from emp;

--[3] 새로운 컬럼 추가 : alter 문
SQL> alter table emp1
  2  add
  3  (
  4     job varchar2(10)
  5  );

--[4] 테이블 구조 수정 : 필드 수정
SQL> alter table emp1
  2  modify
  3  (
  4     job varchar2(30)
  5  );

--[5] 테이블 구조 수정 : 컬럼 삭제
SQL> alter table emp1
  2  drop column job;

--[6] 테이블 구조 삭제 : drop문
SQL> drop table emp2;

--[7] 테이블 이름 변경 : rename문
SQL> rename emp1 to emp2;

--[8] 테이블 내의 모든 레코드 삭제 : truncate문
SQL> truncate table emp1; -- (drop table emp1; -> create table emp1;)


-----------------------------------------------------------------------

오라클 SQL문 : 데이터 입력/출력/수정/삭제 간단 연습

--[1] 샘플 테이블 생성
SQL> create table dept1
  2  (
  3     deptno number(2),
  4     dname varchar2(14),
  5     loc varchar2(14)
  6  );

--[2] 데이터입력 : 기본 Insert문
SQL> insert into dept1
  2  (deptno, dname, loc)
  3  values
  4  (10, 'ACCOUNTING', 'NEW YORK')
  5  ;

--[3] 입력 : 행 생략
SQL> insert into dept1
  2  values(20, 'RESEARCH', 'DALLAS');

--[4] 널 값 입력 : 제약 조건으로 반드시 입력 받도록 가능
SQL> insert into dept1
  2  values(30, 'SALES', NULL)
  3  ;

--[!] 출력 : Select문은 계속 연습

--[5] 수정 연습을 위한 테이블 가져오기
SQL> create table emp1
  2  as
  3  select * from emp;

--[6] 부서 번호 변경
SQL> update emp1
  2  set
  3     deptno =30;

--[7] 급여 10% 인상
SQL> update emp1
  2  set
  3     sal = sal * 1.1;

--[8] 부서번호가 10인 사원의 부서번호를 20으로 변경
(작성해 보세요…)
SQL> update emp1 set deptno = 20 where deptno = 10;

--[9] 급여가 3000이상인 사원만 급여를 10% 인상
(작성해 보세요…)
Update emp1 Set sal = sal * 1.1 Where sal >= 3000;

--[10] 사원 이름이 SCOTT인 자료의 부서번호를 10, 직급을 MANAGER로 변경
(작성해 보세요…)
Update emp1
Set deptno = 1, job = 'MANAGER'
Where dname = 'SCOTT';

--[11] 30번 부서 삭제
Delete From Dept1 Where deptno = 30;

--[12] 모든 자료 삭제
Delete From Dept1

--[!] 트랜잭션 : 좀 전 상태로 되돌리기 또는 완전 수정/삭제
     Rollback
     Commit

 


//=================================================================================================

#작업12

 

테이 블 제약 조건

Primary Key(기본키) : 유일한 값 + Not Null인 값
Foreign Key(외래키) : 다른 테이블에 들어있는 값만 저장, 다른 테이블 참조
Not Null / Null : Null을 허용 아니면 반드시 입력받게 할건지
Unique : 유일한 값만 저장되는 필드
Check : 특정한 값만 저장되도록 설정
Default : 기본값으로 특정 값을 저장되도록 설정

--[1] 샘플 테이블 생성
SQL> create table emp1
  2  (
  3     empno number(4),
  4     ename varchar2(10),
  5     job varchar2(9),
  6     deptno number(4)
  7  );

--[2] 널 데이터 입력 연습
SQL> insert into emp1 values(null, null, null, 40);

--[3] 널 제약 조건을 걸고 테이블 생성
SQL> create table emp2
  2  (
  3     empno number(4) not null,
  4     ename varchar2(10) not null,
  5     job varchar2(9),
  6     deptno number(4)
  7  );
SQL> insert into emp01 values(null, null, 'MANAGER', 40); -- 에러
SQL> Insert Into emp2 Values(1, 'SCOTT', 'MANAGER'); -- 성공

--[4] Check 제약 조건 : 반드시 특정 값만 입력
SQL> Create Table emp3
  2  (
  3     empno number(2) not null,
  4     ename varchar2(20) not null,
  5     gender varchar2(10) check (gender in ('M', 'F'))
  6  );

--[5] Unique 제약조건 : 사번은 유일해야 한다.
SQL> Create Table emp4
  2  (
  3     empno number(2) not null unique,
  4     ename varchar2(20) not null,
  5     gender varchar2(10) check (gender in ('M', 'F'))
  6  );
Insert Into emp4 Values(1, 'SCOTT', 'M'); -- 성공
Insert Into emp4 Values(1, 'SCOTT', 'F'); -- 에러 : 1번 사번 저장

--[6] Primary Key 제약 조건 : Not Null 제약조건 + Unique 제약 조건
SQL> Create Table emp5
  2  (
  3     empno number(2) Primary Key,
  4     ename varchar2(20) not null,
  5     gender varchar2(10) check (gender in ('M', 'F'))
  6  );

--[7] Default 제약 조건 : 기본값 입력
SQL> Create Table emp6
  2  (
  3     empno number(2) Primary Key,
  4     ename varchar2(20) not null,
  5     addr varchar2(20) Default('SEOUL')
  6  );
SQL> insert into emp6(empno, ename) values(1, 'SCOTT');

--[8] Foreign Key 제약 조건 : 외래키(다른 테이블의 필드 값 참조)
Select * from dept;

SQL> Create Table emp7
  2  (
  3     empno number(2) Primary Key,
  4     ename varchar2(20) not null,
  5     deptno number(2) references dept(deptno)
  6  );

SQL> insert into emp7(empno, ename, deptno)
  2  values(1, 'SCOTT', 50); -- 에러

--[9] 제약 조건에 이름 붙이기
SQL> Create Table emp8
  2  (
  3     empno number(2) constraint emp8_empno_pk Primary Key,
  4     ename varchar2(20) constraint emp8_ename_nn not null,
  5     addr varchar2(10) constraint emp8_addr_uk unique,
  6     deptno number(2) constraint emp8_deptno_fk references dept(deptno)
  7  );

--[10] 제약 조건 수정/삭제
Alter table emp8
Drop Primary Key; -- 기본 키 삭제

Alter table emp8
Add Primary Key(empno); -- 기본 키 추가

--[11] 필드명 따로 제약조건 따로 설정
-- 복합키(Primary Key)를 두고자할 때
-- 하나의 테이블에 기본키가 2개 이상일 때...
SQL> Create Table emp9
  2  (
  3     empno number(2),
  4     ename varchar2(20) Not Null,
  5     addr varchar2(10),
  6     deptno number(2),

         Primary Key(empno),
         Unique(addr),
         Foreign Key(deptno) References dept(deptno)
   
  7  );


//=================================================================================================

#작업12


-----------------------------------------------------------------

오라클 - 시퀀스 : 테이블의 필드에 일련번호 부여


-- SQL Server
Create Table Memos
(
     Num Int Identity(1, 1) Primary Key, -- 번호 => 일련번호
     Name VarChar(25) Not Null,
     PostDate DateTime Default(GetDate())
)
Go

-- Oracle
테이블 생성 후 시퀀스(일련번호)를 따로 만들어야 한다.
--[1] 샘플 테이블 생성
Create Table Memos
(
     Num Number(4) Primary Key, -- 번호 => 일련번호
     Name VarChar2(25) Not Null,
     PostDate Date Default(SysDate)
);
--[2] 해당 테이블에 시퀀스 생성
Create Sequence Memos_seq Start With 1 Increment By 1;
--[3] 데이터 입력 : 일련번호 포함
SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '홍길동', SysDate);
--[4] 현재 시퀀스가 어디까지 증가되어져 있는지 확인
SQL> Select Memos_seq.CurrVal From dual;
--[5] 시퀀스 수정 : 최대 증가값을 1000까지로 제한
Alter Sequence Memos_seq MaxValue 1000;
--[6] 시퀀스 삭제
SQL> drop sequence Memos_seq;
--[7] 시퀀스 없는 상태에서 자동 증가값 구현?
Select Max(Num) From Memos;
Insert Into Memos Values(위에서만들어진값, '지리산', SysDate);

 


//=================================================================================================

#작업13

 

----------------------------------------------------------------
오 라클 - 트랜잭션(Transaction)


Commit : 명령어 완전 실행
RollBack : 명령어 되돌리기(실행 해제)

SQL> --[1] 테이블 생성
SQL> Create Table Memos
  2  (
  3     Num Number(2) Primary Key,
  4     Name VarChar2(25) Not Null,
  5     Email VarChar2(100) Null,
  6     Title VarChar2(150) Not Null,
  7     PostDate Date Default SysDate,
  8     PostIP VarChar2(15) Null
  9  );
SQL> --[2] 시퀀스(일련번호) 생성
SQL> Create Sequence Memos_seq Start With 1 Increment By 1;

SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '홍길동', 'h@h.com', '안녕',
  3  SysDate, '127.0.0.1');

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

SQL> Commit;

커밋이 완료되었습니다.

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동

SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '백두산', 'h@h.com', '안녕',
  3  SysDate, '127.0.0.1');

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

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동
         2 백두산

SQL> RollBack;

롤백이 완료되었습니다.

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동

SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '백두산', 'h@h.com', '안녕',
  3  SysDate, '127.0.0.1');

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

SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '백두산', 'h@h.com', '안녕',
  3  SysDate, '127.0.0.1');

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

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동
         3 백두산
         4 백두산

SQL> RollBack;

롤백이 완료되었습니다.

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동

SQL> Insert Into Memos
  2  Values(Memos_seq.NextVal, '백두산', 'h@h.com', '안녕',
  3  SysDate, '127.0.0.1');

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

SQL> Commit;

커밋이 완료되었습니다.

SQL> select Num, Name From Memos;

       NUM NAME
---------- -------------------------
         1 홍길동
         5 백두산

SQL>

 

 

//=================================================================================================

#작업14


-----------------------------------------------------------------

오라클 - 뷰(View) : 가상 테이블(실제 데이터가 없고, Select문만 가지고 있다)
     - 목적
          § 긴 SQL구문을 짧은 뷰(View) 가상 테이블로 대체
          § 보안상의 이유로 필요한 필드만 읽어낼 수 있는 또 다른 가상 테이블 생성
               □ 관리자 DBA는 연봉 테이블에 접근
                    ® Select 이름, 나이, 연봉 From 사원테이블
               □ 사원 DBA는 연봉 필드를 제외한 회원 테이블만 접근
                    ® Select 이름, 나이 From 사원뷰 -- 연봉 필드 제외

SQL> Grant Create View To Scott;

SQL> conn scott/scott;
연결되었습니다.
SQL> Create View vw_emp
  2  As
  3     Select empno, ename from emp where deptno = 10;

뷰가 생성되었습니다.

SQL> Select * From vw_emp;

     EMPNO ENAME
---------- ----------
      7782 CLARK
      7839 KING
      7934 MILLER

SQL>
SQL> desc vw_emp;
이 름                                      널?      유형
----------------------------------------- -------- ----------------------

EMPNO                                     NOT NULL NUMBER(4)
ENAME                                              VARCHAR2(10)

SQL>
SQL>
SQL> Insert Into vw_emp Values(200, 'HONG');

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

SQL> Select * From emp Where empno = 200;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM
---------- ---------- --------- ---------- -------- ---------- ----------
    DEPTNO
----------
       200 HONG

 

SQL> --[!] 별칭 부여
SQL> Create View vw_emp2
  2  (사번, 사원명)
  3  As
  4     Select empno, ename From emp;

뷰가 생성되었습니다.

SQL> select * From vw_emp2;

      사번 사원명
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

      사번 사원명
---------- ----------
      7900 JAMES
      7902 FORD
      7934 MILLER
       200 HONG

15 개의 행이 선택되었습니다.

SQL>
SQL> select * From vw_emp2 Where empno > 7400
  2  ;
select * From vw_emp2 Where empno > 7400
                            *
1행에 오류:
ORA-00904: "EMPNO": 부적합한 식별자


SQL> select * From vw_emp2 Where 사번 > 7400
  2  ;

      사번 사원명
---------- ----------
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES

      사번 사원명
---------- ----------
      7902 FORD
      7934 MILLER

13 개의 행이 선택되었습니다.

SQL>
SQL>
SQL> Create Or Replace vw_emp2
  2  as
  3     Select empno, ename, sal from emp;
Create Or Replace vw_emp2
                  *
1행에 오류:
ORA-00922: 누락된 또는 부적합한 옵션


SQL> Create Or Replace vw_emp
  2  as
  3     select empno, ename, sal from emp where empno = 10;
Create Or Replace vw_emp
                  *
1행에 오류:
ORA-00922: 누락된 또는 부적합한 옵션


SQL> Create Or Replace View vw_emp
  2  as
  3     select empno, ename, sal from emp where empno = 10;

뷰가 생성되었습니다.

SQL> select * from vw_emp;

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

SQL> Create Or Replace View vw_emp
  2  as
  3     select empno, ename, sal from emp;

뷰가 생성되었습니다.

SQL> select * from vw_emp;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7369 SMITH             800
      7499 ALLEN            1600
      7521 WARD             1250
      7566 JONES            2975
      7654 MARTIN           1250
      7698 BLAKE            2850
      7782 CLARK            2450
      7788 SCOTT            3000
      7839 KING             5000
      7844 TURNER           1500
      7876 ADAMS            1100

     EMPNO ENAME             SAL
---------- ---------- ----------
      7900 JAMES             950
      7902 FORD             3000
      7934 MILLER           1300
       200 HONG

15 개의 행이 선택되었습니다.

SQL> --[!] 뷰 삭제
SQL> Drop View vw_emp;

뷰가 삭제되었습니다.

SQL> --[1] 필수 회원 정보 테이블
SQL> Create Table Domains
  2  (
  3     UID Number(2) Primary Key,
  4     DomainID VarChar2(30) Not Null
  5  );
        UID Number(2) Primary Key,
        *
3행에 오류:
ORA-00904: : 부적합한 식별자


SQL> Create Table Domains
  2  (
  3     IDX Number(2) Primary Key,
  4     UserID VarChar2(30) Not Null
  5  );
SQL> Create Table UserProfiels
  2  (
  3     IDX Number(2) Not Null,
  4     Email VarChar2(100) Null
  5  );
SQL> Create Table UserProfiles
  2  (
  3     IDX Number(2) Not Null,
  4     Email VarChar2(100) Null
  5  );
SQL> Insert Into Domains Values(1, 'Administrator');
SQL> Insert Into UserProfiles Values(1, 'a@a.com');
SQL> Insert Into Domains Values(2, 'Guest');
SQL> Insert Into UserProfiles Values(2, 'g@g.com');
SQL> select * from domains;
SQL> select * from userprofiles;
SQL> select Domains.IDX, Domains.UserID, UserProfiles.Email
  2  From Domains Join UserProfiles
  3     on Domains.IDX = UserProfiles.IDX
  4  ;
SQL> Create Or Replace View vw_Users
  2  As
  3  select Domains.IDX, Domains.UserID, UserProfiles.Email
  4  From Domains Join UserProfiles
  5     on Domains.IDX = UserProfiles.IDX
  6  ;
SQL> select * from vw_users;


      암호:   
 

 

//=================================================================================================

#작업15


--------------------------------------------------------------

오라클 - Top 쿼리


--[1] 샘플 테이블 생성
SQL> create table Memos
  2  (
  3     Num Number(2) Primary Key,
  4     Name VarChar2(25) Not Null
  5  );
-- 번호에 역순으로 출력하되 상위(Top) 3개 출력하는 구문…
--[!] SQL Server
-- Select Top 3 * From Memos Order By Num Desc
--[2] 전체 데이터를 번호를 기준으로 내림차순 정렬
SQL> Select * from Memos Order By Num Desc;
--[3] 눈에 보이지 않게 내부적으로 저장되는 고유 번호값 : rownum
SQL> Select rownum, Num, Name From Memos;
--[4] Memos 테이블과 동일한 뷰 생성
SQL> Create Or Replace View vw_Memos
  2  As
  3     Select Num, Name From Memos Order By Num Desc;
--[5] 뷰의 RowNum을 출력
SQL> Select RowNum, Num, Name From vw_Memos;
--[6] 특정 테이블의 상위 N개를 출력 : 뷰와 RowNum을 활용
SQL> Select * From vw_Memos Where RowNum <= 3;
--[7] 뷰를 인라인으로 포함 : [4]+[6]을 한번에 호출해주는 개념...
SQL> Select RowNum, Num, Name From
  2  (
  3     Select Num, Name From Memos Order By Num Desc
  4  )
  5  Where RowNum <= 3;

 

--------------------------------------------------------------------
제 목 : 오라클 - 사용자(User) 및 권한(Role)  
 
오라클 - 사용자(User) 및 권한(Role)

--[1] 최고 관리자(DBA)로 접속 후
SQL> conn system/orcl;
--[2] 사용자/암호 만들기
SQL> Create User User01 Identified By User01;
--[3] 접속 권한 부여
SQL> Grant Create Session To User01;
--[4] User01로 접속
SQL> conn User01/User01;
SQL> show user;
SQL> Create Table Memos ( Num Number(2) Primary Key ); -- 에러
--[5] 테이블 생성 권한 부여
SQL> Grant Create Table To User01;
--[6] 할당량 부여
SQL> Alter User User01
  2  Quota 10M on Users;
SQL> Create Table Memos ( Num Number(2) Primary Key ); -- 성공
--[7] 권한이 없는 다른 사용자의 테이블 조회
SQL> Grant Select on scott.emp To User01;
SQL> select empno, ename from scott.emp;
--[8] 암호변경
SQL> Alter User User01 Identified By User02;
--[9] 새 사용자 생성 후 권한 부여
SQL> Create User User02 Identified By User02;
SQL> Grant Create Session, Create Table, Create View
  2  To User02;
--[10] 역할(Role)을 통해서 한꺼번에 권한 부여
-- DBA, Connect, Resource, …
--[9]번과 동일한 권한을 한번에 부여
Grant Connect To User02; -- Connect 자리에 역할 이름이 들어온다.
--[10] User03 사용자에게 최고 권한 부여
SQL> conn system/orcl;
SQL> Create User User03 Identified By User03;
SQL> Grant Connect To User03; -- 일반 권한
SQL> Grant DBA To User03; -- 최고 권한
SQL> conn User03/User03;
SQL> Select empno, ename From scott.emp; -- 모든 테이블에 접근가능
--[11] 권한 제거
SQL> Revoke DBA From User03;
SQL> Revoke Connect From User03;
--[12] 사용자 제거
SQL> Drop User User01;

관련글 더보기

댓글 영역