본문 바로가기
카테고리 없음

SQL - DAY1

by 로로브 2023. 4. 5.
자바 필기 평가 - 이번주 내에 봄?  객관식 20~25문항
자바 실기 평가 - 완성한것까지만 보낼것
 akasha.park@gmail.com 성적처리 .java 들을 zip압축해서 메일 전송 
_____________________________________________________________
데이터  - 해석할 수 있는 의미를 가진 기호
분류1 - 정성적 데이터, 정량적 데이터
분류2 - 정형 데이터(값의 의미 파악이 용이, 규칙적인 값을 저장, rdbms, excel)
            반정형 데이터 (데이터+메타정보, 가변적 - html, xml, json)
            비정형 데이터 (정해진 규칙이 없는 값, 값의 의미 파악이 어려움 -  pdf, 이미지, sound, 동영상 데이터)
 
데이터 저장소 - 파일, Database

Application의 데이터 저장소로 FileSystem :
파일의 구성방법이나 접근방법을 알아야 처리 가능하다
동일한 내용의 데이터가 서로 다르게 보관=> 데이터 일관성 보장 X
중복 데이터 저장으로 데이터 무결성(정확성+일관성) 보장 X
프로그래밍 언어에 종속적
보안 관리 X
비용 증가 (데이터 중복 보관, 갱신 비용 )

Database  :  논리적인 저장소로서 데이터들의 집합
기업, 조직, 개인이 필요로 하는 데이터를 일정한 형태로 저장
지속적으로 관리하고 저장하는 데이터 
저장된 데이터에 쉽게 접근, 처리, 갱신할 수 있도록 구성된 데이터의 집합체
중복 데이터의 최소화하여 데이터를 통합 관리 => 데이터의 일관성, 무결성 보장
프로그래밍 언어에 종속없이 여러 Application에서 공유 가능, 데이터를 여러 가지 형태로 표현 가능
데이터 보안성 향상, 사용자 편의성  용이 

DBMS(Database Management System)
Database에 저장된 데이터의 관리, 유지보수, 장애로부터 데이터 보호 , ...


DBMS(Database Management System) 목표 : 
물리적 독립성 
데이터 접근 방식의 독립성
프로그래밍 언어, 운영체제, 처리환경 비종속적, 독립적이어야 함

1960년대 계층형 DBMS - 계층구조로 데이터를 저장, 관리(물리적 pointer 참조, 1:M참조 관계)
1960년대 망형 DBMS - 계층구조로 데이터를 저장, 관리(물리적 pointer 참조, N:M참조 관계, 데이터가 상하구조로 종속된 모델링)
1970 논문  A relational Model for Large Shared Data Banks - E.F. Codd
1979년 최초의 관계형 DBMS oracle 등장
1983년 IBM DB2  (관계형 DBMS)
1986년 ANSI 협회 SQL 표준 제정

SQL(Structured  Query Language) - 구조적 질의 언어, 선언적, 결과지향적 언어

1990년대  - ODBMS등장했으나...ORDBMS로 발전

2010년대 초반 - BigData(가변적, 사용자 정의 데이터 구조)를 저장하는  NoSQL

DB운영 목적 :
운영계DB  - 트랜잭션 처리, OLTP
정보계DB - 의사결정, 데이터 분석 , 데이터 마이닝 , OLAP, DSS, DW

RDBMS에서 관리 대상 entity의 데이터를 저장하는 기본  객체 -table
table은 2차원 구조 - 속성, 속성값들로 구성된 레코드 (column+record)
Primary Key (unique+not null) 

services.msc
regedit
컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 삭제
컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Oracle Data Provider for .NET 삭제 
Oracle 폴더 총 6개 삭제

컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Oracle Database Extensions for .NET  삭제
Oracle 폴더 총 3개 삭제

파일탐색기
c:\app폴더 또는 c:\oraclexe 폴더  삭제
C:\Program Files\폴더 아래 oracle이름의 폴더 삭제

Win+i > 앱 > 시작프로그램 에서 Oracle 삭제

관리 대상 데이터 (집합) -  Entity : Table (Entity인스턴스의 집합)
Entity구성 속성(Attribute) -  Column
Entity인스턴스 = 속성값들로 구성된 레코드(tuple, row)

Entity를 구성하는  속성중에서 key 속성 - 유일하게 하나의 레코드 추출할 수 있는 컬럼 : Primary Key


