huginn muninn

[SQL] 데이터의 추가, 삭제, 갱신 본문

데이터베이스/SQL

[SQL] 데이터의 추가, 삭제, 갱신

_maddy 2023. 7. 10. 00:39

SQL 첫걸음

위 책으로 공부한 내용을 정리. 


총정리

추가 - insert

insert into 테이블명 values(값1,값2..)

삭제 - delete

delete from 테이블명 where 조건식

갱신 - update

update 테이블명 set 열1=값1,열2=값2,...where 조건식

데이터의 추가,삭제,갱신

 

행추가 - insert

insert into 테이블명 values(값1,값2..)

1. insert로 행 추가

rdbms에서는 insert 명령을 사용해 테이블의 행 단위로 데이터를 추가한다.

mysql> select * from sample41;
Empty set (0.02 sec)

sample41 테이블에는 3개의 열이 정의되어있지만 저장된 데이터가 없어 아무것도 표시되지 않는다. insert 명령을 통해 행을 추가하려면 각 열의 값을 지정해야한다. 그렇다면 각 열에 어떤유형의 데이터를 저장할 수 있는지 DESC 명령으로 확인해보겠다.

mysql> desc sample41;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| no    | int         | NO   |     | NULL    |       |
| a     | varchar(30) | YES  |     | NULL    |       |
| b     | date        | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
  • insert 명령으로 행 추가 하기
mysql> insert into sample41 values(1,'abc','2014-01-25');
Query OK, 1 row affected (0.01 sec)

값을 지정할 때는 해당 열의 데이터 형식에 맞도록 지정해야한다.

이제 sample41 확인해보기

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
+----+------+------------+
1 row in set (0.00 sec)

기존에 없던 행이 추가되었다.

💡 insert 명령으로 테이블에 행 추가 가능

 

2. 값을 저장할 열 지정

insert 명령으로 행을 추가할 경우 값을 저장할 열을 지정할 수 있다. 열을 지정할 경우는 테이블명 뒤에 괄호로 묶어 열명을 나열하고 values 구로 값을 지정한다.

insert into 테이블명(열1,열2...) values(값1, 값2...)

 

  • 열을 지정해 행 추가하기

no열과 a열만 지정해 행 추가

mysql> insert into sample41(a,no) values('xyz',2);
Query OK, 1 row affected (0.01 sec)
mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
+----+------+------------+
2 rows in set (0.00 sec)

별도로 값을 지정하지 않으면 b열에는 r기본값인 null이 저장되었다.

 

3. not null제약

행을 추가할떄 유효한 값이 없는 상태로 두고 싶을 경우 values구에서 null로 값을 지정할 수있다.

mysql> insert into sample41(no,a,b)values(NULL,NULL,NULL);
ERROR 1048 (23000): Column 'no' cannot be null

에러가난다. no열에 대해 null값을 허용하지 않는 not null 제약이 걸려있기 때문이다.

이와 같이 테이블에 저장하는 데이터를 설정으로 제한하는 것을 통틀어 '제약'이라고 부른다.

💡 not null 제약이 걸려있는 열은 null값을 허용하지 않는다.

 

mysql> insert into sample41(no,a,b) values(3,null,null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
|  3 | NULL | NULL       |
+----+------+------------+
3 rows in set (0.00 sec)

no를 다시 null이 아닌 값으로 지정해주니 잘 되었다.

 

4. default

desc 명령으로 열 구성을 살펴보면 default 라는 항목을 찾을 수 있다. 명시적으로 값을 지정하지 않았을 경우 사용하는 초기값이다. default값은 테이블을 정의할때 지정할 수 있다. 열을 지정해 행을 추가할 때 지정하지 않은 열은 default값을 사용해 저장된다.

mysql> desc sample411;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| no    | int  | NO   |     | NULL    |       |
| d     | int  | YES  |     | 0       |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.01 sec)

sample411 d열에는 디폴트값으로 0이 설정되어있다. 이때 d열에 다음과 같이 숫자를 지정해 행을 추가해보겠다.

mysql> insert into sample411(no,d) values(1,1);
Query OK, 1 row affected (0.02 sec)

mysql> select * from sample411;
+----+------+
| no | d    |
+----+------+
|  1 |    1 |
+----+------+
1 row in set (0.00 sec)

다음으로는 디폴트 값을 지정해 행을 추가해보겠다. values 구에서 default키워드를 사용하면 디폴트 값이 저장된다.

insert into sample411(no,d) values(1,default);
mysql> select * from sample411;
+----+------+
| no | d    |
+----+------+
|  1 |    1 |
|  2 |    0 |
+----+------+
2 rows in set (0.00 sec)

디폴트값으로 insert 되었다. no2를 보면..

 

  • 암묵적으로 디폴트 저장

암묵적 방법이란 디폴트 값으로 저장할 열을 insert 명령문에서 별도 지정하지 않는 것을 말한다.

실제로 d열을 제외하고 no열만 지정해 insert 명령을 실행해보겠다. 그결과 명시적 방법과 암문적 방법 어떤 것을 사용해도 d열의 값이 디폴트로 저장됨을 확인할 수 있다.

mysql> insert into sample411(no) values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from sample411;
+----+------+
| no | d    |
+----+------+
|  1 |    1 |
|  2 |    0 |
|  3 |    0 |
+----+------+
3 rows in set (0.00 sec)
💡 열을 지정하지 않으면 디폴트 값으로 행이 추가된다.

 

