CS/DB

[혼공SQL] SQL 기본 문법과 SELECT

F12:) 2024. 1. 10. 09:40

SQL 기본 문법에 대해서 알아보자.

 

   데이터베이스 만들기

DROP DATABASE IF EXISTS market_db;
CREATE DATABASE market_db;

이 두 쿼리문으로 데이터베이스가 생성된다. 

 

1. DROP DATABASE IF EXISTS market_db;

사실 테이블을 가장 먼저 생성하는 경우라면 이 쿼리문은 필요 없다. 만약 기존에 테이블이 존재한다면 해당 테이블을 지우고 다시 시작해야하므로 실행해주는 쿼리문이다.

 

2. CREATE DATABASE market_db;

데이터베이스를 drop 했으니 새로 DB를 생성해야 한다. CREATE 문으로 데이터베이스를 생성하는데 해당 데이터베이스의 이름을 market_db라고 지정한다.

 

 

   테이블 만들기

USE market_db;
CREATE TABLE member -- 회원 테이블(member)
( mem_db	CHAR(8) NOT NULL PRIMARY KEY, -- 회원 아이디(PK)
  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 -- 데뷔 일자
);

* 하이픈(-) 두 개가 반복되면 그 뒤에 주석이 온다. 하이픈 2개 이후에 공백을 넣어준 후에 주석을 작성하면 된다.

 

CREATE TABLE을 통해서 테이블을 생성한다. 여기서는 member 테이블을 생성하고 있다. member table에서의 구성하는 column들을 나열해준다. 이 때, 각 column에 특성들을 부여할 수 있다. 가령 기본이 되는 자료형이나, NOT NULL 같은 것들을 설정한다.

 

VARCHAR와 같은 다른 자료형들은 나중에 더 다루도록 한다.

 

 

우선은 해당 쿼리문에서 mem_db, mem_name, mem_number, addr, phone1, phone2, height, debut_date라는 column을 가진 테이블이 생성되었다. 정도만 이해하고, 추가적으로 더 알아본다면 NOT NULL은 비워두면 안되는 것이나, PRIMARY KEY를 지정해준다는 것을 기억하자.

 

 

이 외에도 AUTO_INCREMENT를 하나 더 설명하면 좋을 것 같다. 이는 PK가 숫자형일 때 자동으로 증가시켜주면서 값을 넣어주는 방식을 의미한다. 즉, 우리가 데이터를 넣을 때, AUTO_INCREMENT로 지정된 PK를 갖는다면 해당 PK에는 직접 값을 집어넣지 않아도 된다는 것이다. 이 값은 DB에서 자동으로 생성하여 넣어주기 때문이다.

 

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 를 사용한 테이블 생성 예제.

 

이제부터 생성한 테이블에 대해서 계속해서 SQL문의 예제를 들 것이니 구조를 확실히 익혀두자.

 

   데이터 입력하기

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

member와 buy 테이블에 데이터를 넣었다. member에는 모든 데이터의 값들을 입력해줘서 넣었지만 buy에는 NULL값을 넣어주는 부분이 있었다. 이 중에서 mem_id에 해당하는 부분은 AUTO_INCREMENT로 되어있으므로 DB에서 자동 생성해준다. 따라서 NULL을 넣어주면 데이터가 자동적으로 알맞게 들어가게 될 것이다.

 

 

   데이터 조회하기

기본 조회하기: SELECT ~ FROM

USE 문

USE 데이터베이스_이름;

우선 SELECT문을 통해서 데이터를 조회하기 위해서는 해당 쿼리문의 대상이 되는 데이터베이스를 지정해야한다. USE 키워드를 통해서 쿼리문 적용 대상이 되는 데이터베이스를 지정할 수 있다.

 

SELECT 문의 기본 형식

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

이러한 방식으로 여러 조건을 주어 데이터를 조회할 수 있다. 

 

기본적으로 여기에 소개되는 WHERE, GROUP BY, HAVING, ORDER BY, LIMIT와 같은 키워드는 생략이 가능하다. 그래서 가장 간단한 문장부터 하나하나씩 키워드를 붙여나가면서 확인해보자.

 

SELECT * FROM member;

member 테이블의 전체 데이터를 조회하는 것이다. 별 표(*)는 모든을 의미한다. 이 영역에는 member 테이블의 column 값이 들어올 수 있지만 *을 넣어주었으므로 모든 열을 의미하게 된다.

 

SELECT mem_name FROM member;

이렇게 원하는 column만을 선택해서 볼 수 있다. 이렇게 된다면 member 테이블의 전체 데이터 중 mem_name만 보여지게 된다.

 

SELECT addr, debut_date, mem_name FROM member;

여러가지 column을 보고싶다면 콤마(,)를 기준으로 나열해주면 된다.

 

 

기본적인 WHERE 절

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

WHERE 를 통해서 원하는 조건의 데이터를 검색하게 된다. 위 열과로는 member 테이블에서 mem_name의 값이 블랙핑크인 데이터가 조회되게 된다.

 

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

이렇게 관계 연산자 >, <, >=, <=도 사용이 가능하다. 또한 논리 연산자인 AND, OR도 사용할 수 있다.

 

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

또한 위와 같이 WHERE height >= 163 AND height <= 165  BETWEEN 163 AND 165로 변경할 수 있다.

 

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

그리고 WHERE addr = '경기' OR addr = '전남' OR addr = '경남'  WHERE addr IN('경기', '전남', '경남')으로 줄일 수 있다.

 

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

위와 같이 mem_name에서 '우'로 시작하는 값들을 뽑아올 수 있다. %는 무엇이든 허용한다는 의미이다.

 

%는 여러 글자가 와도 상관없다. 만약에 한 글자만 와야한다는 조건을 쓰고 있다면 언더바(_)를 사용한다.

SELECT * FROM member
	WHERE mem_name LIKE '__핑크'; -- 언더바(-) 2개 사용

이렇게 되면 '핑크' 앞에 아무 2 글자가 올 수 있다는 것을 의미한다.

 

 

서브 쿼리

만약 테이블의 쿼리 결과 값을 가지고 조회를 하고 싶을 때는 어떻게 할까? 위에서 사용한 테이블을 예로 들면, 에이핑크의 평균 키보다 높은 데이터를 뽑아오고 싶은 경우일 것이다.

 

원래 이 것은 2개의 쿼리문으로 작성이 가능하다.

  • 에이핑크의 키를 조회하는 쿼리문
  • 에이핑크의 키보다 큰 데이터를 조회하는 쿼리문

 

하지만 이 두 쿼리를 하나로 줄일 수 있는 것이 바로 서브 쿼리이다. 아래와 같은 두 개의 쿼리문이 있다고 해보자.

SELECT height FROM member WHERE mem_name = '에이핑크'; -- 결과가 164가 나왔다고 가정한다.
SELECT mem_name, height FROM member WHERE height > 164;

 

이 두 쿼리문은 서브 쿼리를 이용하면 아래와 같이 나타낼 수 있다.

 

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

 

이 쿼리문은 세미콜론(;)이 하나이므로 당연히 하나의 쿼리문이 되고, 앞서 작성한 2 줄의 쿼리문과 동일한 결과를 나타낸다.