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절이 없으면 전체 행이 삭제
용어 | 영문 용어 | 설명 |
주석 | remark | -- 설명으로 구성 |
VARCHAR | 문자형으로 CHAR과 거의 비슷 | |
AUTO_INCREMENT | 자동으로 숫자를 입력, 테이블 생성할 때 지정 | |
* | 모든 열을 지정할 때 사용하는 기호 | |
별칭 | alias | SELECT 문에서 실제 열 이름 대신에 출력하도록 설정 |
% | 문자열에서 여러 문자에 대응하는 기호 | |
_ | 문자열에서 한 문자에 대응하는 기호 |
1. 기본 중에 기본 SELECT ~ FROM ~ WHERE
※핵심 키워드: USE, SELECT~FROM~WHERE, 관계 연산자, 논리 연산자, LIKE
1-1. 실습용 데이터베이스 구축
실습용 데이터베이스 개요
SELECT 문을 연습할 데이터베이스를 만들어 보자.
1개의 DB에 2개의 테이블을 만들 예정이며, 모두 SQL 문으로 만들 예정이다
- 인터넷 마켓 DB(market_db)
회원 테이블(member), 구매 테이블(buy)
DB 및 테이블은 아래와 같은 조건으로 만들 예정이다.
- 인터넷 마켓은 그룹으로 이루어진 가수만 가입되었다고 가정
- 가수 그룹의 리더는 물건을 사기위해 회원 가입을 하며 이는 회원 테이블에 아이디/이름/인원/주소/국번/전화번호/평균키/ 데뷔일자 등을 입력
- 회원 가입 후 물건을 구입하면 회원이 구매한 정보는 구매 테이블에 기록
배송담당자는 회원테이블에서 구매 테이블의 아이디와 일치하는 회원의 아이디를 찾아 그 행의 주소로 배송
실습용 데이터베이스 만들기
SELECT 문을 연습할 market_db 데이터베이스를 만들어 보자. 여기서는 혼공SQL 사이트에 다운받은 스크립트로 만들자.
테이블이 만들어 진것을 확인할 수 있다.
Market_db.sql 파일 내용 살펴보기
market_db.sql 스크립트 내용을 살펴보자.
1.데이터베이스 만들기
- market_db가 있으면 삭제 후 market_db 생성
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;
2.회원 테이블(member) 만들기
USE market_db --market_db를 선택
CREATE TABLE member -- 회원 테이블
( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원수
addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
phone1 CHAR(3), -- 연락처의 국번(02, 031, 055 등)
phone2 CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔 일자
);
3.구매 테이블(buy) 만들기
CREATE TABLE buy -- 구매 테이블
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK), 자동으로 숫자 입력 1,2,3.....
mem_id CHAR(8) NOT NULL, -- 아이디(FK), FOREIGN key
prod_name CHAR(6) NOT NULL, -- 제품이름
group_name CHAR(4) , -- 분류
price INT NOT NULL, -- 가격
amount SMALLINT NOT NULL, -- 수량
FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);
4.데이터 입력하기
- CHAR, VARCHAR, DATE형은 작은 따옴표로 값을 묶어주고, INT는 작은 따옴표 없이 작성
- AUTO_INCREMENT는 자동으로 숫자가 입력되므로 NULL을 입력
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
5.데이터 조회하기
SELECT * FROM member
SELECT * FROM buy
1-2. 기본 조회하기:SELECT ~ FROM
USE 문
SELECT문을 실행하려면 먼저 사용할 데이터베이스를 지정해야 한다. 아래와 같이 USE를 사용하면 된다.
USE market_db;
SELECT문의 기본 형식
SELECT문은 복잡하기 때문에 여기서는 우선 간단하게 핵심만 표현하고 하나씩 차근 차근 살펴보자.
SELECT 열_이름
FROM 테이블 이름
WHERE 조건식
GROUP BY 열_이름
HAVING 조건식
ORDER BY 열_이름
LIMIT 숫자
여기서는 FROM, WHERE의 기본적이고 핵심적인 형식에 대해 먼저 알아본다.
SELECT와 FROM
USE문으로 market_db를 선택하고 member 테이블을 조회해 보자.
USE market_db;
SELECT * FROM member;
- SELECT: 테이블에서 데이터를 가져올 때 사용하는 예약어
- *: 모든 것을 의미, 즉 여기서는 member 테이블의 8개 열 모두를 의미
- FROM: FROM 다음에 나오는 테이블에서 내용을 가져옴
- member: 조회할 테이블
원래 테이블의 전체 이름은 데이터베이스_이름.테이블_이름 형식으로 표현한다. 하지만 여기서는 USE로 데이터베이스를 이미 지정하였기 때문에 동일한 문으로 인식한다.
SELECT * FROM market_db.member
==
USE market_db;
SELECT * FROM member
이번에는 mem_name 열만 가져와 보자.
SELECT mem_name FROM member;
=========================================================
# mem_name
'에이핑크'
'블랙핑크'
'소녀시대'
'잇지'
'마마무'
'오마이걸'
'레드벨벳'
'우주소녀'
'트와이스'
'여자친구'
이 번에는 주소, 데뷔일, 이름을 가져와 보자. 여러 열을 가져오는 경우에는 ,를 사용하면 된다.
SELECT addr, debut_date, mem_name FROM member;
# addr, debut_date, mem_name
'경기', '2011-02-10', '에이핑크'
'경남', '2016-08-08', '블랙핑크'
'서울', '2007-08-02', '소녀시대'
'경남', '2019-02-12', '잇지'
'전남', '2014-06-19', '마마무'
'서울', '2015-04-21', '오마이걸'
'경북', '2014-08-01', '레드벨벳'
'서울', '2016-02-25', '우주소녀'
'서울', '2015-10-19', '트와이스'
'경기', '2015-01-15', '여자친구'
추가적으로 열 이름이 보기 어려울 수도 있으니 Alias(별칭)으로 데이터를 가져와 보자. 만약 별칭에 공백이 있으면 "로 묶어주면 된다.
SELECT addr 주소, debut_date "데뷔 일자", mem_name 이름 FROM member;
1-3. 특정한 조건만 조회하기:SELECT ~ FROM ~ WHERE
WHERE 없이 조회하기
SELECT ~ FROM 문으로만 조회하면 결과 값이 많은 경우 성능 및 데이터를 찾는데 문제가 생길 수 있다. 그래서 WHERE 절과 함께 사용하는 것이 좋다.
기본적인 WHERE 절
WHERE 절을 이용하여 이름(mem_name)이 블랙핑크인 결과를 출력해 보자.
SELECT * FROM member WHERE mem_name = "블랙핑크";
# mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date
'BLK', '블랙핑크', '4', '경남', '055', '22222222', '163', '2016-08-08'
이번에는 인원수(mem_number)가 4명인 사람만 출력해 보자.
SELECT * FROM member WHERE mem_number = 4;
# mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date
'BLK', '블랙핑크', '4', '경남', '055', '22222222', '163', '2016-08-08'
'MMU', '마마무', '4', '전남', '061', '99999999', '165', '2014-06-19'
'RED', '레드벨벳', '4', '경북', '054', '55555555', '161', '2014-08-01'
관계 연산자, 논리 연산자의 사용
숫자로 표현된 데이터는 범위를 지정할 수 있다.
평균 키(height)가 162이하인 회원의 mem_id와 mem_name을 검색해 보자.
SELECT mem_id, mem_name FROM member WHERE height <= 162;
# mem_id, mem_name
'OMY', '오마이걸'
'RED', '레드벨벳'
'SPC', '우주소녀'
2가지 이상의 조건인 height가 165 이상이면서 mem_number도 6명 초과인 mem_name, height, mem_number 회원을 검색해 보자.
SELECT mem_name, height, mem_number FROM member WHERE height >= 165 AND mem_number > 6;
# mem_name, height, mem_number
'소녀시대', '168', '8'
'트와이스', '167', '9'
이번에는 height가 165 이상이거나 mem_number가 6명 초과인 mem_name, height, mem_number 회원을 검색해 보자.
SELECT mem_name, height, mem_number FROM member WHERE height >= 165 OR mem_number > 6;
# mem_name, height, mem_number
'소녀시대', '168', '8'
'잇지', '167', '5'
'마마무', '165', '4'
'오마이걸', '160', '7'
'우주소녀', '162', '13'
'트와이스', '167', '9'
'여자친구', '166', '6'
BETWEEN ~ AND
AND나 BETWEEN ~ AND를 사용해 사이 값을 확인할 수도 있다.
height가 163 ~ 165인 mem_name, height 회원을 검색해 보자.
SELECT mem_name, height FROM member WHERE height >= 163 AND height <= 165;
SELECT mem_name, height FROM member WHERE height BETWEEN 163 AND 165;
# mem_name, height
'에이핑크', '164'
'블랙핑크', '163'
'마마무', '165'
IN()
IN()을 사용하면 문자 값의 특정 범위에 있는 곳을 편하게 검색할 수 있다.
예를 들어 addr에 경기/전남/경남 중 한 곳에 사는 회원을 검색하려면 OR 조건을 사용해야 하는데 코드가 복잡하다 IN()을 사용하면 간결하게 작성 가능하다.
SELECT mem_name, addr FROM member WHERE addr = "경기" OR addr = "전남" OR addr = "경남";
SELECT mem_name, addr FROM member WHERE addr IN("경기", "전남", "경남");
# mem_name, addr
'에이핑크', '경기'
'블랙핑크', '경남'
'잇지', '경남'
'마마무', '전남'
'여자친구', '경기'
LIKE
문자열의 일부 글자를 검색하려면 LIKE를 사용한다. 예를 들어 mem_name의 첫글자가 "우"로 시작하는 회원은 '우%'로 표현할 수 있다. 제일 앞글자가 "우"이고 뒤는 무엇이든 허용한다는 의미이다.
SELECT * FROM member WHERE mem_name LIKE '우%';
# mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date
'SPC', '우주소녀', '13', '서울', '02', '88888888', '162', '2016-02-25'
만약 한 글자와 매칭하기 위해서는 _를 사용한다. 앞에 두 글자는 상관없이 뒤에 "핑크"가 와야 한다면 아래와 같이 검색할 수 있다.
SELECT * FROM member WHERE mem_name LIKE '__핑크';
# mem_id, mem_name, mem_number, addr, phone1, phone2, height, debut_date
'APN', '에이핑크', '6', '경기', '031', '77777777', '164', '2011-02-10'
'BLK', '블랙핑크', '4', '경남', '055', '22222222', '163', '2016-08-08'
서브 쿼리
SELECT 안에 또 다른 SELECT가 들어갈 수 있다.이것을 서브쿼리라고 한다.
한 예제로 에이핑크인 회원의 평균 키(height)보다 큰 회원을 검색 하려면 아래와 같이 2번의 쿼리가 필요하다.
SELECT height FROM member WHERE mem_name = "에이핑크";
# height
'164'
그리고 나서 164보다 평균 키(height)가 큰 회원을 조회하면 된다.
SELECT mem_name, height FROM member
WHERE height > 164;
# mem_name, height
'소녀시대', '168'
'잇지', '167'
'마마무', '165'
'트와이스', '167'
'여자친구', '166'
이 2개의 SQL 문을 하나로 만들어 보자.,
SELECT mem_name, height FROM member
WHERE height > (SELECT height FROM member WHERE mem_name = "에이핑크");
# mem_name, height
'소녀시대', '168'
'잇지', '167'
'마마무', '165'
'트와이스', '167'
'여자친구', '166'
'혼자공부하는 SQL' 카테고리의 다른 글
3. SQL 기본 문법-3 (0) | 2022.01.21 |
---|---|
3. SQL 기본 문법-2 (0) | 2022.01.19 |
2. 실전용 SQL 미리 맛보기-2 (0) | 2022.01.15 |
2. 실전용 SQL 미리 맛보기-1 (0) | 2022.01.14 |
1. 데이터베이스와 SQL (0) | 2022.01.14 |