카테고리 없음

sql(다중행 서브 쿼리, 다중열 서브쿼리, 집합 연산자, 문자함수)

boangod 2025. 9. 16. 17:46

다중행 서브쿼리 → 애매해서 잘 사용 안 함.

SELECT 컬럼 ...

FROM 테이블

WHERE 컬럼 다중_행_연산자 (SELECT 문장 : Sub query문)......;

 

 

서브쿼리에 여러 행이 검색되는 경우 사용한다.

‐ 다중행 연산자를 이용한다.

‐ 다중행 연산자의 종류

      . IN : 나열된(검색된) 값 중에 하나만 일치하면 된다.

      . ANY : 나열된(검색된) 값 일부와 일치하면 된다.

      . ALL : 나열된(검색된) 값 전체와 일치해야 한다.

 

 

IN 연산자를 이용한 다중행 서브쿼리

 

• 화학과교수의 부임일과동일한 날 입사한 사원의 명단을 검색한다.

• 20번 부서원과 동 일한관리자로부터 관리받는 사원을 검색한다.

 

SQL> SELECT eno 사번, ename 이름

2 FROM emp

3 WHERE hdate IN (SELECT hiredate

4 FROM professor

5 WHERE section = '화학');

 

SQL> SELECT * FROM emp

2 WHERE mgr IN (SELECT mgr FROM emp

3 WHERE dno = '20')

4 AND dno != 20; ← 매우 많은 실수!!

 

 

ANY, ALL을 이용한 다중행 서브쿼리

 

• 10번 부서원들보다 급여가 낮은 사원을 검색한다.

 

SQL> SELECT eno 사번, ename 이름, dno 부서번호

2 FROM emp

3 WHERE sal < ALL (SELECT sal

4 FROM emp

5 WHERE dno = '10');

 

 

 

  • 컬럼 > ALL → 컬럼> MAX() : 가장 큰 값보다 크다
  • 컬럼 < ALL → 컬럼< MIN() : 가장 작은 값보다 작다.
  • 컬럼 > ANY → 컬럼> MIN() : 가장 작은 값보다 크다.
  • 컬럼 < ANY → 컬럼< MAX() : 가장 큰 값보다 작다

 

 

다중열서브쿼리 → in 서야 하는 경우가 많다.

 

SELECT 컬럼 ...

FROM 테이블

WHERE (컬럼1, 컬럼2, ...)

IN (SELECT 문장 : Sub query문) ......;

 

‐ 서브쿼리의 SELECT문에 여러 개의 컬럼을 검색한다.

‐ 여러 개의 컬럼을 검색하는 서브쿼리문을 이용할 때는 반드시 비교대상 컬럼과 1:1 대응돼야 한다.

‐ 다중열 서브쿼리에서 서브쿼리의 검색결과가 단지하나의 행이라면'=' 연산자사용 이 가능하지만 되도록'IN' 연산자를 이용한다.

 

 

• 손하늘과 동일 관리자의 관리를 받으면서 업무도 같은 사원을 검색한다.

 

SQL> SELECT eno 사번, ename 이름, mgr 관리자, job 업무

2 FROM emp

3 WHERE (mgr, job) IN (SELECT mgr, job

4 FROM emp

5 WHERE ename = '손하늘')

6 AND ename != '손하늘';

 

이건 쓰지 말자.(같은 결과 나온다는 보장 못함.)

SQL> SELECT eno 사번, ename 이름, mgr 관리자, job 업무

2 FROM emp

3 WHERE mgr= (SELECT mgr FROM emp WHERE ename = '손하늘')

4 AND job = (SELECT job FROM emp WHERE ename = '손하늘')

5 AND ename!= '손하늘';

 

 

• 김선유와 부서 및 업무가 동일한 같은 사원을 검색한다.

 

SQL> SELECT eno 사번, ename 이름, dno 부서번호, job 업무

2 FROM emp

