본문 바로가기
  • hello world
DataBase

[DataBase] SQL : DML (SELECT)

by JJoajjoa 2023. 8. 29.

 

DML :
Data Manipulation Language
RDBMS 테이블 데이터를 저장, 수정, 삭제하는 명령어

 

 

 

INSERT SELECT UPDATE DELETE

 

 

 

 

# SELECT 문

데이터베이스에서 정보를 검색하는데 사용되는 코드

 

 

순서)

SELECT DISTINCT

FROM

WHERE

GROUP BY 

HAVING

ORDER BY

 

 

 

1. SELECT절 :

SELECT 문의 시작을 담당

어떤 열을 반환할건지 지정함

SELECT * : 모든 열을 의미

 

SELECT column1, column2, column3, ... columnN;

>> 해당 column들이 반환하고자하는 테이블 열의 이름이다!

 

# DISTINCT 키워드

중복된 결과를 제거하고 고유한(unique) 결과만을 반환하는데 사용

SELECT절에서 column 앞에 작성한다

SELECT DISTINCT  column1, column2, column3, ... columnN

 

 

 

2. FROM절 :

어떤 테이블에서 데이터를 검색할 것인지 지정

마지막을 담당

 

FROM table

>> 해당 table 내에서 데이터를 검색하고자 한다!

 

ex 1 )

SELECT *

FROM table1, table2, table3;

>> 이렇게 하면 오류남

 

ex 2 )

SELECT table1.column1, table2.column2

FROM table1, table2;

>> 테이블은 객체니까 이렇게 해야함

 

ex 3 )

SELECT t1.column1, t2.column2

FROM table1 t1, table2 t2;

 

 

 

3. ORDER BY절

정렬 순서 지정

특정 열 또는 여러 열에 따라 정렬해줌

기본적으로 오름차순(ASC)

내림차순(DESC)을 사용하려면 DESC 키워드를 사용해아함

 

SELECT column1, column2, column3, ... columnN

FROM table

ORDER BY column1 ASC, column2 DESC, ... columnN ASC;

>> 순서대로 정렬, column1 기준정렬, column2 기준정렬 ...

동일한 앞의 값에 대해 뒤의 조건으로 정렬하는 것

 

 

 

4. WHERE절

특정 조건을 만족하는 row(행)를 선택하도록 필터링 해주는 친구

필터링이라 조건식이 필요하고, 만족하는 행 만이 결과에 포함된다

 

SELECT column1, column2, column3, ... columnN

FROM table

ORDER BY condition;

 

SELECT *

FROM table

WHERE age > 30 AND age < 50;

 

@ 연산자

비교연산자 :

< , > , <= , >= , = , != , NOT, AND, OR 

BETWEEN ... AND ... :

특정 범위 내에 있는 값 선택

WHERE a BETWEEN 1 AND 100

>> 1 < a < 100 이거 안됨

IN :

WHERE a IN ("개발부서", "디자인부서", "영업부서")

Like :

문자열 패턴 매칭을 위해 %와 함께 사용

% : 임의의 문자열을 대체

_ : 임의의 문자 한개를 대체

WHERE name LIKE '_A%' : 이름의 두번째 글자가 A인 친구들만 가져와줘

WHERE job LIKE '%A%' : 직업에 A가 들어간 모든 친구들 가져와줘

IS NULL, IS NOT NULL :

NULL인지 아닌지 판단해줌

 

 

 

5. GROUP BY절

특정 열에 따라 그룹화 하는 친구

보통 집계함수와 함께 사용되어 결과집합을 그룹화해주거나 계산해주는데 사용되는 친구

 

SELECT column1, column2, column3, ... function(columnN)

FROM table

GROUP BY  column1, column2

>> column1 column2 해당 열에서 columnN열을 function으로 계산함

 

ex)

SELECT id, ... AVG(salary)

FROM table

GROUP BY id, name;

>> 테이블에서 각 id, name의 평균 급여(salary)를 계산하는 쿼리

 

 

 

6. HAVING절

GROUP BY의 친구라서 같이 써야함

GROUP BY에서 추가 필터링을 도와줌

GROUP화가 된 전체 객체에 대한 조건을 지정해줌

 

SELECT column1, column2, column3, ... function(columnN)

FROM table

GROUP BY column1, column2

HAVING condition;

 

 

 


 

 

 

# 연산기법

1. 셀렉션 Selection

