Posts Database-2. 데이터베이스 함수와 조인
Post
Cancel

Database-2. 데이터베이스 함수와 조인

집계함수

COUNT : 검색되는 데이터 수를 반환 MAX : 선택된 컬럼 값 중에서 최대값 반환 MIN : 선택된 컬럼 값 중에서 최소값 반환

1
2
3
4
5
집계함수

SELECT COUNT(EMPNO), MAX(SAL), MIN(SAL), AVG(SAL), SUM(SAL)
FROM EMP
WHERE JOB = 'MANAGER';

데이터 그룹핑

특정 컬럼기준으로 집계한다. (group by)

무슨말인지 몰랐지만 데이터베이스를 조회하면서보면 어떤 부서코드별로 연봉이 1800이상인 사람의 숫자를 세고자한다? 그럴때 사용한다.

1
2
3
4
5
6
7
8
9
group by
SELECT  DEPTNO,  COUNT(*)
FROM EMP
WHERE SAL >= 1500
GROUP BY DEPTNO;

SELECT  DEPTNO
FROM EMP
WHERE SAL >= 1500

Having절

Group by 집계된 값중 WHERE절 처럼 특정 조건을 추가하는 경우

1
2
3
4
select DEPTNO, count(*)
from emp
where sal>=2000
group by DEPTNO having count(DEPTNO) > 1;

DISTINCT

데이터를 조회한후 중복을 제거한 결과를 나타냄 이것을 사용할때는 매니저라는 부서번호를 알고싶다?

1
2
3
4
5
6
7
SELECT JOB, DEPTNO
WHERE EMP;
이렇게 조회할때는 매니저라는 직업을 가진 중복된데이터가 나올것이다. 그렇다면 

SELECT DISTINCT JOB, DEPTNO
FROM EMP;
이렇게사용하면 중복을 제거할수있다.

ORDER BY

열 이름을 하나 또는 여러 개의 열을 지정하여 정렬할때 사용 오름차순(ASC)과 내림차순(DESC)정렬

1
2
3
SELECT DEPTNO, EMPNO
FROM EMP
ORDER BY DEPTNO ASC, EMPNO DESC;

먼저 부서번호로 쫙 오름차순정렬한다음 같은 부서번호한해서 직원번호를 내림차순하는것이다.

GROUP BY

EQUI 조인

두개 이상의 테이블을 연결하여 두개의테이블을 마치 하나의 테이블인 것처럼 보여준것이다.

  1. 두개의 테이블에 하나라도 같은 컬럼이 있어야함 (두컬럼 값은 공유되어야함)
  2. Primary key와 Foreign key값을 사용하여 조인 3.각각 테이블에대한 AS를 반드시 명시해 줘야함
1
2
3
4
-- 사원이 어떤 부서에서 근무하는지를 검색하시오.
SELECT E.EMPNO, E.ENAME , D.DEPTNO, D.DNAME
from EMP E, DEPT D
where E.DEPTNO = D.DEPTNO;

INNER 조인

두개의 테이블 혹은 두개이상의 테이블을 조인하면서 INNER JOIN을 한다. EQUI조인을 더많이사용하므로 가볍게 넘어가자

1
2
3
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

OUTER 조인

Desktop View

SELF 조인

상사이름별로 관리하고있는 사원을 조회할때

1
2
3
4
-- 각 사원을 관리하는 상사의 이름을 검색한다.
SELECT E1.EMPNO 사원번호 , E1.ENAME 사원이름, E1.MGR 상사번호, E2.EMPNO 상사의사원번호, E2.ENAME 상사이름
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO

처음엔 맨마지막에 where 조건에 저렇게 e1 테이블의 매니저 = e2 테이블의 매니저 조건을 걸어줘야하는지 이해가안갔다 하지만 이그림을 보니 이해할수있었다.

SUB QUERY

SELECT문 안에 다시 SELECT문이 기술된 형태의 쿼리 서브쿼리에서는 ORDER BY를 사용하지못함 서브쿼리는 반드시 한건만 가져올수있다. (PRIMARY KEY로가져올확률이있다.)

EXISTS NOT EXISTS

서브쿼리에 해당하는 튜플이 적어도 한건이상 존재하면 TRUE 없으면 FALSE 를 리턴한다. NOT EXISTS는 반대로 값이 없을경우에 테이블을 조회한다. 만약에 하나만 TRUE이면 TRUE를 리턴한다.

1
2
3
4
5
SELECT *
FROM EMP
WHERE SAL >= 2000
AND NOT EXISTS
    (SELECT * FROM EMP WHERE GRADE >=7);

서브쿼리를 활용한 DML

개발에서 임의적으로 테이블을 생성할때 사용한다

1
2
3
4
5
6
7
8
9
UPDATE EMP_TEMP SET SAL = 3800
WHERE EMPNO IN (SELECT EMPNO
                FROM EMP
                WHERE DEPTNO = 30);
                
DELETE FROM EMP_TEMP
WHERE EMPNO IN (SELECT EMPNO
                FROM EMP
                WHERE DEPTNO = 30);

이렇게 사용한다.

This post is licensed under CC BY 4.0 by the author.