오라클 기본 3

이정우·2021년 10월 12일
0

오라클

목록 보기
3/5

쿼리문의 결과는 전부 2차원의 테이블형태로 출력된다.

-- 주석 처리.

''안의 대소문자는 구별을 한다.

한 라인만 출력하는 방법

WHERE ROWNUM = 1

쿼리문 기본 구성

selelct (필드리스트)
from (테이블리스트)
where (조건)

모든 경우의 수

SELECT * FROM DEPARTMENT d , STUDENT s 이런 식으로 써주면 모든 경우의 수 찾아줌.

재명명 연산 (테이블 OR 필드의 이름을 재명명하는 기능. 일시적으로 편할려고 사용함.) (같은 이름이 있을 경우만 .써주면 됨. 유일값이면 안 써줘도 인식 해줌)

d, s처럼 재사용을 용이하게 할 수 있음.
SELECT * FROM DEPARTMENT d , STUDENT s
WHERE d.DEPT_ID = s.DEPT_ID

재명명 연산 (필드명에도 사용 가능)

SELECT NAME 이름, POSITION 직위, 2012-YEAR_EMP 재직연수
FROM PROFESSOR p

JOIN 실사용

컴퓨터공학과 3학년의 학번 검색.

select student.stu_id
from student, department
where student.dept_id = department.dept_id //이 부분은 필수. 어디에서 갖고올 것인가?
and student.year = 3 and
department.dept_name='컴퓨터공학과'

오라클 DB에서는 순서 X

순서에는 의미가 없다. -> 레코드의 순서를 내가 원하는 방식으로 할 수 있다.(ORDER BY)

레코드 순서 지정 (오름차순 기본 ORDER BY)

select name, stu_id
from student
where year = 3 or year = 4
order by name, stu_id <<ORDER BY 여러개 필드가 있는 이유는 이름으로 우선 정렬하다가 동명이인이 있으면 stu_id로 정렬해준다.

레코드 내림차순 정렬 (DESC)

SELECT NAME, STU_ID
FROM STUDENT s
WHERE YEAR = 3 OR YEAR = 4
ORDER BY NAME DESC, STU_ID

LIKE 연산자

문자열에서 일부분만 일치할 경우를 찾을 때 사용.

_ 임의의 한 개의 문자
% 임의의 여러 개의 문자

'%단어%' : '단어'가 포함된 문자열
'%단어' : 단어로 끝나는 문자열
'단어%' : 단어로 시작하는 문자열

(띄어쓰기 X. 벨로그 작성 포맷때문에 붙여쓰면 지시어로 인식됨.)
'_ _ _ ' : 정확히 세 개의 문자로 구성된 문자열
'
_ _ _ %' : 최소한 세 개의 문자로 구성된 문자열

LIKE 연산자

SELECT *
FROM STUDENT s
WHERE NAME LIKE '이정우%'

SELECT *
FROM STUDENT s
WHERE NAME = '이정우%' 이렇게 = 쓰면 인식 못 함. LIKE 써주자!

OR, AND 연산자 사용 가능

SELECT
FROM STUDENT s
WHERE RESIDENT_ID LIKE '%
2%'
OR RESIDENT_ID LIKE '%*1%'

집합 (필드의 개수와 데이터타입이 같아야 집합 사용 가능) (SQL에서도 집합의 특성이 살아있어서 중복 값 제외)

UNION 합집합

A필드와 B필드를 합친 내용

SELECT NAME FROM A
UNION
SELECT NAME FROM B

중복된 값을 제거하지 않을려면 UNION ALL

SELECT NAME FROM A
UNION ALL
SELECT NAME FROM B

교집합 (INTERSECT)

교집합 안 쓴 경우

SELECT S.STU_ID
FROM STUDENT s , DEPARTMENT d , TAKES t
WHERE S.DEPT_ID = D.DEPT_ID
AND T.STU_ID = S.STU_ID
AND DEPT_NAME = '컴퓨터공학과' AND GRADE = 'A+'

교집합 쓴 경우

