본문 바로가기

SQL

[SQL] SQL SELECT 문(1)

목차

  • 데이터베이스 구축하기
  • SELECT문
    • FROM
    • WHERE
    • BETWEEN ~ AND
    • IN( )
    • LIKE
    • 서브 쿼리

 

 

데이터베이스 구축하기

 

 

데이터베이스 만들기

DROP DATABASE IF EXISTS market_db; -- 1
CREATE DATABASE market_db; -- 2

 

  • 1. DROP DATABASE 는 market_db 를 삭제하는 문장이다.
  • 2. 데이터베이스를 새로 만든다. 

 

 

회원 테이블(member) 만들기

USE market_db; -- 1
CREATE TABLE member -- 회원 테이블 -- 2 start
( 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  -- 데뷔 일자
); -- 2 end
  • 1. USE 문은 market_db 데이터베이스를 선택하는 문장이다.
  • 2. member 테이블을 만드는 과정이다.

 

 

구매 테이블(buy) 만들기

CREATE TABLE buy -- 구매 테이블 -- 1
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK) -- 2
   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) -- 3
);

 

  • 1. 구매 테이블을 생성한다.
  • 2. AUTO_INCREMENT: 자동으로 숫자를 입력해준다는 의미
    • 즉, 순번은 직접 입력할 필요없이 1, 2, 3, .. 과 같은 방식으로 자동으로 증가
  • 3. FOREIFN KEY: 외래 키

 

데이터 입력하기

INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19'); -- 1
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2); -- 2
  • 1. 회원 테이블(member)에 값을 입력한다.  CHAR, VARCHAR, DATE 형은 작은따옴표로 값을 묶어줬다.
  • 2. 구매 테이블의 첫 번째 열인 순번(num)은 자동으로 입력되므로 그 자리는 NULL 이라고 써주면 된다.
    • 처음으로는 1이 입력된다.

 

 

 

USB 문

  • SELECT 문을 실행하려면 먼저 사용할 데이터베이스를 지정해야 한다.
  • 지정해 놓은 후에 다시 USB 문을 사용하거나 다른 DB를 사용하겠다고 명시하지 않으면
  • 앞으로 모든 SQL문은 market_db에서 수행된다.
USB 데이터베이스_이름;

 

 

SELECT 문

  • SELECT 문은 구축이 완료된 테이블에서 데이터를 추출하는 기능을 한다.
  • SELECT의 가장 기본 형식은 SELECT ~ FROM ~ WHERE 
  • SELECT 바로 다음에는 열이름이, FROM 다음에는 테이블 이름이 나온다.
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}]
SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

 

 

기본적이고 핵심적인 형식

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

 

 

SELECT와 FROM

SELECT * FROM member;

 

  • 테이블에서 데이터를 가져올 때 사용하는 예약어이다.
  • * 은 일반적으로 '모든 것'을 의미한다. 그런데 * 가 사용된 위치가 열 이름이 나올 곳이므로 모든 열을 의미한다.
  • FROM 다음에 테이블 이름이 나온다. 
  • 결과적으로 'member 테이블에서 모든 열의 내용을 가져와라' 라는 뜻이다.

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

SELECT * FROM market_db.member;

 

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

그러므로 두 쿼리는 동일한 것이 된다.

 

열 이름의 별칭

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

 

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

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

 

 

 

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

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

기본적인 WHERE 절

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

 

 

예시

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

  • 이름(mem_name) 열은 문자형(CHAR) 이므로 작은따옴표로 묶어준다.
SELECT * FROM member WHERE mem_number = 4;

 

 

 

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

숫자로 표현된 데이터는 범위를 지정할 수 있다.

관계 연산자는 >, <, >=, <=, = 등이 있다.

예를 들어 평균 키(height)가 162 이하인 회원을 검색하려면 관계 연산자를 사용해서 조회할 수 있다.

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

 

 

2가지 이상의 조건을 만족하도록 할 수 도 있다.

예를 들어 height가 165 이상이면서 인원도 6명 초과인 회원은 논리 연산자 AND를 이용한다.

AND가 두 조건이 모두 만족해야 하는 것이라면, 논리 연산자 OR는 두 조건 중 하나만 만족해도 된다.

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

 

 

 

BETWEEN ~ AND

AND를 사용해서 평균 키(height)가 163 ~ 165인 회원을 조회하겠다.

SELECT mem_name, height, mem_number
    FROM member
    WHERE height >= 163 AND height <= 165;

 

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

숫자의 범위를 조건식에서 사용할 때는 BETWEEN ~ AND가 편리하다.

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

 

 

 

IN( )

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

사용할 수 있지만, 주소(addr)와 같은 데이터는 문자로 표현되기 때문에 어느 범위에 들어 있다고 표현할 수 없다.

만약 경기/전남/경남 중 한 곳에 사는 회원을 검색하려면 OR로 일일이 써줘야 하는 불편함이 있다.

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

 

IN( )을 사용하면 코드를 훨씬 간결하게 작성할 수 있다.

조건식에서 여러 문자 중 하나에 포함되는지 비교할 때는 IN( )이 간결하다.

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

 

 

 

LIKE

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

예를 들어 이름(mem_name)의 첫 글자가 '우'로 시작하는 회원은 다음과 같이 검색할 수 있다.

이 조건은 제일 앞 글자가 '우'이고 그 뒤는 무엇이든(%) 허용한다는 의미이다.

SELECT * 
    FROM member
    WHERE mem_name LIKE '우%';

 

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

이름(mem_name)의 앞 두 글자는 상관없고 뒤는 '핑크'인 회원을 검색해보자.

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

 

 

 

서브쿼리

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

 

예시

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

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

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

 

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

SELECT mem_name, height FROM member WHERE height > 164;

 

그런데 두 SQL을 하나로 만들 수는 없을까?

가능하다. 두 번째 SQL의 164 위치에 에이핑크의 평균 키(height)를 조회하는 SQL을 대신 써주면 된다.

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

 

세미콜론이 하나이므로 이 SQL은 하나의 문장이다.

괄호 안의 SELECT 결과가 164이므로 이 자리에 164를 직접 써준 것과 동일한 효과를 얻는다.

서브 쿼리의 장점은 2개의 SQL을 하나로 만듦으로써 하나의 SQL만 관리하면 되므로 더 간단해진다.

 

'SQL' 카테고리의 다른 글

[SQL] 데이터 변경을 위한 SQL 문  (0) 2024.05.31
[SQL] SQL SELECT 문(2)  (0) 2024.05.31
[SQL] 데이터베이스 개체  (0) 2024.05.30
[SQL] 데이터베이스 구축해보기  (1) 2024.05.30
[SQL] DBMS, MySQL 설치  (0) 2024.05.30