C:\Users\cheoho-hi>sqlplus /nolog   --sqlplus 툴 실행

--sys계정(DBA)로 접속 
SQL> connect sys/oracle as sysdba

--샘플계정 hr 설정
SQL> alter user hr
  2  identified by oracle
  3  account unlock;
 

--샘플 계정 hr로 DB 접속
SQL> connect hr/oracle

--계정 hr 소유의 테이블 목록 조회
SQL> select  table_name from user_tables;

--사원정보 테이블 모든 데이터 조회
SQL> select  * from employees;

--사원정보 테이블의 구조 조회
SQL> describe employees

entity참조 관계 설정
Parent.PK를 Child.FK 참조 관계 설정 
FK(Foreign Key)는 외래키

SQL 종류 :
DML (Data Manipulation Language) - 테이블 대상, 데이터 조회, 추가, 수정 , 삭제 
insert, update, delete, select, merge

DDL(Data Definition Language) - 데이터가 저장될 객체 구조 정의, 구조 변경, 구조 삭제
create~, alter ~, drop~,...

모든 database의 데이터를 보호하기 위한 첫번째 방법- 인증
모든 database의 데이터를 보호하기 위한 두번째 방법- 권한
DCL(Data Control Language) - 권한 부여, 권한 회수
grant~, revoke~	

TCL(Transaction Control Language)  -트랜잭션 제어
Transaction : Unit of Work 분리되어 수행할 수 없는 작업단위
예) 계좌이체, 온라인 구매
commit;
rollback;

sql 키워드는 대소문자 구별하지 않음
table명 , column 명 대소문자 구별하지 않음
컬럼값은  대소문자 구별함

db명, user명, table명 , column 명에 naming rule 적용됨
영문자로 시작, _, # 허용
두번째 문자부터 숫자 허용
키워드 X
길이 제한 있음(db명 -8자 ,  table명 - 30자)

SQL문장은 ;으로 종료되며, 실행됨


검색 종류 :
Projection - 1개의 테이블, 컬럼 기준으로 검색
Selection -1개의 테이블, row단위로 검색
JOIN - 2개 이상의 테이블로부터 (참조관계, PK=FK 조건의) 컬럼값이 일치하는  레코드들을 결합, 검색
_________________________________________________________________________________
--db 접속 종료, sqlplus 프로그램 종료
SQL> exit;

--sqlplus 툴 실행시키고 sys계정으로 접속
C:\Users\cheoho-hi>sqlplus sys/oracle as sysdba

SQL> create user scott
         identified by oracle;

SQL> conn scott/oracle   --db 연결
--create session 권한 없어서 오류

SQL> conn  / as sysdba     --관리자로  db 연결

SQL>  GRANT  CONNECT,RESOURCE, UNLIMITED TABLESPACE TO scott;   --필요한 권한 부여
SQL>   ALTER USER scott DEFAULT TABLESPACE USERS;
SQL>  ALTER USER scott TEMPORARY TABLESPACE TEMP;

SQL> conn scott/oracle
--DEPT 테이블 (DEPTNO, DNAME, LOC 컬럼)
SQL> CREATE TABLE  DEPT (
          DEPTNO  NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
         DNAME  VARCHAR2(14) ,
         LOC  VARCHAR2(13) ) ;
--EMP 테이블 (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO 컬럼)
SQL> CREATE  TABLE   EMP(
      EMPNO  NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
      ENAME  VARCHAR2(10),
      JOB  VARCHAR2(9),
     MGR NUMBER(4),
     HIREDATE  DATE,
     SAL NUMBER(7,2),
    COMM NUMBER(7,2),
      DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);

--레코드 추가
SQL> INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
SQL> INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
SQL> INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
SQL> INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

SQL>INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
SQL>INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
SQL>INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
SQL>INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
SQL>INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
SQL>INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
SQL>INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
SQL>INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,
to_date('13-07-87', 'dd-mm-yyyy') ,3000,NULL,20);
SQL>INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
SQL>INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
SQL>INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,to_date('13-07-87', 'dd-mm-yyyy') ,1100,NULL,20);
SQL>INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
SQL>INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
SQL>INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);

SQL> CREATE  TABLE  BONUS (
 ENAME  VARCHAR2(10) ,
 JOB  VARCHAR2(9)  ,
 SAL  NUMBER,
 COMM  NUMBER
) ;

