본문 바로가기

혼자 공부하는 SQL/3장 SQL 기본 문법

3장 SQL 기본 문법 // SELECT ~ FROM ~ WHERE

SELECT 문은 구축이 완료된 테이블에서 데이터를 추출하는 역활을 한다.

 

SELECT 문의 기본 형식: SELECT ~ FROM ~ WHERE

 

SELECT 다음에는 열이름이, FROM 다음에는 테이블 이름이 나온다. WHERE 다음에는 조건식이 나오는데 조건식을 다양하게 표현함으로써 데이터베이스에서 원하는 데이터를 뽑아낼 수 있다.

 

(1) 실습용 데이터 베이스 만들기

 

1. 완성된 SQL 다운로드

 

한빛미디어 사이트의 혼공 자료실에 접속해서 예제 소스를 다운로드

https://www.hanbit.co.kr/src/10473 

 

https://www.hanbit.co.kr/src/10473

 

www.hanbit.co.kr

 

2. File - Open SQL Script 메뉴를 선택, market.db.sql을 선택한 후 열기

실행 된 모습

 

 

지금 실습한 내용을 통해 'market_db'를 초기화 할 수 있다.

 

다음은 데이터베이스를 만들어 보자

 

(3) 데이터베이스 만들기

DROP DATABASE IF exists market_db; // market_db가 존재한다면 삭제
CREATE DATABASE market_db; // market_db 생성

 

1. 회원 테이블 만들기

USE 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  -- 데뷔 일자
);

 

* USE 문은 market_db 데이터베이스를 선택하는 문장 

*  -- => 하이폰 2개는 주석의 의미

 

2. 구매 테이블 만들기

CREATE TABLE buy -- 구매 테이블
(  num  INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
   mem_id   CHAR(8) NOT NULL, -- 아이디(FK)
   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)
);

 

* AUTO_INCREMENT 자동으로 숫자를 입력해준다는 의미 순번은 직접 입력할 필요 없이 자동으로 숫자가 증가한다.

* FOREIGN KEY는 5장에서 다룬다

 

3. 데이터 입력하기

INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO member VALUES('BLK', '블랙핑크', 4, '경남', '055', '22222222', 163, '2016.08.08');
INSERT INTO member VALUES('WMN', '여자친구', 6, '경기', '031', '33333333', 166, '2015.01.15');
INSERT INTO member VALUES('OMY', '오마이걸', 7, '서울', NULL, NULL, 160, '2015.04.21');
INSERT INTO member VALUES('GRL', '소녀시대', 8, '서울', '02', '44444444', 168, '2007.08.02');
INSERT INTO member VALUES('ITZ', '잇지', 5, '경남', NULL, NULL, 167, '2019.02.12');
INSERT INTO member VALUES('RED', '레드벨벳', 4, '경북', '054', '55555555', 161, '2014.08.01');
INSERT INTO member VALUES('APN', '에이핑크', 6, '경기', '031', '77777777', 164, '2011.02.10');
INSERT INTO member VALUES('SPC', '우주소녀', 13, '서울', '02', '88888888', 162, '2016.02.25');
INSERT INTO member VALUES('MMU', '마마무', 4, '전남', '061', '99999999', 165, '2014.06.19');

INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);
INSERT INTO buy VALUES(NULL, 'BLK', '맥북프로', '디지털', 1000, 1);
INSERT INTO buy VALUES(NULL, 'APN', '아이폰', '디지털', 200, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '아이폰', '디지털', 200, 5);
INSERT INTO buy VALUES(NULL, 'BLK', '청바지', '패션', 50, 3);
INSERT INTO buy VALUES(NULL, 'MMU', '에어팟', '디지털', 80, 10);
INSERT INTO buy VALUES(NULL, 'GRL', '혼공SQL', '서적', 15, 5);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 2);
INSERT INTO buy VALUES(NULL, 'APN', '청바지', '패션', 50, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 1);
INSERT INTO buy VALUES(NULL, 'APN', '혼공SQL', '서적', 15, 1);
INSERT INTO buy VALUES(NULL, 'MMU', '지갑', NULL, 30, 4);

 

