1. 기본적인 사용형태
select name -- attribute
from instructor -- relation
where dept_name = 'Comp.Sci.' and salary > 80000 -- predicate
2. distinct : 퀴리문은 중복된 값을 허용하기 때문에 중복을 제거할 경우 사용.
select dept_name --12가지의 중복된 데이터, all 키워드가 생략된 형태
from instructor;
select distinct dept_name --7가지의 중복없는 데이터
from instructor;
3. select 문에 4칙연산이 들어갈 수 있다
select ID, name, salary --저장된 salary 그대로 출력
from instructor;
select ID, name, salary/12 --salary를 12로 나눈 값으로 출력
from instructor;
4. where 문에 조건이 들어가진다.
and, or, not 키워드가 들어갈 수 있다.
다만 주의점은 from의 결과 내에서의 조건이다. (뒤의 group by의 경우 해당사항이 아니다.)
select name, dept_name, salary
from instructor
where dept_name = 'Comp. Sci.' and salary > 80000;
5. from 문서 relation 사이에 쉼표','를 넣으면 Cartesian product가 연산된다.
select *
from instructor, teaches;
6. Join : from 에서 쉼표료 연결한 후 where 문에서 연결조건을 명시한다.
Q : For all instructors who have taught courses, find their names and the course ID of the courses they taught.
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
Q : Find the course ID, semester, year, and title of each course offered by the Comp. Sci. department.
select section.course_id, semester, year, title
-- 두가지 relation에 모두 course_id가 있기 때문에 어떤 course_id 값인지 명시가 필요하다
from course, section
where section.course_id = course.course_id and course.dept_name = 'Comp. Sci.';
-- id값이 같으며 Comp. Sci. 에서 열리는게 조건
select course_id, semester, year, title
from course natural join section
-- natural join을 통해 동일한 결과를 얻을 수 있다
where course.dept_name = 'Comp. Sci.';
-- natural join의 경우 접점을 통해 연결되기 때문에 명시를 안해도 된다
-- course_id 또한 한가지 값이기 때문에 명시를 안해도 된다
7. natural join : 두 relation 간의 동일 attribute로 join된다.
다만 세가지 이상의 relation의 natural join의 경우 원하지 않는 값이 출력된다
select name, title
from instructor natural join teaches, course
where teaches.course_id = course.course_id;
8. join , using : equi-join 형태로 join의 조건을 설정하는 방법.
select name, title
from (instructor natural join teaches) join course
using(course_id);
9. as : relation 이름을 새로운 별칭으로 사용이 가능하다.
select ID, name, salary/12 as monthly_salary
-- monthly_salary 이름으로 결과가 출력된다
from instructor;
Q : Fint the names of all instructors who have a higher salary than some instructor in 'Comp. Sci.'.
select distinct T.name
from instructor as T, instructor as S
-- 같은 instructor 내에서 비교가 필요하기 때문에 T, S로 새로운 명칭이 필요하다
where T.salary > S.salary and S.dept_name = 'Comp. Sci.';
10. %문자열% + like : 특정 문자열을 지닌 값을 찾을 때 사용된다.
select name
from instructor
where name like '%E%';
11. || : attribute 값끼리 붙인 새로운 값을 출력할 때 사용된다.
select name || ' ' || ID as new_value
from instructor;
12. order by + attribute + asc, dest : 특정 attribute값을 기준으로 정렬하여 출력한다.
select distinct name
from instructor
order by name asc;
-- asc : 오름차순 (a -> z)
select distinct name
from instructor
order by name desc;
-- desc : 내림차순 (z -> a)
attribute 값을 두가지 이상 나열할 경우 앞 attribute로 정렬 후 뒤 attribute로 정렬된 순서로 출력된다.
select distinct name, dept_name
from instructor
order by name, dept_name;
-- 1차로 name으로 정렬, 2차로 dept_name으로 정렬
13. between, and : attribute 값을 비교시에 특정 구간으로 잡을 수 있다.
다만 and 앞 뒤는 오름차순 값이어야 한다 (1 and 5)
select name, salary
from instructor
where salary between 90000 and 100000;
14. Tupple : 두가지 이상 attribute 값을 비교시 사용할 수 있다.
Tupple의 attribute 위치에 맞게 비교하면 된다.
select name, course_id
from instructor, teaches
where (instructor.ID, dept_name) = (teaches.ID, 'Biology');
15. union : 합집합 연산으로, 중복이 제거되어 출력된다.
뒤에 all 명시시 중복제거가 이뤄지지 않는다.
(select course_id
from section
where semester = 'Fall' and year = 2009)
union
(select course_id
from section
where semester = 'Spring' and year = 2010);
16. intersect : 교집합 연산으로, 중복이 제거되어 출력된다.
뒤에 all 명시시 중복제거가 이뤄지지 않는다.
(select course_id
from section
where semester = 'Fall' and year = 2009)
intersect
(select course_id
from section
where semester = 'Spring' and year = 2010);
17. except : 차집합 연산으로, 앞 집합에서 뒤 집합데이터를 제거, 중복이 제거되어 출력된다.
뒤에 all 명시시 중복제거가 이뤄지지 않는다.
(select course_id
from section
where semester = 'Fall' and year = 2009)
except
(select course_id
from section
where semester = 'Spring' and year = 2010);
18. is null : null은 값이 아닌 상태를 의미하므로 비교연산이 불가하다.
is null로 null값에 해당되는 값을 찾을 수 있다.
is not null 키워드로 null 이 아닌 값을을 찾을 수 있다.
select name
from instructor
where salary is not null;
19. true, unknown, false : null값과 비교시 unknown 값이 출력될 수 있다.
OR : (unknown or true) = true
(unknown or false) = unknown
(unknown or unknown) = unknown
AND : (unknown and true) = unknown
(unknown and false) = false
(unknown and unknown) = unknown
NOT : (not unknown) = unknown
is unknown = true or false
20. avg : aggregate 함수, 특정 attribute colum 전체값의 평균값 반환
select avg(salary)
from instructor
where dept_name = 'Comp. Sci.';
21. min : aggregate 함수, 특정 attribute colum 전체값의 최소값 반환
select min(salary)
from instructor
where dept_name = 'Comp. Sci.';
22. max : aggregate 함수, 특정 attribute colum 전체값의 최대값 반환
select max(salary)
from instructor
where dept_name = 'Comp. Sci.';
23. sum : aggregate 함수, 특정 attribute colum 전체값의 합산 반환
select sum(salary)
from instructor
where dept_name = 'Comp. Sci.';
24. count : aggregate 함수, 특정 attribute colum 전체 개수 반환
select count(salary)
from instructor
where dept_name = 'Comp. Sci.';
select count(distinct ID)
from teaches
where semester = 'Spring' and year = 2010;
select count(*)
-- 주의! count(distinct *) 이런 문법은 안된다
from course;
25. group by : 특정 relation에서 특정 attribute 값들로 그룹을 묶어 표기한다.
다만, aggregate 함수 결과값, 또는 groub by의 attribute 값만 표기가 가능하다.
Q : Find the average salary of instructors in each dpartment
select dept_name, avg(salary)
from instructor
group by dept_name;
26. group by + having : group by 로 묶여진 상태에서 조건을 추가할 경우 사용된다.
다만, aggregate 함수 결과값, 또는 groub by의 attribute 값만 조건비교가 가능하다.
Q : Find the names and average salaries of all departments whose average salary is greater than 42000
select dept_name, avg(salary)
from instructor
group by dept_name
having avg(salary) > 42000;
'DB (DataBase)' 카테고리의 다른 글
쿼리문 임시저장소 (0) | 2021.04.12 |
---|---|
JDBC : Java(eclipse), DB(progresSql) 연결하기 (0) | 2021.04.12 |
SQL 쿼리문 정리 - Subquery (0) | 2021.04.07 |
SQL 쿼리문 정리 - BASIC (0) | 2021.04.05 |