[Oracle] Solution to puzzles

Joy🌱·2023λ…„ 1μ›” 17일
0

🧩 Coding Challenges

λͺ©λ‘ 보기
14/20
post-thumbnail
post-custom-banner

🧩 DDL을 ν™œμš©ν•˜μ—¬ 쿼리문 짜기

Q1

πŸ’β€ 계열 정보λ₯Ό μ €μž₯ν•  μΉ΄ν…Œκ³ λ¦¬ ν…Œμ΄λΈ”μ„ λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν…Œμ΄λΈ”μ„ μž‘μ„±ν•˜μ„Έμš”.

CREATE TABLE TB_CATEGORY (
    NAME VARCHAR2(10)
 ,  USE_YN CHAR(1) DEFAULT 'Y'
);

Q2

πŸ’β€ κ³Όλͺ© ꡬ뢄을 μ €μž₯ν•  ν…Œμ΄λΈ”μ„ λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν…Œμ΄λΈ”μ„ μž‘μ„±ν•˜μ„Έμš”.

CREATE TABLE TB_CLASS_TYPE (
    NO VARCHAR2(5) PRIMARY KEY
,   NAME VARCHAR2(10)
);

Q3

πŸ’β€ TB_CATEGORY ν…Œμ΄λΈ”μ˜ NAME μ»¬λŸΌμ— PRIMARY KEY λ₯Ό μƒμ„±ν•˜μ„Έμš”.
(KEY 이름을 μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 무방. 만일 KEY 이λ₯Ό μ§€μ •ν•˜κ³ μž ν•œλ‹€λ©΄ 이름은 본인이 μ•Œμ•„μ„œ μ λ‹Ήν•œ 이름을 μ‚¬μš©)

ALTER TABLE TB_CATEGORY 
ADD CONSTRAINT PK_CATE_NAME PRIMARY KEY(NAME);

Q4

πŸ’β€ TB_CLASS_TYPE ν…Œμ΄λΈ”μ˜ NAME μ»¬λŸΌμ— NULL 값이 듀어가지 μ•Šλ„λ‘ 속성을 λ³€κ²½ν•˜μ„Έμš”.

ALTER TABLE TB_CLASS_TYPE
MODIFY NAME CONSTRAINT NN_CLASS_NAME NOT NULL;

Q5

πŸ’β€ 두 ν…Œμ΄λΈ”μ—μ„œ 컬럼 λͺ…이 NO인 것은 κΈ°μ‘΄ νƒ€μž…μ„ μœ μ§€ν•˜λ©΄μ„œ ν¬κΈ°λŠ” 10 으둜, 컬럼λͺ…이 NAME 인 것은 λ§ˆμ°¬κ°€μ§€λ‘œ κΈ°μ‘΄ νƒ€μž…μ„ μœ μ§€ν•˜λ©΄μ„œ 크기 20 으둜 λ³€κ²½ν•˜μ„Έμš”.

ALTER TABLE TB_CATEGORY
MODIFY NAME VARCHAR2(20);

ALTER TABLE TB_CLASS_TYPE
MODIFY NO VARCHAR2(10)
MODIFY NAME VARCHAR2(20);

Q6

πŸ’β€ 두 ν…Œμ΄λΈ”μ˜ NO 컬럼과 NAME 컬럼의 이름을 각 각 TB_ λ₯Ό μ œμ™Έν•œ ν…Œμ΄λΈ” 이름이 μ•žμ— 뢙은 ν˜•νƒœλ‘œ λ³€κ²½ν•˜μ„Έμš”. (ex. CATEGORY_NAME)

ALTER TABLE TB_CATEGORY
RENAME COLUMN NAME TO CATEGORY_NAME;

ALTER TABLE TB_CLASS_TYPE
RENAME COLUMN NO TO CLASS_TYPE_NO;
ALTER TABLE TB_CLASS_TYPE
RENAME COLUMN NAME TO CLASS_TYPE_NAME;
-- ν•¨κ»˜ RENAME을 ν–ˆμ„ λ•Œ, '이 μž‘μ—…μ„ λ‹€λ₯Έ μž‘μ—…κ³Ό κ²°ν•©ν•  수 μ—†μŒ' 였λ₯˜

