1. 가져올 데이터의 개수 제한하기 - LIMIT
SELECT * FROM 테이블명
[WHERE 조건]
LIMIT 50
SELECT * FROM 테이블명
[WHERE 조건]
LIMIT 100, 50
2. 특정 문자가 들어간 데이터 찾기 - LIKE
%로 시작되는 경우 index 조회가 아닌 Full scan이 되므로 사용하지 않는게 좋다.
A%로 조회하면 A로 시작하는 데이터로 범위가 좁혀지므로 range scan이 된다.
SELECT * FROM 테이블명
WHERE `name` LIKE `A%`
SELECT * FROM 테이블명
WHERE `name` LIKE `%A%`
SELECT * FROM 테이블명
WHERE `name` LIKE `%A`
테이블을 특정 컬럼 기준으로 정렬한다.
SELECT * FROM 테이블명
ORDER BY `name`
SELECT * FROM 테이블명
ORDER BY `name` DESC
4. 문자열을 합치는 함수 - CONCAT()
select concat('hello ', 'world') as str;
5. GROUP BY
SELECT * FROM 테이블명
GROUP BY 컬럼명
GROUP BY name 결과
SELECT DISTINCT name FROM 테이블 결과
GROUP BY 처럼 중복이 제거된 이름들이 결과로 나타난다.
중복이 완전히 제거되어 대표로 한 사람의 정보만 갖고 있으므로 COUNT, SUM 연산이 불가하다.
사람 별 응시 시험 수 구하기
각 이름마다 N행(N개의 시험)이 있는지 구한다.
SELECT count(*) FROM `entrant`
GROUP BY `name`
6. HAVING
GROUP BY로 그룹화 된 데이터에 조건 추가하기
select `name` from entrant
group by `name`
having count(*) >= 2;
예제1)
# LIMIT
-- 처음부터 50개만 가져오기
select * from `city` limit 50; -- limit은 항상 뒤에 있어야한다.
-- 처음부터 50개만 가져오기
select * from `city` limit 0, 50; -- 내가 원하는 것보다 하나 전, 갯수
-- 101번째부터 50개 가져오기
select * from `city` limit 100, 50;
# LIKE(대소문자 구별이 없다.)
-- C로 시작하는 도시명 찾기
select * from `city` where `city` like 'c%'; -- 뒤에 뭐가 붙을 지 모르겠다는 뜻
-- C로 끝나는 도시명 찾기(권장 안함 - table full scan)
select * from `city` where `city` like '%c'; -- 앞에 뭐가 붙을 지 모르겠다는 뜻
-- C가 들어가는 도시명 찾기(권장 안함 - table full scan)
select * from `city` where `city` like '%c%'; -- 앞, 뒤, 중간 c를 다 찾는다.
# Like 대소문자 구별 - binary() 함수 사용
-- 대문자 C가 들어가는 도시명 찾기
-- % 앞뒤에 있는경우 full scan이다. full scan은 좋은 쿼리가 아님
select * from `city` where `city` like binary('%C%'); -- 대문자 C넣기
#ORDER BY
-- 오름차순 정렬
select * from `city` order by `country_id`;
select * from `city` order by `country_id` ASC; -- ASC 오름차순이라는 뜻
-- 내림차순 정렬
select * from `city` order by `country_id` DESC;
# C로 시작하는 도시명, contry_id 내림차순으로 정렬하고 10개만 가져오기(종합)
select * from `city`
where `city` like 'c%'
order by `country_id` desc
limit 10; -- 순서 중요
# concat 함수 -- string을 이어준다.
select concat('hello', ' world') as str; -- as는 별칭
select * from `film`
-- 제목:000, 설명:0000
select concat('제목:', `title`, ', 설명:', `description`) as result
from `film`
예제2)
-- 테이블 생성
CREATE TABLE `entrant` (
`id` int NOT NULL AUTO_INCREMENT primary key,
`name` varchar(10) NOT NULL,
`license` varchar(20) NOT NULL,
`score` int NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 데이터 삽입
insert into `entrant` (`name`, `license`, `score`)
values
('신보람', '정보처리기사', 87),
('김바다', '컴퓨터활용능력', 95),
('김태형', '정보처리기사', 99),
('박지민', '컴퓨터활용능력', 68),
('신보람', '컴퓨터활용능력', 78),
('김남준', '정보처리산업기사', 40),
('정호석', '컴퓨터활용능력', 99),
('민윤기', '컴퓨터활용능력', 100),
('김바다', '정보처리산업기사', 78),
('김바다', '정보처리기사', 82);
select * from `entrant`;
# Distinct - 중복제거
-- 동명이인이 있을 때 한사람만 남기고 제거해서 보여준다.
select distinct `name` from `entrant`;
# Group by - 그룹화
-- 동명이인들을 그룹으로 묶는다(중복 제거된 효과가 있으나 distinct와는 완전히 다르다)
select `name` from `entrant`
group by `name`;
# 자격증 종류 (중복 제거)
select `license` from `entrant` group by `license`;
-- 사람 별 응시 시험 개수 구하기(행 개수가 응시 시험 종류이다)
select `name`, count(*) from `entrant`
group by `name`;
-- 자격증 종류 별 점수 평균구하기 avg()
-- 주머니로 묶여있어서 구할 수 있다.
select `license`, avg(`score`) as average from `entrant`
group by `license`;
-- 자격증 종류별 점수 합계 구하기
select `license`, sum(`score`) AS sum from `entrant`
group by `license`;
# having - group by 된 결과에 조건 붙이기
-- 자격증 시험을 두개이상 응시한 사람의 이름 출력
-- 1단계: 사람 이름 별 그룹핑
-- 2단계: 그중 개수가 2개 이상인 조건
select `name`, count(*) from `entrant`
group by `name`
having count(*) >= 2;
-- 자격증 종류별 평균점수가 80점이 넘는 자격증명을 출력
-- 1단계: 자격증 종류별로 묶는다
-- 2단계: 평균점수가 80점이 넘는 애들만 추려낸다
SELECT `license`, avg(`score`) as average FROM `entrant`
GROUP BY `license`
having average >= 80; -- 별칭을 사용할 수 있다.