빅데이터 국비 교육

[아이티윌 빅데이터 52기] Day 4 데이터 입력/수정/삭제/데이터 고급 조회 1

datahaseo 2025. 10. 10. 10:39

데이터 입력 / 수정 / 삭제 / 데이터 고급 조회 1

<학습 내용>

-데이터 입력하기

-데이터 수정/삭제

-INNER JOIN / OUTER JOIN

 

 

데이터 입력하기

(1) 데이터 저장하기 INSERT INTO

-나열되는 컬럼 순서는 테이블 구조와 일치하지 않아도 괜찮음

-VALUE 와 컬럼은 1:1 대응 필요

 

 

 

데이터의 무결정

> 잘못된 데이터가 들어가는 것을 방지하고, 올바른 데이터만 유지되도록 보장하는 것

> 무결성을 보장하기 위해 테이블 생성 시 적절한 제약 조건을 설정 (테이블 생성 시 지정하는 옵션)

> 데이터 조회보다는 입력/ 수정 / 삭제 할 때 지키는 옵션들 

 

(1) 엔티티 무결성

-각 행은 고유해야하고, 각 행을 식별하기 위해서 NULL 이 아닌 고유 값(일련 번호) 가 필요하다 | 기본키 (PRIMARY KEY)

(EX 학급 동명이인을 중복 없는 번호로 구분)

 

(2) 도메인 무결성

-컬럼에 들어갈 값의 유형과 범위를 제한하는 것

(EX 나이는 0보다 큰 정수만 허용 / 특정 회사 범위 내에서만 통용되는 지식)

 

(3) 참조 무결성

-어떤 값은 반드시 다른 테이블에 저장되어 있는 값 중 하나여야 함

-테이블 2개가 논리적인 관계를 가지고 있어야 함

 

 

 

-기본키는 엔티티 무결성을 보장하며 NULL 불가

-유일한 컬럼

-기본키 값의 일련번호가 자동으로 증가하는 조건을 걸어줄 수 있음 (AUTO_INCREMENT)

-INSERT 구문에서 일련 번호 부분을 아예 생략

 

 

 

 


<연습문제>

 

1. 학과테이블(departments)에소프트웨어공학과를새로등록하세요.학과번호는자동으로생성되도록하며, 학과명은‘소프트웨어공학과’,위치는‘2호관’,전화번호는‘051-123-7890’,이메일은‘sw@myschool.ac.kr’, 설립연도는2012,홈페이지는‘http://sw.myschool.ac.kr’로입력하세요.

 

INSERT INTO DEPARTMENTS (dname,loc,phone,email,established,homepage) 
VALUES ('소프트웨어공학과' , '2호관' , '051-123-7890','sw@myschool.ac.kr',2012,'http://sw.myschool.ac.kr');

 

문자열 값('소프트웨어공학과', '2호관' 등)은 따옴표로 감싸고, 숫자 값(2012)은 따옴표 없이 입력

 

2, 방금등록한소프트웨어공학과에소속된학생1명을students테이블에추가하세요.학생의이름은‘박세린’, 학년은2학년이며,생년월일은2005년10월17일입니다.키는169cm,몸무게는56kg,성별은‘여’,학적 상태는‘재학’입니다.주민번호(idnum)과연락처는임의로지정하세요.

 

INSERT INTO STUDENTS (name,grade,birthdate,height,weight,gender,status,idnum,phone,user_id,department_id) VALUES ('박세린',2,'2005-10-17 00:00:00',169,56,'여','재학','21201-2000123','010-2339-8952','serin',504);

 

id 컬럼은 AUTO_INCREMENT 이므로 자동 생성되어 입력하지 않습니다.

 

 

3. 소프트웨어공학과에소속된교수1명을professors테이블에등록하세요.

이교수의이름은‘최정훈’이며, 아이디는‘jhchoi’,직급은‘부교수’입니다.급여는5,200,000원이며,입사일은2018년3월2일,재직상태는 ‘재직’입니다.소속학과는앞에서생성한학과와동일하게설정하세요.이메일,연락처,사진의URL은Null로 저장하세요.

 

INSERT INTO PROFESSORS (NAME,USER_ID,POSITION,SAL,HIREDATE,COMM,EMAIL,PHONE,PHOTO_URL,STATUS,DEPARTMENT_ID) VALUES ('최정훈','jhchoi','부교수',520,'2018-03-02 00:00:00',NULL,NULL,NULL,NULL,'재직',504);

 

 

4.소프트웨어공학과에서개설하는과목으로‘소프트웨어프로젝트실습’을추가하세요.학점은3이며,개설학과 번호는소프트웨어공학과로설정하세요.담당교수는아직정해지지않았습니다.

 

