INNER JOIN은 두 테이블 간에 일치하는 행만 반환. 즉, 연결 조건을 충족하는 행만 결과에 포함
SELECT ename, job,sal,e.deptno, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno;
[join 여러테이블]
여러개의 테이블(3개이상) 조인
select 컬럼명
from 테이벌이름 1 별칭1 [inner] join 테이블이름2 별칭2
on 별칭1.컬럼명 = 별칭2.컬럼명 [inner] join 테이블이름3 별칭3
on 별칭2.컬럼명 = 별칭3.컬럼명 ...
SELECT p.profno, concat(p.name,' ' ,'교수') 교수이름,
s.studno, s.name, s.grade, d.dname
FROM professor p JOIN student s
ON p.profno = s.profno JOIN department d
ON p.deptno = d.deptno;
LEFT JOIN은 왼쪽(첫 번째) 테이블의 모든 행을 반환하고, 오른쪽(두 번째) 테이블과 일치하는 행이 없으면 NULL 값을 반환.
SELECT ename, job,sal,e.deptno, dname
FROM dept d left outer JOIN emp e
-- left outer join 기준 왼쪽에 있는 데이터 모두,
오른쪽 데이터는 일치하는 것만 출력
ON d.deptno = e.deptno;
RIGHT JOIN은 오른쪽(두 번째) 테이블의 모든 행을 반환하고, 왼쪽(첫 번째) 테이블과 일치하는 행이 없으면 NULL 값을 반환.
SELECT ename, job,sal,e.deptno, dname
FROM dept d right outer JOIN emp e
-- right outer join 기준 오른쪽에 있는 데이터 모두,
왼쪽 데이터는 일치하는 것만 출력
ON d.deptno = e.deptno;
FULL JOIN은 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행에 대해 NULL 값을 반환.
MariaDB는 FULL JOIN을 직접 지원하지 않습니다.
대신 LEFT JOIN과 RIGHT JOIN을 UNION 연산자를 사용하여 결합하여
동일한 효과를 얻을 수 있습니다.
CROSS JOIN은 두 테이블 간의 모든 가능한 조합을 생성. 이것은 테이블의 크기에 따라 결과 행 수가 급격하게 증가할 수 있으므로 주의해야 함.
SELECT *
FROM buy
CROSS JOIN member; -- buy table rowcount * member row count
SELF JOIN은 동일한 테이블을 사용하여 테이블 내의 행을 서로 연결하는 데 사용. 자체 참조적인 관계를 다룰 때 유용.
SELECT e.EMPNO 사원번호, e.ENAME 이름, e.JOB 직책,
em.MGR 매니저번호, em.ENAME 매니저이름
FROM emp e JOIN emp em
ON e.mgr = em.mgr;
쿼리 내에서 다른 쿼리를 포함하는 쿼리
서브쿼리는 주 쿼리의 WHERE, HAVING, FROM 절에서 사용할 수 있으며, 다양한 상황에서 유용
목적
[예시]
SELECT * FROM emp2
WHERE pay > (SELECT pay FROM emp2 WHERE NAME='백원만');
SELECT * FROM emp2
WHERE pay < (SELECT avg(pay) FROM emp2);
유형
-- 직원 중에서 최고 급여를 받는 직원 검색
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
-- 부서별로 평균 급여를 계산하여 부서 이름과 평균 급여를 반환
SELECT department_name, avg_salary
FROM departments
JOIN (SELECT department_id, AVG(salary) AS avg_salary
FROM employees GROUP BY department_id) AS subquery
ON departments.department_id = subquery.department_id;
-- 주문이 있는 고객 검색
SELECT customer_name
FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);
-- 특정 부서에 속한 직원 검색
SELECT name, department_id
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'Engineering');
-- 부서별로 최고 급여를 가진 직원 검색 (단일 행 서브쿼리)
SELECT department_id, name, salary
FROM employees
WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);
-- 특정 부서에 속한 직원 검색 (다중 행 서브쿼리)
SELECT name, department_id
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');
-- 부서별로 평균 급여와 최고 급여를 비교 (다중 열 서브쿼리)
SELECT department_id, AVG(salary) AS avg_salary,
(SELECT MAX(salary) FROM employees WHERE employees.department_id = departments.department_id) AS max_salary
FROM departments;