본문 바로가기

코딩 공부/DataBase

[DataBase] 09_입력, 수정, 삭제

입력, 수정, 삭제

#01. 데이터 입력하기

1) INSERT 절

  • 테이블에 데이터를 추가하기 위한 구문\
insert into <테이블이름> values (값1, 값2,...,값n);
  • 값을 명시하는 방법
    • 숫자형식의 데이터는 홑따옴표를 사용하지않는다.
    • 그 밖의 형식(문자열, 날짜 형식) 값은 홑따옴표로 감싼다.
    • 값을 나열할 때는 테이블 구조에서 정의하고 있는 컬럼의 순서에 맞게 명시한다.
      • —>“DESC 테이블이름;”의 구문으로 테이블 정의를 확인할 수 있다.

예제

  • 학생 테이블에 다음의 정보로 새로운 데이터 추가하기
학번 10110 이름 홍길동
아이디 hkd85 학년 1
주민번호 8501011143098 생년월일 2013-10-01 11:42:30
전화번호 055)-777-7777 170
몸무게 70 학과번호 101
담당교수번호 9903
mysql> insert into student values ( 10110, '홍길동', 'hkd85', 1, '8501011143098',
    -> '2013-10-01 11:42:30', '055)-777-7777',
    -> 170, 70, 101, 9903);
Query OK, 1 row affected (0.01 sec)

mysql> select studno, name, grade from student;
+--------+--------+-------+
| studno | name   | grade |
+--------+--------+-------+
|  10101 | 전인하 |     4 |
|  10102 | 박미경 |     1 |
|  10103 | 김영균 |     3 |
|  10104 | 지은경 |     2 |
|  10105 | 임유진 |     2 |
|  10106 | 서재진 |     1 |
|  10107 | 이광훈 |     4 |
|  10108 | 류민정 |     2 |
|  10110 | 홍길동 |     1 | // 추가된것을 알수있다.
|  10201 | 김진영 |     2 |
|  10202 | 오유석 |     4 |
|  10203 | 하나리 |     1 |
|  10204 | 윤진욱 |     3 |
|  20101 | 이동훈 |     1 |
|  20102 | 박동진 |     1 |
|  20103 | 김진경 |     2 |
|  20104 | 조명훈 |     1 |
+--------+--------+-------+

2) 컬럼명을 명시한 데이터 저장

insert into <테이블이름> (컬럼1, 컬럼2, ..., 컬럼n)
values (값1, 값2, ...,값n);
  • 나열되는 컬럼의 이름이 테이블 구조에서 정의하고 있는 컬럼순서와 일치할 필요는 없다.
  • 테이블 이름 뒤에 명시되는 컬럼의 순서나 갯수는 values 뒤에 나열되는 값과 일치하여야 한다.

예제

  • 학생 테이블에 다음의 정보로 새로운 데이터를 컬럼명 나열하여 추가하기.
학번 10111 이름 둘리
아이디 dolly 학년 2
주민번호 8202021234765 생년월일 2011-10-01 11:42:30
전화번호 02)-123-2345 170
몸무게 70 학과번호 101
담당교수번호 9903
mysql> insert into student(
    -> studno, name, userid, grade, idnum, birthdate, tel, height
    -> , weight, deptno, profno)
    -> values ( 10111, '둘리', 'dooly', 2, '8202021234765',
    -> '2011-10-01 11:42:30','02)-123-2345', 170, 70, 101, 9903);
Query OK, 1 row affected (0.01 sec)

mysql> select studno, name, grade from student
    -> where name = '둘리';
+--------+------+-------+
| studno | name | grade |
+--------+------+-------+
|  10111 | 둘리 |     2 |
+--------+------+-------+

3) NULL 데이터 입력

  • NULL 데이터를 입력하기 위한 암묵적인 방법
    • INSERT INTO 절에서 해당 칼럼의 이름과 값을 생략한다.
mysql> insert into department(deptno, dname) values (300,'응용과학');
Query OK, 1 row affected (0.01 sec)

mysql> select * from department;
+--------+----------------+-------+
| deptno | dname          | loc   |
+--------+----------------+-------+
|    101 | 컴퓨터공학과   | 1호관 |
|    102 | 멀티미디어학과 | 2호관 |
|    201 | 전자공학과     | 3호관 |
|    202 | 기계공학과     | 4호관 |
|    300 | 응용과학       | NULL  |
+--------+----------------+-------+
  • NULL 데이터를 입력하기 위한 명시적인 방법
    • VALUES 절의 칼럼값에 NULL을 사용한다.

예제

  • 학과번호 301인 ‘영문학과’를, 위치가 결저오디지 않은 상태로 저장하시오
mysql> insert into department values (301,'영문학과',NULL);
Query OK, 1 row affected (0.01 sec)

mysql> select * from department where dname='영문학과';
+--------+----------+------+
| deptno | dname    | loc  |
+--------+----------+------+
|    301 | 영문학과 | NULL |
+--------+----------+------+

