[SQL] 기본 - SELECT, JOIN

is Yoon·2023년 9월 3일

SQL

목록 보기
4/6

SELECT (데이터 조회)

USE database_name;
SELECT 컬럼명 FROM 테이블명 WHERE 조건문 GROUP BY 기준컬럼 HAVING 조건문 ORDER BY 기준컬럼

➀ FROM 발췌 대상 테이블을 참조 ➁ WHERE 대상 데이터 아닌 것 제거 ➂ GROUP BY 행들을 소그룹화 ➃ HAVING 조건에 맞는 것만 출력 ➄ SELECT 데이터 값 출력/계산 ➅ ORDER BY 데이터 정렬


SELECT~FROM~WHERE

Query 1. 모든 컬럼 정보 조회 - 와일드카드 애스터리스크(*) 이용

SELECT * FROM 테이블;

Query 2. 특정 칼럼 정보 조회

SELECT 컬럼1, .. FROM 테이블;

Query 3. 중복 제거, 고유한 값 반환 - DISTINCT

SELECT DISTINCT 컬럼1, .. FROM 테이블;

Query 4. WHERE절 이용한 특정 Row 조회

별도의 WHERE절이 없으면 테이블 전체 Row가 조회된다.

SELECT 컬럼1, .. FROM 테이블 WHERE 컬럼1 = Value;

Query 5. 별명(Alias) 이용

SELECT 컬럼명 AS 별명 FROM 테이블;

SELECT 별명.컬럼 FROM 테이블 별명 WHERE 별명.row = Value;

# 별명은 호출 시 사용되거나, 결과값 컬럼명으로 지정된다.

WHERE 조건절 (with. 연산자, TOP-N 쿼리)

INSERT를 제외한 DML문SELECT, UPDATE, DELETE를 수행할 때 원하는 데이터만 골라 수행할 수 있도록 해주는 구문이다.

SELECT 컬럼 FROM 테이블 WHERE 조건절;

UPDATE 테이블 SET 컬럼 = 새로운_데이터 WHERE 조건절;

DELETE FROM 테이블 WHERE 조건절;

연산자

  • 산술, 합성 연산자는 SELECT문에서 사용한다.
  • 비교, SQL, 논리 연산자는 WHERE 조건절에서 사용한다. 해당하는 행을 출력한다.

산술 연산자 - 숫자형을 계산함 (), *, /, +, -

  • 0은 나누면 오류가 발생한다.

합성 연산자 - 문자를 연결함 ||, CONCAT()

비교연산자 - =, >, >=, <, <=

부정비교연산자

  • 같지 않음 : !=, ^=, <>,NOT 칼럼명 =
  • 크지 않음 : NOT 칼럼명 >

SQL연산자

  • BETWEEN a AND b : A와 B의 사이 (A, B 포함)
  • IN (list) : list 중 하나와 일치
  • LIKE ‘비교문자열’ : 비교 문자열을 포함
    - %어떤 문자% : LIKE 조건에 앞뒤로 %가 붙으면 그 문자가 포함된 컬럼을 가진 행을 출력
    - _ or %가 포함된 문자 검색하고자 할 때 ESCAPE '#' 지정
  • IS NULL : NULL 값

부정SQL연산자 - NOT BETWEEN a AND b, NOT IN (list), IS NOT NULL

논리연산자 - AND, OR, NOT

✔️ 와일드 카드 : % (0개 이상의 어떤 문자), _ (1개인 단일 문자)
✔️ 우선순위 : (괄호) ⏵ NOT 연산자 ⏵ 비교연산자, SQL 연산자 ⏵ AND ⏵ OR

TOP-N 쿼리
행의 갯수를 제한할 수도 있다.
단, 순서 상 ORDER BY 절 바깥에서 정의되어야 한다.

  • ROWNUM (Oracle) : < or <= 조건으로 사용
  • TOP (SQL Server)
  • LIMIT
