본문 바로가기

콩's EDUCATION/콩's DATABASE

데이터베이스 수업 1일차

Application에 필요한 데이터를 종속적 파일에 저장

Application 별로 저장, 변경하는 데이터가 여러 파일에 중복, 부정확성, 불일치성

Database : data가 저장되는 가장 큰 논리적인 저장소

DBMS : DataBase를 관리하는 시스템 (메모리와 프로세스로 구성)

Application이나 사용자는 database에 직접 접근 할 수 없으며 모든 요청은 DBMS를 통해서 수행된다.

Data에 대한 모든 요청은 SQL 표준언어를 사용해서 요청을 처리한다.

 

SQL은 ANSI협회에 표준3 까지 제정되어 있다.

DB 벤더별로 표준언어를 대부분 지원하지만 벤더에 종속적인 구문을 쓰기도 한다.

 

- SQL(구조적 질의 언어) 분류

Data Query Language : select (DQL)

Data Maniplate Language : insert, update, delete, merge (DML)

Data Definition Language : create, alter, drop (DDL)

Data Control Language : grant, revoke

Transaction Control Language : commit, rollback

 

- 관계형DB는 관리해야 할 데이터(entity)를 2차원(행, 열)로 구조의 테이블로 표현

entity간의 참조인 관계를 설정(Primary Key, Foreign Key)

entity à Table , attribute(열) à column, column값(field)들로 구성되는 entity 인스턴스 à row, record, tuple

entity의 속성주에서 entity instance를 구별하는 속성키를 primary key라고 한다.

entity간의 관계는 foreign key로 설정한다. 물리적으로 Table의 레코드(record)들은 random하게 물리적 저장

 

- RDBMS에서 데이터가 저장되는 가장 기본 단위(객체) : table

- sql 명령어 키워드 : 대소문자 구분하지 않는다.(오라클의 경우 내부적으로 column명, table명은 대문자로 변환되어 처리)

테이블명과 컬럼명으로 사용할 수 없다, 컬럼값은 대소문자 구별한다.

 

준비물 : OracleXE112_Win32 , scott_schema, sqldeveloper-3.2.20.09.87

시작 à Services.msc(서비스) à OracleServiceXE, OracleXETNSListener 시작되어 있는지 확인한다.

SQL TOOL 시작 à sqlplus /nolog 종료 à exit

로그인 종료 : Logon denid

SQL à sqlplus sys/oracle as sysdba : 관리자 계정으로 DB접속

SQL> alter user hr

Identified by hr

Account unlock;

SQL > connect hr/hr

SQL > select user from dual; è DB에 접속된 USER명 검색

SQL > conn / as sysdba

Alter user sys

Identified by oracle; à 비밀번호 기존 입력

Alter user system

Identified by oracle; à 비밀번호 새로 변경

SQL DEVLOPER 시작

접속(오른쪽 버튼)à새접속à 사용자/패스 : hr/hr , 나머지 default 값 그대로, 로그 저장, 테스트 후 실행한다.

DB에는 USER DATA (비즈니스 DATA, APLLICATION DATA)와 DBMS가 DB를 관리하는데 필요한 정보

(USER, 권한, table명, column명)

Select * from tab;

Local에

Select * from employees; --employees 대상 테이블의 모든 데이터 검색

** projection 검색 : 하나의 테이블을 대상, 컬럼 기준으로

** selection 검색 : 하나의 테이블을 대상, 검색조건, 레코드 기준으로 검색, 행 단위 검색(row)

** join 검색 : 하나이상의 테이블을 대상, 공통 컬럼을 기준으로 검색 컬럼들을 결합해서 행단위로 검색

- SELECT절, FROM 절 (필수)

 

[PROJECTION 검색]

select department_name, department_id, manager_id, location_id

from departments;

è 검색 컬럼 순서는 테이블에 정의된 순서와 상관 없다.

select *

from departments;

select department_name, location_id