Q7

πŸ’β€ TBCATEGORY ν…Œμ΄λΈ”κ³Ό TB_CLASS_TYPE ν…Œμ΄λΈ”μ˜ PRIMARY KEY 이름을 λ‹€μŒκ³Ό 같이 λ³€κ²½ν•˜μ„Έμš”. Primary Key 의 이름은 "PK + μ»¬λŸΌμ΄λ¦„"으둜 μ§€μ •ν•˜μ„Έμš”. (ex. PK_CATEGORY_NAME )

/* TB_CATEGORY μ œμ•½ 쑰건λͺ… λ³€κ²½(NAME) */
ALTER TABLE TB_CATEGORY
RENAME CONSTRAINT PK_CATE_NAME TO PK_CATEGORY_NAME;

/* TB_CLASS_TYPE μ œμ•½ 쑰건λͺ… λ³€κ²½(NO) */
ALTER TABLE TB_CLASS_TYPE
RENAME CONSTRAINT SYS_C008168 TO PK_CLASS_TYPE_NO; -- ν…Œμ΄λΈ”μ—μ„œ 찾아와야함

Q8

πŸ’β€ λ‹€μŒκ³Ό 같은 INSERT 문을 μˆ˜ν–‰ν•˜μ„Έμš”.

INSERT
    INTO TB_CATEGORY
VALUES (
    '곡학', 'Y'
);

INSERT
    INTO TB_CATEGORY
VALUES (
    'μžμ—°κ³Όν•™', 'Y'
);

INSERT
    INTO TB_CATEGORY
VALUES (
    'μ˜ν•™', 'Y'
);

INSERT
    INTO TB_CATEGORY
VALUES (
    '예체λŠ₯', 'Y'
);

INSERT
    INTO TB_CATEGORY
VALUES (
    'μΈλ¬Έμ‚¬νšŒ', 'Y'
);

COMMIT;

Q9

πŸ’β€ TBDEPARTMENT 의 CATEGORY 컬럼이 TB_CATEGORY ν…Œμ΄λΈ”μ˜ CATEGORY_NAME μ»¬λŸΌμ„ λΆ€λͺ¨ κ°’μœΌλ‘œ μ°Έμ‘°ν•˜λ„λ‘ FOREIGN KEY λ₯Ό μ§€μ •ν•˜μ„Έμš”. 이 λ•Œ KEY 이름은 FKν…Œμ΄λΈ”μ΄λ¦„_μ»¬λŸΌμ΄λ¦„μœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.
(ex. FK_DEPARTMENT_CATEGORY )

ALTER TABLE TB_DEPARTMENT 
ADD CONSTRAINT FK_DEPARTMENT_CATEGORY FOREIGN KEY(CATEGORY) REFERENCES TB_CATEGORY(CATEGORY_NAME);

Q10

πŸ’β€ 좘 κΈ°μˆ λŒ€ν•™κ΅ ν•™μƒλ“€μ˜ μ •λ³΄λ§Œμ΄ ν¬ν•¨λ˜μ–΄ μžˆλŠ” ν•™μƒμΌλ°˜μ •λ³΄ VIEW λ₯Ό λ§Œλ“€κ³ μž ν•©λ‹ˆλ‹€. μ•„λž˜ λ‚΄μš©μ„ μ°Έκ³ ν•˜μ—¬ μ μ ˆν•œ SQL 문을 μž‘μ„±ν•˜μ„Έμš”.

CREATE OR REPLACE VIEW VW_ν•™μƒμΌλ°˜μ •λ³΄
(
    ν•™λ²ˆ
,   학생이름
,   μ£Όμ†Œ
)
AS
SELECT
        STUDENT_NO
    ,   STUDENT_NAME
    ,   STUDENT_ADDRESS
    FROM TB_STUDENT;
    
/* λ·°λ₯Ό 생성할 수 μžˆλŠ” κΆŒν•œμ„ μ£ΌλŠ” ꡬ문 (system κ³„μ •μ—μ„œ μ‹€ν–‰) */
GRANT CREATE VIEW TO C##HOMEWORK;

Q11

