Language/SQL

[MySQL] 데이터를 조회하는 SELECT ~ FROM ~ WHERE 문 (1)

seoraroong 2024. 8. 20. 22:37

SELECT ~ FROM ~ WHERE

SQL의 SELECT 문은 데이터베이스에서 데이터를 조회하는 데 사용되는 문법이다.

SELECT 문을 사용해 데이터베이스 테이블에서 필요한 데이터를 선택하고 결과를 반환받을 수 있다.

 

SELECT column1, column2, ...
FROM table_name
WHERE 조회하려는_조건;

 

 

실습용 데이터베이스 및 테이블 생성하기

 '이것이 MySQL이다' 책을 참고하며 학습을 진행했기 때문에 교안에 나와있는대로 데이터를 만들었다는 점 참고

 

 

기존에 db가 존재한다면 삭제하고 새로운 db를 생성한다.

CREATE DATABASE 
DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;

 

 

 

테이블을 생성하기 전에 반드시 USE 문을 이용해 어떤 데이터베이스에 테이블을 만들 것인지 지정해주어야한다.

GUI 상에서는 우측 데이터베이스 리스트에서 해당 데이터베이스를 더블 클릭하면 선택된다.

CREATE TABLE

 

<회원 (member) 테이블>

USE market_db;
CREATE TABLE member -- 회원 테이블(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 -- 데뷔 일자
);

 

<구매 (buy) 테이블> 

CREATE TABLE buy -- 구매 테이블(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 - 자동으로 숫자가 입력되는 옵션

 

 

실습용 데이터 입력하기

INSERT INTO 테이블_이름 VALUES(값1, 값2, 값3 ....);
INSERT INTO member VALUES('TWC', '트와이스', 9, '서울', '02', '11111111', 167, '2015.10.19');
INSERT INTO buy VALUES(NULL, 'BLK', '지갑', NULL, 30, 2);

-> CHAR, VARCHAR, DATE 형은 작은 따옴표로 값을 묶어주어야 한다. INT는 따옴표로 묶지 않고 입력한다.

     구매 테이블의 첫번째 열인 num은 AUTO_INCREMENT 옵션을 지정해서 자동 입력되기 때문에 NULL로 입력해준다.

 

 

 

 

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}]

   // 대괄호로 묶인 부분은 생략 가능
   
SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

 

 

 

SELECT와 FROM

USE market_db;
SELECT * FROM member;

// SELECT * FROM market_db.member; 쿼리와
   SELECT * FROM member; 쿼리는 동일하다. (이미 USE로 지정해놓아서!)

 

 

 

 

열 (Column) 이름에 별칭 (Alias) 붙이기

열 이름 다음에 지정하고 싶은 별칭을 작성해준다.

공백이 포함되어 있을 경우 큰 따옴표로 묶어주어야 한다.

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

 

 

 

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

SELECT ~ FROM은 대부분 WHERE 절과 함께 사용한다.

SELECT ~ FROM 만으로 데이터를 조회하면 데이터의 모든 행을 출력하기 때문에 가독성이 떨어지고 성능이 저하된다.

 

- 기본적인 WHERE 절

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

-> member 테이블에서 member 이름이 '블랙핑크'인 데이터의 모든 열을 출력

 

SELECT * FROM member WHERE mem_number = 4;

-> member  테이블에서 member 수가 4인 데이터의 모든 열을 출력

     INT형 열을 조회할 때는 작은 따옴표를 사용하지 않는다.

 

 

- 관계 연산자, 논리 연산자를 사용한 WHERE 절

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

-> member 테이블에서 키가 162 이하인 데이터의 mem_id, mem_name 열만 출력

 

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

-> member 테이블에서 키가 165 이상이고 (AND) member 수가 6 초과인 데이터의 mem_name, height, mem_number 열만 출력

논리 연산자 AND를 사용해 두 가지 이상의 조건을 만족하는 데이터를 조회할 수 있다

 

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

-> member 테이블에서 키가 165 이상이거나 (OR) member 수가 6 초과인 데이터의 mem_name, height, mem_number 열만 출력

 

 

 

BETWEEN ~ AND

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

->  member 테이블에서 키가 163 이상, 165 이하인 데이터의 mem_anme, height 열만 출력

     BETWEEN 163 AND 165 는 163 <= x <= 165 와 의미 상으로 동일하다.

 

 

 

IN( )

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

// 문자로 표현되는 데이터는 범위를 지정할 수 없어 OR로 일일히 지정해야 함
// IN()을 사용하면 코드를 간결하게 할 수 있음

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

 

 

 

LIKE

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

 

-> 앞 글자가 '우' 이고 뒤에 오는 문자는 무엇이든 (%) 허용한다는 의미

 

 

 

언더바 (_)

SELECT *
    FROM member
    WHERE mem_name LIKE '__핑크'; // 2개의 언더바 __ 사용

 

 

 

 

서브 쿼리 (Subquery)

SELECT 문 안에는 또 다른 SELECT 문이 들어갈 수 있다.

 

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

// 위 2개의 SQL문을 서브쿼리를 이용해 하나의 SQL문으로 바꾸기

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