SELECT STU_ID
FROM STUDENT s , DEPARTMENT d
WHERE S.DEPT_ID = D.DEPT_ID
AND DEPT_NAME = '컴퓨터공학과'
INTERSECT
SELECT STU_ID
FROM TAKES t
WHERE GRADE = 'A+'

차집합(MINUS)

SELECT STU_ID
FROM STUDENT s , DEPARTMENT d
WHERE S.DEPT_ID = D.DEPT_ID
AND DEPT_NAME = '컴퓨터공학과'
MINUS
SELECT STU_ID FROM TAKES t
WHERE GRADE = 'A+'

왼쪽 외부조인

SELECT TITLE, CREDIT, YEAR, SEMESTER
FROM COURSE
LEFT OUTER JOIN CLASS
USING(COURSE_ID)

LEFT OUTER JOIN은 왼쪽 테이블이 기준 테이블이 됨. 무슨 말이냐면 왼쪽 테이블의 데이터는 모두 출력됨(조건 만족을 하지 못 해도). 우변의 경우에는 값이 없으면 NULL로 출력

USING 은 WHERE C.COURSE_ID =C2.COURSE_ID와 같은 말. 외부 조인에서 자주 쓰임.

오른쪽 외부조인

SELECT TITLE, CREDIT, YEAR, SEMESTER
FROM COURSE
RIGHT OUTER JOIN CLASS
USING(COURSE_ID)

완전 외부조인

전부 출력! 값 없으면 NULL 넣음

SELECT TITLE, CREDIT, YEAR, SEMESTER
FROM COURSE
FULL OUTER JOIN CLASS
USING(COURSE_ID)

집계 함수

집게 함수가 쓰인 SELECT절에선 다른 필드를 사용할 수 없다.
SELECT ENAME, MAX(SAL)

COUNT 필드 값의 개수 출력

  • NULL은 계산에서 제외됨. 중요.

SELECT COUNT(*)
FROM STUDENT s
WHERE YEAR = 3

SELECT COUNT(COMM)
FROM EMP e

COUNT 중복 제거 DISTINCT

SELECT COUNT(DISTINCT DEPT_ID)
FROM STUDENT s
중복된 값 제거하고 COUNTING

SUM 합계

SELECT SUM(2021 - YEAR_EMP)
FROM PROFESSOR

MAX, MIN 최소, 최대

SELECT MAX(SAL)
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND DNAME='ACCOUNTING'

GROUP BY

WHERE절 다음에 위치. 같은 그룹끼리 묶는 역할.

SELECT DEPT_ID, COUNT()
FROM STUDENT s
GROUP BY DEPT_ID
만약 세 번째 줄이 없다라면
SELECT DEPT_ID, COUNT(
)
FROM STUDENT s
인데 쿼리문의 문법에 의해서 집계 함수가 쓰인 SELECT절에서는 다른 필드가 들어올 수 없으므로 오류가 발생. 그렇기에 그룹으로 묶어줘서 오류를 없앰!

HAVING 절. 집계 함수에 대한 조건에서는 WHERE 못 씀! 이때 사용하는 조건문이 HAVING 절

SELECT DEPT_NAME, COUNT(*), AVG(2021 - YEAR_EMP), MAX(2012-YEAR_EMP)
FROM PROFESSOR p, DEPARTMENT d
WHERE P.DEPT_ID = D.DEPT_ID
AND AVG(2021-YEAR_EMP) >= 10
GROUP BY DEPT_NAME

이렇게AVG(2021-YEAR_EMP) >= 10 이 부분이 오류.

SELECT DEPT_NAME, COUNT(*), AVG(2021 - YEAR_EMP)
FROM PROFESSOR p, DEPARTMENT d
WHERE P.DEPT_ID = D.DEPT_ID
GROUP BY DEPT_NAME
HAVING AVG(2021-YEAR_EMP) >= 19
이렇게 HAVING으로 빼줘야함.

출처 : 국비 교육

profile
프로그래밍 공부 중!

0개의 댓글