-
2.7 디 버그(거) 사용법, SQL (join, 서브 쿼리)SQL 과정 2019. 2. 7. 14:08
디 버거 사용법 = https://codedragon.tistory.com/6137
디 버그 사용법 = https://codedragon.tistory.com/5901
1. EQUI JOIN(동등 조인)
가. 가장 많이 사용하는 조인 방법
나. 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결하여 결과를
생성하는 조인 기법
* emp테이블의 deptno컬럼과 dept테이블의 deptno컬럼의 공통적인값을 일치시켜 행을 연결하였다.
(where조건 사용)
* emp테이블과 dept테이블 전체컬럼을 같이 출력해도 위와 같은 컬럼으로 출력 되지만, 출력의 의미가 없다.
(의미 : 공통적인 컬럼을 일치가 안된다는 뜻)
* emp. dept 테이블에서 ename, dname 컬럼을 출력하는데, emp, dept 테이블의 deptno컬럼을 조인하고
ename컬럼에서 SCOTT 값을 가지는 행 만을 출력한다.
* 별칭 사용 경우(emp = e, dept = d)[출력 부분에 emp와 dept테이블의 deptno컬럼 출력을 추가한것]
2. NON-EQUI JOIN(비등가 조인)
가. 동일 컬럼이 없이 다른 조건을 사용하여 조인
* salgrade 테이블 기본 전체출력
* 비교 연산자를 사용하여 losal에서 hisal 사이의 범위에서 값이 포함되는 emp테이블과 salgrade테이블의 공통된 컬럼 출력
* 위와 동일(between 사용으로 비교연산자를 대신함)
* 별칭 사용(e, d, s)후 e와 d의 공통 join과(and) between 사용(non equi join)으로 e.sal을 s.losal과 s.hisal 컬럼의 값 사이의 부분을 출력
3. SELF JOIN
가. 자기 자신과 조인
나. 하나의 테이블 내에서 조인을 해야만 자료를 얻을 수 있는 경우에 사용
* emp 테이블 2개에 각각의 별칭(e, m)을 사용하여 e.mgr과 m.empno 컬럼을 공통 조인(EQUI JOIN)하여
e.name 값이 SMITH인 값만을 출력한다.
4. OUTER JOIN
가. 조인 조건에 만족하지 않는 행도 나타내는 조인 기법
나. 2개 이상의 테이블이 조인될 때 어느 한쪽의 테이블에는 해당하는 데이터가 존재하는데,
다른쪽 테이블에는 데이터가 존재하지 않는 경우 그 데이터가 출력되지 않는 문제를 해결하기 위해 사용되는 조인 기법
다. 정보가 부족한 쪽에 ( + )를 덧붙여서 매칭되지 않은 데이터도 표시해준다.
* emp 테이블의 전체 컬럼을 count(*[전체]) 하여 수를 세는 것(공통 조인하게 되면 공통된 컬럼은 생략
하게 되어 13개가 나오게 된다.)
* emp(e), dept(d) 테이블에서 ename과 deptno 컬럼의 값을 공통 조인하는데
공통되지 않고 누락된 것(e.deptno[40])을 OUTER JOIN하여 출력하였다.
5. 서브 쿼리(Subquery)
가. 하나의 select문장 내에 포함된 또 하나의 select문장
나. 서브 쿼리를 포함하고 있는 쿼리문을 메인 쿼리라 하고, 포함된 또 하나의 쿼리를 서브쿼리라 한다.
다. 서브쿼리는 비교연산자의 오른쪽에 기술해야하고 , 반드시 괄호 안에 넣어주어야 한다.
라. 서브쿼리는 메인 쿼리가 실행되기 전에 한번만 실행이 된다.
마. 단일행 서브 쿼리(singel row query)
1) 수행 결과가 오직 하나의 로우(행)만을 반환
2) 서브 쿼리를 수행한 결과가 1건만 나오고, 이 결과를 메인 쿼리로 전달해서 메인 쿼리를 수행
3) 메인 쿼리의 where절에서는 단일행 비교 연산자를 사용해야 한다.
* 평균 급여 보다 sal이 큰 경우값 출력( "( )"안에 있는 것이 서브 쿼리)
* 단일행 서브 쿼리를 적용하지 않고 비교 연산자만 이용
* 단일행 서브 쿼리를 적용한 것(결과 값은 같다.)
바. 다중행 서브 쿼리
1) 서브 쿼리에서의 결과가 두 건 이상 출력되는 것
2) 서브 쿼리의 결과가 여러 건 출력되기 때문에 단일행 연산자를 사용할수 없으며 별도의
다중행 연산자(in, all, any, exists)를 사용해야 한다.
3) IN 연산자
가) 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 하나라도 일치하면 TRUE가 된다.
* 중복 제거(DISTINCT)
* 연산이 단일행 2개이상(deptno= 와 sal>=3000)의 행이 리턴되어 오류가 나게 된다.
* IN 연산자 사용으로 다중행 연산을 시행가능하게 하였음
* 이런 형태도 가능하다.(참고)
4) ALL 연산자
가) 메인 쿼리의 비교 조건이 서브 쿼리의 검색결과와 모든 값이 일치하면 참
나) 검색한 값에 AND연산을 해서 모두 참이면 참
* sal 최대값(MAX)을 출력하는데 emp테이블에서 deptno 값들을 그룹화하여 출력
아래는 조건(having)을 걸어 30번 부서의 최대값(MAX)을 출력
* 단일행 연산(sal>)
* deptno가 30인 값의 emp테이블에서 sal 컬럼을 출력(위)
서브 쿼리의 모든 내용보다 큰값(>ALL)으로 emp테이블에서 ename과 sal을 출력(아래)
5) ANY 연산자
가) 메인 쿼리의 비교 조건이 서브쿼리의 검색결과와 하나이상이 일치하면 참
* deptno가 30인 행을 조건(HAVING)으로 emp테이블에서 deptno를 그룹화(GROUP BY)하였고 거기에
sal 최소값(MIN)을 출력하였다.
* 단일행 서브 쿼리로 바꾸어서 ename과 sal 컬럼을 가지는 emp테이블을 출력
* sal 보다 어느것 하나라도 작게 되는 연산자(>ANY) 사용하여 ename과 sal 컬럼을 가지는 emp테이블 출력
5) EXISTS 연산자
가) 메인 쿼리의 비교조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참이 되고
아무 행도 반환하지 않으면 거짓이 된다.
가) SELECT 1 FROM 테이블 명:
(1) SELECT문에 1을 사용하면 해당 테이블의 갯수만큼 1로된 행을 출력한다.
(2) 테이블의 행의 수가 N개이면 1이 N행 반환된다.
(3) WHERE 조건문과 함께 써 해당 조건을 만족하면 1을 반환한다.
(4) 다중행 서브 쿼리문에서 WHERE 조건절에 (NOT) EXISTS 안의 서브쿼리문에 사용되어 진다.
(5) EXISTS로 SELECT * FROM EMP 또는 SELECT 1 FROM EMP은 논리식에 사용될때는 실제 값이
아닌 값의 존재 유무가 더 중요하기 때문에 보다 간단하게 사용하기 위해 SELECT 1 FROM EMP
형태로 사용하게 된다.
* 10 ,20에 데이터가 존재하는 곳이 하나라도 있을때 e , d 의 deptno의 공통 조인하여 만족하는 값을
emp테이블에 포함된 ename과 deptno, sal 컬럼으로 출력되게 된다.
'SQL 과정' 카테고리의 다른 글
2.7 SQL 데이터 정의어 ALTER TABLE(ADD, ALTER, DROP COLUMN) (0) 2019.02.07 2.7 SQL 데이터 정의어(DDL, CREAT TABLE) (0) 2019.02.07 2.1 SQL 관계형 데이터베이스 (0) 2019.02.01 2.1 SQL 그룹함수 (0) 2019.02.01 2.1 SQL 형 변환 함수 (0) 2019.02.01