SQL> CREATE TABLE  SALGRADE (
    GRADE NUMBER,
 LOSAL NUMBER,
 HISAL NUMBER
);

INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
COMMIT; 

___________________________________________________________________
SELECT   [DISTINCT] { *  | column명| 표현식 }
FROM     테이블명;

--테이블 전체 레코드 조회
SELECT  * 
FROM  emp;

oracle db 에서 'select  ~ from ~' 필수
ms sql server, mysql 등에서는 select문으로 조회 가능 (단순 연산 결과, 함수 결과)

select  deptno, ename, job 
from emp; 
-- select절에 선언된 컬럼은 테이블에 선언된(저장된) 컬럼순서와 일치하지 않아도 됨

--emp 테이블 구조 조회
describe emp
desc emp
 
select문은 datafile로부터 data가 저장된 block을 메모리에 캐쉬하고 리턴(fetch)합니다. (물리적 읽기/논리적 읽기 수행)

select ename, sal, sal*12, sal+100
from emp;   -- 컬럼 연산 수행, select는 db에 저장된 데이터는 변경시킬 수 없음

표현식  expression  :  컬럼에 연산자 적용, 함수 적용

컬럼타입에 따라서 적용할 수 있는 연산자가 다름

describe emp
desc emp         ---sqlplus tool명령어는 축약가능  (describe, connect)

--number(p, s) :  정수, 실수 저장  - binary형식으로 저장됨
--char(size) : 고정길이 문자열 ~2000byte  
   예) name char(10)
--varchar2(size)  : 가변길이 문자열  ~4000byte
  예) name varchar2(10)
--date : 00세기00년 00월 00일 00시 00분 00초
select hiredate from emp;
select sysdate from dual;  --시스템 현재 날짜 시간을 반환하는 함수 
db에 접속한 세션환경의 파라미터에 RR/MM/DD로 설정되어 있음
alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
select sysdate from dual;

number 타입 컬럼에 적용가능한 연산자 :  +, -, *, /
char,varchar2  타입 컬럼에 적용가능한 연산자 : ||
※ 문자열, 날짜 값은 ' 데이터  '으로 감싸줍니다.
select ename || job
from emp;

select ename||'  works  as  a  '|| job
from emp;

date타입 컬럼에 적용가능한 연산자 :  +, - 
date + n, date -n, date -date
select sysdate+1, sysdate-1, sysdate
from dual;

select sysdate+1/24, sysdate+5/1440, sysdate
from dual;

select sysdate-hiredate 
from emp;  -- 입사한 이후에 근무 일수 

※  NULL 은 아직 값이 할당되지 않음을 의미
     0 또는 공백과 다름
    NULL이 포함된 산술연산, 비교연산, 논리연산 의 결과는 NULL이됨

select sal, comm, sal+comm
from emp;

--표현식이 컬럼 heading으로 노출되지 않게 검색 결과 컬럼 heading을 rename => alias,  별칭
select sal, comm, sal+comm as total
from emp;

select sal, comm, sal+comm   total
from emp;

--컬럼 heading에 공백 포함, 대소문자 구별하려면 " " 으로 감싸줍니다.
select sal, comm, sal+comm   "Total Salary"
from emp;

select deptno
from emp;  --14개의 record의 모든 값  검색

select distinct deptno
from emp;   -- 검색된 데이터로부터 중복 제거한 unique한 값만 반환

select deptno, distinct  job
from emp; --error

select distinct  deptno,  job
from emp; 

Quiz> EMP 테이블에서 ENAME를 NAME로 SAL을 SALARY로 출력하여라
select ename  as name
         , sal  salary
from emp;


SQL> @c:\creobjects.sql
연습문제 park 계정의 employees 테이블, departments 테이블
conn park/oracle
6. describe departments
    desc departments
    select * from departments;

7. describe  EMPLOYEES 
    desc   EMPLOYEES 

8. select employee_id, last_name, job_id, hire_date startdate
    from EMPLOYEES ;

9.  select distinct job_id
    from EMPLOYEES ;

10. select employee_id  "Emp#"
                 , last_name  "Employee"
                 , job_id as "Job"
                 , hire_date "Hire Date"
    from EMPLOYEES ;

11. select  last_name ||', '|| job_id  as "Employee and Title"
      from EMPLOYEES ;