[데이터베이스/SQL] 기본 문법

JuseungL·2023년 12월 28일
0

DB/SQL

목록 보기
1/9
post-thumbnail

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
  • GROUP BY 여러 개도 지정 가능

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

이렇게 하면 순위를 급여를 기준으로 순위를 메기긴 하는데 직업을 기준으로 묶어서 직업마다 순위를 메긴다.

profile
기록

0개의 댓글