INSERT INTO  SUBJECTS (NAME,CREDIT,DEPARTMENT_ID,PROFESSOR_ID) VALUES ('소프트웨어 프로젝트 실습',3,504,NULL);

 

 

5.학생번호10101번이`웹프로그래밍`과목을2025년3월2일에수강신청하였습니다.이학생의점수는아직 부여되지않았습니다.이정보를enrollments테이블에등록하세요

 

INSERT INTO ENROLLMENTS (STUDENT_ID, SUBJECT_ID ,ENROLL_DATE, SCORE) VALUES (10101,1007,'2025-03-02',NULL);

 

 

 

도메인 무결성

 

-정해진 형식의 데이터만 저장 가능

-ENUM 열거형 데이터로 고정값 지정 

 

 

 

 

-MD5 로 암호화하여 INSERT 가능하고, WHERE 절에서도 MD5 로 감싸서 조회해야함

 

 

 


<연습문제>

1. students테이블에학생을추가하되,성별은‘남’,상태는‘재학’으로저장하세요.입학일은오늘날짜로 저장하며,키/몸무게는임의로설정하세요.그밖의다른필수항목은임의의데이터로지정하세요.

 

INSERT INTO STUDENTS (NAME,USER_ID,GRADE,IDNUM,BIRTHDATE,PHONE,HEIGHT,WEIGHT,DEPARTMENT_ID,GENDER,STATUS,ADMISSION_DATE) VALUES ('정보희','BOHEE',3,MD5('BOHEE'),'1999-05-06 06:30:30','010-2339-8952','160','55','504','남','재학',CURDATE())

 

 

2.101번학과의박태수부교수의이메일주소는'PARK@MYSCHOOL.AC.KR'이다.이메일을모두소문자로 변환해서등록하세요.그밖의정보는임의로저장하세요.

INSERT INTO PROFESSORS (NAME,USER_ID,POSITION,SAL,HIREDATE,EMAIL,STATUS,DEPARTMENT_ID) VALUES ('박태수','TAESU','부교수','200',CURDATE(),LOWER('PARK@MYSCHOOL.AC.KR' ),'재직',101)

 

 

3.학생이름이'김하늘',소속학과명이'소프트웨어공학과'인학생을등록하세요. 이메일은이름 +소속학과앞글자3개@myschool.ac.kr형식으로생성하며,전부소문자로저장하면됩니다. 예:kim소프@myschool.ac.kr→kim소프@myschool.ac.kr→소문자변환 그밖의정보는임의로설정하여저장하세요.

 

INSERT INTO STUDENTS (NAME,USER_ID,GRADE,IDNUM,BIRTHDATE,PHONE,HEIGHT,WEIGHT,DEPARTMENT_ID,EMAIL) VALUES ('김하늘','HANEUL',3,MD5('HANEUL'),'1999-05-06','010-2339-8952',160,55,101,LOWER(CONCAT('HANEUL','소프트','@myschool.ac.kr')))

 

4.enrollments테이블은student_id와subject_id가참조키입니다.존재하지않는학생번호와과목번호로 수강신청을시도해보세요.

 

INSERT INTO ENROLLMENTS (STUDENT_ID,SUBJECT_ID,ENROLL_DATE) VALUES (10000,10000,NOW())

ERROR 1452 (23000): Cannot add or update a child row:

 

5.students테이블에성별을'남성'으로잘못입력하면어떤일이발생하는지확인해보세요

INSERT INTO STUDENTS (NAME,USER_ID,GRADE,IDNUM,BIRTHDATE,PHONE,HEIGHT,WEIGHT,DEPARTMENT_ID,EMAIL,GENDER) VALUES ('김구름','GURUM',3,MD5('GURUM'),'1999-05-06 00:00:00','010-2339-8952',160,55,101,LOWER(CONCAT('GURUM ','소프트','@myschool.ac.kr')),'남성')

ERROR 1265 (01000): Data truncated for column 'gender' at row 1

 

 

 

데이터 수정/삭제

 

참조키가 걸려있는 경우 부모키를 함부로 삭제할 수 없음

 

 

<연습문제>

1.학번이10101번인학생의전화번호를'010-1234-5678'로수정하세요.

 

UPDATE STUDENTS
SET PHONE = '010-1234-5678'
WHERE ID=10101

 

2.모든‘휴학’상태의학생을‘재학’으로변경하세요.

 

UPDATE STUDENTS
SET STATUS = '재학'
WHERE STATUS ='휴학'

 

3.1학년학생중키가160cm이하인학생을삭제하시오.삭제가안될경우왜삭제가안되는지 확인하세요.

 

DELETE FROM  STUDENTS
WHERE HEIGHT <= 160 AND GRADE =1

 

Cannot delete or update a parent row: a foreign key constraint fails 

 

4.102번학과의이름을'소프트웨어학과'로,위치를'공학관'으로수정하세요.