SELECT * FROM table_name WHERE ROWNUM <= 5;

TOP SELECT TOP(반환할 행의 수)[PERCENT][WITH TIES]

윈도우 함수의 순위 함수를 이용하여 작성할 수도 있다.

SELECT * FROM (
	SELECT RANK() OVER(__) AS RANK,
    		column1
      FROM table_name)
WHERE RANK <= 5



GROUP BY, HAVING (with. 집계함수)

  • GROUP BY : 데이터를 그룹별로 묶을 수 있도록 해주는 절
  • HAVING : GROUP BY 다음에 오는 조건절. 집계 함수를 통해 조건 제한 가능
    - 테이블 전체가 한 개의 그룹이 되는 경우 단독 사용 가능
  • 집계 함수 : 그룹별로 집계 데이터를 도출하는 것이 가능해진다.
    - SELECT, HAVING, ORDER BY에서 이용.
    - COUNT, SUM, AVG, MIN, MAX 등

ORDER BY 정렬

SELECT 컬럼1, 컬럼2, .. FROM 테이블 ORDER BY 기준_컬럼1 [기준], 기준_컬럼2 [기준];
  • [기준] : ASC - Ascending : 오름차순 (기본값) & DESC - Descending : 내림차순
  • 기준 _컬럼 대신 숫자만 입력 가능. SELECT절에서 입력한 컬럼 순서대로 정렬

Oravcel에서의 NULL값 : 가장 큰 값 (오름차순의 가장 마지막)
SQL Server에서의 NULL값 : 가장 작은 값 (오름차순의 가장 처음)
순서를 바꾸고 싶다면 NULLS FIRST, NULLS LAST 옵션 사용




JOIN

각기 다른 테이블을 한 번에 보여줄 때 쓰는 쿼리
두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것
테이블 간에 PK, FK의 연관 관계가 없어도 JOIN 가능

  • 기본 조인 : WHERE절, EQUI JOIN, Non EQUI JOIN
  • 표준 조인 : FROM절, INNER JOIN, NATURAL JOIN, USING 조건절, ON 조건절, CROSS JOIN, OUTER JOIN
  • 셀프 조인

◾ SQL JOIN (EQUI, Non EQUI)

WHERE절에 사용한다.

EQUI JOIN (등가 조인)

Equal = 을 조건으로 JOIN 하는 것으로, 가장 흔히 볼 수 있는 JOIN 방식이다. 두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하는 경우에 사용한다.

  • WHERE 테이블1.컬럼x = 테이블2.컬럼y
SELECT A.컬럼1, A.컬럼2, B.컬럼1, B.컬럼2, B.컬럼3
  FROM 테이블1 A, 테이블2 B
 WHERE A.컬럼1 = B.컬럼1;

1) 교집합 : INNER JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN
2) 합집합 : UNION
3) 차집합 : Oracle MINUS = SQL Server EXCEPT

Non EQUI JOIN (비등가 조인)

Equal 조건이 아닌 다른 조건 BETWEEN, >, >=, <, <= 으로 JOIN하는 방식이다. 두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하지 않는 경우에 사용한다.

  • WHERE 테이블1.컬럼x = BETWEEN 테이블2.컬럼y AND 테이블2.컬럼z
SELECT A.컬럼1, A.컬럼2, B.컬럼1, B.컬럼2, B.컬럼3
  FROM 테이블1 A, 테이블2 B
 WHERE A.컬럼1 BETWEEN B.컬럼1 AND B.컬럼2;

3개 이상 TABLE JOIN

EQUI JOIN과 Non EQUI JOIN을 하나의 쿼리에서 같이 사용할 수 있다.


◾ 표준 조인 Standard Join

FROM절에 사용한다.

  • INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.
  • OUTER JOIN(외부 조인)은 두 테이블을 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나온다.
  • CROSS JOIN(상호 조인)은 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능이다.
  • SELF JOIN(자체 조인)은 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용한다.

