1. LIMIT - 조회하는 행 개수 제한
처음부터 6개만 가져오기
SELECT * FROM 테이블명
[WHERE 조건]
LIMIT 6;
2개 이후부터(3번째 부터) 6개 가져오기
SELECT * FROM 테이블명
[WHERE 조건]
LIMIT 2, 6;
2. LIKE - 특정 문자가 들어간 레코드(행 단위 데이터) 찾기
이름이 A로 시작하는 데이터 찾기
SELECT * FROM 테이블명
WHERE `name` LIKE `A%`
이름에 A가 들어가는 데이터 찾기 - 권장 안함
WHERE `name` LIKE `%A%`
이름이 A로 끝나는 데이터 찾기 - 권장 안함
WHERE `name` LIKE `%A`
%로 시작되는 경우 index 조회가 아닌 Full scan이 되므로 사용하지 않는게 좋다.
A%로 조회하면 A로 시작하는 데이터로 범위가 좁혀지므로 range scan이 된다.
3. GROUP BY - 그룹화
, HAVING - GROUP BY된 결과에 조건 붙이기
컬럼명 기준으로 같은 값의 데이터를 그룹화 해서 묶는다.
SELECT * FROM 테이블명
GROUP BY 컬럼명
GROUP BY , HAVING 예시
-- 테이블 생성
CREATE TABLE `entrant` (
`id` int NOT NULL AUTO_INCREMENT primary key,
`name` varchar(8) NOT NULL,
`license` varchar(32) NOT NULL,
`score` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 데이터 삽입
INSERT INTO `entrant`
(`name`, `license`, `score`)
VALUES
('강호동', '정보처리기사', 87),
('유재석', '컴퓨터활용능력', 95),
('김태형', '정보처리기사', 99),
('박지민', '정보처리산업기사', 68),
('유재석', '정보처리기사', 78),
('강호동', '정보처리산업기사', 78),
('강호동', '컴퓨터활용능력', 82);
-- 쓸때 없음, 이름 중복된 row들 씹힘
select * from entrant group by name;
-- 테이블에 있는 서로다른 이름들만 딱 출력( 동명이인들을 그룹으로 묶는다. )
SELECT `name` FROM `entrant` GROUP BY `name`;
-- 사람 별 응시 시험 개수 구하기 (행 자체가 응시한 시험)
SELECT `name`, count(1) FROM `entrant` GROUP BY `name`;
-- 자격증 시험을 2개 이상 응시한 사람의 이름 출력
-- 1단계: 사람 별(name) 그룹핑
-- 2단계: 그 중 개수가 2개 이상인 것 구하기
SELECT `name`, count(1) FROM `entrant` GROUP BY `name` HAVING count(1) >= 2;
-- 테이블에 있는 서로다른 자격증들만 딱 출력( 같은 자격증끼리 그룹으로 묶는다. )
SELECT `license` FROM `entrant` GROUP BY `license`;
-- 자격증별로 점수 합계 구하기
SELECT `license`, sum(`score`) FROM `entrant` GROUP BY `license`;
-- 자격증별로 점수 평균 구하기
SELECT `license`, avg(`score`) FROM `entrant` GROUP BY `license`;
-- 자격증 종류별 평균 점수가 80이 넘는 자격증을 출력
-- 1단계: 자격증별로 그룹핑
-- 2단계: 그 중 평균 80점이 넘는 것 구하기
SELECT `license`, avg(`score`) AS `average` FROM `entrant` GROUP BY `license` HAVING `average` >= 80;
4. JOIN , LEFT JOIN , LIGHT JOIN - 여러 테이블 데이터를 한꺼번에
key값이 연결되어 있는 N개의 테이블의 데이터를 합쳐서 한번에 가져오는 문법
SELECT 테이블명1.*, 테이블명2.*
FROM
테이블명1 JOIN 테이블명2 ON 테이블명1.필드명 = 테이블명2.필드명
[where 조건]
| JOIN( INNER JOIN ) | key값이 같은 레코드(데이터)만 가져옴 |
| LEFT JOIN | 왼쪽 테이블 레코드 다 가져오고, 오른쪽 테이블은 key값이 같은 레코드(데이터)만 가져옴 |
| LIGHT JOIN | 오른쪽 테이블 레코드 다 가져오고, 왼쪽 테이블은 key값이 같은 레코드(데이터)만 가져옴 |
JOIN , LEFT JOIN , LIGHT JOIN 예시
| 테이블 이름 | key | 레코드 개수 | 필드와 필드의 값 |
| seller | id만 pk로 유일 | 7 | id : 1 ~ 7 |
| used_goods | id만 pk로 유일 | 4 | id : 1 ~ 4 | sellerId : 5 , 5 , 3 , 2 |
select * from
seller join used_goods on seller.id = used_goods.sellerId;
SELECT seller.*, used_goods.* FROM
`seller` JOIN `used_goods` ON seller.id = used_goods.sellerId
WHERE seller.nickname = '하구루';
SELECT seller.*, used_goods.* FROM
`seller` JOIN `used_goods` ON seller.id = used_goods.sellerId
WHERE seller.nickname = '하구루'
ORDER BY used_goods.price;
select * from
seller left join used_goods on seller.id = used_goods.sellerId;
select * from
used_goods left join seller on seller.id = used_goods.sellerId;
select * from
used_goods right join seller on seller.id = used_goods.sellerId;'DB > RDB' 카테고리의 다른 글
| 테이블에서 column 추가및 수정 (0) | 2022.12.04 |
|---|---|
| DB 튜닝 , 성능 최적화를 위한 Explain문 (0) | 2022.11.28 |
| Select 문, Part1 (0) | 2022.11.12 |
| 키, 인덱스, 실행계획, 테이블의 관계 (0) | 2022.11.03 |
| DB 구성 과정 (1) | 2022.11.03 |