회원 테이블(member)에 값을 입력한다. CHAR, VARCHAR, DATE형은 작은따움표로 값을 묶어준다. INT형은 작은따움표 없이 그냥 넣어주면 된다.

 

구매 테이블의 첫 번째 순번(NUM)은 자동으로 입력되므로 그 자리에는 NULL이라고 써주면 된다. 알아서 숫자가 입력되고 증가한다. 

 

4. 데이터 조회하기

 

SELECT * FROM member;
SELECT * FROM buy;

 

 

 

 

기본 조회하기: SELECT ~ FROM

 

(1) USE 문

USE 데이터베이스_이름;

USE market_db

=> 이런 식으로 지정해 놓은 후에 다시 USE 문을 사용하거나 다른 DB를 사용하겠다고 명시하지 않으면 모든 SQL 문은 market_db에서 수행된다.

 

MySQL 워크벤치를 재시작하거나 쿼리 창을 새로 열면 다시 USE 구문을 실행해야 한다.

 

(2) SELECT 문의 기본 형식

SELECT select_expr -- []은 생략 가능 // 열 이름
    [FROM table_references] // 테이블 이름
    [WHERE where_condition] // 조건식
    [GROUP BY {col_name | expr | position}] //열_이름
    [HAVING where_condition] // 조건식
    [ORDER BY {col_name | expr | position}] // 열_이름
    [Limit {[offset,] row_count| row count OFFSET offset}] // 숫자

 

(3) SELECT와 FROM

 

회원 테이블을 조회

USE market_db;

(1)SELECT (2)* (3)FROM (4)member;

 

(1) 테이블에서 데이터를 가져올 때 사용하는 예약어

(2) 일반적으로 '모든 것'을 의미. *가 사용된 위치가 열 이름이 나올 곳이므로 모든 열을 말함.
(3) from 다음에 테이블 이름이 나옴. 테이블에서 내용을 가져온다는 의미

(4) 조회할 테이블 이름

실행 결과

 

 

원래 테이블의 전체 이름은 데이터베이스_이름.테이블_이름 형식으로 표현한다.

그렇다면 실습하고 있을 테이블의 전체 이름은 market_db.member이다. 그렇기 때문에 원칙적으로는 다음과 같이 사용한다.

SELECT * FROM market_db.member;

결과는 같다

 

하지만 데이터베이스 이름을 생략하면 USE 문으로 지정해 놓은 데이터베이스가 자동으로 선택된다. 현재 선택된 데이터베이스가 market_db이므로 다음 두 쿼리는 동일한 것이 된다.

 

SELECT * FROM market_db.member;

=

SELECT * FROM member;

 

(4) 전체 열이 아닌 필요한 열만 가져오기

 

SELECT mem_name FROM member;

 

여러 개의 열을 가져오고 싶으면 콤마(,)로 구분하면 된다. 열 이름의 순서는 원래 테이블을 만들 때 순서에 맞출 필요가 없다. 보고 싶은 순서대로 열을 나열하면 된다.

 

SELECT addr, debut_date, mem_name FROM member;

 

 

*열 이름의 별칭(alias)을 지정할 수 있다. 열 이름 다음에 지정하고 싶은 별칭을 입력하면 된다.

 

SELECT addr 주소, debut_date "데뷔 일자", mem_name FROM member;

 

 

특정한 조건만 조회하기: SELECT ~ FROM ~ WHERE

SELECT ~FROM은 대부분 WHERE 과 함께 사용한다. WHERE은 필요한 것들만 골라서 결과를 보는 효과를 갖는다.

 

WHERE가 없이 SELECT ~ FROM 만으로 테이블을 조회하면 테이블의 모든 행이 출력된다.

데이터의 건수가 적으면 괜찮지만 데이터 량이 많아지면 WHERE 절이 필수적이다.

 

기본적인 WHERE 절

 

SELECT 열_이름 FROM 테이블_이름 WHERE 조건식;

 

또는

SELECT 열_이름

FROM 테이블_이름

WHERE 조건식;

 

만약 찾는 이름(mem_name)이 블랙핑크라면 아래와 같은 조건식을 사용하면 된다.

 

SELECT * FROM member WHERE mem_name = '블랙핑크';

 

