웹 어플리케이션 기초

SQL 문법

문법

 
SELECT 칼럼명1, 칼럼명2
[FROM 테이블명 ]
[WHERE 조회조건 ]
[GROUP BY 칼럼명]
[ORDER BY 칼럼명 [ASC | DESC]]
[LIMIT offset, 조회 할 행의 수]

예제

CREATE TABLE student (
id tinyint(4) NOT NULL,
name char(4) NOT NULL,
sex enum('남자','여자') NOT NULL,
address varchar(50), distance int,
birthday datetime,
PRIMARY KEY (id)
);

INSERT INTO student VALUES (2, '박재숙', '남자', 10, '서울', '1985-10-26 00:00:00');
INSERT INTO student VALUES (1, '이숙경', '여자', 220, '청주', '1982-11-16 00:00:00');
INSERT INTO student VALUES (3, '백태호', '남자', 350, '경주', '1989-2-10 00:00:00');
INSERT INTO student VALUES (4, '김경훈', '남자', 10, '서울', '1979-11-4 00:00:00');
INSERT INTO student VALUES (8, '김정인', '남자', 200, '대전', '1990-10-1 00:00:00');
INSERT INTO student VALUES (6, '김경진', '여자', 610, '제주', '1985-1-1 00:00:00');
INSERT INTO student VALUES (7, '박경호', '남자', 200, '대전', '1981-2-3 00:00:00');

-- 모든 컬럼을 조회한다.
SELECT * FROM student;

-- 필요한 컬럼별로 조회한다.
SELECT name, birthday FROM student;

-- 조회 조건
SELECT * FROM student WHERE id=3;

-- 조회 조건 AND
SELECT * FROM student WHERE sex='남자' AND address='서울';

-- 조회 조건 OR
SELECT * FROM student WHERE sex='여자' OR address='서울';

-- 결과 행의 수 제한
SELECT * FROM student LIMIT 1;
SELECT * FROM student LIMIT 1,1;
SELECT * FROM student LIMIT 2,1;

 

GROUP BY

특정 칼럼을 기준으로 데이터를 그룹핑함

select sex from student group by sex;

select sex, count(*) from student group by sex;
select sex,sum(distance), avg(distance), count(distance) from student group by sex;

select address, sum(distance), avg(distance), count(*)  from student group by address;

ORDER BY

지정된 칼럼을 기준으로 행을 정렬

정렬순서

 - ASC : Ascending 오름차순 

 - DESC : Descending 내림차순

select * from student order by age desc;
select * from student order by age desc, address asc;

index

색인, 조회할 때 원하는 행을 빠르게 찾을 수 있게 준비해둔 데이터

인덱스의 종류

  • primary : 중복되지 않는 유일한 키
  • normal : 중복을 허용하는 인덱스
  • unique : 중복을 허용하지 않는 유일한 키
  • foreign : 다른 테이블과의 관계성을 부여하는 키

인덱스의 정의 방법

  • 자주 조회되는 칼럼에 적용
  • 조회 시 오랜시간을 소모하는 컬럼에 적용
  • 데이터가 긴 경우 인덱스를 사용하지 않는다.

인덱스 생성

CREATE INDEX index_name ON table_name (index_col_name,...)

primary key

  • 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다.
  • where 문을 이용해서 데이터를 조회할 때 가장 고속으로 데이터를 가져올 수 있다.
  • 테이블마다 딱 하나의 primary key를 가질 수 있다.
  • 여러개의 컬럼으로 조합이 가능하다.
  • primary key는 자동으로 인덱스가 생성된다.

JOIN

테이블간의 관계성에 따라서 복수의 테이블을 결합, 하나의 테이블인 것처럼 결과를 출력

JOIN의 종류

  • OUTTER JOIN : 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시한다.
    LEFT JOIN과 RIGHT JOIN이 있다.
  • INNER JOIN : 조인하는 두개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져온다.

예제

위의 예제 중 address는 distnace와 관련되어 있기 때문에 location이라는 별도의 테이블로 분할 할 수 있다.

DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id tinyint(4) NOT NULL,
  name char(4) NOT NULL,
  sex enum('남자','여자') NOT NULL,
  location_id tinyint(4) NOT NULL,
  birthday datetime NOT NULL,
  PRIMARY KEY (id)
);
 
CREATE TABLE location (
id  tinyint NOT NULL,
name  varchar(20) NOT NULL ,
distance  tinyint NOT NULL ,
PRIMARY KEY (id)
);

INSERT INTO `location` VALUES (1, '서울', 10);
INSERT INTO `location` VALUES (2, '청주', 200);
INSERT INTO `location` VALUES (3, '경주', 255);
INSERT INTO `location` VALUES (4, '제천', 190);
INSERT INTO `location` VALUES (5, '대전', 200);
INSERT INTO `location` VALUES (6, '제주', 255);
INSERT INTO `location` VALUES (7, '영동', 255);
INSERT INTO `location` VALUES (8, '광주', 255);

INSERT INTO `student` VALUES (1, '이숙경', '여자', 1, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (2, '박재숙', '남자', 2, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', 3, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', 4, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', 5, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', 6, '1981-2-3 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', 5, '1990-10-1 00:00:00');

LEFT JOIN

가장 많이 사용되는 조인의 형태

SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s
LEFT JOIN location AS l ON s.location_id = l.id;

SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s
INNER JOIN location AS l ON s.location_id = l.id;

 

OUTTER JOIN과 INNER JOIN의 차이

Location에서 제주를 삭제 후 OUTTER JOIN(LEFT JOIN)과 INNER JOIN의 차이를 비교

 

 아래 이미지는 JOIN의 종류에 따른 결과를 보여준다.

원본 보기

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
휴먼밸
현재 버전
선택 버전
graphittie 자세히 보기