※동물병원 실습 강사님 풀이
/*
* TBL_OWNER
----------------------------------
OWNER_ID NUMBER PK_OWNER
----------------------------------
OWNER_NAME VARCHAR2 NOT NULL
OWNER_AGE NUMBER
OWNER_ADDRESS VARCHAR2 NOT NULL
OWNER_PHONE VARCHAR2 NOT NULL
* */
CREATE TABLE TBL_OWNER(
OWNER_ID NUMBER CONSTRAINT PK_OWNER PRIMARY KEY,
OWNER_NAME VARCHAR2(500) NOT NULL,
OWNER_AGE NUMBER,
OWNER_ADDRESS VARCHAR2(500) NOT NULL,
OWNER_PHONE VARCHAR2(500) NOT NULL
);
/*
* TBL_PET
----------------------------------
PET_ID NUMBER PK_PET
----------------------------------
PET_TYPE VARCHAR2 NOT NULL
PET_NAME VARCHAR2 NOT NULL
PET_AGE NUMBER NOT NULL
PET_ILL_NAME VARCHAR2 NOT NULL
OWNER_ID NUMBER FOREIGN KEY FK_PET_OWNER
* */
CREATE TABLE TBL_PET(
PET_ID NUMBER CONSTRAINT PK_PET PRIMARY KEY,
PET_TYPE VARCHAR2(500) NOT NULL,
PET_NAME VARCHAR2(500) NOT NULL,
PET_AGE NUMBER NOT NULL,
PET_ILL_NAME VARCHAR2(500) NOT NULL,
OWNER_ID NUMBER,
CONSTRAINT FK_PET_OWNER FOREIGN KEY(OWNER_ID)
REFERENCES TBL_OWNER(OWNER_ID)
);

DML(Data Manipulation Language)
1. SELECT : 조회(검색)
SELECT [컬럼명, ...]
FROM [테이블명]
WHERE [조건식];
2. INSERT : 추가
1) 컬럼은 전부 다 작성하지 않아도 되고 필요한 컬럼만 작성 할 수 있다.
INSERT INTO [테이블명] ([컬럼명, ...])
VALUES([값, ...]);
/*TBL_ANIMAL = ANIMAL 테이블의 ANIMAL_ID 열 확인
SELECT ANIMAL_ID FROM TBL_ANIMAL;
*/
/*TBL_STUDENT = TBL_SSTUDENT 테이블의 STUDENT_ID 열 출력
SELECT STUDENT_ID FROM TBL_STUDENT;
*/
/*전체 컬럼 가져오기*/
SELECT * FROM TBL_ANIMAL;
/*추가 : ANIMAL 테이블에 생성했던 해당 열들에 값을 추가*/
INSERT INTO TBL_ANIMAL (ANIMAL_ID, ANIMAL_KIND, ANIMAL_AGE, ANIMAL_FEED)
VALUES(1, '개', 10, '사료');

2) 모든 값을 전부 순서대로 작성해야 되며, 컬럼명은 직접 작성하지 않아도 된다.
INSERT INTO [테이블명]
VALUES([값, ...]);
3. UPDATE : 수정(기존 데이터를 다른값으로 변경할때 사용)
UPDATE [테이블명]
SET [기존 컬럼명] = [값], [기존 컬럼명] = [값], ...
WHERE [조건식];
/* 수정 : WHERE 절이 없으면 해당 열의 모든 값이 바뀌기때문에 경고창 생성*/
UPDATE TBL_ANIMAL
SET ANIMAL_KIND = '고양이';
WHERE ANIMAL_ID =1; /*ANIMAL ID가 1인 값을 수정하라*/

4. DELETE : 삭제
DELETE FROM [테이블명]
WHERE [조건식];
/*삭제 DELETE : 데이터의 값들을 삭제한다 / DROP 은 테이블 자체를 삭제*/
DELETE TBL_ANIMAL;

/* 중복 없을때 규칙성없이 PK를 활용하여 사용*/
CREATE SEQUENCE SEQ_ANIMAL;
/*전체 컬럼 가져오기*/
SELECT * FROM TBL_ANIMAL;
/*추가 : ANIMAL 테이블에 생성했던 해당 열들에 값을 추가*/
INSERT INTO TBL_ANIMAL (ANIMAL_ID, ANIMAL_KIND, ANIMAL_AGE, ANIMAL_FEED)
VALUES(SEQ_ANIMAL.NEXTVAL, '개', 10, '사료');
INSERT INTO TBL_ANIMAL (ANIMAL_ID, ANIMAL_KIND, ANIMAL_AGE, ANIMAL_FEED)
VALUES(SEQ_ANIMAL.NEXTVAL, '고양이', 5, '사료');
DROP TABLE TBL_ANIMAL;
/*SEQUENCE 삭제*/
DROP SEQUENCE SEQ_ANIMAL;