UPDATE DEPARTMENTS
SET DNAME = '소프트웨어학과' , LOC = '공학관'
WHERE ID = 102

 

 

INNER JOIN

-두 테이블을 연결해서 공통된 값을 기준으로 데이터를 조회하는 방법

-양쪽 테이블 모두에 존재하는 값 출력

- EQUI JOIN ,NATURAL JOIN 과 같음

 

-ON 뒤에 두 테이블을 연결할 조건 명시

 

 

 

 

 


1. 학생 이름과 지도 교수 이름을 함께 출력하시오.

 SELECT S.NAME , P.NAME FROM STUDENTS S INNER JOIN PROFESSORS P ON S.PROFESSOR_ID = P. ID;

 

 

 

2. 수강신청한 학생의 이름과 수강한 과목명을 출력하시오

 

SELECT S.NAME , SB.NAME FROM ENROLLMENTS E
INNER JOIN STUDENTS S ON E.STUDENT_ID = S.ID
INNER JOIN SUBJECTS SB ON E.SUBJECT_ID = SB.ID

 

 

 

3. 학생이 수강한 과목과 그 과목의 학과명을 출력하시오.

 

SELECT S.NAME,D.DNAME,SB.NAME  FROM STUDENTS S

INNER JOIN DEPARTMENTS D ON S.DEPARTMENT_ID= D. ID

INNER JOIN SUBJECTS SB ON S.PROFESSOR_ID= SB. PROFESSOR_ID

 

 SELECT 
  s.name AS 
학생이름
, 
  sub.name AS 
과목명
, 
  d.dname AS 
개설학과
 
FROM enrollments e 
INNER JOIN students s ON e.student_id = s.id 
INNER JOIN subjects sub ON e.subject_id = sub.id 
INNER JOIN departments d ON sub.department_id = d.id;

 

 

4. 2024년 이후 입사한 교수의 이름과 소속 학과명을 출력하시오.

 

SELECT P.NAME, D.DNAME FROM PROFESSORS P INNER JOIN DEPARTMENTS D 
ON P.DEPARTMENT_ID = D.ID
WHERE YEAR(P.HIREDATE) > 2024;

 

 

5. 2과목 이상 수강신청한 학생에 대해서 학생별로 학생의 이름과 수강신청한 과목 수, 평균 점수를 평균점수가 높은 순으로 조회 하시오.

SELECT S.NAME, COUNT(*) COUNT, AVG(E.SCORE) AVG_SCORE FROM STUDENTS S
INNER JOIN ENROLLMENTS E ON S.ID = E.STUDENT_ID
GROUP BY S.ID
HAVING COUNT(e.subject_id)>=2
ORDER BY AVG_SCORE DESC

 

*S.NAME 으로 GROUP BY 했는데, 동명 이인이 있어 다른 결과가 나왔음

 

 

 

OUTER JOIN

-기준 테이블의 모든 행을 결과에 포함시키는 방식

-한쪽에만 존재해도 결과에 포함

 

 

 

1. professors 와 subjects 를 조인하여, 과목을 담당하지 않는 교수의 이름만 출력하세요

 

SELECT * FROM PROFESSORS P LEFT JOIN SUBJECTS S ON P.ID = S.PROFESSOR_ID WHERE S.NAME IS NULL;

 

 

2. departments 와 subjects 를 조인하여, 학과명과 과목 수를 출력하세요. 모든 학과가 포함되어야 하며,

과목이 없는 학과도 출력되어야 합니다.

SELECT D.DNAME, COUNT(S.NAME)

FROM DEPARTMENTS D LEFT OUTER JOIN SUBJECTS S ON D.ID = S.DEPARTMENT_ID

GROUP BY D.DNAME;

 

3. 담당 과목이 없는 교수도 포함하여, 교수 이름과 담당 과목명을 출력하시오.

모든 교수를 출력하되, 과목을 맡지 않은 교수의 과 목명은 NULL로 표시되도록 하세요

 

SELECT P.NAME,S.NAME  FROM PROFESSORS P LEFT OUTER JOIN SUBJECTS S ON P.ID = S.PROFESSOR_ID

 

4. 모든 학생의 이름과 수강신청한 과목명을 출력하시오.

단, 수강신청을 하지 않은 학생도 모두 포함되어야 하며, 수강신청이 없 는경우 과목명은 NULL로 표시됩니다

 

SELECT * FROM STUDENTS S LEFT JOIN 

 

 

 

5. students 와 enrollments 를 조인하여, 수강 신청을 한 번도 하지 않은 학생의 이름을 출력하세요

SELECT * FROM STUDENTS S LEFT OUTER JOIN ENROLLMENTS E ON S.ID = E.STUDENT_ID

WHERE E.STUDENT ID IS NULL