쌓고 쌓다

[SQL] SELECT ~ FROM ~ WHERE + USE, IN(), LIKE, 서브쿼리 (1) 본문

프로그래밍/SQL

[SQL] SELECT ~ FROM ~ WHERE + USE, IN(), LIKE, 서브쿼리 (1)

승민아 2022. 6. 23. 16:46

+ 작성한 쿼리는 Ctrl + Shift + Enter로 실행 가능.

 

데이터 베이스 만들기

DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;

DROP DATABASE는 market_db를 삭제하는 문장이다. 이번 실습에서 다시 market_db.sql을 실행할 일이 있기 때문에

기존의 데이터 베이스를 삭제하는 명령어가 있음.

삭제 후 다시 market_db 데이터베이스를 만듦.

앞서 클릭으로 스키마를 만들어낸 것과 동일한 역할임. (스키마=데이터베이스)

 

회원 테이블(member) 만들기

USE market_db;
CREATE TABLE member -- 회원 테이블
( mem_id  		CHAR(8) NOT NULL PRIMARY KEY,
  mem_name    	VARCHAR(10) NOT NULL,
  mem_number    INT NOT NULL,
  addr	  		CHAR(2) NOT NULL,
  phone1		CHAR(3),
  phone2		CHAR(8),
  height    	SMALLINT,
  debut_date	DATE
);

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

앞서 우리가 [SCHEMAS] 패널에서 더블 클릭하여 선택한 것과 동일한 효과이다.

그리고 CREATE TABLE member을 통해 테이블을 만든다.

VARCHAR는 CHAR과 동일하게 문자를 입력하는것으로 추후에 자세히 정리할 것.

 

SQL에서 하이픈(-) 2개가 연속으로 입력 후 한 칸을 띄고 작성하면 그 부분은 주석으로 처리

 

구매 테이블(buy) 만들기

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가 있는데 이것은 자동으로 숫자를 입력해준다는 의미이다.

1, 2, 3, ...과 같은 방식으로 자동으로 증가함.

FOREIGN KEY도 추후에 공부함.

 

데이터 입력하기

INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);

INSERT로 데이터를 입력한다.

CHAR, VARCHAR, DATE형은 작은따옴표로 값을 묶어주고, INT형은 작음 따옴표 없이 그냥 넣어준다.

buy 테이블에 데이터를 입력하는 구문에 num을 NULL로 넣어줬는데 이러면 자동으로 1, 2, 3, ...으로 증가하면서 입력됨.

여기서 처음이므로 1이 입력된다.

 

데이터 조회하기

SELECT * FROM member;
SELECT * FROM buy;

member, buy 테이블의 모든 열을 조회

이렇게 두 문장이면 아래 사진처럼 두 개의 텝으로 생긴다.

 

하나의 쿼리만 실행하기 원한다면 드래그한 후, 실행하면 된다.

그러면 아래처럼 자신이 원하는 쿼리만 실행되고 하나의 텝만 만들어져 결과를 보이는 걸 볼 수 있다.

 

USE문

SELECT문을 사용하려면 먼저 데이터베이스를 지정해야 한다.

USE문을 이용해 현재 사용하는 데이터베이스를 지정 또는 변경한다.

USE 데이터베이스_이름;
-- > USE market_db;

 

SELECT문의 기본 형식

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

 

아래처럼 기본만 일단 다룬다.

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

 

SELECT와 FROM

USE market_db;
SELECT * FROM member;

SELECT : 테이블에서 데이터를 가져올 때 사용하는 예약어

* : 모든 것을 의미하고 이 위치는 원래 열 이름이 들어가야 하므로 모든 열을 뜻함

FROM : FROM 다음에 테이블의 이름이 나올 것이고 이 테이블에서 가져온다는 의미이다.

member : 조회할 테이블의 이름

 

 

 

원래 테이블의 전체 이름은 데이터베이스_이름.테이블_이름 형식으로 아래와 같다.

SELECT * FROM market_db.member;

하지만, 데이터베이스 이름을 생략하면 USE문으로 지정해 놓은 데이터베이스가 자동 선택됨.

그렇기에 위의 SELECT랑 아래의 SELECT가 동일한 효과를 보임.

 

필요한 열만 가져오기

SELECT * FROM member;는 member 테이블의 모든 열을 가져온다.

하지만, 필요한 열만 가져올 수 있다.