특정 조건을 만족하는 행을 선택하는 연산

SQL에서는 WHERE절을 사용해서 셀렉션을 한다.

 

 

2. 프로젝션 Projection

특정 열만 선택하는 연산

SELECT column1, column2, ... <<  이거

 

 

3. 조인 Join

여러 개의 테이블에서 관련있는 데이터를 결합하는 연산

두개 이상의 테이블을 열 기준으로 결합해주는 SQL 연산

공통된 열을 기준으로 작업

JOIN ... ON ...

ON: 뒤에 서로 연관있는 연산이 나옴

 

SELECT emp.first_name, emp.last_name. dept.deptname

FROM emp

JOIN dept ON emp.id = dept.id

>> emp.id와 dept.id가 같은 친구들만 쪼인하겠다 라는 뜻

 

☞ oracle join 

더보기

- JOIN 앞에 붙임

- 모두다 일치하지 않는 경우는 NULL 반환

 

1. INNER JOIN

두 테이블에서 일치하는 행만 반환

 

2. LEFT OUTER JOIN

첫번째 테이블의 모든 행 그리고 두번째 테이블과 일치하는 행을 반환

 

3. RIGHT OUTER JOIN

두번째 테이블의 모든 행 그리고 첫번째 테이블과 일치하는 행을 반환

 

4. FULL OUTER JOIN

두개의 모든 데이터를 가져와서 한쌍으로 만들고 전체 데이터를 반환

 

5. CROSS JOIN

첫번째 테이블과 두번째 테이블의 모든 조합을 반환 << 셀렉*하고두개출력하는거랑똑같

 

6. SELF-JOIN

자기 자신의 여러 ROW간의 JOIN 연산 수행 

 

 

이미지 설명

 

L  R

FROM L

FULL OUTER JOIN R

 

L - L ∩ R

FROM L

LEFT OUTER JOIN R ON L.VALUE = R.VALUE

WHERE R.VALUE IS NULL

 

R - L ∩ R

FROM R

LEFT OUTER JOIN L ON L.VALUE = R.VALUE

WHERE L.VALUE IS NULL

 

L  R - L  R

FROM L

FULL OUTER JOIN R ON L.VALUE = R.VALUE

WHERE L.VALUE IS NULL OR R.VALUE IS NULL

 

 

 SQL-99 join 

더보기

1. NATURAL JOIN

두개 이상의 동일한 이름을 가진 열들 사이에서 자동으로 일치하는 열들을 결합

ON 사용 안함

SELEC절에서 JOIN의 기준이 되는 column 의 이름을 명시할때 객체 이름을 붙이면 안됨

>> 식별자를 가질 수 없는 오류가 있을 수 있음

 

SELECT *

FROM EMP E1

NATURAL JOIN EMP E2;

 

SELECT E.EMPNO, E.ENAME, E.MGR, DEPTNO, D.DNAME, D.LOC
FROM EMP E 

NATURAL JOIN DEPT D;

>> DEPTNO 기준으로 합쳐지기 때문에 DEPTNO는 테이블이 뭔지 명시할 필요 없음

 

 

 

2. USING

두개 이상의 동일한 이름을 가진 열들 사이에서 자동으로 일치하는 열들을 결합

 

SELECT E.EMPNO, E.ENAME, E.MGR, DEPTNO, D.DNAME, D.LOC
FROM EMP E 
JOIN DEPT D USING(DEPTNO);

 

 

 

3. ON 절

조건식(비교 연산자)들과 결합할 열들을 직접 비교할 수 있음

 

 

 

 

 

4. NVL (NULL VALUE)

☞ 뒤에서 다시 다룸

널값이면 계산이 이상해짐

NVL(값, 대체값)

 

SELECT SAL*12+ NVL(COMM, 0) AS TOTAL_SAL
FROM EMP;

>> COMM중에 NULL 값 있으면 0으로 대체해서 계산해줘

 

 


 

 

# 집합연산자

1. UNION

두개의 SELECT문 결과를 중복된 행 제거 후 결합

조건: SELECT문에서 동일한 수의 열을 가져야하고, 유사한 데이터 타입을 가져야 함

ex) 불가능 ↓

1  1

1  1  + 3  3

1  1

 

SELECT column1 FROM table1

UNION

SELECT column2 FROM table2

 

ex)

사원번호, 이름, 직급, 급여, 부서번호 출력

