
📌 모든 행을 조합하여 출력
테이블A 행 수 × 테이블B 행 수 만큼의 결과 생성 SELECT * FROM A CROSS JOIN B;
📌 조건에 맞는 데이터만 가져오는 조인
= 연산자를 사용하여 두 테이블을 연결SELECT A.name, B.salary
FROM A
INNER JOIN B ON A.id = B.id;
= 외의 비교 연산자 (<, >, <=, >=, !=) 사용SELECT A.name, B.salary
FROM A
INNER JOIN B ON A.age > B.min_age;
📌 한쪽에만 데이터가 있어도 포함하여 출력
| 종류 | 설명 |
|---|---|
| LEFT JOIN 🔹 | 왼쪽 테이블 기준, 매칭되는 데이터가 없는 경우 NULL |
| RIGHT JOIN 🔸 | 오른쪽 테이블 기준, 매칭되는 데이터가 없는 경우 NULL |
-- LEFT JOIN 예제
SELECT A.name, B.salary
FROM A
LEFT JOIN B ON A.id = B.id;
-- RIGHT JOIN 예제
SELECT A.name, B.salary
FROM A
RIGHT JOIN B ON A.id = B.id;
📌 같은 테이블 내에서 컬럼끼리 조인
SELECT staff.last_name, staff.job_id, manager.last_name, manager.job_id
FROM employees staff, employees manager
WHERE staff.manager_id = manager.employee_id;
ON 조건 사용 → WHERE 절에서 추가 조건 지정SELECT *
FROM A
JOIN B ON A.id = B.id
WHERE A.age > 30;
FROM 절에서 테이블을 쉼표로 구분, WHERE에서 조건 지정SELECT *
FROM A, B
WHERE A.id = B.id AND A.age > 30;
📌 쿼리 안에 또 다른 쿼리를 포함
SELECT name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
| 연산자 | 설명 |
|---|---|
| IN | 서브쿼리 결과 중 하나라도 일치 |
| ANY | 서브쿼리 결과 중 어느 하나라도 만족 |
| ALL | 서브쿼리 결과 중 모두 만족 |
| EXISTS | 결과가 존재하면 TRUE |
| NOT EXISTS | 결과가 없으면 TRUE |
SELECT name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 100);
📌 서브쿼리가 메인 쿼리의 행을 기준으로 반복 실행
SELECT name
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
📌 데이터를 저장하고 전송하는 경량의 텍스트 형식
{ key: value }{
"name": "Alice",
"age": 25,
"city": "Seoul"
}
[ value1, value2, ... ]
{
"employees": [
{ "name": "Alice", "age": 25 },
{ "name": "Bob", "age": 30 }
]
}