쿼리문의 결과는 전부 2차원의 테이블형태로 출력된다.
-- 주석 처리.
''안의 대소문자는 구별을 한다.
WHERE ROWNUM = 1
selelct (필드리스트)
from (테이블리스트)
where (조건)
SELECT * FROM DEPARTMENT d , STUDENT s 이런 식으로 써주면 모든 경우의 수 찾아줌.
d, s처럼 재사용을 용이하게 할 수 있음.
SELECT * FROM DEPARTMENT d , STUDENT s
WHERE d.DEPT_ID = s.DEPT_ID
SELECT NAME 이름, POSITION 직위, 2012-YEAR_EMP 재직연수
FROM PROFESSOR p
컴퓨터공학과 3학년의 학번 검색.
select student.stu_id
from student, department
where student.dept_id = department.dept_id //이 부분은 필수. 어디에서 갖고올 것인가?
and student.year = 3 and
department.dept_name='컴퓨터공학과'
순서에는 의미가 없다. -> 레코드의 순서를 내가 원하는 방식으로 할 수 있다.(ORDER BY)
select name, stu_id
from student
where year = 3 or year = 4
order by name, stu_id <<ORDER BY 여러개 필드가 있는 이유는 이름으로 우선 정렬하다가 동명이인이 있으면 stu_id로 정렬해준다.
SELECT NAME, STU_ID
FROM STUDENT s
WHERE YEAR = 3 OR YEAR = 4
ORDER BY NAME DESC, STU_ID
문자열에서 일부분만 일치할 경우를 찾을 때 사용.
_ 임의의 한 개의 문자
% 임의의 여러 개의 문자
'%단어%' : '단어'가 포함된 문자열
'%단어' : 단어로 끝나는 문자열
'단어%' : 단어로 시작하는 문자열
(띄어쓰기 X. 벨로그 작성 포맷때문에 붙여쓰면 지시어로 인식됨.)
'_ _ _ ' : 정확히 세 개의 문자로 구성된 문자열
' _ _ _ %' : 최소한 세 개의 문자로 구성된 문자열
SELECT *
FROM STUDENT s
WHERE NAME LIKE '이정우%'
SELECT *
FROM STUDENT s
WHERE NAME = '이정우%' 이렇게 = 쓰면 인식 못 함. LIKE 써주자!
SELECT
FROM STUDENT s
WHERE RESIDENT_ID LIKE '%2%'
OR RESIDENT_ID LIKE '%*1%'
UNION 합집합
SELECT NAME FROM A
UNION
SELECT NAME FROM B
SELECT NAME FROM A
UNION ALL
SELECT NAME FROM B
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+'
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)
SELECT COUNT(*)
FROM STUDENT s
WHERE YEAR = 3
SELECT COUNT(COMM)
FROM EMP e
SELECT COUNT(DISTINCT DEPT_ID)
FROM STUDENT s
중복된 값 제거하고 COUNTING
SELECT SUM(2021 - YEAR_EMP)
FROM PROFESSOR
SELECT MAX(SAL)
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND DNAME='ACCOUNTING'
WHERE절 다음에 위치. 같은 그룹끼리 묶는 역할.
SELECT DEPT_ID, COUNT()
FROM STUDENT s
GROUP BY DEPT_ID
만약 세 번째 줄이 없다라면
SELECT DEPT_ID, COUNT()
FROM STUDENT s
인데 쿼리문의 문법에 의해서 집계 함수가 쓰인 SELECT절에서는 다른 필드가 들어올 수 없으므로 오류가 발생. 그렇기에 그룹으로 묶어줘서 오류를 없앰!
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으로 빼줘야함.
출처 : 국비 교육