SELECT * FROM TBL_STUDENT;
CREATE SELECT SEQ_STUDENT;
/*HR-테이블 우클릭-SQL 선택에서 COPY 작성 가능*/
/*화면에서 입력받는 부분*/
INSERT INTO TBL_STUDENT
(STUDENT_ID, STUDENT_IDENTIFICATION, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER, STUDENT_BIRTH, STUDENT_AGE, STUDENT_GRADE)
VALUES(SEQ_STUDENT.NEXTVAL ,'STS', '송태섭', '농구', 'N', '1985-12-04', 20, 'A+');
/*DEFAULT 설정해 둔 값은 추가할때 뺄 수 있다*/
/*SEQUENS는 오류가 나도 숫자가 올라간다*/
INSERT INTO TBL_STUDENT
(STUDENT_ID, STUDENT_IDENTIFICATION, STUDENT_NAME, STUDENT_MAJOR, STUDENT_BIRTH, STUDENT_AGE, STUDENT_GRADE)
VALUES(SEQ_STUDENT.NEXTVAL, 'sch', '성춘향', '그네', '2000-12-04', 24, 'D');
/*테이블 수정*/
UPDATE TBL_STUDENT
SET STUDENT_MAJOR = '실용음악'
WHERE STUDENT_IDENTIFICATION = 'sch';
/*송태섭 자퇴*/
DELETE FROM TBL_STUDENT
WHERE STUDENT_ID = 21;


/*TBL_FLOWER 조합키 수정하기*/
SELECT * FROM TBL_FLOWER;
INSERT INTO TBL_FLOWER
(FLOWER_NAME, FLOWER_COLOR, FLOWER_PRICE)
VALUES('장미', '빨간색', 5000);
INSERT INTO TBL_FLOWER
(FLOWER_NAME, FLOWER_COLOR, FLOWER_PRICE)
VALUES('장미', '노란색', 5000);
/*노란색 해바라기로 수정*/
UPDATE TBL_FLOWER
SET FLOWER_NAME ='해바라기'
WHERE FLOWER_COLOR ='노란색' AND FLOWER_NAME ='장미';
/*TBL_POT*/
SELECT *FROM TBL_POT;
CREATE SEQUENCE TBL_POT ;
/*해바라기가 */
INSERT INTO TBL_POT
(POT_ID, POT_SHAPE, POT_COLOR, FLOWER_NAME, FLOWER_COLOR)
VALUES(SEQ_POT.NEXTVAL, '원기둥', '흰색', '해바라기', '노란색');
/*POT에서 쓰고있기때문에 FLOWER에서 수정이 불가 부모에 국화를 추가하고 실행가능
UPDATE TBL_FLOWER
SET FLOWER_NAME = '국화'
WHERE FLOWER_COLOR = '노란색' AND FLOWER_NAME = '해바라기';*/
INSERT INTO TBL_FLOWER
(FLOWER_NAME, FLOWER_COLOR, FLOWER_PRICE)
VALUES('국화', '노란색', 4000);


DELETE FROM TBL_POT
WHERE FLOWER_NAME = '해바라기' AND FLOWER_COLOR ='노란색';
/*참조하는 데이터가 연결된 테이블에 존재하기에 위에문구 먼저 실행해야 실행 가능*/
DELETE FROM TBL_FLOWER
WHERE FLOWER_COLOR ='노란색' AND FLOWER_NAME ='해바라기'

