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 = '에이핑크');
서브 쿼리의 장점은 2개의 SQL을 하나로 만듦으로써 하나의 SQL만 관리하면 되므로 더 간단해 진다는 점이다. 많이 사용되므로 잘 학습하는 것이 좋다.
핵심 포인트
USE 문은 데이터베이스를 선택하는 구문으로 한 번 지정하면 계속 유지된다.
SELECT ~ FROM ~ WHERE 문은 가장 기분족언 SQL이다. SELECT 다음에는 열 이름이, FROM 다음에는 테이블 이름이, WHERE 다음에는 다양한 조건식이 올 수 있다.
관게 연산자는 WHERE 절에다 크다/작다/같다 등을 지정하는 기호로 <, <=, >, >=, = 등이 있다.
논리 연산자는 관계 연산자가 2개 이상 나오면 AND, OR 등으로 참/거짓을 판별한다
LIKE는 문자열 비교 시 모두 허용할 때는 %를, 하나로 지정할 때는 _를 사용한다.
'혼자 공부하는 SQL > 3장 SQL 기본 문법' 카테고리의 다른 글
3장 -3 데이터 변경을 위한 SQL문 (0) | 2023.11.01 |
---|---|
3장 -2 좀 더 깊게 알아보는 SELECT 문 (0) | 2023.10.29 |