*가 아닌 필요한 열의 이름을 쓴다.

SELECT mem_name FROM member;

여러 개의 열도 "," 를 이용해 한번에 출력이 가능하다.

SELECT addr, mem_name, debut_date FROM member;

 

 

+ 열 이름의 별칭

열 이름에 별칭(alias)을 지정할 수 있다.

별칭에 공백이 필요하다면 큰따옴표(")로 묶어줘야 한다.

SELECT addr 주소, mem_name "그룹 이름", debut_date FROM member;

 

특정한 조건만 조회하기

SELECT ~ FROM ~ WHERE

SELECT ~ FROM은 보통 WHERE을 이용해 필요한 것들만 골라서 결과를 찾는다.

 

기본적인 WHERE문

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

또는

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

-> 세미콜론(;)이 나오기 전까지는 한 줄로 쓰든, 여러 줄로 쓰든 동일하기에 여러줄로 나눠 가독성을 높임.

 

찾는 이름(mem_name)이 '블랙핑크' 라면

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

이름(mem_name) 열은 문자형(CHAR)이므로 작은따옴표로 묶어준다.

만약 인원(mem_number)과 같은 숫자형 열을 조회할 때는 작은따옴표가 필요 없다.

SELECT * FROM member WHERE mem_number = 4;

 

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

숫자로 표현된 데이터는 관계 연산자 <=를 사용해서 범위를 지정할 수 있다.

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

 

2가지 이상의 조건을 만족하도록 AND 연산자를 통해 설정도 가능하다.

SELECT mem_id, mem_name, height, mem_number FROM member WHERE height >= 165 AND mem_number > 6 ;

 

한 가지 조건만 만족해도 되는 OR 연산자도 사용이 가능하다.

SELECT mem_id, mem_name, height, mem_number FROM member WHERE height >= 165 OR mem_number > 6 ;

 

BETWEEN ~ AND

위의 예제 중에 AND로 키의 범위를 잡아 조회를 해보았다.

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

SELECT mem_id, mem_name, height, mem_number FROM member WHERE height BETWEEN 163 AND 165;

 

IN()

키(height)와 같이 숫자로 구성된 데이터는 크다/작다의 범위를 지정할 수 있으므로 BETWEEN ~ AND를 사용할 수 있었지

주소(addr)와 같은 데이터는 문자로 표현되기 때문에 범위를 표현할 수 없다.

경기/전남/경남 중 한 곳에 사는 사는 회원을 검색한다면 아래와 같이 작성해야 할 것이다.

SELECT mem_name, addr FROM member WHERE addr = '경기' OR addr = '전남' OR addr = '경남';

 

 

여기서, IN()을 사용하면 간결하게 사용할 수 있다.

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

 

 

LIKE

문자열의 일부를 검색하려면 LIKE를 사용해야 한다.

이름(mem_name)이 '우'로 시작하는 회원을 검색하려면 아래와 같이 한다.

SELECT mem_name, addr FROM member WHERE mem_name LIKE '우%';

 

제일 앞 글자가 '우'이고 그 뒤는 무엇이든 허용한다는 의미에서 %를 사용한다.

 

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

SELECT * FROM member WHERE mem_name LIKE '__핑크';

위의 코드 박스는 언더바 2개가 붙어있어 하나로 보이지만

' _ _ 핑 크 ' 를 입력했으므로 총 4글자인데 앞 2글자는 상관없고 뒤 2글자는 핑크인 이름을 검색합니다.

 

 

 

+ 서브 쿼리

SELECT 안에 SELECT가 들어갈 수 있다.

이것을 서브 쿼리 또는 하위 쿼리라고 부른다.

 

예로,

에이핑크의 평균 키(height) 보다 큰 회원을 검색하고 싶다.

그러면 아래와 같은 과정을 거쳐야 할 것이다.

 

1. 에이핑크의 height를 찾는다.

2. 찾은 height보다 큰 멤버를 찾는다.

 

여기서 서브 쿼리를 이용해 한번에 찾아보자.

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

 

 

키 164 이상인 이름을 찾는 것에

키 164를 대신하여 에이핑크의 height를 찾는 쿼리를 넣어준 것이다.

SELECT mem_name, height FROM member WHERE height > 164;

 

위 내용들은 "혼자공부하는SQL" 교재를 기반으로 학습후 정리한 내용입니다.

Comments