4) 날짜 데이터 입력 방법

  • 칼럼에 날짜를 입력하려면 ‘YYYY-MM-DD HH:MI:SS’ 혹은 ‘YYYY-MM-DD’ 형식에 따른 날짜 데이터를 입력해야 한다.
mysql> insert into professor (profno, name, userid, position, sal, hiredate, deptno)
    -> values (9920,'고길동','gilldong','교수',450,'2014-01-01',102);
Query OK, 1 row affected (0.01 sec)

mysql> select profno, name, hiredate from professor;
+--------+--------+---------------------+
| profno | name   | hiredate            |
+--------+--------+---------------------+
|   9901 | 김도훈 | 1982-06-12 00:00:00 |
|   9902 | 이재우 | 1995-04-12 00:00:00 |
|   9903 | 성연희 | 1993-03-17 00:00:00 |
|   9904 | 염일웅 | 1998-10-11 00:00:00 |
|   9905 | 권혁일 | 1986-02-11 00:00:00 |
|   9906 | 이만식 | 1988-07-11 00:00:00 |
|   9907 | 전은지 | 2001-05-11 00:00:00 |
|   9908 | 남은혁 | 1990-10-18 00:00:00 |
|   9920 | 고길동 | 2014-01-01 00:00:00 |
+--------+--------+---------------------+
  • 날짜 데이터 입력 방법
    • 자동으로 현재 날짜로 입력하기 위해서는 ‘now()’ 함수를 사용한다.
    • ex)입사일 오늘
mysql> insert into professor(profno, name, userid, position, sal, hiredate, comm, deptno)
    -> values(9921, '뚬땜이', 'ttum', '교수', 550, now(), null, 202);
Query OK, 1 row affected (0.01 sec)

mysql> select profno, name, hiredate, comm from professor;
+--------+--------+---------------------+------+
| profno | name   | hiredate            | comm |
+--------+--------+---------------------+------+
|   9901 | 김도훈 | 1982-06-12 00:00:00 |   20 |
|   9902 | 이재우 | 1995-04-12 00:00:00 | NULL |
|   9903 | 성연희 | 1993-03-17 00:00:00 |   15 |
|   9904 | 염일웅 | 1998-10-11 00:00:00 | NULL |
|   9905 | 권혁일 | 1986-02-11 00:00:00 |   25 |
|   9906 | 이만식 | 1988-07-11 00:00:00 | NULL |
|   9907 | 전은지 | 2001-05-11 00:00:00 | NULL |
|   9908 | 남은혁 | 1990-10-18 00:00:00 |   17 |
|   9920 | 고길동 | 2014-01-01 00:00:00 | NULL |
|   9921 | 뚬땜이 | 2019-11-13 15:21:44 | NULL |
+--------+--------+---------------------+------+

4) 중복데이터 방지하기

  • 테이블에 중복되는 데이터가 저장되어 있다면 하나를 뺀 나머지 데이터들은 불필요한 값으로 시스템의 자원을 낭비하게 된다.
  • 각 데이터는 중복되지 않기 위한 최소한의 제약을 요구한다
  • 테이블의 각행을 고유하게 식별하는 값을 가진 열(또는 열 조합)을 기본키(Primary Key)라고 한다.
  • 데이터베이스 테이블의 컬럼에 기본키(Primary Key) 옵션을 지정하여 중복데이터의 입력을 방지할 수 있다.
    • 기본키로 설정된 컬럼은 각 데이터 행의 구분을 위해 고유한 값만을 저장해야 하기 때문에 다른 행과 중복된 값을 저장할 수 없도록 제약된다.
    • 기본키는 일반적으로 일련번호의 개념으로 사용되는데, 데이터를 저장 할 때마다 중복되지 않는 일련번호를 계산하기 어려우므로 AUTO_INCREMENT 옵션을 사용하여 데이터 저장시 시스템에서 자동으로 일련번호를 생성하도록 할 수 있다.
  • 테이블을 생성하면서 특정 컬럼을 Primary Key로 설정하면 중복 데이터 저장에 대한 제약이 설정되는데, 이를 기본키 제약조건 이라 한다.
    • 테이블에서 데이터가 고유한 값이다 —> 데이터 무결성

5) 기본키에 대한 자동 증가 일련번호 속성 사용

  • PRIMARY KEY에는 AUTO_INCREMENT 속성을 추가할 수 있다.
  • 이 속성이 설정된 경우, INSERT 절에서 해당 컬럼을 명시하지 않아도 자동으로 기존 값들중 가장 큰 값보다 1큰 값이 저장되어, 데이터의 고유성을 유지하게 된다.

#02. 데이터 수정, 삭제

1) 데이터 수정을 위한 UPDATE 절

update <테이블이름> set 컬럼1=값1, 컬럼2=값2, ... , 컬럼n=값n
[where 검색조건];

