0. 학습 목표
- 테이블에서 데이터를 추출하는 SELECT 문을 완벽히 이해
- 여러 건의 데이터를 그룹으로 묶는 방법을 이해
- 데이터를 입력, 수정, 삭제하는 방법을 익히고 활용
0. 요약
- USE 문은 데이터베이스를 선택하는 구문
- SELECT~FROM~WHERE는 기본적인 SQL
- 관계연산자는 WHERE절에서 크다/작다/같다(<, <=, =, >=, >)등이 있음
- 논리연산자는 관계 연산자가 2개이상 나오면 AND, OR 등으로 참/거짓을 판별
- LIKE는 문자열 비교 시 모두 허용할 때는 %, 하나로 지정할 때는 _을 사용
- ORDER BY는 결과가 출력되는 순서를 조절, 오름차순은 ASC, 내림차순은 DESC
- LIMIT는 출력하는 개수를 조절, ORDER BY와 함께 사용
- DISTINCT는 조회된 결과에서 중복된 항목을 제거
- GROUP BY는 데이터를 그룹으로 묶어주는 기능
- HAVING은 집계 함수와 관련된 조건을 제한하며 GROUP BY 뒤에 옴
- INSERT문은 테이블에 데이터를 입력하는 명령
- AUTO_INCREMENT는 1부터 증가하는 값을 자동으로 입력, 주의할 점은 PRIMARY KEY로 지정해야 함
- INSERT INTO ~ SELECT는 다른 테이블의 데이터를 가져와서 한 번에 대량으로 입력
- UPDATE는 기존에 입력되어 있는 값을 수정하며 주로 WHERE와 함께 사용
- DELETE는 행 단위로 삭제하며 WHERE절이 없으면 전체 행이 삭제
용어 | 약자 | 설명 |
NULL | 빈 값 | |
PRIMARY KEY | PK | 기본 키 |
ALTER TABLE | 테이블의 구조를 변형하는 SQL | |
시스템 변수 | MySQL이 가지고 있는 변수 | |
@@auto_increment_increment | AUTO_INCREMENT의 증가값을 지정하는 시스템 변수 | |
DESCRIBE | DESC | 테이블의 구조를 확인하는 SQL |
TRUNCATE | DELETE와 비슷한 기능이지만 전체 행을 삭제할 때 사용 |
3. 데이터 변경을 위한 SELECT 문
※핵심 키워드: INSERT, AUTO_INCREMENT, INSERT INTO ~ SELECT, UPDATE, DELETE
3-1. 데이터 입력: INSERT
테이블에 행 데이터를 입력하는 기본적인 SQL문은 INSERT 이다.
INSERT 문의 기본 문법
기본적인 형식은 아래와 같다.
INSERT INTO 테이블 [(열1, 열2, ....)] VALUES (값1, 값2, ....)
간단하지만 주의해야 할 사항이 몇 가지 있다.
- 테이블 이름 다음에 나오는 열을 생략하는 경우 VALUES에서는 열 순서 및 개수가 동일해야 한다.
첫 번째로 market_db에 hongon1 테이블을 만들고 3개의 열을 만들고 이 안에 열을 생략한 값을 입력해 보자.
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 VALUES (1, '우디', 25);
SELECT * FROM hongong1;
# toy_id, toy_name, age
'1', '우디', '25'
이번에는 toy_id, toy_name만 입력해 보자. age에는 NULL이 자동으로 입력될 것이다.
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈');
SELECT * FROM hongong1;
# toy_id, toy_name, age
'1', '우디', '25'
'2', '버즈', NULL
이번에는 열의 순서를 바꿔서 입력해보자. 값도 순서를 바꿔서 입력하면 된다.
INSERT INTO hongong1 (toy_name, age, toy_id) VALUES ('제시', 20, 3);
SELECT * FROM hongong1;
# toy_id, toy_name, age
'1', '우디', '25'
'2', '버즈', NULL
'3', '제시', '20'
자동으로 증가하는 AUTO_INCREMENT
AUTO_INCREMENT는 열을 정의할 때 1부터 증가하는 값을 자동으로 입력해 준다. INSERT에서는 NULL을 지정해 주면 된다. 단 주의할 점은 꼭 AUTO_INCREMENT로 지정하는 열은 PRIMARY KEY로 지정해야 한다.
우선 간단한 테이블을 만들고 toy_id가 자동으로 증가하도록 설정하자.
CREATE TABLE hongong2 (toy_id INT AUTO_INCREMENT PRIMARY KEY, toy_name CHAR(4), age INT);
아래와 같이 3개의 값을 입력해보고 테이블을 확인하면 자동으로 toy_id가 증가한 것을 확인할 수 있다.
INSERT INTO hongong2 VALUES (NULL, '보핍', 25), (NULL, '슬링키', 22), (NULL, '렉스', 21);
SELECT * FROM hongong2;
# toy_id, toy_name, age
'1', '보핍', '25'
'2', '슬링키', '22'
'3', '렉스', '21'
참고로 자동으로 증가하는 값이 어디까지 증가하였는지 확인하려면 LAST_INSERT_ID() 함수를 사용하면된다.
SELECT LAST_INSERT_ID();
AUTO_INCREMENT로 입력되는 값을 100부터 시작하고 싶으면 아래와 같이 ALTER TABLE 명령어를 실행하면 된다.
ALTER TABLE hongong2 AUTO_INCREMENT=100;
INSERT INTO hongong2 VALUES (NULL, '우하', 22);
SELECT * FROM hongong2;
# toy_id, toy_name, age
'1', '보핍', '25'
'2', '슬링키', '22'
'3', '렉스', '21'
'100', '우하', '22'
이번에는 AUTO_INCREMENT 값이 3씩 증가하도록 해보자. 이런 경우 시스템 변수인 @@auto_increment_increment를 변경해 주면 된다.
CREATE TABLE hongong3 (toy_id INT AUTO_INCREMENT PRIMARY KEY, toy_name CHAR(4), age INT);
ALTER TABLE hongong3 AUTO_INCREMENT=1000;
SET @@auto_increment_increment=3;
그리고 3개의 값을 입력하고 3씩 증가하였는지 살펴보자.
INSERT INTO hongong3 VALUES (NULL, '토마스', 20), (NULL, '제임스', 23), (NULL, '고든', 25);
SELECT * FROM hongong3;
# toy_id, toy_name, age
'1000', '토마스', '20'
'1003', '제임스', '23'
'1006', '고든', '25'
다른 테이블의 데이터를 한 번에 입력하는 INSERT INTO ~ SELECT
많은 양의 데이터를 타이핑으로 입력하려면 오랜 시간이 걸린다. 다른 테이블에 데이터가 이미 입력되어 있다면 이를 INSERT INTO ~ SELECT 구문을 사용해 해당 테이블의 데이터를 가져와서 한 번에 입력할 수 있다.
주의할 점은 SELECT 문의 열 개수는 INSERT할 테이블의 열 개수와 같아야 한다.
우선 MySQL을 설치할 때 함께 생성된 world 데이테베이스의 city테이블을 아래와 같이 살펴봐 보자.
- COUNT(*)로 city의 개수를 확인
- DESC(describe)로 테이블의 구조를 출력
- LIMIT 5로 데이터 값 확인
SELECT COUNT(*) FROM world.city;
# COUNT(*)
'4079'
DESC world.city;
# Field, Type, Null, Key, Default, Extra
'ID', 'int', 'NO', 'PRI', NULL, 'auto_increment'
'Name', 'char(35)', 'NO', '', '', ''
'CountryCode', 'char(3)', 'NO', 'MUL', '', ''
'District', 'char(20)', 'NO', '', '', ''
'Population', 'int', 'NO', '', '0', ''
SELECT * FROM world.city LIMIT 5;
# ID, Name, CountryCode, District, Population
'1', 'Kabul', 'AFG', 'Kabol', '1780000'
'2', 'Qandahar', 'AFG', 'Qandahar', '237500'
'3', 'Herat', 'AFG', 'Herat', '186800'
'4', 'Mazar-e-Sharif', 'AFG', 'Balkh', '127800'
'5', 'Amsterdam', 'NLD', 'Noord-Holland', '731200'
이 중에서 도시 이름(Name)과 인구(Population)을 가져와 보자.
우선 테이블을 만들자.
CREATE TABLE city_popul (city_name CHAR(35), population INT);
자 이제 넣어 보자.
INSERT INTO city_popul
SELECT Name, Population FROM world.city;
INSERT INTO city_popul SELECT Name, Population FROM world.city 4079 row(s) affected Records: 4079 Duplicates: 0 Warnings: 0 0.094 sec
3-2. 데이터 수정: UPDATE
회원의 주소가 변경되는 것처럼 행 데이터를 수정해야 하는 경우 UPDATE를 사용한다.
UPDATE 문의 기본 문법
UPDATE 테이블_이름
SET 열1=값1, 열2=값2, ....
WHERE 조건;
city_popul 테이블의 도시 이름(city_name) 중에서 'Seoul'을 서울로 변경해 보자.
USE market_db;
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
SELECT * FROM city_popul WHERE city_name = '서울';
# city_name, population
'서울', '9981619'
이번에는 여러 개의 열을 변경해 보자. city_name이 New York인 도시를 뉴욕으로 변경하면서 population은 0으로 설정하자.
USE market_db;
UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
SELECT * FROM city_popul WHERE city_name = '뉴욕';
# city_name, population
'뉴욕', '0'
WHERE가 없는 UPDATE 문
UPDATE 문에서 주의할 점은 WHERE절이 없다면 테이블의 모든 행의 값이 변경되게 된다는 것이다.
예를 들어 아래와 같이 city_name을 서울로 지정하고 WHERE절이 없다면 모든 도시가 서울로 변경되게 된다.
UPDATE city_popul
SET city_name = '서울';
그렇다면 WHERE절이 없는 UPDATE 문은 언제 사용할까? 예를 들어 population의 값이 큰 값이여서 확인하기 어려운 경우 10,000명 단위로 하면 좀 더 편하게 확인할 수 있을 것 같다.
UPDATE city_popul
SET population = population / 10000;
SELECT * FROM city_popul LIMIT 5;
# city_name, population
'Kabul', '178'
'Qandahar', '24'
'Herat', '19'
'Mazar-e-Sharif', '13'
'Amsterdam', '73'
3-3. 데이터 삭제: DELETE
회원 탈퇴와 같이 데이터를 삭제해야하는 경우 DELETE 구문을 사용한다.
DELETE 문의 기본 문법
DELETE FROM 테이블_이름 WHERE 조건;
city_popul 테이블에서 NEW로 시작하는 도시를 삭제해 보자.
DELETE FROM city_popul
WHERE city_name LIKE 'New%';
주의 할점은 WHERE절이 없으면 모든 행이 삭제된다는 것에 주의하자.
테이블 삭제 참고
- DELETE: 속도는 느리지만 특정 값을 삭제하는데 유용하며 테이블 구조를 남긴다
- TRUNCATE: 속도가 빠르며 테이블 구조를 남긴다
- DROP: 테이블 자체를 삭제하며 속도가 빠르다.
'혼자공부하는 SQL' 카테고리의 다른 글
4. SQL 고급 문법-2 (0) | 2022.01.28 |
---|---|
4. SQL 고급 문법-1 (0) | 2022.01.24 |
3. SQL 기본 문법-2 (0) | 2022.01.19 |
3. SQL 기본 문법-1 (0) | 2022.01.17 |
2. 실전용 SQL 미리 맛보기-2 (0) | 2022.01.15 |