Soy Library

[혼공S] CH3-(1). 기본 중에 기본 SELECT ~ FROM ~ WHERE 본문

Study/SQL

[혼공S] CH3-(1). 기본 중에 기본 SELECT ~ FROM ~ WHERE

Soy_Hwang 2022. 1. 9. 00:17

실습용  데이터베이스 구축 

 

market_db 만들기

# 만약 market_db가 존재하면 우선 삭제
DROP DATABASE IF EXISTS market_db; 
# market_db 만들기 
CREATE DATABASE market_db;

 

USE 문은 데이터베이스를 선택하는 문장: 2장에서 더블클릭으로 shop_db를 선택했는데 그와 같은 과정.

USE market_db;

 

Create table 문을 통해서 member 테이블을 만듦. 멤버 테이블은 mem_id를 primary key로 하였고, buy 테이블에서는 num을 primary key로 하였다. 

auto_increment: 자동으로 숫자를 입력해준다는 의미로, 순번을 직접 입력할 필요 없이 1, 2, 3, .... 순으로 자동으로 증가하게 됨. member_id는 Foreign key로 사용되었는데, 이는 5장에서 자세히 다룰 것임. 

# member 테이블
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  -- 데뷔 일자
);

# 구매 테이블
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)
);

 

데이터를 입력할 때에는 Insert into 문을 사용한다. char랑, varchar, date형의 데이터는 따옴표를 이용하여 표시하고, 숫자는 따옴표 없이 적어주면 된다. buy 테이블에서 맨 처음 열은 auto_increment가 되는 열이기 때문에 null값을 넣어준다.   

# 멤버 테이블의 첫 번째 행의 데이터
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19') ; 

# BUY 테이블의 첫 번째 행의 데이터
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2) ;

 

select 문을 이용하여 만들어진 테이블을 불러온다. 그럼 아래와 같은 표가 출력되는 것을 볼 수 있다. 

SELECT * FROM member;
SELECT * FROM buy;

 

기본 조회하기: SELECT ~ FROM  

 

select 문의 기본 형식은 다음과 같다. (MySQL 매뉴얼에 나온 select문 형식은 복잡하기 때문에 간단하게 적어본다.)

SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자 ;

 

정리하자면, 맨 처음에 사용할 데이터베이스 이름을 use로 불러들이고, select를 통해서 조건에 맞는 데이터를 특정 테이블에서 가져오는 것이다. 예시는 아래와 같다.

USE member_db ;
SELECT * FROM member ;

-- 위는 아래와 같이 한 줄로 나타낼 수 있음.
SELECT * FROM member_db.member ;

 

해당 테이블에서 특정 열만 가져오는 것은 아래와 같다.

SELECT mem_name FROM member ; 
SELECT addr, debut_date, mem_name FROM member ; 

# 열 이름 별칭
SELECT addr, debut_date "데뷔 일자", mem_name FROM member ;

데뷔 일자 열의 원래의 열 이름은 "debut_date"이었는데 이를 "데뷔 일자"로 바꿔서 불러들일 수 있는 것이다. 

 

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

 

where문을 이용해서 해당 데이터의 특정 조건만을 갖는 데이터만을 추출할 수 있다. 예시는 아래와 같다.

SELECT * FROM member WHERE mem_name = "블랙핑크" ;
SELECT * FROM member WHERE mem_number = 4 ;

숫자로 표현된 데이터는 관계 연산자를 이용하여 범위를 지정하여 데이터를 출력할 수 있다. 

SELECT mem_id, mem_name FROM member WHERE height <= 162 ;

-- AND 논리연산자
SELECT mem_name, height, mem_number FROM member WHERE height >= 165 AND mem_number > 6 ;

-- OR 논리연산자
SELECT mem_name, height, mem_number FROM member WHERE height >= 165 OR mem_number > 6 ;

-- BETWEEN ~ AND
SELECT mem_name, height FROM member WHERE height BETWEEN 163 AND 165 ; -- BETWEEN은 해당 값도 포함.

-- IN
SELECT mem_name, addr FROM member WHERE addr = '경기' OR addr = '전남' OR addr = '경남' ; 
SELECT mem_name, addr FROM member WHERE addr IN('경기', '전남', '경남') ; 

-- LIKE
SELECT * FROM member WHERE mem_name LIKE '우%' ; 
SELECT * FROM member WHERE mem_name LIKE '__핑크' ;
SELECT * FROM member WHERE mem_name LIKE '____' ;

 

서브쿼리

 

Select문 안에 또 select문이 들어갈 수도 있다. 예를 들어, 에이핑크의 평균 키보다 큰 그룹을 검색하고 싶다고 가정해보자. 먼저 mem_name이 에이핑크인 데이터의 키를 출력해야한다. 그리고 출력된 키보다 큰 그룹을 또 다시 출력하면 된다. 

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

 

위와 같은 두 쿼리문을 하나로 합칠 수 있는 방법은 서브쿼리를 이용하는 것이다. 아래와 같다. 

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

 

 

Reference

혼자 공부하는 SQL, 우재남 지음