-SELECT:검색
DDL(DATA DERINITION KANGUAGE) : CREATE, ALTER, DROP
DCL(DATA CONTROL LANGUAGE) : COMMIT, ROLLBACK, SAVEPOINT,REVOKE,GRANT
DML(DATA MAINPULATION LANGUAGE): INSERT, UPDATE, DELETE, MERGE
-오라클 객체를 생성할 때 사용
-테이블 생성시 CREATE TABLE 명령 사용
(사용형식)
CREATE TABLE 테이블명(
컬럼명1 데이터타입[(크기)][NO NULL] [DEFAULT 값][,]
컬럼명2 데이터타입[(크기)][NO NULL] [DEFAULT 값][,]
:
컬럼명N 데이터타입[(크기)][NO NULL] [DEFAULT 값]
[CONSTRAINT 기본키설정명 PRIMARY KEY(컬럼명[,컬럼명,...]([,]CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명[,컬럼명,...]([,]
REFERENCES 테이블명(컬럼명[,컬럼명,...]([,]CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명[,컬럼명,...]([,]
REFERENCES 테이블명(컬럼명[,컬럼명,...]([,]
:
[CONSTRAINT 외래키설정명 FOREIGN KEY(컬럼명[,컬럼명,...]([,]
REFERRENCES 테이블명(컬럼명[,컬럼명,...]([,]
사용예) 다음 자료를 참고하여 사원테이블을 생성하시오
테이블명: EMPLOYEE
컬럼명 데이터타입 크기 NULLABLE PK/FK
EMP_ID CHAR 5 N.N PK
EMP_NAME VARCHAR2 30 N.N
EMP_ADDR VARCHAR2 100
DEPT_NAME VARCHAR2
CREATE TABLE EMPLOYEE(
EMP_ID CHAR(5)NOT NULL,
EMP_NAME VARCHAR2(30)NOT NULL,
EMP_ADDR VARCHAR2(100),
DEPT_NAME VARCHAR2(50),
CONSTRAINT pk_employee PRIMARY KEY(EMP_ID));
2021-0909-01)
사용예) 사업장 테이블을 생성하시오
테이블명: CONST_SITE(사업장)
----------------------------------------------------------
컬럼명 데이터타입 크기 NULLABELE PK/FK
----------------------------------------------------------
CONST_ID CHAR 8 N.N PK
CONST_NAME VARCHAR2 50 N.N
CONST_ADDR VARCHAR2 100
CONST_TER_NUM VARCHAR2 20
REMARKS VARCHAR2 200
-----------------------------------------------------------
CREATE TABLE CONST_SITE(
CONST_ID CHAR(8), --기본키는 NOT NULL 안써두댐
CONST_NAME VARCHAR2(50) NOT NULL,
CONST_ADDR VARCHAR2(100), --컬럼명 공백 조심
CONST_TER_NUM VARCHAR2(20),
REMARKS VARCHAR2(200),
CONSTRAINT pk_const_site PRIMARY KEY(CONST_ID) --테이블 끝났으면 ,안해두댐
);
사용예) 근무 테이블을 생성하시오
테이블명:TBL_WORRKS(근무)
----------------------------------------------------------
컬럼명 데이터타입 크기 NULLABELE PK/FK
----------------------------------------------------------
EMP_ID CHAR 5 PK&FK
--다른 테이블 거를 기본키와 외래키로 지정함
CONST_ID CHAR 8 PK&FK
--다른 테이블 거를 기본키와 외래키로 지정함
SDATE DATE Default SYSDATE
-- SDATE 는 투입일자 DATE타입은 길이를 가지지 않는다/ Default SYSDATE는 시스템에서 제공하는 날짜와 시간
EDATE DATE
----------------------------------------------------------
CREATE TABLE TBL_WORRKS(
EMP_ID CHAR(5),
CONST_ID CHAR(8),
SDATE DATE Default SYSDATE,
EDATE DATE,
CONSTRAINT pk_tbl_worrks PRIMARY KEY(EMP_ID,CONST_ID),
CONSTRAINT fk_works_emp FOREIGN KEY(EMP_ID)--부모테이블 이름
REFERENCES EMPLOYEE(EMP_ID),
CONSTRAINT fk_works_site FOREIGN KEY(CONST_ID)
REFERENCES CONST_SITE(CONST_ID)
);
2. INSERT문
- 생성된 테이블에 새로운 자료를 삽입
(사용형식)
INSERT INTO 테이블명[(컬럼명1,컬럼명2,...)]
VALUES(값1,값2,...);
.'(컬럼명1,컬럼명2,...)': 생략하면 테이블 생성시 기술한 순서와 모든 컬럼에 배정될 값(데이터)을 VALUES절에 기술해야한다
.'(컬럼명1,컬럼명2,...)': 필요한 컬럼에만 값을 배정하기 위해 사용되며 컬럼 제약사항이 NOT NULL인 걸럼은 생략할 수 없음
사용예) 사원 테이블(EMPLOYEE)에 다음 자료를 입력하시옹
[자료]
---------------------------------------------------------
사원번호 사원명 주소 부서명
---------------------------------------------------------
18021 홍길동 대전시 중구 중앙로 76 설계부
20002 홍길순 토목
17113 강감찬 총무부
19007 이성계
--------------------------------------------------------
INSERT INTO EMPLOYEE --공백은 구분자로 쓰임
VALUES('18021','홍길동','대전시 중구 중앙로 76','설계부');
INSERT INTO EMPLOYEE --값이 없을때는 ''
VALUES('20002','홍길순','','토목');
INSERT INTO EMPLOYEE(EMP_ID,EMP_NAME,DEPT_NAME) --이것만 하겠다는 의미(컬럼명 작성)
VALUES('17113','강감찬','총무부'); --주소값은 적지 않아도됨
INSERT INTO EMPLOYEE(EMP_ID,EMP_NAME)
VALUES('19007','이성계',NULL,NULL);
SELECT * FROM EMPLOYEE;
사용예) 다음 자료를 사업장테이블(CONST_SITE)에 저장하시오
---------------------------------------------------------------------
사업장번호 사업장명 주소 전화번호 비고
---------------------------------------------------------------------
A1010120 도로신설공사 충남 예산군 예산읍 132-5678 공사중
C2103002 새여울초등학교 대전시 대덕구 867-0987 공사완료
--------------------------------------------------------------------
INSERT INTO CONST_SITE
VALUES('A1010120','도로신설공사','충남 예산군 예산읍','132-5678','공사중');
INSERT INTO CONST_SITE
VALUES('C2103002','새여울초등학교','대전시 대덕구','867-0987','공사완료');
SELECT * FROM CONST_SITE;
사용예) 다음 자료를 근무테이블에 저장하시오
1) 홍길동사원이 '도로신설동사' 공사장에 오늘 일자로 배속됨
INSERT INTO TBL_WORRKS(EMP_ID,CONST_ID)
VALUES('18021','A1010120');
INSERT INTO TBL_WORRKS(EMP_ID,CONST_ID)
VALUES('20002','A1010120');
SELECT * FROM TBL_WORRKS;
2) 강감찬직원이 '새여울초등학교'공사장에 '2020년 2월 1일에 배속되어 2020년 12월 30일까지 근무했음;
INSERT INTO TBL_WORRKS
VALUES('17113','C2103002',TO_DATE('20200201'),TO_DATE('20201230'));
SELECT * FROM TBL_WORRKS;
**'도로신설공사' 공사장에서 근무하는 모든 사원을 조회하시오
SELECT B.EMP_IS AS 사원번호,
B.EMP_NAME AS 사원명,
B.EMP_NAME AS 부서명,
A.SADTE AS 배속일
FROM TBL_WORRKS A, EMPLOYEE B, CONST_SITE C
WHERE .,EMP_ID=B.EMP_ID
AND A.CONST_ID=C.CONST_ID
AND A.CONST_NAME='도로신설공사'
ORDER BY 1;
- 오라클에 사용되는 데이터 타입은 문자열, 숫자, 날짜, 이진데이터 타입으로 구분
. 오라클은 문자타입은 존재하지 않음
. 모든 문자열은 ' '안에 기술 되어야 함
. ' '에 기술되는 문자열은 대소문자 구별 됨
. 문자열 데이터 타입은 CHAR, VARCHAR, VARCHAR2,NVARCHAR,LONG,CLOB,NCLOB 등이 있음
CHAR는 고정길이라 지정해 놓으면 남더라도 빈공간으로 채워짐
가변길이는 나머지 모두이다.
- 고정길이 데이터를 저장
- 최대 2000 byte 저장가능
- 기억공간이 남으면 오른쪽에 남는 공간에 공백이 채워짐
-기본키 설정이나 확정된 길이를 나타내는 컬럼(주민번호 등)
(사용형식)
컬럼명 CHAR(크기[BYTE|CHAR])-> 생략하면 BYTE
.'크기[BYTE|CHAR]' : '크기'가 byte 인지 글자의 갯수인지 설정, 기본은 BYTE --1~2000까지 사용가능
.한글 한글자는 3 BYTE(최대 666글자 저장)
사용예)
CREATE TABLE TEMPO1(
COL1 CHAR(50),
COL2 CHAR(50 BYTE),
COL3 CHAR(50 CHAR);
INSERT INTO TEMP01
VALUES('IL POSTINO','IL POSTINO','일 포스티노');
--60글자에 6글자를 사용했으면 남은 글자는 44글자 이다. 이것은 미국이 만들어서 영어 기준이다.
--그래서 영어는 44바이트가 필요함 하지만 한글은 글자수로 6글자는 5글자 * 3 = 15 + 1BYTE + 16 이며 16 + 44
SELECT * FROM TEMP01;
WHERE 절의 조건문 구성에 사용
BUYER는 거래처
CSRT 매출(_MEMBER구매 회원/_NO 카트의 고유 번호(날짜 8자리:연도 4자리-월2자리-일2자리)/_PROD 구매 상품 코드/_QTY 구매 상품 수량)
-- 다음 사람에게 부여하려면 +만 붙여도됨
LPROD: 상품 분류가 저장된 테이블(_ID 순번이며 시퀀스(차례로 부여되는 것: 오라클 객체)를 사용(기본키 아님)/_GU 코드 값 /_NM 분류 코드 명 )
--가장 상위 테이블
MEMBER (*_ID 기본키/_PASS/_NAME/_REGNO1 주민등록 번호 앞부분/_REGNO2 주민등록 번호 뒷부분/_BIR 생년월일/_ZIP 우편번호 코드/_ADD1 기본주소/_ADD2 상세 주소
/_HOMETEL집전화/_COMTEL/_HP핸드폰/_MAIL메일/_JOB직업/_LIKE 취미(원자값이여야 하는데 쪼개질 수 있어서 사용하면 안됨)/_MEMORIAL 기념일종류/_MEMORIADAY기념일
/_MILDAGE 물건 구매시 부가되는 마일리지 /_DELETE
PROD 상품 정보가 저장된 테이블(_ID 상품 번호/_NAME/_LGU 분류 코드(분류코드를 갖다 쓴것)/_BUYER 거래처 코드(잘못 사용한것)/_COST매입 단가/_PRICE 매출 단가
/_SALE할인 판매 단가/_OUTLINE대략적인 설명/_DETALE자세한 설명/_IMG 상품 이미지/_TOTALSTOCK 진짜 재고량/_INSDATE/_PROPERSTOCK 각 품목당 팔리는 갯수
/_SIZE 크기/_COLOR 색상/_DELIVERY 배송/_UNIT/_QTYN/_QTYSALE/_MILEAGE 하나의 상품이 팔렸을때 부여되는 마일리지
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 회원명,
MEM_ADD1 || ' ' || MEM_ADD2 AS"주 소",
EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM MEM_BIR) AS 나이,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_MILEAGE >= 3000;
-- WHERE절이 참일 때만 SELECT절 수행
-- 키워드가 없다는 에러가 날 경우FROM 절 위에 별칭을 찾아봐야함 (콤마)
사용예) 상품테이블에서 매입가가 10만원 이상인 상품을 조회하시오
Alias는 상품코드, 상품명, 매입가, 거래처명
SELECT A.PROD_ID AS 상품코드,
A.PROD_NAME AS 상품명,
A.PROD_COST AS 매입가,
B.BUYER_NAME AS 거래처명
FROM PROD A, BUYER B --PROD를 A로 BUYER를 B로 별칭함
WHERE A.PROD_COST >= 100000
AND A.PROD_BUYER = B.BUYER_ID; --테이블 조인
사용예) 사원테이블에서 급여가 5000이상 10000이하인 사원을 조회하시오
Alias는 사원번호, 사원명, 입사일, 부서코드, 급여
--HR 계정에 있는 것을 가져다 쓸때 HR.테이블명으로 작성해야 한다.
SELECT EMPLOYEE_ID AS 사원번호, --1
FIRST_NAME || ' ' || LAST_NAME AS 사원명, --2
HIRE_DATE AS 입사일, --3
DEPARTMENT_ID AS 부서코드, --4
SALARY AS 급여 --5
FROM HR.EMPLOYEES
WHERE SALARY >= 5000 AND SALARY <= 10000; -- WHERE SALARY BETWEEN 5000 AND 10000;
-- ORDER BY 4, 5(SALATY DESC);
-- 번호는 줄 수 / 내림차순으로 정렬
사용예) 2005년 1월 매입정보 중 매입수량이 20개이상인 상품만 조회하시오
Alias는 일자, 상품코드, 매입수량, 매입단가, 금액
SELECT BUY_DATE AS 일자,
BUY_PROD AS 상품코드,
BUY_QTY AS 매입수량,
BUY_COST AS 매입단가,
BUY_QTY * BUY_COST AS 금액
FROM BUYPROD
-- WHERE EXTRACT(YEAR FROM BUY_DATE) = 2005 AND EXTRACT(MONTH FROM BUY_DATE)
= 01 AND BUY_QTY >=20;
WHERE BUY_DATE >= TO_DATE('20050101') AND
BUY_DATE <= TO_DATE('20050131') AND
BUY_QTY >=20
ORDER BY 1;
사용예) 회원테이블에서 직업이 주부이면서 마일리지가 3000이상인 회원을 조회하시오 -- 이거나: OR
Alias는 회원 번호, 회원명, 직업, 마일리지
SELECT MEM_ID AS 회원번호, --회원 번호 라고 쓰면 오류남
MEM_NAME AS 회원명,
MEM_JOB AS 직업,
MEM_MILEAGE AS 마일리지
FROM MEMBER
WHERE MEM_JOB = '주부' AND MEM_MILEAGE >= 3000; --주부는 문자열 임
- 하나의 컬럼과 다수개의 데이터를 비교하여 그 중 어느 하나라도 일치하면 전체 결과가 참(TRUE)이 됨
- =ANY, =SOME으로 치환될 수 있음 (반드시 등호, 부등호가 와야함 IN은 필요없음)
- OR 연산자로 치환 가능
(사용형식)
expr IN(값1[,값2,...])
. 연속적이지 않은 값들을 비교하는 경우 주로 사용
사용예0 사원테이블에서 부서번호 10-30번부서의 사원정보를 조회하시오
Alias는 사원번호, 사원명, 부서번호, 직무코드
=> 이 경우 IN 연산자 보다 BETWEEN 또는 AND 연산자보다 효율적이다.
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME ||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID >= 10 AND DEPARTMENT_ID <= 30
ORDER BY 3;
-- WHERE DEPARTMENT_ID-BETWEEN 10 AND 30 ORDER BY 3;
-- WHERE DEPARTMENT_ID IN(10,20,30) ORDER BY 3;
-- WHERE DEPARTMENT_ID =1 OR DEPARTMENT_ID =20 OR DEPARTMENT_ID =30 ORDER BY 3;
사용예) 사원 테이블에서 부서번호 30,70,90,100번 부서의 사원정보를 조회하시오
Alias는 사원번호, 사원명, 부서번호, 직무코드 => 이 경우 IN 연산자가 다른 연산자보다 효율적이다.
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME ||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
JOB_ID AS 직무코드
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID =30 OR DEPARTMENT_ID =70 OR DEPARTMENT_ID =90 OR DEPARTMENT_ID =100
ORDER BY 3;
-- =SOME, =ANY(비교대상이 연속적이고 규칙적이지 않을때 사용) WHERE DEPARTMENT_ID =ANY(30,70,90,100)
사용예)사원의 수가 5명 이상인 부서에 속한 사원들을 조회하시오
Alias는 사원번호, 사원명, 부서코드
SELECT EMPLOYEE_ID AS 사원번호,
FIRST_NAME||' '||LAST_NAME AS 사원명,
DEPARTMENT_ID AS 부서코드
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(SELECT A.DID
FROM(SELECT DEPARTMENT_ID AS DID,
COUNT(*) AS CNT
FROM HR.EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>=5 A)
ORDER BY 3;