COUNT : 총 개수 계산
SUM : 합계 계산
AVG : 평균 계산
MIN : 최솟값
MAX : 최댓값
FIRST : 첫 번째 결과값
LAST : 마지막 결과값
SELECT COUNT(column)
FROM tablename
WHERE condition;
select count(*) from police_station;
-> 테이블 데이터 개수 계산
select count(distinct police_station) from crime_status;
-> 경찰서 개수 세기(중복 없게끔 distinct)
SELECT SUM(column)
FROM tablename
WHERE condition;
select sum(case_number) from crime_status where status_type="발생";
-> 범죄 총 발생건수 구하기
SELECT AVG(column)
FROM tablename
WHERE condition;
select AVG(case_number)
from crime_status
where crime_type like '폭력' and status_type='검거';
-> 평균 폭력 검거 건수 구하기
SELECT MIN(column)
FROM tablename
WHERE condition;
select MIN(case_number)
from crime_status
where crime_type like '강도' and status_type='발생';
-> 강도 발생 건수가 가장 적은 경우 구하기
SELECT MAX(column)
FROM tablename
WHERE condition;
select MAX(case_number)
from crime_status
where crime_type like '살인' and status_type like '검거';
-> 살인이 가장 많이 검거된 건수 구하기
SELECT column1, column2, ...
FROM tablename
WHERE condition
GROUP BY column1, column2, ...
ORDER BY column1, column2, ...;
select police_station
from crime_status
group by police_station
order by police_station;
-> 경찰서 별로 그룹화하기
-> 같은 역할을 하는 DISTINCT는 ORDER BY 사용불가
select police_station, sum(case_number) 발생건수
from crime_status
where status_type like '발생'
group by police_station
order by 발생건수 desc;
-> 경찰서별로 총 범죄 발생 건수 구하기
select police_station, status_type, avg(case_number)
from crime_status
group by police_station, status_type limit 10;
SELECT column1, column2, ...
FROM tablename
WHERE CONDITION
GROUP BY column1, column2, ...
HAVING condition (Aggregate Functions)
ORDER BY column1, column2, ...
select police_station, sum(case_number) count
from crime_status
where status_type like '발생'
group by police_station
having count > 4000;
-> 경찰서별로 발생한 범죄 건수의 합이 4000건보다 큰 경우를 검색
UCASE : 영문을 대문자로 변환
LCASE : 영문을 소문자로 변환
MID : 문자열 부분을 반환
LENGTH : 문자열 길이를 반환
ROUND : 지정한 자리에서 숫자를 반올림 (0이 소수점 첫째 자리)
NOW : 현재 날짜 및 시간을 반환
FORMAT : 숫자를 천단위 콤마가 있는 형식으로 반환
SELECT UCASE(string);
SELECT LCASE(string);
SELECT MID(string, start_position, length);
-> string: 원본 문자열 / start: 문자열 반환 시작 위치 (첫글자는 1, 마지막글자는 -1) / length: 반환할 문자열 길이
SELECT LENGTH(string);
-> 공백도 문자이므로 1의 길이를 가짐
SELECT ROUND(number, decimals_place);
-> number: 반올림할 대상숫자 / decimals: 반올림할 소수점 위치(option)
-> 반올림할 위치를 지정하지 않을 경우, 소수점 자리 첫번째에서 반올림
-> 일단위 위치는 -1, 십단위는 -2
SELECT NOW();
SELECT FORMAT(number, decimals_place);
-> number: 포맷을 적용할 문자 혹은 숫자 / decimals: 표시할 소수점 위치
-> 소수점을 표시하지 않을 경우 decimals= 0
-> 소수점 두자리까지 표시할 경우 2 (세자리에서 반올림)
하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 뜻함
메인쿼리가 서브쿼리를 포함하는 종속적인 관계
-> 서브쿼리는 메인쿼리의 칼럼 사용 가능
-> 메인쿼리는 서브쿼리의 칼럼 사용 불가
서브쿼리 사용시 주의
-> 서브쿼리는 괄호로 묶어서 사용
-> 단일 행 혹은 복수 행 비교연산자와 함께 사용 가능
-> 서브쿼리에서는 order by 사용X
서브쿼리 종류
-> 스칼라 서브쿼리 (Scalar Subquery) : SELECT절에 사용
-> 인라인 뷰 (Inline View) : FROM절에 사용
-> 중첩 서브쿼리 (Nested Subquery) : WHERE절에 사용
스칼라 서브쿼리
: SELECT절에서 사용하는 서브쿼리. 결과는 하나의 Column이어야 한다.
SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;
select case_number,
(SELECT avg(case_number)
FROM crime_status
WHERE crime_type like '강도' and status_type like '검거') avg
FROM crime_status
WHERE police_station like '은평' and crime_type like '강도' and status_type like '검거';
-> 서울은평경찰서의 강도검거 건수와 경찰서 전체의 평균 강도검거 건수를 조회
SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;
select c.police_station, c.crime_type, c.case_number
from crime_status c,
(select police_station, max(case_number) count
from crime_status
where status_type like '발생'
group by police_station) m
where c.police_station = m.police_station
and c.case_number = m.count;
-> 경찰서별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회
-> 어렵!!!!!!!
중첩 서브쿼리
: WHERE절에서 사용하는 서브쿼리.
-Single Row - 하나의 열을 검색하는 서브쿼리
-Multiple Row - 하나 이상의 열을 검색하는 서브쿼리
-Multiple Column - 하나 이상의 행을 검색하는 서브쿼리
Single Row 서브쿼리
: 서브쿼리가 비교연산자(=,>,>=,<,<=,<>,!=)와 사용되는 경우,
서브쿼리의 검색결과는 한 개의 결과값을 가져야 한다. (두 개 이상인 경우 에러)
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
select name from celeb
where name = (select host from snl_show where id=1);
-> id가 1인 host 데이터는 한 개니까 single row 조건 만족!
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_names;
select host from snl_show
where host IN (select name from celeb where job_title like '%영화배우%');
-> SNL에 출연한 영화배우를 조회
SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_names;
select name from police_station p
where EXISTS (select police_station from crime_status c
where p.name = c.reference and case_number > 2000);
-> 범죄 검거 혹은 발생 건수가 2000건보다 큰 경찰서 조회
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_names;
select name from celeb
where name = ANY (select host from snl_show);
-> SNL에 출연한 적이 있는 연예인 이름을 조회
SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_names;
select name from celeb
where name = ALL (select host from snl_show where id = 1);
SELECT column_names
FROM tablename a
WHERE (a.column1, a.column2, ... ) IN (SELECT b.column1, b.column2, ...
FROM tablename b
WHERE a.column_name = b.column_name)
ORDER BY column_names;
select name, sex, agency
from celeb
where (sex, agency) in (select sex, agency from celeb where name = '강동원');
-> 강동원과 성별, 소속사가 같은 연예인의 이름, 성별, 소속사를 조회
서브쿼리 좀 어렵다
<제로베이스 데이터 취업 스쿨>