(조건: 부서번호20, 급여2000이상, 부서번호30, 급여2000이상)

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE SAL >= 2000 AND DEPTNO = 20
UNION
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE SAL >= 2000 AND DEPTNO = 30;

 

 

2. UNION ALL

두개의 SELECT문 결과를 중복된 행 제거하지는 않고 결합

 

SELECT column1 FROM table1

UNION ALL

SELECT column2 FROM table2

 

 

3. INTERSECT

두개의 SELECT문 결과 중 공통된 행만 반환

 

SELECT column1 FROM table1

INTERSECT

SELECT column2 FROM table2

 

SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE DEPTNO = 30
INTERSECT
SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 
FROM EMP
WHERE JOB = 'SALESMAN';

 

 

4. EXCEPT(MINUS)

첫번째 SELECT문 결과에서 두번째 SELECT문의 결과에 있는 행들 제외하고 나머지만 반환

 

SELECT column1 FROM table1

EXCEPT

SELECT column2 FROM table2

 

SELECT column1 FROM table1

MINUS

SELECT column2 FROM table2

 

 

 

 

 

 

 

 


 

 

 

# CASE문

DECODE 와 비슷

조건에 따라 다른 동작을 수행하거나 반환하는 역할 수행

WHEN 조건 THEN 결과

조건이 T면 THEN에 있는 결과 반환

 

SELECT ENAME,

CASE

WHEN DEPT = 'IT' THEN 'IT DEPARTMENT'

WHEN DEPT = 'SALES' THEN 'SALES DEPARTMENT'

ELSE 'OTHER DEPARTMENT'

END AS DEPARTMENT, SAL

FROM EMP; 

 

 

 

 

 

 

# 고급 그룹화 연산 함수

그룹바이를 도와주는 친구들 (HAVING과 같은 포지션)

 

1. ROLLUP

GROUP BY 절에 지정된 열 목록에 대해

서브그룹(소그룹), 각 열에 대한 합계 생성

 

SELECT DEPTNO, JOB, SUM(SAL)

FROM EMP

GROUP BY (DEPTNO, JOB);

>> DEPTNO와 JOB 기준으로 겹치지 않게(고유하게) 합계 생성

 

SELECT DEPTNO, JOB, SUM(SAL)

FROM EMP

GROUP BY ROLLUP(DEPTNO, JOB);

>> DEPTNO와 JOB 기준 합계 뿐 아니라 나머지 그룹의 합계까지 생성

>> DEPTNO각각합계, JOB각각합계, DEPTNO 전체 합계, 전체그룹과의 최종합계

 

 

2. CUBE

GROUP BY 절에 지정된 열 목록에 대해

서브그룹(소그룹), 각 열에 대한 합계 생성

다차원 분석 쿼리에 유리

 

SELECT DEPTNO, JOB, SUM(SAL)

FROM EMP

GROUP BY CUBE(DEPTNO, JOB);

>> 쪼갤수있는거 다 쪼개서 계산해줌

 

 

3. GROUPING SETS

GROUP BY 절에 지정된 열 목록에 대해

서브그룹(소그룹), 각 열에 대한 합계 생성

복잡한 그룹화에서 사용

 

SELECT DEPTNO, JOB, SUM(SAL)

FROM EMP

GROUP BY GROUPING SETS((DEPTNO), (JOB));

>> 쪼갤수있는거 다 쪼개서 계산해줌

 

 


 

 

 

# GROUPING

# 그룹바이 함수를 도와주는 친구들을 도와주는 친구

직접적으로 합계를 생성해주는 함수는 아니고

그룹함수들을 도와주는 함수

CASE, DECODE와 절친

집계된 결과에서는 1, 안된 결과에서는 0 의 값을 가짐

조건문에도 활용할 수 있음

 

SELECT DEPTNO, JOB, COUNT(*), SUM(SAL), GROUPING(DEPTNO), GROUPING(JOB)

FROM EMP

GROUP BY CUBE(DEPTNO, JOB);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'DataBase' 카테고리의 다른 글

[DataBase] Subquery 서브쿼리 하위질의  (0) 2023.08.31
[OracleDB] SCOTT 계정 실습문제  (0) 2023.08.29
[OracleDB] Toad 설치  (0) 2023.08.29
[DataBase] SQL (종류, 키, 자료형)  (0) 2023.08.29
[DataBase] Intro  (0) 2023.08.29