예제

  • 교수번호가 9903번인 교수의 직급을 ‘조교수’로, 급여는 200만원으로 수정하시오.
mysql> select name, position, sal from professor where profno=9903;
+--------+----------+-----+
| name   | position | sal |
+--------+----------+-----+
| 성연희 | 조교수   | 360 |
+--------+----------+-----+
1 row in set (0.00 sec)

mysql> update professor
    -> set position = '조교수', sal = 200
    -> where profno = 9903;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select name, position, sal from professor where profno=9903;
+--------+----------+-----+
| name   | position | sal |
+--------+----------+-----+
| 성연희 | 조교수   | 200 |
+--------+----------+-----+

2) 데이터 삭제를 위한 DELETE 절

delete from <테이블이름> [where 검색조건];

예제

  • 학생번호가 20103번인 학생의 데이터를 삭제하시오.
mysql> select studno, name from student where studno=20103;
+--------+--------+
| studno | name   |
+--------+--------+
|  20103 | 김진경 |
+--------+--------+
1 row in set (0.00 sec)

mysql> DELETE FROM student WHERE studno = 20103;
Query OK, 1 row affected (0.01 sec)

mysql> select studno, name from student where studno=20103;
Empty set (0.00 sec)

3) UPDATE와 DELETE에 WHERE절을 사용하지 않는 경우

  • UPDATE절의 경우 모든 데이터가 같은 값으로 수정된다.
  • DELETE절의 경우 모든 데이터가 삭제된다.

#03. 함수의 사용

  • 데이터 입력시 –> 저장할 값을 함수를 사용하여 명시한다.
insert into <테이블이름> values (함수이름(값), 함수이름(값)...);
  • 데이터 수정 시 –> 수정될 값에 함수를 적용할 수 있다.
update <테이블이름> set
컬럼이름 = 함수이름(값),
컬럼이름 = 함수이름(값)
[where 함수가 적용된 검색조건]
  • 데이터 삭제 시 –> 삭제될 대상을 지정하는 WHERE 절에서 사용할 수 있다.
delete from <테이블이름> [where 함수가 적용된 검색조건]

예제

  • 학번이 20101번인 학생의 생년월일을 현재 시각으로 변경하기.
mysql> select name, birthdate from student where studno=20101;
+--------+---------------------+
| name   | birthdate           |
+--------+---------------------+
| 이동훈 | 1983-12-10 00:00:00 |
+--------+---------------------+
1 row in set (0.00 sec)

mysql> update student set birthdate=now() where studno=20101;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select name, birthdate from student where studno=20101;
+--------+---------------------+
| name   | birthdate           |
+--------+---------------------+
| 이동훈 | 2019-11-13 16:20:53 |
+--------+---------------------+

연습문제1

  • 다음의 학과를 신설하기 위한 데이터를 입력하고 결과를 조회하시오.
    • 학과번호: 103, 학과이름: 인터넷정보과, 위치: 공학관
mysql> insert into department(deptno, dname, loc) values(103, '인터넷정보과', '공학관');
Query OK, 1 row affected (0.01 sec)

mysql> select * from department;
+--------+----------------+--------+
| deptno | dname          | loc    |
+--------+----------------+--------+
|    101 | 컴퓨터공학과   | 1호관  |
|    102 | 멀티미디어학과 | 2호관  |
|    103 | 인터넷정보과   | 공학관 |
|    201 | 전자공학과     | 3호관  |
|    202 | 기계공학과     | 4호관  |
|    300 | 응용과학       | NULL   |
|    301 | 영문학과       | NULL   |
+--------+----------------+--------+

연습문제2

  • 공학관에 위치한 학과의 위치를 ‘5호관’으로 수정하시오.
mysql> update department
    -> set loc = '5호관'
    -> where loc = '공학관';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from department;
+--------+----------------+-------+
| deptno | dname          | loc   |
+--------+----------------+-------+
|    101 | 컴퓨터공학과   | 1호관 |
|    102 | 멀티미디어학과 | 2호관 |
|    103 | 인터넷정보과   | 5호관 |
|    201 | 전자공학과     | 3호관 |
|    202 | 기계공학과     | 4호관 |
|    300 | 응용과학       | NULL  |
|    301 | 영문학과       | NULL  |
+--------+----------------+-------+

연습문제3

  • 학과번호가 300번 이상인 학과를 삭제하시오.
mysql> delete from department
    -> where deptno >= 300;
Query OK, 2 rows affected (0.01 sec)

mysql> select * from department;
+--------+----------------+-------+
| deptno | dname          | loc   |
+--------+----------------+-------+
|    101 | 컴퓨터공학과   | 1호관 |
|    102 | 멀티미디어학과 | 2호관 |
|    103 | 인터넷정보과   | 5호관 |
|    201 | 전자공학과     | 3호관 |
|    202 | 기계공학과     | 4호관 |
+--------+----------------+-------+