조회(SELECT) - 조인(JOIN)


  • 조인

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


  • 종류

OUTTER JOIN : 매칭이 되는 행이 없어도 결과를 가져오고 매칭되는 행이 없으면 NULL로 표시

  LEFT JOIN과 RIGHT JOIN이 있음

INNER JOIN : 조인하는 두 개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져옴


  • 테이블 재설정

student 테이블과 location 테이블 두 개 생성


1
2
3
4
5
6
7
8
9
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4NOT NULL,
  `name` char(4NOT NULL,
  `sex` enum('남자','여자'NOT NULL,
  `location_id` tinyint(4NOT NULL,
  `birthday` datetime NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
cs


1
2
3
4
5
6
7
DROP TABLE IF EXISTS `location`;
CREATE TABLE `location` (
`id`  tinyint UNSIGNED NOT NULL AUTO_INCREMENT ,
`name`  varchar(20NOT NULL ,
`distance`  tinyint UNSIGNED NOT NULL ,
PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
cs



1
2
3
4
5
6
7
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');
cs


1
2
3
4
5
6
7
8
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);
cs


  • LEFT JOIN

가장 많이 사용


1
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;
cs


  • OUTTER JOIN vs INNER JOIN

Location에서 제주를 삭제 후 OUTTER JOIN과 INNER JOIN 비교


1
2
3
4
5
DELETE FROM location WHERE name='제주'
 
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;
cs






실습


두 개의 테이블 생성








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

student AS s

 student 테이블을 s로 표시

location AS l

 location 테이블을 l로 표시

l.name AS address

 location 테이블의 name속성을 address로 표시

student AS s LEFT JOIN location AS l

 student 테이블을 기준으로 location 테이블 조인

ON s.location_id=l.id

 JOIN의 조건 = student 테이블의 location_id 속성값과 location 테이블의 id 속성값을 매치




'제주'속성 지우고 OUTTER(LEFT) JOIN 과 INNER JOIN 비교


OUTTER(LEFT) JOIN


INNER JOIN


'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(8)  (0) 2018.03.21
SQL - 테이블(7)  (0) 2018.03.21
SQL - 테이블(6)  (0) 2018.03.21
SQL - 테이블(5)  (0) 2018.03.21
SQL - 테이블(4)  (0) 2018.03.21

조회(SELECT) - 인덱스(index)


  • 인덱스

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


  • 인덱스의 종류

설명 

primary

중복되지 않는 유일한 키 

normal

중복을 허용하는 인덱스 

unique 

중복을 허용하지 않는 유일한 키 

foreign 

다른 테이블과의 관계성을 부여하는 키 

full text 

자연어 검색, myisam에서만 지원 


  • 인덱스의 정의 방법

자주 조회되는 속성(컬럼)에 적용

조회 시 오랜시간을 소모하는 속성에 적용

데이터가 긴 경우 인덱스 사용하지 않음


  • 테이블 재설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4NOT NULL AUTO_INCREMENT,
  `name` char(4NOT NULL,
  `address` varchar(50NOT NULL,
  `department` enum('국문과','영문과','컴퓨터공학과','전자공학과','물리학과'NOT NULL,
  `introduction` text NOT NULL,
  `number` char(255NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_number` (`number`) USING BTREE,
  KEY `idx_department` (`department`),
  KEY `idx_department_name` (`department`,`address`),
  FULLTEXT KEY `idx_introduction` (`introduction`)
ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
 
INSERT INTO `student` VALUES (1'이주연''청주''컴퓨터공학과''저는 컴퓨터 공학과에 다닙니다. computer''0212031');
INSERT INTO `student` VALUES (2'지한별''서울''영문과''저는 영문과에 다닙니다.''0512321');
INSERT INTO `student` VALUES (3'곽진성''경주''컴퓨터공학과''저는 컴퓨터 공학과에 다니고 경주에서 왔습니다.''0913134');
INSERT INTO `student` VALUES (4'박의성''제천''국문과''제천이 고향이고 국문과에 다닙니다.''9813413');
INSERT INTO `student` VALUES (6'김대웅''제주''국문과''이번에 국문과에 입학한 김경진이라고 합니다. 제주에서 왔어요.''0534543');
INSERT INTO `student` VALUES (7'백정헌''제주''국문과''박경호입니다. 잘 부탁드립니다.''0134511');
INSERT INTO `student` VALUES (8'전하람''대전''영문과''김정인입니다. 대전에서 왔고, 영문과에 다닙니다.''0034543');
cs


  • primary key
1
PRIMARY KEY (`id`),
cs

테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 함

where 문을 이용해 데이터를 조회할 때 가장 고속으로 데이터를 가져옴

테이블마다 딱 하나의 primary key가 존재


1
select * from student where id=3;
cs

  • unique key
1
UNIQUE KEY `idx_number` (`number`) USING BTREE,
cs

테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 함

고속으로 데이터를 가져옴

여러개의 unique key를 지정 가능 -> 즉, 여러 속성들을 unique로 지정 가능


1
select * from student where number=0534543;
cs

  • normal key

1
KEY `idx_department` (`department`),
cs
중복을 허용
primary, unique보다 느림
여러개의 키 지정 가능

1
select * from student where department='국문과'
cs


  • Full Text
1
FULLTEXT KEY `idx_introduction` (`introduction`)
cs

검색기능

mysql의 기본 설정(ft_min_word_len)이 4로 되어 있으므로 최소 4글자 이상 입력하거나 이 값을 조정해야 함

msql은 한글 검색이 잘 안됨

스토리지 엔진 중 myisam에서만 사용 가능


1
SELECT introduction FROM student WHERE MATCH (introduction) AGAINST('영문과에');
cs


  • 중복키
1
KEY `idx_department_name` (`department`,`address`),
cs

하나의 키에 여러개의 속성(컬럼)을 포함

인덱스가 아닌 인덱스를 만드는 스타일

즉, 키를 정의할 때 여러 개의 속성을 포함시키는 것


1
select * from student where department='국문과' AND address='제주';
cs



실습




primary key를 이용한 검색


unique key를 이용한 검색


normal key를 이용한 검색


Full Text 검색(한글이라 잘 안됨)


중복를 이용한 검색

'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(9)  (0) 2018.03.21
SQL - 테이블(7)  (0) 2018.03.21
SQL - 테이블(6)  (0) 2018.03.21
SQL - 테이블(5)  (0) 2018.03.21
SQL - 테이블(4)  (0) 2018.03.21

조회(SELECT) - 정렬(order)


  • 테이블 재설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4NOT NULL,
  `name` char(4NOT NULL,
  `sex` enum('남자','여자'NOT NULL,
  `address` varchar(50NOT NULL,
  `distance` INT NOT NULL,
  `birthday` datetime NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO `student` VALUES (2'지한별''여자''대전'10'1995-04-23 00:00:00');
INSERT INTO `student` VALUES (1'이주연''여자''서울'200'1995-04-19 00:00:00');
INSERT INTO `student` VALUES (3'곽진성''남자''경주'350'1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4'박의성''남자''제천'190'1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8'김대웅''남자''대전'200'1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6'백정헌''남자''제주'400'1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7'전하람''남자''영동'310'1981-2-3 00:00:00');
cs


  • 지정된 속성(컬럼)을 기준으로 행을 정렬
1
SELECT * FROM 테이블명 ORDER BY 정렬의 기준으로 사용할 열 [DESC | ASC]
cs

1
select * from student order by distance desc;
cs

1
select * from student order by distance desc, address asc;
cs





실습




distance 속성을 기준으로 내림차순(desc)


distance 속성을 기준으로 오름차순(asc)


distance 속성을 기준으로 내림차순 & distance 속성값이 같은 경우 address 속성을 기준으로 오름차순


'Programming > DataBase' 카테고리의 다른 글

SQL - 테이블(9)  (0) 2018.03.21
SQL - 테이블(8)  (0) 2018.03.21
SQL - 테이블(6)  (0) 2018.03.21
SQL - 테이블(5)  (0) 2018.03.21
SQL - 테이블(4)  (0) 2018.03.21

+ Recent posts