미래학자
[MySQL] 2장 데이터 변경, 삭제 (ALTER, SELECT, DROP, DELETE) 본문
저번 1장(DB와 테이블 생성, Link : SELECT http://futurists.tistory.com/11)에 이어 이번 시간에는 테이블을 변경 시키는 것에 대해
이야기 해볼까 합니다.
- 조건 검색, 효율적인 방법 (BETWEEN, IN)
- 데이터 베이스, 테이블, 데이터 삭제 (DROP, DELETE)
- 테이블 변경 (UPDATE, CHANGE)
- 데이터 변경
- 생성문 보기 (SHOW)
1. 조건 검색, 효율적인 방법 (BETWEEN, IN)
저번 시간에 배웠던 WHERE 절을 AND 또는 OR로 연결하는 것을 기억할 것이다.
아래와 같은 student 테이블이 있을 때
저번에 배웠던 조건절을 리마인딩 해보자.
SELECT * FROM student | |
WHERE _id > '2010'; | |
# 학번이 2010 으로 시작하는 학생을 검색할 수 있다. |
그렇다면 2009 ~ 2010 학번인 학생을 구할 때는 어떻게 하는 것이 좋을까?
아래의 두 예를 보자.
SELECT * FROM student | |
WHERE _id > '2009' AND _id < '2011'; | |
SELECT * FROM student | |
WHERE _id BETWEEN '2009' AND '2011'; |
두 쿼리 모두 같은 결과를 내놓는다. 그러나 두 쿼리의 성능은 다르다. '2009'보다 큰 값을 모두 구하고, '2011' 보다 작은 값을 모두 구하여 교집합을 다시 구하는 연산과,
'2009' 부터 시작하여 '2011'보다 작을 때 까지 순차적으로 구하는 것과는 차이가 있을 것이기 때문이다.
또, 아래의 예도 살펴 보자.
SELECT * FROM student | |
WHERE belong = 'MSE' OR belong = 'ESE' OR belong = 'CSE'; | |
SELECT * FROM student | |
WHERE belong IN ('MSE', 'ESE', 'CSE'); |
이 둘 또한 같은 결과를 내놓는다. 그러나 아래의 예가 더욱 좋다. 간단히 말 해 첫 번 째 쿼리는 for 문을 총 3번 돈다면, 아래의 쿼리는 for문을 한 번 도는 것이기 때문이다.
2. 데이터 베이스, 테이블 삭제
DROP DATABASE db_name; | |
DROP TABLE table_name; | |
DELETE FROM table_name; | |
DELETE FROM table_name WHERE _id = 20070103; |
데이터 베이스와 테이블을 제거할 때는 DROP을, 테이블의 데이터를 제거할 때는 DELETE를 사용한다. 데이터가 한 번 삭제되면 복구할 수 없으므로 삭제할 때는
조심히 해야 한다.
5 : 데이터를 삭제할 때는 원하는 데이터를 SELECT 할때와 마찬가지로 조건을 주어 삭제할 수 있다. (삭제할 때 SELECT를 통해 결과를 확인 후 DELETE하는 습관
을 가지는 것이 좋다)
3. 테이블 변경 (ALTER)
테이블 변경에서는 아래의 일을 할 수 있다.
- 테이블 이름 변경 (RENAME)
- 테이블 칼럼 , 제약조건 추가 (ADD)
- 테이블 변경 (CHANGE, MODIFY)
- 테이블 제약 조건 제거 (DROP)
A. 테이블 이름 변경 (RENAME)
ALTER TABLE student | |
RENAME TO hero; | |
DESC hero; |
1 : student라는 테이블을 변경
2 : hero라는 새로운 이름으로 변경
B. 테이블 칼럼 , 제약조건 추가 (ADD)
ALTER TABLE hero | |
ADD COLUMN star INT NOT NULL AFTER _id, | |
ADD PRIMARY KEY (_id); | |
DESC hero; |
start 라는 새로운 칼럼이 추가가 되었고, _id가 기본키로 변경되었다. 특이한 점은 AFTER _id 로 추가될 칼럼의 위치를 선정하는 점이다.
MySQL에서는 FIRST를 사용하면 첫 번째 칼럼으로 추가된다. (첫 번째 칼럼은 보통 기본키다.) 그런데 책에서는 SECOND, THIRD, LAST, BEFORE 등의
키워드도 사용할 수 있다고 했는데, 해본 결과 되지 않았다.
C. 테이블 변경 (CHANGE, MODIFY)
ALTER TABLE hero | |
MODIFY COLUMN star BIGINT DEFAULT 10000; | |
DESC hero; | |
ALTER TABLE hero | |
CHANGE COLUMN star rating INT DEFAULT 100; | |
DESC hero; |
MODIFY와 CHANGE 모두 테이블의 칼럼의 상태를 변경하는 공통점이 있다. 그러나 CHANGE는 칼럼의 이름도 변경이 가능 하다.
D. 테이블 제약 조건 제거 (DROP)
ALTER TABLE hero | |
DROP COLUMN star, | |
DROP PRIMARY KEY; | |
DESC hero |
테이블에서 star 칼럼을 제거하고, 기본키를 제거 한다.
4. 데이터 변경 (UPDATE)
UPDATE hero | |
SET belong = 'ZER' | |
WHERE status = 0; | |
SELECT * FROM hero; | |
UPDATE hero | |
SET status = status + 200 | |
WHERE _id LIKE '2009%'; | |
SELECT * FROM hero; |
첫 번째 쿼리는 status 값이 0인 레코드의 belong을 'ZER'로 바꾼다.
두 번째 쿼리는 _id 가 '2009'로 시작하는 레코드의 status 값을 현재 값에서 200만큼 더한 값으로 변경한다.
5. 생성문 보기 (SHOW)
SHOW CREATE DATABASE study_db; | |
SHOW CREATE TABLE hero; | |
SHOW INDEX FROM hero; | |
SHOW WARNINGS; |
각 테이블, 칼럼 이름 사이에 `로 감싸진 것을 볼 수 있다. 지금은 변수를 `로 감싸는 구나 하고 생각하자. 저 구문을 복사하여 그대로 `가 있는 상태로
사용해도 상관없고, 제거해서 사용해도 좋다.
3, 4 구문은 지금은 나도 잘 모르고, 차차 공부해야 겠다.
'DataBase' 카테고리의 다른 글
[MySQL] 6장 외래 키 설정하기, 1NF (테이블 쪼개기), (1) | 2016.11.21 |
---|---|
[MySQL] 5장 정규화 (1NF, 2NF, 3NF) (3) | 2016.11.19 |
[MySQL] 4장 키(Primary Key, Foreign Key)의 종류와 함수적 종속 (7) | 2016.11.19 |
[mySQL] 3장 내부 함수, 그룹 묶기 (SUM, COUNT, SUBSTRING, GROUP BY) (2) | 2016.11.18 |
(MySQL) 1장 시작하기. (DB 생성, 테이블 생성, SELECT) (10) | 2016.10.27 |