from departments;

 

select 표현식(컬럼연산자, 값(literal))

from 테이블명;

select last_name, salary, salary*12(메모리에서 수행)

from employees;

è 표현식은 저장된 테이블의 data에 영향을 주는 게 아니고, 메모리에서 연산을 수행해서 연산결과를 리턴.

 

컬럼에 적용가능한 산술 연산자는 컬럼타입이 Number타입인 경우에 적용

desc employees

 

select last_name || job_id

from employees;

è 두 개의 컬럼값을 단일 컬럼값으로 문자열 결합

 

select last_name || 'is a' || job_id

from employees;

è 컬럼 타이틀을 보기좋게 rename하려면 as키워드 넣거나 혹은 생략하고 공백을 준 다음에 별칭을 사용한다.

è rename 될 컬럼 타이틀을 대소문자를 구별하고 싶거나 공백 또는 한글등을 포함하려면 " "로 감싸주면 된다.

select last_name || 'is a' || job_id (as) EmployeeTitle

from employees;

 

select distinct department_id

form employees;

è 컬럼값에 대하여 중복을 제거한다.

è 10g버전이전에는 distinct로 중복 컬럼을 제거하기 위해서 내부적으로 정렬을 수행하므로 정렬된 결과로 리턴

10g버전에서는 hashing을 수행해서 중복제거 하므로 성능이 개선되었지만 정렬된 결과로 리턴안됨.

 

select department_id , distinct job_id

form employees; è 오류! Distinct는 중간에 쓸 수 없다.

 

select * 컬럼이름, 컬럼이름, … |distinct 컬럼이름, 컬럼이름 | 표현식(컬럼에 연산식)

from 테이블명;

 

SQL > @C:\dev\abc.sql

SQL > select empno, sal, comm, (sal+comm)*12

From emp;

컬럼값이 없는 null값 à 산술 연산불가, 비교연산 불가

Null 컬럼값에 대해서 산술 연산을 수행하면 결과는 null 이다.

 

[SELECTION 검색 방법]

 

사원 데이터 중에서 부서번호 90번에 속하는 사원 정보 검색(사번, 이름, 월급, 부서번호, 직무)

SQL> select employee_id, last_name, salary, department_id, job_id

2 from employees

3 where department_id = 90;

 

사원 데이터 중에서 부서번호1985년 이후에 입사한 사원 정보 검색(사번, 이름, 월급, 입사날짜, 직무)

è 날짜, 시간 형식을 비교값으로 사용할 때는 DB내부적으로 날짜와 시간 세기, 년,월,일,시,분,초로 저장

Display format은 세션 파라미터로 'RR/MM/DD'설정(우리나라 기준) 'DD-MON-RR' (영미권)

select employee_id, last_name, salary, hire_date, job_id

2 from employees

3 where hire_date = '85/01/01'

 

select employee_id, last_name, salary, hire_date, job_id

2 from employees

3 where hire_date >to_date('85/01/01', 'DD-MM-YYYY');

사원 데이타 중에서 직무가 IT_PROG사원 정보 검색 	
(사번, 이름, 월급,   직무)

 

select employee_id, last_name, salary,   job_id

 

from employees

 

where job_id =  'IT_PROG';

 

 

비교연산자 : =, > , < ,>=, <= , != , ^=, <>

select *

 

from employees

 

where manager_id = ''; ç
					논리적
					오류
					

 

 

select *

 

from employees

 

where manager_id = null; ç
					비교연산자로 null비교
					불가
					

 

 

select *

 

from employees

 

where manager_id is null;

 

 

부서번호가 50 또는 80
					사원검색
					

 

(사번, 이름, 월급, 부서번호, 직무)

 

 

select employee_id, last_name, salary, department_id, job_id

 

from employees

 

where department_id = 50 or department_id = 80; 

 

è 'or' 논리
					연산자는
					조건중
					하나만 true
					경우
					검색
					결과로
					리턴
					

 

