: 테이블에 저장되는 데이터 검증용 (무결성 데이터 보장)
: 테이블의 컬럼 단위로 지정
: 제약조건 정보 보는 방법
select *
from information_schema.table_constraints
where table_name = 'emp';
목적 : 레코드 식별용
특징 : 값이 존재 (null 값 불가. not null 제약 조건)
중복 불가 (unique 제약 조건)
테이블당 하나만 지정 가능
복합 컬럼 가능 (예> 수강테이블에서 (학번, 과목))
추가되는 제약 조건 add
자동으로 인덱스 (색인표 역할) 추가됨
목적 : 중복값 저장 불가
특징 : 값이 없어도 됨 (null 값 허용)
레코드 식별용으로 사용 불가
테이블당 여러 개 설정 가능
복합컬럼 가능
추가되는 제약 조건 add
자동으로 인덱스 추가됨
목적 : 비즈니스 로직 검증 역할로서 저장되는 데이터의 범위를 제한한다
예> gender check (gender in ('남', '여'));
목적 : 다른 테이블 참조 (2개 테이블의 연결 고리)
특징 : child - parent 테이블 관계
반드시 외래키는 parent 테이블의 primary key, unique 지정된 컬럼만 참조할 수 있다
null 값 가능
추가되는 제약 조건 add
목적 : null 허용 불가 (반드시 값을 가져야 됨. 중복 가능)
특징 : 기본적으로 모든 테이블의 컬럼은 null을 허용
null -----(변경)------> not null
변경되는 제약 조건 modify
pk와 fk 이용
연산자를 사용한다면 동등연산자 (=) 사용
equi 조인이라고도 부른다
조인이라고 하면 equi 조인을 의미한다
inner 조인
일반컬럼과 일반컬럼 이용
범위로 조인하기 때문에 non-equi 조인이라고 부른다.
inner 조인
https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/join.html
: 2개의 테이블 연결시 반드시 일치되는 데이터만 반환
일치하지 않으면 누락됨
: inner 조인 + 일치되지 않는 데이터까지 포함해서 반환
select
from 테이블1 cross join 테이블2;
테이블1의 하나의 행과 테이블2의 여러 행과 조인됨.
따라서 테이블1의 행 개수 * 테이블2의 행 개수한 결과가 나옴
SELECT 컬럼명
FROM 테이블1 별칭 NATURAL JOIN 테이블2 별칭; // 별칭에 as 사용 불가
SELECT 컬럼명
FROM 테이블1 별칭 NATURAL JOIN 테이블2 별칭
WHERE 조건식;
select
from 테이블1 [inner] join 테이블2 using(공통컬럼);
select 별칭.컬럼명,...., 별칭.공통컬럼
from 테이블1 별칭 join 테이블2 별칭 using(공통컬럼);
select // 3번
from 테이블1 join 테이블2 using(공통컬럼) // 1번 조인조건
where 조건식; // 2번 검색조건
====> natural join 또는 using(공통컬럼) 모두 공통컬럼이 반드시 존재해야 됨
: 가장 범용적으로 사용됨
SELECT
FROM 테이블1 [INNER] JOIN 테이블2 ON 테이블1.컬럼 = 테이블2.컬럼;
SELECT
FROM 테이블1 [INNER] JOIN 테이블2 ON 테이블1.컬럼 = 테이블2.컬럼
WHERE 조건식;
가상 테이블 emp e 가상테이블 emp m
empno ename mgr empno ename
---------------- ---------------
7369 SMITH 7902 7369 SMITH
7902 FORD
select *
from emp e join emp m ON e.mgr = m.empno;
: 조인 조건이 일치한 행만 반환하는 것은 INNER 조인. 이 때 일치하지 않는 행은 누락됨. 누락된 행까지 포함해서 반환할 수 있는 방법 OUTER 조인이다
SELECT
FROM 테이블1 LEFT OUTER JOIN 테이블2 USING(공통컬럼) | ON 절;
-> 테이블1의 모든 행이 반환됨 (일치하지 않아도)
SELECT
FROM 테이블1 RIGHT OUTER JOIN 테이블2 USING(공통컬럼) | ON 절;
-> 테이블2의 모든 행이 반환됨 (일치하지 않아도)
cf) 테이블1과 테이블2의 누락된 데이터를 모두 같이 보려면 FULL OUTER JOIN을 써야된다. 하지만 Oracle 에서만 가능 !!
아니면 UNION (합집합) 이용해도 가능하다
select *
from emp
where sal > (select sal
from emp
where ename = 'scott');
: 사용되는 연산자가 2가지
: 서브쿼리 값의 최대값보다 큰 값을 반환함
: MAX(SAL)로도 구현 가능
SELECT
FROM
WHERE SAL > ALL (select sal
from emp);
SELECT
FROM
WHERE SAL > ALL (100
200
300 );
: 서브쿼리 값의 최소값보다 작은 값을 반환함
: MIN(SAL)로도 구현 가능
SELECT
FROM
WHERE SAL < ALL (select sal
from emp);
SELECT
FROM
WHERE SAL < ALL (100
200
300 );
: 서브쿼리 값 중 하나라도 만족하는 것을 반환 (서브쿼리의 최소값보다 큰 값을 반환)
: MIN(SAL)로도 구현 가능
SELECT
FROM
WHERE SAL > any (select sal
from emp);
SELECT
FROM
WHERE SAL > any (100
200
300 );
: 서브쿼리의 최대값 보다 작은 값을 반환
: MAX(SAL)로도 구현 가능
SELECT
FROM
WHERE SAL < any (select sal
from emp);
SELECT
FROM
WHERE SAL < any (100
200
300 );
: 서브쿼리에서 검색된 결과가 하나라도 존재하는지 여부를 확인할 때 사용
문법
SELECT *
FROM
WHERE EXISTS (서브쿼리);
-> 서브쿼리의 결과가 있으면 메인쿼리 실행
메인쿼리에서 from 절에 오는 서브쿼리를 의미한다
SELECT
FROM (서브쿼리) 별칭
[WHERE절];
예>
emp 와 dept 테이블에서 부서별 sal총합과 평균을 출력?
select e.deptno, sum(sal), ROUND(avg(sal)), count(*)
from emp e join dept d on e.deptno = d.deptno
group by deptno;
emp 15개와 dept 4개가 조인에 참여함
SELECT e.deptno, total_sum, total_avg, cnt
FROM (SELECT deptno, SUM(sal) total_sum, ROUND(AVG(sal)) total_avg,COUNT(*) cnt
FROM emp
GROUP BY deptno) e
JOIN dept d ON e.deptno = d.deptno;
4개의 서브쿼리 dept 4개가 조인에 참여함