3 WHERE (dno, job) IN (SELECT dno, job

4 FROM emp

5 WHERE

6 AND ename != '김선유';

 

(이름이 같은 사람이 있어서 결과가 다르게 나온다.)

SQL> SELECT eno 사번, ename 이름, dno 부서번호, job 업무

2 FROM emp

3 WHERE dnoIN (SELECT dno FROM emp WHERE ename = '김선유')

4 AND job IN (SELECT job FROM emp WHERE ename = '김선유')

5 AND ename!= '김선유'

 

 

집합연산자

 

SELECT ...

[UNION ALL | UNION | INTERSECT | MINUS]

SELECT ...

 

‐ 두 SELECT 문의결과를 집합연산한다.

‐ 검색결과의 헤더는 앞쪽 SELECT문에 의해 결정된다.

‐ 두 SELECT 문의 컬럼개수와 데이터타입이 일치해야 한다.

 

 

UNION                           합집합                         검색된 결과의 합으로 중복이 제거된다.

UNION ALL                                                       검색된 결과의 합으로 중복을 허용한다 → 보통 사용 안 하고 유니온만 사용함.

INTERSECT                  교집합                         양쪽모두에 포함된 결과만 검색한다.

MINUS                           차집합                         첫 번째 검색결과에서 두 번째 검색결과를 제외한 나머지만 검색한다.

 

 

집합연산자를 이용한 검색

 

• 2000년 이후에 입사한 사원과부 임한 교수의 명단을 부임일순으로 검색한다.

 

SQL> SELECT pno 번호, pname 이름, hiredate 입사일_부임일

2 FROM professor

3 WHERE hiredate >= '2000/01/01'

4 UNION ALL

5 SELECT eno, ename, hdate

6 FROM emp

7 WHERE hdate >= '2000/01/01'

8 ORDER BY 3;

 

‐ 집합연산자를 이용한 출력에서 헤더는 첫 번째 SELECT문에 의해 결정된다.

‐ ORDER BY절은 SELECT문 끝에 추가한다.

      . pno나 eno가 아니라 반드시 번호를 이용해서 정렬한다.

 

 

• 화학, 물리학과학생들 중에 학점이 3.0 이상인학생을 검색한다.

• 제갈씨성을가진 사원 중에 지원업무를 하지 않는 사원을 검색한다.

 

 

SQL> SELECT sno 학번, sname 이름, major 학과, avr 학점 FROM student

2 WHERE major IN ('화학', '물리')

3 INTERSECT

4 SELECT sno, sname, major, avr FROM student

5 WHERE avr >= 3;

 

SQL> SELECT eno, ename, job FROM emp

2 WHERE ename LIKE '제갈%'

3 MINUS

4 SELECT eno, ename, job FROM emp

5 WHERE job = '지원';

 

 

 

단일행 함수문자함수

 

• 단일행 함수를 이용하면 검색된 데이터에 대해서 각행 별로 연산된 결과값을 얻을 수 있으며 중첩이 가능하다.

• 단일행 함수는 응용프로그램의 오류를 줄이 고개발시간을 단축할 수 있다.

• 인수로는 칼럼명, 수식, 변수, 상수 등을 사용할 수 있다. 함수명(인수 1, 인수 2,...)

• 단일행 함수는 SELECT 절이나 WHERE절 또는 HAVING 절등값이필요한 거의 모든 구문에 사용이 가능하다.

• 단일행 함수의 종류‐ 문자함수, 숫자함수, 날짜함수, 변환함수, 일반함수..

 

 

문자함수

함수명 기능 함수명 기능
LOWER 문자열을소문자로변환한다. LOWER(문자열) INSTR 문자의위치반환 INSTR(문자열, 검색문자, 시작위치, 횟수)
LOWER('ORACLE') → oracle INSTR('ORACLE', 'A') → 3
UPPER 문자열을대문자로변환한다. UPPER(문자열) TRIM 접두(접미) 글자를잘라낸다 TRIM([leading | trailing | both] 제외문자 FROM 문자열)
UPPER('oracle') → ORACLE TRIM('o' FROM 'oracle') → racle
INITCAP 첫번째문자는대문자로, 나머지는소문자로변 환한다. INITCAP(문자열) LENGTH
LENGTHB
문자열의길이나BYTE를반환한다. LENGTH(문자열) LENGTHB(문자열)
INITCAP('oracle') → Oracle LENGTH('디비') → 2 LENGTHB('디비') → 4
SUBSTR 문자열내지정된위치의문자열을검색 한다. SUBSTR(문자열, STR,CNT) LPAD,RPAD 지정된문자열의길만큼빈부분에문자를 채운다. LPAD(문자열, 출력폭, 채움문자)
SUBSTR('oracle', 1, 2) → or LPAD('20000', 10, '*') → *****20000

 

 

공백 자동으로 없애는 거 → TRIM

 

 

 

문자치환함수

단일행 기능
TRANSLATE 문자단위로치환된값을반환한다. TRANSLATE(문자열, 검색문자, 치환문자)
TRANSLATE('oracle', 'a','#') → or#cle
REPLACE 문자열단위로치환된값을반환한다. REPLACE(문자열, 검색문자열, 치환문자열)
REPLACE('oracle', 'or', '##') → ##acle

 

 

• 형식이 비슷한 TRANSLATE와 REPLACE를 동일한 치환을 통해 비교해 보자.

‐ 원문의'Wo'를'--'로 변환한다.

 

 

SQL> SELECT TRANSLATE('World of Warcraft', 'Wo', '--') Translate,

2 REPLACE('World of Warcraft', 'Wo', '--') Replace

3 FROM dual;

 

‐ TRANSLATE는 각각의 글자를 지정된 문자로 변환하는 것에 주의한다