웹 어플리케이션 기초

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 자세히 보기