다음과 같이 인원 처럼 숫자형 열을 조회할 때는 작은따움표가 필요 없다.

 

SELECT * FROM member WHERE mem_number =4;

 

 

 

관계 연산자, 논리 연산자 사용

관계 연산자 사용 가능

ex)

SELECT mem_id, mem_name

FROM member

WHERE height <= 162;

 

아래와 같이 165 이상이면서 6명 초과인 회원을 찾는 논리 연산자 and를 사용할 수 있다.

SELECT mem_name, height, mem_number

FROM member

WHERE height >= 165 AND mem_number >6;

 

 

OR 도 똑같이 가능하다

 

BETWEEN ~ AND

AND를 사용해서 평균 키 163 ~165 인 회원을 조회

SELECT mem_name, height

FROM member

WHERE height >= 163 AND height <= 165;

 

범위 안에 있는 값을 구하는 경우에는 BETWEEN ~AND를 사용해도 된다.

 

SELECT mem_name, height

FROM member

WHERE height BETWEEN 163 AND 165;

 

IN()

평균 키와 같이 숫자로 구성된 데이터는 크다/작다의 범위를 지정할 수 있으므로 BETWEEN ~AND를 사용할 수 있지만, 주소(addr)와 같은 데이터는 문자로 표현되기 때문에 어느 범위에 들어 있다고 표현할 수 없다. 만약, 경기/전남/경남 중 한 곳에 사는 회원을 검색하려면 or을 사용해서 일일히 써줘야 한다.

 

SELECT mem_name, addr

FROM member

WHERE addr = '경기' OR addr = '전남' OR addr = '경남';

 

IN()을 사용하면 코드를 간결하게 줄일 수 있다.

 

SELECT mem_name, addr 

FROM member

WHERE addr IN('경기', '전남', '경남');

 

LIKE

문자열의 일부 글자를 검색하려면 LIKE를 이용한다

첫 글자가 '우'로 시작하는 회원은 다음과 같이 검색할 수 있다.

(%)는 무엇이든 허용한다는 의미

SELECT *

FROM member

WHERE mem_name LIKE '우%';

 

한 글자와 매치하기 위해서는 언더바(_)를 사용

앞 글자는 상관 없이 '핑크'인 회원을 검색하는 SQL은 다음과 같다

SELECT *

FROM member

WHERE mem_name LIKE '__핑크'; 

 

서브 쿼리

 

SELECT 안에는 또 다른 SELECT가 들어갈 수 있는데 이것을 서브 쿼리 또는 하위 쿼리라 부른다.

 

이름(mem_name)이 '에이피크'인 회원이 평균 키(height)보다 큰 회원을 검색하고 싶다고 가정해보자.

 

우선 에이핑크의 평균 키를 알아야 한다. 

 

SELECT mem_name, height FROM member WHERE mem_name ='에이핑크';

 

이제는 164 보다 평균 키가 큰 회원을 조회하면 된다.

 

 

SQL 문 2개를 사용해서 결과를 얻었는데 이 두 구문을 하나로 만들 수 있다.

 

SELECT mem_name, height FROM member WHERE height > (SELECT height FROM  member WHERE mem_name = '에이핑크');

SQL 구문안에 SQL이 들어간 모습이다

 

서브 쿼리의 장점은 2개의 SQL을 하나로 만듦으로써 하나의 SQL만 관리하면 되므로 더 간단해 진다는 점이다. 많이 사용되므로 잘 학습하는 것이 좋다.

 

핵심 포인트

USE 문은 데이터베이스를 선택하는 구문으로 한 번 지정하면 계속 유지된다.

 

SELECT ~ FROM ~ WHERE 문은 가장 기분족언 SQL이다. SELECT 다음에는 열 이름이, FROM 다음에는 테이블 이름이, WHERE 다음에는 다양한 조건식이 올 수 있다.

 

관게 연산자는 WHERE 절에다 크다/작다/같다 등을 지정하는 기호로 <, <=, >, >=, = 등이 있다.

 

논리 연산자는 관계 연산자가 2개 이상 나오면 AND, OR 등으로 참/거짓을 판별한다

 

LIKE는 문자열 비교 시 모두 허용할 때는 %를, 하나로 지정할 때는 _를 사용한다.