2025. 10. 16. 18:30ㆍTIL
1. WHERE
데이터를 조회하고 수정할 대 모든 데이터를 조회/수정하는 것이 아닌 내가 원하는 조건에 부합하는 데이터만 조회/수정/삭제하기 위해 사용하는 조건문
1) 기본 구조
SELECT [DISTINCT] column_name [AS alias]
FROM table
WHERE condition;
2) WHERE 절에 사용할 수 있는 연산자 종류
I. 비교 연산자
숫자 혹은 문자 값의 대소/동일 여부를 확인할 때 사용하는 연산자.
=, >, >=, <, <= 등이 있다.
SELECT name, age
FROM students
WHERE age>=20;
II. SQL 연산자
| BETWEEN | BETWEEN a AND b a와 b 사이 (a<=X<=b)에 있는 값만을 출력 |
| IN | IN (a, b, c, ...) 괄호 안에 있는 값 중에 하나라도 일치하면 출력 |
| LIKE | LIKE '비교 문자열' 비교 문자열과 형태가 일치하면 출력 % : 어떤 문자를 포함한 모든 것을 조회 _ : 정확히 하나의 단일 문자를 조회 |
| IS NULL | NULL인 경우 출력 |
| IS NOT NULL | NULL이 아닌 경우 출력 |
III. 논리 연산자
단독으로 쓰일 수는 없지만 여러 조건이 있을 때 논리적인 연결성을 위해 사용함.
| AND | a AND b a와 b가 모두 True인 경우만 True, 나머지는 모두 False |
| OR | a OR b a 또는 b 중 하나만 True여도 True, 둘 다 False인 경우 False |
| NOT | NOT a a가 True이면 False로, a가 False이면 True로 변환 |
2. GROUP BY & HAVING
GROUP BY는 데이터들을 작은 그룹으로 분류하여 해당 그룹에 대한 항목 별로 통계 정보를 얻기 위해 사용하는 절
GROUP BY를 통해 얻은 그룹 집계 결과를 필터링하고 싶을 때 HAVING을 사용한다.
SELECT [DISTINCT] column_name
FROM table_name
WHERE condition
GROUP BY column_name
HAVING group_condition;
※ 주의사항
- GROUP BY에는 컬럼의 alias를 사용할 수 없다.
- WHERE 절은 GROUP BY를 수행하기 전에 실행된다.
SELECT country, COUNT(id) AS COUNT
FROM supplier
GROUP BY country
HAVING COUNT(id) > 2;
-- country 컬럼을 기준으로 id 컬럼의 행 수를 계산
-- COUNT(id)가 2 초과인 group만 출력
3. ORDER BY
ORDER BY는 조회할 데이터를 특정 칼럼을 기준으로 정렬하여 출력하는 구문이다.
아무 표기가 없으면 오름차순으로 정렬되며, 내림차순으로 정렬하기 위해서는 컬럼 뒤에 DESC를 쓰면 된다.
SELECT column_name
FROM table_name
ORDER BY column_name [DESC];
GROUP BY에 의해 그룹화된 결과 컬럼에 대해서도 ORDER BY를 사용할 수 있다.
SELECT department, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
ORDER BY avg_sal DESC;
4. JOIN
1) EQUI JOIN
두 개 이상의 테이블을 결합해서 데이터를 출력하는 것을 JOIN이라고 한다.
이때 EQUI JOIN(등가 JOIN)은 두 테이블 간의 칼럼의 값들이 서로 같은 경우를 의미한다.
SELECT employees.emp_id, department.dept_name
FROM employees, department
WHERE employees.dept_id=department.dept_id
테이블들을 JOIN한 결과에 대해서도 동일하게 WHERE, GROUP BY, HAVING, ORDER BY 구문을 수행할 수 있다.
2) Non-EQUI JOIN
두 데이블 간의 칼럼의 값들이 정확히 일치하지 않고 특정 범위 내에 있는 경우를 의미한다.
모든 값이 일치하지 않기 때문에 JOIN 시 =를 사용하지 못하고 비교연산자나 BETWEEN 등을 이용한다.
SELECT e.name, e.sal, s.grade
FROM employees e, salary s
WHERE e.sal BETWEEN s.losal AND s.hisal
3) JOIN의 방법 (실제 SQL에서)
| INNER JOIN | 일반적으로 가장 많이 사용하는 JOIN JOIN 조건에 대해 일치하는 값이 있는 행만 반환한다. |
| NATURAL JOIN | 두 테이블 간의 동일한 이름을 갖는 모든 칼럼에 대해 INNER JOIN을 수행 Oracle에서만 지원한다. |
| USING 조건절 | NATURAL JOIN에서, 원하는 칼럼만 선택적으로 JOIN하기 위해 사용 |
| ON 조건절 | 명시적으로 JOIN 조건을 지정하기 위해서 사용 USING은 칼럼명이 같은 경우만 사용할 수 있지만, ON은 칼럼명이 달라도 사용할 수 있다. |
| CROSS JOIN | JOIN 조건이 없는 경우 가능한 모든 데이터를 조합한다. (실무에서 거의 쓸 일이 없다) |
| OUTER JOIN | JOIN 조건에서 동일한 값이 없는 행도 결과 집합에 포함시키기 위해 사용 LEFT JOIN, RIGHT JOIN, FULL JOIN 등이 있다. |
5. 집합 연산자
집합 연산자는 SELECT를 통해 얻은 결과 간의 집합 연산을 수행할 때 사용하는 연산자이다.
JOIN 없이 두 개 이상의 쿼리 수행 결과를 하나의 결과로 만들 수 있다.
집합 연산자를 사용하기 위해서는 SELECT 절의 칼럼 수가 동일해야 한다.
1) 집합 연산자의 종류
| UNION | 두 query의 결과에 대한 합집합 합집합의 결과에서 중복된 행을 제거하기 때문에 시스템 자체적인 추가적인 연산이 필요하다. |
| UNION ALL | 두 query 결과에 대한 합집합 UNION과 달리 중복된 행을 제거하지 않는다. |
| INTERSECT | 두 query 결과에 대한 교집합 중복을 허용하지 않는다. |
| MINUS(EXCEPT) | 두 query 결과에 대한 차집합 중복을 허용하지 않는다. 순서에 유의해야 한다. |
2) 집합 연산자 사용 시 주의사항
- 두 집합의 칼럼 수가 일치해야 한다.
- 두 집합의 칼럼 순서가 일치해야 한다.
- 두 집합의 각 컬럼의 데이터 타입이 일치해야 한다.
- 각 컬림의 사이즈는 달라도 된다.
6. SUBQUERY
1) 서브쿼리의 개념
서브쿼리는 하나의 SQL문 안에 있는 또 다른 SQL문을 의미한다.
서브쿼리의 결과는 최종 쿼리의 결과로 나타나지 않으며, 메인쿼리의 컬럼을 모두 사용해 만들 수 있다. (그러나 메인쿼리는 서브쿼리의 컬럼을 사용할 수 없다)
서브쿼리는 GROUP BY 절을 제외한 나머지 모든 절에 사용할 수 있다.
2) 서브쿼리의 분류
| 동작 방식에 따른 분류 | |
| 연관 서브쿼리 | 서브쿼리가 메인쿼리의 값을 가지고 있는 경우 |
| 비연관 서브쿼리 | 서브쿼리가 메인쿼리의 칼럼을 가지고 있지 않은 경우 |
I. 연관 서브쿼리
서브쿼리 내에 메인 쿼리의 칼럼을 사용한 경우
SELECT A.EMPNO, A.ENAME, A.DEPTNO, A.SAL
FROM EMP A
WHERE A.SAL >=
(
SELECT AVG(X.SAL)
FROM EMP X
WHERE X.DEPTNO = A.DEPTNO
GROUP BY X.DEPTNO
);
서브쿼리 내에서 A.DEPTNO라는 메인 쿼리의 컬럼을 사용했기 때문에 해당 서브쿼리는 연관 서브쿼리이다.
II. 비연관 서브쿼리
서브쿼리가 메인 쿼리의 어떤 것도 참조하지 않는 경우
SELECT MAX(height)
FROM participant
WHERE height NOT IN (SELECT MAX(height) FROM participant);
서브쿼리 내에 메인쿼리에 사용한 컬럼이 없기 때문에 해당 서브쿼리는 비연관 서브쿼리이다.
| 반환 형태에 따른 분류 | |
| 단일행 서브쿼리 | 실행 결과가 항상 1행 이하인 서브쿼리 |
| 다중행 서브쿼리 | 실행 결과가 여러 행인 서브쿼리 |
| 다중칼럼 서브쿼리 | 실행 결과가 여러 칼럼인 서브쿼리 |
I. 단일행 서브쿼리
서브쿼리의 결과가 0건 혹은 1건인 경우
SELECT A.EMPNO, A.ENAME, A.SAL
FROM EMP A
WHERE A.SAL >= (SELECT AVG(K.SAL) AS MAX_SAL FROM EMP K)
ORDER BY A.SAL ;
여기서 서브쿼리의 결과는 MAX_SAL로 표현되는 EMP의 평균 SAL 값 1행이다.
II. 다중행 서브쿼리
서브쿼리의 결과가 2행 이상인 경우
반드시 다중행 비교 연산자와 함께 사용해야 한다.
III. 다중칼럼 서브쿼리
서브쿼리의 결과가 여러 개의 칼럼인 경우
메인쿼리의 조건과 동시에 비교하기 위해서 사용한다.
| 위치별 서브쿼리 분류 | |
| SELECT | 스칼라 서브쿼리 |
| FROM | 인라인뷰 서브쿼리 |
| 기타 | 서브쿼리 |
I. 스칼라 서브쿼리
스칼라 서브쿼리는 1행 1칼럼만을 반환한다.
II. 인라인뷰 서브쿼리
FROM 절에 위치한 서브쿼리의 결과는 동적으로 생성된 테이블(view)인 것처럼 사용할 수 있다.
서브쿼리의 칼럼은 메인쿼리에서 사용할 수 없지만, 인라인뷰의 칼럼은 메인쿼리에서 사용할 수 있다.
'TIL' 카테고리의 다른 글
| 251020_BootCamp Day 1_데이터 직무 분석 1 (0) | 2025.10.20 |
|---|---|
| 251017_SQLD의 활용(2) (0) | 2025.10.17 |
| 251015_SQLD_관계형 데이터베이스 / SELECT와 함수 (0) | 2025.10.15 |
| 251014_SQLD_정규화, 관계, 조인, 트랜잭션 (0) | 2025.10.14 |
| 251013_SQLD_데이터 모델링의 요소 (0) | 2025.10.13 |