# SQL의 내장 타입(data type)
char(n) : 사용자가 지정하는 길이 n을 갖는 고정 길이 문자열.
varchar(n) : 사용자가 지정하는 최대 길이 n을 갖는 가변 길이 문자열.
int : 정수(기계 종속적인 정수의 유한 부분 집합).
smallint : 작은 정수(정수 도메인 타입의 기계 종속적인 부분 집합.
numeric(p,d) : 사용자가 지정하는 정확도를 갖는 고정 소수점 수.
수는 p개의 숫자로 구성. p개의 숫자에서 d개는 소수점의 오른쪽에 있음.
real, double precision : 기계 종속적인 정확도를 가지는 이동 소수점 수와 기계 종속 수준 두 배의 정확도를 지닌 이동 소수점 수. 부동 소수점 표현.
float(n) : 적어도 n개의 숫자의 정확도를 가지는 이동 소수점 수.
# SQL 질의의 기본 구조
select A1, A2, ..., An
from r1, r2, ..., rm
where P
Ai : 속성
Ri : 릴레이션
P : 조건
- SQL 질의의 결과는 릴레이션
# select 절
- 질의의 결과 속성을 나열
- 관계 대수 연산 해당
- 대/소문자 구분하지 않음
- SQL 은 질의 결과에서 중복 허용
- 중복 제거 할 경우, select 뒤에 distinct 라는 키워드 삽입
- 모든 교수들의 소속 학과를 찾고 중복 제거
select distinct dept_name
from instructor
- 키워드 all : 중복 제거하지 않음 (default)
select all dept_name
from instructor
- 별표 “*” 는 select절에서 모든 속성
select *
from instructor
- The select 절은 상수나 투플들의 속성들에 적용되는 +, –, *, / 연산자를 포함하는 산술적인 표현들을 사용
select ID, name, salary/12
from instructor
-> instructor 릴레이션에 아무런 변화 없음
# where 절
- where 절은 결과가 충족해야 하는 특정 조건 지정
- 관계 대수의 선택 연산에 해당
- 컴퓨터과학과에서 급여가 80000이 넘는 모든 교수의 이름을 구하라
select name
from instructor
where dept_name = ‘Comp. Sci.' and salary > 80000
- 논리적인 접속사 and, or, not 사용 가능
- 비교 연산자 <, <=, >, >=, =, <> 사용가능
# from 절
- from 절에 질의를 수행하기 위해 접근해야하는 릴레이션들 나열
- 관계 대수 카티션 곱 연산
- instructor X teaches 의 카티션 곱
select *
from instructor, teaches
=> 모든 instructor – teaches 투플들 결합
- 카티션 곱은 적합하지 않지만 where절 조건에서 사용됨 (관계 대수 선택 연산)
# 조인
- 대학 내에 있는 수업을 하는 모든 교수에 대해, 그들의 이름과 그들이 가르치는 수업 아이디를 구하라
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID
- 컴퓨터과학과에서 제공하는 각 교과목의 course ID, semester, year, title를 구하라
select section.course_id, semester, year, title
from section, course
where section.course_id = course.course_id and dept_name = ‘Comp. Sci.'
# 자연 조인
- 자연 조인은 두 릴레이션의 스키마에서 나타나는 속성의 값이 같은 투플의 짝만을 고려함. 공통인 속성이 먼저 나열.
select *
from instructor natural join teaches
- 자연 조인의 위험 : 속성을 잘못 동일시함
- 모든 교수들의 이름과 그들이 가르치는 수업의 제목을 나열하라
- 잘못된 버전(course.dept_name 와 instructor.dept_name 속성을 동일시함)
select name, title
from instructor natural join teaches natural join course
- 옳은 버전
select name, title
from instructor natural join teaches, course
where teaches.course_id= course.course_id
- Join … using 명령 : 속성 이름들의 목록 필요
select name, title
from (instructor natural join teaches) join course using(course_id)
# Rename 연산 : as
- SQL은 결과 릴레이션에서 속성의 이름을 재명명할 수 있음 :
old-name as new-name
select ID, name, salary/12 as monthly_salary
from instructor
- 적어도 컴퓨터과학과 한 교수보다 급여가 많은 모든 교수들의 이름을 구하여라.
select distinct T. name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = ‘Comp. Sci.’
- 키워드 as 는 생략 가능
instructor as T => instructor T
# 문자열 연산
- SQL은 문자열 비교를 위한 문자열 일치 연산자 포함.
- 연산자 “like”는 두 개의 특수 문자를 사용하여 나타냄 :
퍼센트 (%) : % 문자는 어떠한 부분 문자열과도 일치한다.
밑줄 (_) : _ 문자는 어떠한 한 문자와도 일치한다.
- 이름에 “zar”이라는 부분 문자열이 포함 된 교수의 이름을 구하여라
select name
from instructor
where name like '%zar%’
- Escape 키워드 이용하여 “100 %” 문자열 찾기
like ‘100 \%' (escape '\')
- SQL은 다양한 문자열 연산 지원
문자열 병합 (using “||”)
대문자, 소문자로 변환하기
문자열 길이 찾기, 부분 문자열 추출, 문자열 끝의 공백 제거
# 투플 출력의 순서 : order by
- 모든 교수들을 알파벳 순서로 나열
select distinct name
from instructor
order by name
- 내림차순은 desc, 오름차순은 asc(default)
order by name desc
- 여러 속성 정렬 가능
order by dept_name, name
# between 비교 연산자
급여가 $90,000과 $100,000 사이에 있는 교수들의 이름
(>= $90,000 and <= $100,000)
select name
from instructor
where salary between 90000 and 100000
# 집합 연산 : 중복 제거
union : or (또는)
intersect : and (모두 만족하는)
except : but not (차집합)
# 널 값 – 값 아님. symbol
- 투플은 특정 속성에 대해 null 값 가질 수 있음
- null 은 알 수 없는 값을 나타내거나 값이 존재하지 않음을 의미
- null 과 관련된 수학 연산식의 결과는 null
예 : 5 + null 는 null
- is null 은 널 값인지 확인
예 : 급여가 null인 모든 교수들을 찾아라.
select name
from instructor
where salary is null
# Unknown
- null 값을 포함하는 비교의 결과를 unknown 으로 처리
예 : 5 < null or null <> null or null = null
- unknown 값 부울 연산 :
OR :
(unknown or true) = true,
(unknown or false) = unknown
(unknown or unknown) = unknown
AND :
(true and unknown) = unknown,
(false and unknown) = false,
(unknown and unknown) = unknown
NOT :
(not unknown) = unknown
“P is unknown” 는 P가 unknown으로 판명되면 true
- where 절의 투플에 대한 값이 false 나 unknown으로 판명되면,
그 투플은 결과에 포함하지 않는다.
# 집계 함수
- 릴레이션 열의 값의 다중집합을 입력 값으로 가지며, 결과값으로는 단일 값을 가짐
avg : 평균
min : 최소값
max : 최대값
sum : 총합
count : 개수
group by : 각 학과별 평균 급여를 구하라
select dept_name, avg (salary) as avg_salary
from instructor
group by dept_name;
집계되지 않고 select 절에 나타나는 속성은 오직 group by절의 속성
having 절 : 각각의 그룹에 대해 적용됨
평균 급여가 얼마 이상인 학과의 교수들의 평균 급여를 구하라
select dept_name, avg (salary)
from instructor
group by dept_name
having avg (salary) > 42000;
# 널 값과 부울 값과의 집계
- count(*)를 제외한 집계 함수는 입력 값에서 null 값 무시
- 빈 집합이 적용되었을 때
count는 0으로 정의
모든 집계 함수들은 null 값 반환