본문 바로가기

혼자공부하는 SQL

3. SQL 기본 문법-1

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