== where department_id in (50,80);

 

è
					멤버십
					연산자
					

 

 

월급이 5000이상 10000이하인
					사원들
					검색
					

 

(사번, 이름, 월급, 부서번호, 직무)

 

 

select employee_id, last_name, salary, department_id, job_id

 

from employees

 

where salary >= 5000 and salary <= 10000; == where salary between 5000 and 10000;

 

è 'and' 논리
					연산자는
					
					개의
					조건을
					모두 true
					경우에만
					검색
					결과를
					리턴
					한다.

 

è between ~ and 비교
					연산자, 하한값
					먼저
					쓰고
					상한값을
					쓴다.

 

 

사원
					이름중에서
					
					문자가 'A' 
					사원을
					검색
					

 

(사번, 이름, 월급, 부서번호, 직무)

 

 

select employee_id, last_name, salary, department_id, job_id

 

from employees
			

 

where last_name like 'A%';

è %는 다른언어에서 쓰이는 '*' 전체를 뜻하는 기호와 동일로 쓰인다.
è Like는 컬럼에서 시작 문자 검색시 사용한다.

사원
					이름중에서
					두번째
					문자가 'o' 
					사원을
					검색
					

 

(사번, 이름, 월급, 부서번호, 직무)

 

 

where last_name like '_o%';

 

è _ 
					첫문자를
					넣어주고, 두번째
					문자부터
					검색가능하게
					한다.

 

 

  1. 연습문제 (89페이지) 8,9,10,11
    
  2. 연습문제 (119 페이지) 1,2,3
    

 

8번

select employee_id, last_name, job_id, hire_date startdate

from employees;

9번

select distinct job_id

from employees;

10번

select employee_id as EMP# , last_name as Employee, job_id as Job, hire_date

from employees;

11번

select (employee_id || ',' ||job_id) as abc

from employees;

 

2장

1번

select last_name, salary

from employees

where salary >= 12000;

2번

select last_name, department_id

from employees

where employee_id=176;

3번

select last_name, salary

from employees

where salary <=5000 and salary>=12000;

 

NOT연산자

where 컬럼 NOT BETWEEN 하한값 and 상한값;

where 컬럼 NOT IN (값1, 값2, ...);

where 컬럼 NOT LIKE '컬럼값%';

where 컬럼 IS NOT NULL:

 

select절

from 절

[where 절]

[group by절 ]

[having 절]

[order by절]

 

order by은 검색 결과를 정렬수행

select employee_id, last_name, salary

from employees

order by salary ; --> asc 오름차순

 

select employee_id, last_name, salary

from employees

order by salary desc; -->월급의 내림 차순으로

 

select employee_id, last_name, salary*12

from employees

order by salary*12 desc; ==> order by절에 표현식 사용가능?

 

select employee_id, last_name, salary*12 annualsalary

from employees

order by annualsalary desc; ==> order by절에 별칭 사용 가능?

 

select employee_id, last_name, salary*12 annualsalary

from employees

order by 3 desc; ==>order by절에 select문의 column position값을 사용 가능

 

select sysdate from dual;

alter session set nls_date_format ='DD-MON-RR';

select sysdate from dual;

// 날짜를 한국 날짜식에서 영미식으로 바꾼다.

 

119페이지 4,5,6,7,8,9,10,11

 

4번

select last_name, job_id, hire_date

from employees

where hire_date >= '05/02/20' and hire_date <= '10/02/20'

order by hire_date asc;

 

5번

select last_name, department_id

from employees

where department_id in (20,50)

order by last_name asc;

 

6번

select first_name as employee, salary as Monthly

from employees

where (salary >= 5000 and salary <= 12000) and (department_id >=20 and department_id<=50);

 

7번

 

10번

select last_name

from employees

where last_name like '__a%';

 

11번

select last_name

from employees

where last_name like '%a%' and last_name like '%e%';