sql 조회

jadive study·2022년 10월 12일

저번 포스팅에 간단한 쿼리문을 생활코딩 강의를 보며 정리해보았다.

실습하면서 삽입 변경 삭제에 해당되는것은 크게 어려웠던것이 없었던것 같다.

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

문법
1

SELECT * FROM 테이블명 GROUP BY 그룹핑 할 기준 칼럼명
예제

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4) NOT NULL,
  `name` char(4) NOT NULL,
  `sex` enum('남자','여자') NOT NULL,
  `address` varchar(50) NOT NULL,
  `distance` INT NOT NULL,
  `birthday` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울',  10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 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');

select sex from student group by sex;

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

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

문법

SELECT * FROM 테이블명 ORDER BY 정렬의 기준으로 사용할 열 [DESC | ASC]

예제

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` tinyint(4) NOT NULL,
  `name` char(4) NOT NULL,
  `sex` enum('남자','여자') NOT NULL,
  `address` varchar(50) NOT NULL,
  `distance` INT NOT NULL,
  `birthday` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울',  10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 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');
select * from student order by distance desc;

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

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

인덱스의 종류
primary: 중복되지 않는 유일한 키
normal : 중복을 허용하는 인덱스
unique : 중복을 허용하지 않는 유일한 키
foreign : 다른 테이블과의 관계성을 부여하는 키
full text : 자연어 검색, myisam에서만 지원


생활코딩의 설명만으로 이해가 되지 않는것이 있어 구글링해서 자료를 찾아보았다

primary key
테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다.
where 문을 이용해서 데이터를 조회할 때 가장 고속으로 데이터를 가져올 수 있다.
테이블마다 딱 하나의 primary key를 가질 수 있다.
1
select from student where id=3;
unique key
테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다. (== primary key)
고속으로 데이터를 가져올 수 있다.
여러개의 unique key를 지정할 수 있다.
1
select
from student where number=0534543;
normal key
중복을 허용한다.
primary, unique 보다 속도가 느리다.
여러개의 키를 지정할 수 있다.
1
select from student where department='국문과'
Full Text
mysql의 기본설정(ft_min_word_len)이 4로 되어 있기 때문에 최소 4글자 이상을 입력하거나 이 값을 조정해야 한다.
mysql은 전문 검색 엔진이 아니기 때문에 한글 검색이 잘 안된다.
전문검색엔진으로 lucene, sphinx 참고
스토리지 엔진 중 myisam에서만 사용가능
1
SELECT introduction, MATCH(introduction) AGAINST('영문과에') FROM student WHERE MATCH (introduction) AGAINST('영문과에');
중복키
하나의 키에 여러개의 칼럼을 포함
1
select
from student where department='국문과' AND address='제주';
인덱스의 정의 방법
자주 조회되는 칼럼에 적용
조회 시 오랜시간을 소모하는 컬럼에 적용
데이터가 긴 경우 인덱스를 사용하지 않는다.


그리고 JOIN

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

JOIN의 종류
OUTTER JOIN : 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시한다.
LEFT JOIN과 RIGHT JOIN이 있다.
INNER JOIN : 조인하는 두개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져온다.
예제
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;

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

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;
아래 이미지는 JOIN의 종류에 따른 결과를 보여준다. (출처)

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

JOIN의 종류
OUTTER JOIN : 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시한다.
LEFT JOIN과 RIGHT JOIN이 있다.
INNER JOIN : 조인하는 두개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져온다.
예제
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;

OUTTER JOIN과 INNER JOIN의 차이
Location에서 제주를 삭제 후 OUTTER JOIN(LEFT 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;
아래 이미지는 JOIN의 종류에 따른 결과를 보여준다. (출처)

profile
개발 메모창고

0개의 댓글