INNER JOIN (내부 조인)

JOIN 조건에 충족하는 데이터만 출력되는 방식 (교집합)
두 테이블에 모두 있는 내용만 출력
USING or ON 필수

SELECT 컬럼 FROM 테이블 A INNER JOIN 테이블 B ON 조인될 조건 [WHERE 검색 조건]

USING/ON 조건절

USING 조건절

같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN (SQL Server 미지원)

SELECT * FROM Table JOIN Dept_Temp USING (DEPTNO)

JOIN에서 USING절을 사용할 경우, SELECT 절에서 USING 절로 정의된 컬럼 앞에는 별도의 별명이나 테이블명을 표기할 수 없다.

# Oracle에서 USING 이용하여 NATURAL JOIN 처럼 쓰기
SELECT 컬럼1, 컬럼2, .. FROM 테이블 A JOIN 테이블 B USING (컬럼1, 컬럼2)

ON 조건절

두 테이블 간 특정 컬럼으로 EQUI JOIN 수행. 컬럼명 다르더라도 JOIN 사용 가능

OUTER JOIN (외부 조인)

JOIN 조건에 만족하지 않는 행들도 출력되는 형태

  • LEFT OUTER JOIN : 왼쪽 테이블의 모든 값이 출력되는 조인
  • RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값이 출력되는 조인
  • FULL OUTER JOIN : 왼쪽, 오른쪽 테이블의 모든 값이 출력되는 조인 = 합집합 (단, 중복값은 제거)
SELECT * 
  FROM 테이블 A (LEFT/RIGHT/FULL) OUTER JOIN 테이블 B  #➀
    ON 조건절  #➁ 
 WHERE 조건절  #➂

➀ 기준이 되는 테이블은 항상 모두 출력
➁ 이후 ON 절에 정의된 조건에 따라 JOIN 여부 판단
➂ 최종적으로 WHERE 조건에 의해 필터링

Oracle의 경우, 기준이 되는 테이블 반대편 좌변/우변 하나에만 (+) 기호를 표시한다.

SELECT * FROM 테이블 A, 테이블 B WHERE A.컬럼(+) = B.컬럼;

CROSS JOIN (상호 조인)

테이블 간 JOIN 조건이 없는 경우, 생길 수 있는 모든 데이터의 조합

  • ON 사용 불가능
  • M * N 건의 데이터 조합 발생
SELECT * FROM 테이블 A CROSS JOIN 테이블 B
SELECT * FROM 테이블, 테이블 B.  
# 별도의 JOIN 선언이 없다면, 두 테이블의 CROSS JOIN 발생

NATURAL JOIN

두 테이블 간의 동일한 이름을 갖는 모든 칼럼들이 모두 동일한 데이터를 가지고 있을 경우 EQUI JOIN 수행 (SQL Server 미지원)

  • ON 사용 불가능, WHERE 에서의 JOIN 정의 불가능
SELECT * FROM 테이블 A NATURAL JOIN 테이블 B

Oracle의 경우, USING 조건절을 이용하여 같은 이름을 가진 컬럼 중 원하는 컬럼만 JOIN에 이용할 수 있다. (단, SELECT 절에서 USING 절로 정의된 컬럼 앞에는 별도의 별명이나 테이블명 붙이지 않아야 한다.)

# Oracle에서 USING 이용하여 NATURAL JOIN 처럼 쓰기
SELECT 컬럼1, 컬럼2, .. FROM 테이블 A JOIN 테이블 B USING (컬럼1, 컬럼2)

SELF JOIN (자체 조인)

동일 테이블 사이의 조인
반드시 테이블 별칭 사용 : FROM 절에 같은 테이블이 두 번 이상 등장하기 때문에 혼란 방지를 위해

SELECT 컬럼들 FROM 테이블 별칭A INNER JOIN 테이블 별칭B ON 조인될 조건 [WHERE 검색 조건]




profile
planning design development with data

0개의 댓글