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 줄의 쿼리문과 동일한 결과를 나타낸다.
'CS > DB' 카테고리의 다른 글
[혼공SQL] MySQL의 데이터 형식 (0) | 2024.01.15 |
---|---|
[혼공SQL] 혼공단 11기 - 2주차 미션 인증 (1) | 2024.01.11 |
[혼공SQL] 데이터 변경 SQL (0) | 2024.01.11 |
[혼공SQL] SQL 기본 문법 SELECT (0) | 2024.01.10 |
[혼공SQL] 혼공단 11기 - 1주차 미션 인증 (3) | 2024.01.04 |