/*수정 실습*/
CREATE TABLE TBL_OWNER(
OWNER_ID NUMBER CONSTRAINT PK_OWNER PRIMARY KEY,
OWNER_NAME VARCHAR2(500) NOT NULL,
OWNER_AGE NUMBER,
OWNER_ADDRESS VARCHAR2(500) NOT NULL,
OWNER_PHONE VARCHAR2(500) NOT NULL
);
CREATE TABLE TBL_PET(
PET_ID NUMBER CONSTRAINT PK_PET PRIMARY KEY,
PET_TYPE VARCHAR2(500) NOT NULL,
PET_NAME VARCHAR2(500) NOT NULL,
PET_AGE NUMBER NOT NULL,
PET_ILL_NAME VARCHAR2(500) NOT NULL,
OWNER_ID NUMBER,
CONSTRAINT FK_PET_OWNER FOREIGN KEY(OWNER_ID)
REFERENCES TBL_OWNER(OWNER_ID)
);
CREATE SEQUENCE SEQ_OWNER;
CREATE SEQUENCE SEQ_PET;
/*정보 조회*/
SELECT * FROM TBL_OWNER;
SELECT * FROM TBL_PET;
DELETE FROM TBL_OWNER;
DELETE FROM TBL_PET;
/*정보 추가*/
INSERT INTO TBL_OWNER
(OWNER_ID, OWNER_NAME, OWNER_AGE, OWNER_ADDRESS, OWNER_PHONE)
VALUES(SEQ_OWNER.NEXTVAL, '송태섭', 20, '경기도', '010-1234-1234');
INSERT INTO TBL_OWNER
(OWNER_ID, OWNER_NAME, OWNER_AGE, OWNER_ADDRESS, OWNER_PHONE)
VALUES(SEQ_OWNER.NEXTVAL, '채치수', 21, '서울', '010-5555-9999');
/*정보 수정: 보호자 이름 변경*/
UPDATE TBL_OWNER
SET OWNER_NAME = '정대만'
WHERE OWNER_ID = 1;
/*동일한 보호자의 반려 동물 추가*/
INSERT INTO TBL_PET
(PET_ID, PET_TYPE, PET_NAME, PET_AGE, PET_ILL_NAME, OWNER_ID)
VALUES(SEQ_PET.NEXTVAL, '말티즈', '뽀삐', 5, '감기', 25);
INSERT INTO TBL_PET
(PET_ID, PET_TYPE, PET_NAME, PET_AGE, PET_ILL_NAME, OWNER_ID)
VALUES(SEQ_PET.NEXTVAL, '고양이', '나비', 1, '배탈', 25);
INSERT INTO TBL_PET
(PET_ID, PET_TYPE, PET_NAME, PET_AGE, PET_ILL_NAME, OWNER_ID)
VALUES(SEQ_PET.NEXTVAL, '고양이', '톰', 2, '방광염', 26);
INSERT INTO TBL_PET
(PET_ID, PET_TYPE, PET_NAME, PET_AGE, PET_ILL_NAME, OWNER_ID)
VALUES(SEQ_PET.NEXTVAL, '고양이', '잭', 2, '눈병', 26);
/*반려동물을 키우고 있는 보호자를 PET 테이블에서 삭제(유기ㅠㅠ)*/
/*FK를 NULL로 초기화 해주고*/
UPDATE TBL_PET
SET OWNER_ID = NULL
WHERE OWNER_ID IS NOT NULL;
/*고양이 는 다시 24번이 데려가면서 보호자 1명을 삭제*/
UPDATE TBL_PET
SET OWNER_ID = 26
WHERE PET_TYPE = '고양이';
/*두 마리 이상의 반려동물 보호자의 핸드폰 번호를 다른 번호로 변경*/
/*GROUP BY ": 중복없이 그룹을 묶는다*/
/*HAVING 집계함수 : 2마리 이상인 OWNER_ID 를 SET해주기 위함 */
UPDATE TBL_OWNER
SET OWNER_PHONE = '010-8888-7777'
WHERE OWNER_ID =
(
SELECT OWNER_ID FROM TBL_PET
GROUP BY OWNER_ID
HAVING COUNT(OWNER_ID) >= 2
);


/*DML(조회) 실습(API 테이블 사용)*/
SELECT * FROM PLAYER;
/*PLAYER 테이블에서 TEAM_ID가 'K01'인 선수*/
SELECT * FROM PLAYER WHERE TEAM_ID = 'K01';
/*PLAYER 테이블에서 TEAM_ID가 'K01'이 아닌 선수*/
SELECT * FROM PLAYER WHERE TEAM_ID != 'K01';
/*PLAYER 테이블에서 WEIGHT가 70이상이고 80이하인 선수*/
SELECT * FROM PLAYER WHERE WEIGHT >= 70 AND WEIGHT <= 80;
SELECT * FROM PLAYER WHERE WEIGHT BETWEEN 70 AND 80;
/*PLAYER 테이블에서 TEAM_ID가 'K03'이고 HEIGHT가 180미만인 선수*/
SELECT * FROM PLAYER WHERE TEAM_ID = 'K03' AND HEIGHT < 180;
/*PLAYER 테이블에서 TEAM_ID가 'K06'이고 NICKNAME이 '제리'인 선수*/
SELECT * FROM PLAYER WHERE TEAM_ID = 'K06' AND NICKNAME = '제리';
SELECT NICKNAME FROM PLAYER;
/*PLAYER 테이블에서 HEIGHT가 170이상이고 WEIGHT가 80이상인 선수 이름*/
SELECT * FROM PLAYER WHERE HEIGHT >= 170 AND WEIGHT >= 80;
/*STADIUM 테이블에서 SEAT_COUNT가 30000 초과이고 41000이하인 경기장*/
SELECT * FROM STADIUM WHERE SEAT_COUNT > 30000 AND SEAT_COUNT <= 41000;
/*PLAYER 테이블에서 TEAM_ID가 'K02'이거나 'K07'이고 포지션은 'MF'인 선수*/
SELECT * FROM PLAYER WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07') AND "POSITION" = 'MF';
SELECT * FROM PLAYER WHERE TEAM_ID IN ('K02', 'K07') AND "POSITION" = 'MF';
DB 조건식
>,< : 초과, 미만
>=, <= : 이상, 이하
= : 같다.
<>, !=, ^= : 같지 않다.
AND : 둘다 참이면 참
OR : 둘 중 하나라도 참이면 참
TCL(Transaction Control Langyage) : 트랜잭션 제어어
트랜젝션
하나의 서비스를 구현하기 위한 DML의 묶음
COMMIT
모든 작업을 확정하는 명령어
ROLLBACK
이전 커밋시점으로 이동
ex)결제시 포인트 적립
결제라는 서비스 하나
상품, 고객 테이블 수정
하나의 서비스를 구현할때 쿼리들 : 트랜잭션
댓글