SELECT문 기본
SELECT 열 이름 -- 어떤 필드 가져올지
FROM 테이블 이름 -- 어떤 테이블에서
WHERE 조건문 -- 특정 조건 조회
GROUP BY 열 이름
HAVING 조건문
ORDER BY 열 이름 -- 정렬
LIMIT 수 -- 쿼리 갯수 제한
논리 연산자
1. AND
2. OR
3. NOT
관계 연산자
1. 등호(=)
2. 부등호(<> 또는 !=)
3. 크다/작다(>, <)
4. 크거나 같다/작거나 같다(>=, <=)
BETWEEN
범위 연산자로 특정 범위만 쿼리하도록 제약
IN
특정 값이 포함된 데이터를 조회
SELECT *
FROM user_profile
WHERE address IN('서울', '대구');
LIKE
문자열의 일부 글자 검색
-- name 필드 값이 '김'으로 시작하는 3단어 조회
SELECT * FROM user_profile WHERE name LIKE '이__';
-- name 필드 값이 '이'로 시작하는 모든 데이터 조회
SELECT * FROM user_profile WHERE name LIKE '이%';
-- name 필드 값에 '최'가 들어가는 모든 데이터 조회
SELECT * FROM user_profile WHERE name LIKE '%최%';
ORDER BY
오름차순(ASC) 또는 내림차순(DESC) 정렬
-- 오름차순
SELECT *
FROM user_profile
ORDER BY age (ASC) -- ASC는 생략 가능하다.
-- 내림차순
SELECT *
FROM user_profile
ORDER BY age DESC
-- 여러개의 기준 설정 가능
SELECT *
FROM user_profile
ORDER BY age DESC, weight
LIMIT
출력 개수 제한
-- 4건만 조회
SELECT *
FROM user_profile
LIMIT 4
-- 2번째부터 4건 조회
SELECT *
FROM user_profile
LIMIT 2,4
LIMIT 4 OFFSET 2;
DISTINCT
중복 데이터 제거
-- 주소 필드가 중복 없이 출력됨
SELECT DISTINCT(address)
FROM user_profile
GROUP BY
GROUP BY 로 지정한 컬럼이 같은 데이터끼리 그룹화
-- usr_id를 기준으로 묶어서 usr_id 기준으로 salary의 합을 출력
SELECT usr_id, SUM(amount) AS "총 급여"
FROM salary
GROUP BY usr_id
HAVING
GROUP BY뒤에 나오며 그룹의 조건을 걸어줄 수 있음
WHERE랑 HAVING이 처음에 많이 헷갈렸는데 WHERE는 그룹화 하기 전, HAVING은 그룹화 후에 조건으로 생각하면 될것같다.
-- usr_id를 기준으로 묶었을 때 총 급여가 5천만원 이하인 그룹(usr_id)만 출력되록 함
SELECT usr_id, SUM(amount) AS "총 급여"
FROM salary
GROUP BY usr_id
HAVING SUM(amount) <= 50000000
UNION ALL
두 개 이상의 SELECT 문의 결과를 결합. 이때 중복 행을 고려하지 않는다.
컬럼 갯수 및 명칭을 통일시켜야 한다.
SELECT usr_id, name FROM user_profile1
UNION ALL
SELECT usr_id, name FROM user_profile2
UNION
두 개 이상의 SELECT 문의 결과를 결합하고 결과 집합에서 중복 행을 제거한다.
컬럼 갯수 및 명칭을 통일시켜야 한다.
SELECT usr_id, name FROM user_profile1
UNION
SELECT usr_id, name FROM user_profile2
RANK(), DENSE_RANK()
SELECT name, sal, RANK() OVER(ORDER BY sal DESC) AS ranked_sal
FROM employees
SELECT name, sal, DENSE_RANK() OVER(ORDER BY sal DESC) AS ranked_sal
FROM employees
RANK()
: 일한 값이 있는 경우에 같은 순위를 부여하며, 그 다음 순위는 그 갯수만큼 건너뛴다. 예를 들어, 3명의 동일한 점수를 가진 학생이 있다면 이들은 같은 순위를 갖게 되고, 그 다음 순위는 3등 다음인 4등이 된다.
DENSE_RANK()
:동일한 값이 있는 경우에도 같은 순위를 부여하지만, 그 다음 순위는 건너뛰지 않는다. 예를 들어, 3명의 동일한 점수를 가진 학생이 있다면 이들은 같은 순위를 갖게 되고, 그 다음 동일한 점수를 가진 학생 들 바로 순위인 2등이 된다.
PARTITION BY
SELECT name, job, sal, RANK() OVER(PARTITION BY job ORDER BY sal DESC) AS ranked_sal_group
FROM employees
이렇게 하면 순위를 급여를 기준으로 순위를 메기긴 하는데 직업을 기준으로 묶어서 직업마다 순위를 메긴다.