시작하기 전에 cats
table을 새로 만들고 시작하도록 하자.
DROP TABLE cats;
CREATE TABLE cats
(
cat_id INT AUTO_INCREMENT,
name VARCHAR(100),
breed VARCHAR(100),
age INT,
PRIMARY KEY(cat_id)
);
다음으로 데이터를 넣어보도록 하자.
INSERT INTO cats(name, breed, age)
VALUES ('Ringo', 'Tabby', 4),
('Cindy', 'Maine Coon', 10),
('Dumbledore', 'Maine Coon', 11),
('Egg', 'Persian', 4),
('Misty', 'Tabby', 13),
('George Michael', 'Ragdoll', 9),
('Jackson', 'Sphynx', 7);
잘 들어갔는 지 확인해보면 다음과 같다.
SELECT * FROM cats;
+--------+----------------+------------+------+
| cat_id | name | breed | age |
+--------+----------------+------------+------+
| 1 | Ringo | Tabby | 4 |
| 2 | Cindy | Maine Coon | 10 |
| 3 | Dumbledore | Maine Coon | 11 |
| 4 | Egg | Persian | 4 |
| 5 | Misty | Tabby | 13 |
| 6 | George Michael | Ragdoll | 9 |
| 7 | Jackson | Sphynx | 7 |
+--------+----------------+------------+------+
SELECT
로 특정 column에 해당하는 값을 가져올 수도 있다. 가령 이름만 가져오고 싶다면 다음과 같이 할 수 있다.
SELECT name from cats;
+----------------+
| name |
+----------------+
| Ringo |
| Cindy |
| Dumbledore |
| Egg |
| Misty |
| George Michael |
| Jackson |
+----------------+
name
과 age
를 가져오고 싶은 경우는 다음과 같이 할 수 있다.
SELECT name, age from cats;
+----------------+------+
| name | age |
+----------------+------+
| Ringo | 4 |
| Cindy | 10 |
| Dumbledore | 11 |
| Egg | 4 |
| Misty | 13 |
| George Michael | 9 |
| Jackson | 7 |
+----------------+------+
select로 얻어오는 row들의 범위를 Where
를 통해 줄 일 수 있다. Where
는 Select
뿐만 아니라 데이터 업데이트, 삭제할 때도 사용된다.
나이가 4살인 고양이들만 가져온다고 하자. 다음과 같이 할 수 있다.
SELECT * FROM cats WHERE age=4;
+--------+-------+---------+------+
| cat_id | name | breed | age |
+--------+-------+---------+------+
| 1 | Ringo | Tabby | 4 |
| 4 | Egg | Persian | 4 |
+--------+-------+---------+------+
만약, 4살인 고양이의 name
과 breed
만 가져오고 싶다면 다음과 같이 할 수 있다.
SELECT name, breed FROM cats WHERE age=4;
+-------+---------+
| name | breed |
+-------+---------+
| Ringo | Tabby |
| Egg | Persian |
+-------+---------+
WHERE
은 int값 뿐만 아니라, text도 할 수 있다. 가령, name
이 Egg
인 고양이를 가져오고 싶다면, 다음과 같이 할 수 있다.
SELECT name, breed FROM cats WHERE name='egg';
+------+---------+
| name | breed |
+------+---------+
| Egg | Persian |
+------+---------+
name
이 Egg
인 고양이의 name
과 breed
를 가져왔다. 여기서 name
이 대문자이든 소문자이든 상관하지 않는다. 물론 대소문자를 식별하게 만들 수도 있지만, 보통 그러진 않는다.
더 나아가서 column끼리 비교도 WHERE
를 통해서 가능하다. 가령, age
와 cat_id
가 동일한 값인 경우의 row만 뽑는 것은 다음과 같이 할 수 있다.
SELECT * FROM cats WHERE age=cat_id;
+--------+---------+---------+------+
| cat_id | name | breed | age |
+--------+---------+---------+------+
| 4 | Egg | Persian | 4 |
| 7 | Jackson | Sphynx | 7 |
+--------+---------+---------+------+
SELECT문을 쓰다보면 너무 긴 column 이름이나, table 이름에 대해서 가칭을 부여하여 query를 간단히 진행하고 싶을 때가 있다. 이때 사용하는 것이 바로 Alias
이다.
가령 cat_id
를 id
라는 alias로 변경하고 싶다면 다음과 같이 쓸 수 있다.
SELECT cat_id as id, name FROM cats;
+----+----------------+
| id | name |
+----+----------------+
| 1 | Ringo |
| 2 | Cindy |
| 3 | Dumbledore |
| 4 | Egg |
| 5 | Misty |
| 6 | George Michael |
| 7 | Jackson |
+----+----------------+
출력되는 결과의 이름만 바뀌는 것이지, 실제 column의 이름이 바뀌는 것은 아니다.
특정 row의 값들을 바꾸고 싶다면 어떻게 할 수 있을까?? UPDATE
를 사용하면 된다.
UPDATE cats SET breed='sqlorthair'
WHERE breed='Tabby';
여기서 UPDATE
는 SET
과 짝꿍이다. 즉, INSERT ~ INTO~
처럼 UPDATE ~ SET ~
이 되는 것이다. 재밌는 것은 UPDATE
의 경우는 table 명이 앞에 나온다는 것이다.
다음의 table을 만들도록 하자.
CREATE TABLE employees (
id INT AUTO_INCREMENT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
middle_name VARCHAR(255),
age INT NOT NULL,
current_status VARCHAR(255) NOT NULL DEFAULT 'employed',
PRIMARY KEY(id)
);
INSERT INTO employees(first_name, last_name, age) VALUES ('Dora', 'Smith', 58);
INSERT INTO employees(first_name, last_name, age) VALUES ('thomas', 'chickenman', 87);
INSERT INTO employees(first_name, last_name, age) VALUES ('thomas', 'chickenman', 87);
INSERT INTO employees(first_name, last_name, age) VALUES ('thomas', 'chickenman', 87);
SELECT * FROM employees;
+----+------------+------------+-------------+-----+----------------+
| id | first_name | last_name | middle_name | age | current_status |
+----+------------+------------+-------------+-----+----------------+
| 1 | Dora | Smith | NULL | 58 | employed |
| 2 | thomas | chickenman | NULL | 87 | employed |
| 3 | thomas | chickenman | NULL | 87 | employed |
| 4 | thomas | chickenman | NULL | 87 | employed |
+----+------------+------------+-------------+-----+----------------+
이제 employees table의 모든 last_name
을 roosterbeard
로 바꾸도록 하자.
UPDATE employees SET last_name='roosterbeard';
SELECT * FROM employees;
+----+------------+--------------+-------------+-----+----------------+
| id | first_name | last_name | middle_name | age | current_status |
+----+------------+--------------+-------------+-----+----------------+
| 1 | Dora | roosterbeard | NULL | 58 | employed |
| 2 | thomas | roosterbeard | NULL | 87 | employed |
| 3 | thomas | roosterbeard | NULL | 87 | employed |
| 4 | thomas | roosterbeard | NULL | 87 | employed |
+----+------------+--------------+-------------+-----+----------------+
모든 row들이 다 바뀐 것을 볼 수 있다.
한번에 여러 filed들도 바꿀 수 있다.
UPDATE employees SET current_status='laid_off', last_name='who cares';
SELECT * FROM employees;
+----+------------+-----------+-------------+-----+----------------+
| id | first_name | last_name | middle_name | age | current_status |
+----+------------+-----------+-------------+-----+----------------+
| 1 | Dora | who cares | NULL | 58 | laid_off |
| 2 | thomas | who cares | NULL | 87 | laid_off |
| 3 | thomas | who cares | NULL | 87 | laid_off |
| 4 | thomas | who cares | NULL | 87 | laid_off |
+----+------------+-----------+-------------+-----+----------------+
current_status
와 last_name
이 바뀐 것을 볼 수 있다.
WHERE
을 통해서 특정 row만 수정할 수도 있다.
SELECT * FROM cats;
+--------+----------------+------------+------+
| cat_id | name | breed | age |
+--------+----------------+------------+------+
| 1 | Ringo | Tabby | 4 |
| 2 | Cindy | Maine Coon | 10 |
| 3 | Dumbledore | Maine Coon | 11 |
| 4 | Egg | Persian | 4 |
| 5 | Misty | Tabby | 13 |
| 6 | George Michael | Ragdoll | 9 |
| 7 | Jackson | Sphynx | 7 |
+--------+----------------+------------+------+
Mistry
이름을 가진 row의 age를 바꾸도록 하자.
UPDATE cats SET age=14 WHERE name='Misty';
SELECT * FROM cats WHERE name='Misty';
+--------+-------+-------+------+
| cat_id | name | breed | age |
+--------+-------+-------+------+
| 5 | Misty | Tabby | 14 |
+--------+-------+-------+------+
잘 바뀐 것을 볼 수 있다.
특정 row를 지우고 싶다면 DELETE
를 사용하면 된다.
DELETE FROM cats WHERE name='Egg';
만약 특정 row가 아니라, table의 전체 row들을 지우고 싶다면 다음과 같이 사용할 수도 있다.
DELETE FROM cats;
DROP TABLE
과 다른 점은 DROP
의 경우는 table 자체의 schema(정의)를 없애는 반면, DELETE FROM
은 row들만 없앤다. 즉, 빈 껍데기만 남기는 것이다.
SELECT * FROM cats;
+--------+----------------+-------------------+------+
| cat_id | name | breed | age |
+--------+----------------+-------------------+------+
| 1 | Ringo | Tabby | 4 |
| 2 | Cindy | Maine Coon | 12 |
| 3 | Dumbledore | Maine Coon | 12 |
| 4 | Egg | Persian | 4 |
| 5 | Misty | Tabby | 14 |
| 6 | George Michael | Ragdoll | 9 |
| 7 | Jack | British Shorthair | 7 |
+--------+----------------+-------------------+------+
Egg
를 없애보도록 하자.
DELETE FROM cats WHERE name='Egg';
SELECT * FROM cats;
+--------+----------------+-------------------+------+
| cat_id | name | breed | age |
+--------+----------------+-------------------+------+
| 1 | Ringo | Tabby | 4 |
| 2 | Cindy | Maine Coon | 12 |
| 3 | Dumbledore | Maine Coon | 12 |
| 5 | Misty | Tabby | 14 |
| 6 | George Michael | Ragdoll | 9 |
| 7 | Jack | British Shorthair | 7 |
+--------+----------------+-------------------+------+
없어진 것을 볼 수 있다.
다음으로 employees
table을 비워보도록 하자.
SELECT * FROM employees;
+----+------------+-----------+-------------+-----+----------------+
| id | first_name | last_name | middle_name | age | current_status |
+----+------------+-----------+-------------+-----+----------------+
| 1 | Dora | who cares | NULL | 58 | laid_off |
| 2 | thomas | who cares | NULL | 87 | laid_off |
| 3 | thomas | who cares | NULL | 87 | laid_off |
| 4 | thomas | who cares | NULL | 87 | laid_off |
+----+------------+-----------+-------------+-----+----------------+
DELETE FROM employees;
SELECT * FROM employees;
Empty set (0.00 sec)
row들은 모두 사라지고 table은 남아있는 것을 볼 수 있다.