본문 바로가기

혼자공부하는 SQL

3. SQL 기본 문법-3

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