πŸ’β€ 좘 κΈ°μˆ λŒ€ν•™κ΅λŠ” 1 년에 두 λ²ˆμ”© ν•™κ³Όλ³„λ‘œ 학생과 μ§€λ„κ΅μˆ˜κ°€ 지도 면담을 μ§„ν–‰ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ μ‚¬μš©ν•œ 학생이름, 학과이름, λ‹΄λ‹Ήκ΅μˆ˜μ΄λ¦„ 으둜 κ΅¬μ„±λ˜μ–΄ μžˆλŠ” VIEW λ₯Ό λ§Œλ“œμ„Έμš”. μ΄λ•Œ 지도 κ΅μˆ˜κ°€ μ—†λŠ” 학생이 μžˆμ„ 수 μžˆμŒμ„ κ³ λ €ν•˜μ„Έμš”. (단, 이 VIEW λŠ” λ‹¨μˆœ SELECTλ§Œμ„ ν•  경우 ν•™κ³Όλ³„λ‘œ μ •λ ¬λ˜μ–΄ 화면에 λ³΄μ—¬μ§€κ²Œ λ§Œλ“œμ„Έμš”.)

CREATE OR REPLACE VIEW VW_지도면담
(
    학생이름
,   학과이름
,   μ§€λ„κ΅μˆ˜μ΄λ¦„
)
AS
SELECT
        STUDENT_NAME
    ,   DEPARTMENT_NAME
    ,   NVL(PROFESSOR_NAME, 'μ§€λ„κ΅μˆ˜μ—†μŒ')
    FROM TB_STUDENT
    JOIN TB_DEPARTMENT USING (DEPARTMENT_NO)
    LEFT JOIN TB_PROFESSOR ON (COACH_PROFESSOR_NO = PROFESSOR_NO);
    
SELECT
        VW.*
    FROM VW_지도면담 VW;

Q12

πŸ’β€ λͺ¨λ“  ν•™κ³Όμ˜ 학과별 학생 수λ₯Ό 확인할 수 μžˆλ„λ‘ μ μ ˆν•œ VIEWλ₯Ό μž‘μ„±ν•˜μ„Έμš”.

CREATE OR REPLACE VIEW VW_ν•™κ³Όλ³„ν•™μƒμˆ˜
(
    DEPARTMENT_NAME
,   STUDENT_COUNT
)
AS
SELECT
        DEPARTMENT_NAME
    ,   COUNT(S.DEPARTMENT_NO)
    FROM TB_DEPARTMENT D
    JOIN TB_STUDENT S ON(D.DEPARTMENT_NO = S.DEPARTMENT_NO)
    GROUP BY DEPARTMENT_NAME;

Q13

πŸ’β€ μœ„μ—μ„œ μƒμ„±ν•œ ν•™μƒμΌλ°˜μ •λ³΄ Viewλ₯Ό ν†΅ν•΄μ„œ ν•™λ²ˆμ΄ A213046 인 ν•™μƒμ˜ 이름을 본인 μ΄λ¦„μœΌλ‘œ λ³€κ²½ν•˜λŠ” SQL 문을 μž‘μ„±ν•˜μ„Έμš”.

UPDATE
       VW_ν•™μƒμΌλ°˜μ •λ³΄
   SET 학생이름 = 'μ‘°νš¨μ—°'
 WHERE ν•™λ²ˆ = 'A213046';
 >>> 별칭을 달아쀬닀면 별칭을 μ μ–΄μ€˜μ•Όν•¨ !

Q14

πŸ’β€ 13 λ²ˆμ—μ„œμ™€ 같이 VIEWλ₯Ό ν†΅ν•΄μ„œ 데이터가 변경될 수 μžˆλŠ” 상황을 λ§‰μœΌλ €λ©΄ VIEW λ₯Ό μ–΄λ–»κ²Œ 생성해야 ν•˜λŠ”μ§€ μž‘μ„±ν•˜μ„Έμš”.

VIEW 생성 μ‹œ, WITH READ ONLY(DML μˆ˜ν–‰μ΄ λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μ˜΅μ…˜)λ₯Ό μž…λ ₯ν•˜μ—¬ μ‚½μž…/μˆ˜μ •/μ‚­μ œλ₯Ό λ§‰λŠ”λ‹€.

profile
Tiny little habits make me
post-custom-banner

0개의 λŒ“κΈ€