삭제하기 - delete

delete from 테이블명 where 조건식

1. delete로 행 삭제하기

delete from 테이블명 where 조건식
mysql> select * from sample411;
+----+------+
| no | d    |
+----+------+
|  1 |    1 |
|  2 |    0 |
|  3 |    0 |
+----+------+
3 rows in set (0.00 sec)

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
|  3 | NULL | NULL       |
+----+------+------------+
3 rows in set (0.00 sec)
mysql> delete from sample41 where no=3;
Query OK, 1 row affected (0.01 sec)

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
+----+------+------------+
2 rows in set (0.00 sec)

삭제는 행 단위로 수행된다. select 명령과 같이 열을 지정할 수는 없다. 즉 delete no from sample41 명령과 같이 열을 지정할 수는 없다.

💡 delete 명령은 where 조건에 일치하는 모든 행을 삭제한다.

 

2. delete 명령 구

where 구에서 대상이 되는 행을 검색하는 것은 select 명령에서도 delete 명령에서도 똑같다. 단지 select 명령에서는 조건에 맞는 행의 결괏값이 클라이언트로 반환되지만 delete 명령에서는 조건에 맞는 행이 삭제된다는 것만 다르다.

delete 명령에서도 select 명령처럼 where 구를 지정할 수 있다. 하지만 order by구는 사용할 수 없다. 어떤행 부터 삭제할 것인지는 중요하지 않으며 의미가 없다.

데이터 갱신하기 - update

update 테이블명 set 열1=값1,열2=값2,...where 조건식

1. update로 데이터 갱신하기

update 테이블명 set 열명=값 where 조건식
mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
+----+------+------------+
2 rows in set (0.00 sec)

delete와 달리 update는 셀 단위로 데이터를 갱신할 수 있다. where구에 조건을 지정하면 그에 일치하는 행을 갱신할 수 있다. where구를 생략한 경우에는 delete의 경우와 마찬가지로 테이블의 모든 행이 갱신된다.

update명령에서는 set구를 사용해 갱신할 열과 값을 지정한다. 'set 열명=값'

=은 대입 연산자이다. 테이블에 존재하지 않는 열을 지정하면 에러가 발생해 update명령은 실행되지 않는다.

mysql> update sample41 set b='2014-09-07' where no=2;
Query OK, 1 row affected (0.01 sec)

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)
💡 update 명령으로 행의 셀 값을 갱신할 수 있다.

 

update 명령의 where 조건문역시 delete 명령과 마찬가지로 조건에 일치하는 모든 행이 그 대상이 된다. 그리고 where 구를 생략하면 테이블의 모든 행이 갱신 대상이 된다. 즉 where 구를 생략하면 테이블의 모든 행이 갱신 대상이 된다.

 💡 update 명령에서는where 조건에 일치하는 모든 행이 갱신된다.

 

2. update로 갱신할 경우 주의 사항

update 명령은 이미 존재하는 행에 대해 값을 갱신하므로 이전의 값과 이후의 값의 두가지 상태를 생각할 수 있다.

+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | NULL       |
+----+------+------------+
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  1 | abc  | 2014-01-25 |
|  2 | xyz  | 2014-09-07 |
+----+------+------------+

여기다 이 코드를 실행한다면?

mysql> update sample41 set no=no+1;
mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  2 | abc  | 2014-01-25 |
|  3 | xyz  | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)

실행결과 모든 행의 no값에 1씩 더해진 것을 알 수 있다.

 

3. 복수열 갱신

update명령의 set 구에서는 필요에 따라 콤마(,)로 구분해 갱신할 열을 여러개 지정할 수 있다.

update 테이블명 set 열명1=값1,열명2=값2,...where 조건식

두 구문으로 나누어 update 명령 실행

mysql> update sample41 set a='XXX' where no=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update sample41 set b='2014-01-01' where no=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

하나로 묶어서 update 명령 실행

mysql> update sample41 set a='XXX',b='2014-01-01' where no=2;
mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  2 | XXX  | 2014-01-01 |
|  3 | xyz  | 2014-09-07 |
+----+------+------------+
  • set 구의 실행 순서 명령1
mysql> update sample41 set no=no+1,a=no;

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  3 | 3    | 2014-01-01 |
|  4 | 4    | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)

no 열의 값을 a열에 대입합 후 no열의 값을 +1 한다. 따라서 a열의 값은 no-1 값이 된다.

  • mysql에서 update 명령2 실행
mysql> update sample41 set a=no,no=no+1;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  4 | 3    | 2014-01-01 |
|  5 | 4    | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)

a을 기존에 no로 변경하고 no를 1씩 더했다.

  • oracle에서 update 명령 1,2 실행
mysql> update sample41 set no=no+1,a=no;

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  6 | 6    | 2014-01-01 |
|  7 | 7    | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)

4. NULL로 갱신

update 명령으로 셀 값을 null로 갱신할 수 있다. 따로 거창한 문법이 정해진건 아니다.

mysql> update sample41 set a=NULL;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from sample41;
+----+------+------------+
| no | a    | b          |
+----+------+------------+
|  4 | NULL | 2014-01-01 |
|  5 | NULL | 2014-09-07 |
+----+------+------------+
2 rows in set (0.00 sec)