[DB] 데이터 검색: SELECT 활용, 실행 순서

안녕하·2023년 11월 15일
0

데이터베이스

목록 보기
4/21

SELECT: 데이터 검색

1. 기본 검색

  • SELECT DISTINCT: 중복 제거
  • SELECT ALL: 중복 허용 (ALL 없어도 디폴트로 중복 허용)

기본형

SELECT 	[ALL | DISTINCT] 속성_리스트
FROM 	테이블 리스트;

예시

  • 모든 instructor의 이름 찾기
select name
from instructor



2. 조건 검색: WHERE

  • 조건식 사용

  • 논리 연산자 사용 가능: and, or, not

  • 비교 연산자 사용 가능: <, <=, >, >=, =, <>(같지 않다)

  • 수식 사용 가능

  • LIKE: 검색 조건 부분적으로 알 때 (정확히 알면 = 연산자)

    • % 0개 이상의 문자

      • LIKE '데이터%' 데이터로 시작하는 문자열
        LIKE '%데이터%' 데이터가 포함된 문자열
    • _ 1개의 문자

      • LIKE '데이터___' 데이터로 시작하는 6자 길이의 문자열

기본형

SELECT	[ALL | DISTINCT] 속성_리스트
FROM	테이블_리스트
[WHERE	조건];

예시

  • Comp. Sci 학과이고, salary가 70,000 이상인 모든 instructor 이름 찾기
select name
from instructor
where dept_name = 'Comp.Sci' and salary > 70000

  • 김 씨인 모든 instructor 이름 찾기
select name
from instructor
where name LIKE '김%'



3. 정렬 검색: ORDER BY

  • ASC: 오름차순 (디폴트)

  • DESC: 내림차순

  • 여러 개의 속성으로 정렬 가능


기본형

SELECT	[ALL | DISTINCT] 속성_리스트
FROM	테이블_리스트
[WHERE	조건]
[ORDER BY 속성_리스트 [ASC | DESC] ];

예시

  • 학과 우선 정렬, 학과가 같으면 이름 순서대로 정렬
select distinct name
from instructor
order by dept_name, nane



4. 집계 함수 검색: COUNT, SUM, AVG, MIN, MAX

  • SUM, AVG는 숫자 데이터 타입 속성에만 적용

  • 나머지는 문자, 날짜, 숫자 데이터 타입 모두 가능

  • null인 속성 값 제외하고 계산

  • WHERE 절에서 사용 불가

  • SELECT, HAVING 절에만 사용 가능


예시

  • 컴공 교수의 평균 월급
select avg (salary)
from insturctor
where dept_name='Comp.Sci';

  • course 테이블의 튜플 개수
select count (*)
from course;



5. 그룹 검색: GROUP BY HAVING

  • GROUP BY: 그룹을 나누는 기준이 되는 속성 지정

  • HAVING: 그룹에 대한 조건

  • WHERE와 구분하기


기본형

SELECT	[ALL | DISTINCT] 속성_리스트
FROM	테이블_리스트
[WHERE	조건]
[GROUP BY 속성_리스트 [HAVING 조건] ]
[ORDER BY 속성_리스트 [ASC | DESC] ];

예시

  • 학과별 평균 연봉
select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name;

  • 평균 연봉이 42,000보다 큰 학과에 한해서 instructor의 name과 해당 학과의 평균 연봉
select name avg(salary) as avg_salary
from insturctor
group by dept_name
having avg (salary) > 42000;



6. 조인 검색: JOIN

  • 두 릴레이션을 받아 하나의 릴레이션을 결과로 리턴한다

  • 특정 튜플을 이어 붙인다

  • 보통 from 절에서 서브 쿼리로 사용된다


  1. inner join

    • 테이블 간 교집합
  2. outer join

    • 정보 손실을 피함
    • left outer join (A-B)
    • right outer join (B-A)
    • full outer join (AUB)

기본형

SELECT	속성_리스트
FROM 	테이블1	LEFT | RIGHT | FULL OUTER JOIN 테이블2 ON [조인조건]
[WHERE	검색조건]

예시

course 테이블

prereq 테이블


  • inner join
course inner join prereq on
course.course_id = prereq.course_id

  • left outer join
course left outer join prereq on
course.course_id - prereq.course_id



7. 부속 질의문 검색: 서브 쿼리

  • SELECT 문 안에 또 다른 SELECT문

  • 부속 질의문은 괄호로 묶음

  • 부속 질의문은 ORDER BY 절 사용 불가

  • 상위 질의문보다 먼저 수행

  • 결과의 개수에 따라 단일 행 서브 쿼리, 다중 행 서브 쿼리로 나뉨


단일 행 서브 쿼리

  • 일반 비교 연산자 사용 가능

  • 하나의 행을 결과로 반환


다중 행 서브 쿼리

  • 일반 비교 연산자 사용 불가

  • 여러 행을 결과로 반환


다중 행 서브 쿼리에 사용 가능한 연산자

IN
질의문의 결과 값 중 일치하는 것이 있으면 참

NOT IN
질의문의 결과 중 일치하는 것이 없으면 참

EXISTS
질의문의 결과 값이 하나라도 존재하면 참

NOT EXISTS
질의문의 결과 값이 하나도 존재하지 않으면 참

ALL
질의문의 결과 값 모두가 비교한 결과가 참이면 만족 (비교 연산자와 사용)

ANY 또는 SOME
질의문의 결과 값 중 하나라도 비교한 결과가 참이면 검색 결과 만족 (비교
연산자와 사용)


예시

  • 2017년도 가을학기와 2018년도 봄학기 두 번 다 개설된 모든 course
    (set operation을 이용하면 더 쉽다)
select course_id
from section as S
where semester = 'Fall' and year= 2017 and
	exists (select *
			from section as T
            where semester='Spring' and year=2018
            	and S.course_id=T.course_id);

  • 첫 번째 컬럼은 학부 이름, 두 번째 컬럼은 속성 이름이 num_instructor인 교원 수
select dept_name,
	(select count(*)
    	from instructor
        where department.dept_name = instructor.dept_name)
	as num_instructors
from department;



SELECT 실행 순서

  1. FROM and JOIN

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. ORDER BY

  7. LIMIT


출처: 데이터베이스 개론, Database System Concepts

profile
세요

0개의 댓글