Additional Operation

youngwiki
Pinkgo (토론 | 기여)님의 2025년 4월 2일 (수) 10:20 판 (Set Operation)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

상위 문서: SQL

개요

SQL은 그 기본적인 문법을 바탕으로 다양한 여러 연산들을 지원한다.

Rename 연산

SQL 내에서 사용되는 relation의 이름들과 속성(attribute)의 이름들은 from 절에 있는 relation으로부터 유도된다. 하지만 이러한 방식으로 relation과 속성의 이름들을 사용할 때에는 예기치 못한 문제나 불편함이 발생할 수 있다. 따라서 SQL은 relation과 속성(attribute)의 이름을 "as" 구문을 사용하여 이름을 바꾸는 것을 하용한다.

old_name as new_name

이때 as는 select 절과 from 절 양쪽에서 사용될 수 있다.

as 절은 relation의 이름을 바꾸는 데 특히 유용하다. relation의 이름을 바꾸는 한 가지 이유는 긴 릴레이션 이름을 더 짧고 질의의 다른 부분에서 사용하기 더 편한 이름으로 바꾸기 위함이다. 예를 들어, “대학에서 어떤 과목이든 가르친 적이 있는 모든 교수들의 이름과 그들이 가르친 과목의 ID를 구하라.”와 같은 질의는 아래와 같이 간단하게 나타낼 수 있다.

select T.name, S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;

relation 이름을 바꾸는 또 다른 이유는 같은 relation 내의 튜플들을 서로 비교하고자 할 때이다. 이 경우, 하나의 relation과 자기 자신과의 데카르트 곱(Cartesian product) 을 수행해야 하므로, 두 튜플을 구분하기 위해 다른 이름을 사용해야 한다. 예를 들어, “급여가 생물학(Biology) 학과에 속한 어떤 교수보다 높은 교수들의 이름을 구하라.”와 같은 질의는 아래와 같이 나타낼 수 있다.

select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';

이때 키워드 as는 사용하는 것이 선택적이며, 누락될 수도 있다. 이는 아래 예시가 잘 보여준다.

instructor T --instructor as T와 같은 뜻

String Operation

SQL에서는 문자열을 작은따옴표로 감싸서 지정한다. 예를 들어 'Computer'는 문자열을 의미한다. 문자열 내에 작은따옴표 문자가 포함되어야 하는 경우, 작은따옴표를 두 번 연속으로 써서 지정할 수 있다. 예를 들어 문자열 'Its right'는 다음과 같이 표현한다:

'It''s right'


또한 SQL은 SQL은 문자열에 대해 다양한 함수를 허용한다. 예를 들어 다음과 같은 작업들이 가능하다:

  • 문자열 연결(concatenation): ∥ 연산자를 사용
  • 부분 문자열 추출(substring)
  • 문자열 길이 측정
  • 문자열을 대문자로 변환: upper(string)
  • 소문자로 변환: lower(string)
  • 문자열 끝의 공백 제거: trim(string)

Pattern matching

SQL에서는 like 연산자를 사용하여 문자열에서 패턴 매칭(pattern matching) 을 수행할 수 있다. 이때 패턴매칭은 대소문자를 구분한다. 패턴은 두 가지 특수 문자를 이용해 정의된다:

  • 퍼센트 기호(%): 어떤 길이의 문자열이든 부분 문자열로 일치함.
  • 언더스코어(_): 아무 문자 하나와 일치함.

패턴 매칭의 예시는 다음과 같다:

  • 'Intro%': “Intro”로 시작하는 문자열과 일치
  • '%Comp%': “Comp”라는 부분 문자열이 포함된 문자열과 일치
  • '_ _ _': 정확히 세 글자인 문자열과 일치 (_가 3개)
  • '_ _ _%': 최소 세 글자 이상인 문자열과 일치

SQL에서는 like 비교 연산자를 사용하여 패턴 매칭을 사용한다. 예를 들어, “건물 이름에 ‘Watson’이 포함된 모든 학과의 이름을 찾아라.”와 같은 query(질의)는 아래와 같이 작성된다.

select dept_name
from department
where building like '%Watson%';

패턴에 %나 _과 같은 특수 문자 자체를 포함하고자 할 경우, SQL은 이스케이프 문자(escape character) 를 지정할 수 있도록 허용한다. 이스케이프 문자는 특수 문자 앞에 붙여, 해당 문자를 일반 문자로 취급하도록 한다. like 비교에서 이스케이프 문자를 지정하려면 escape 키워드를 사용한다. 예를 들어, 백슬래시(\)를 이스케이프 문자로 사용할 경우 다음과 같다:

like 'ab\%cd%' escape '\' --"ab%cd"로 시작하는 모든 문자열과 일치
like 'ab\\cd%' escape '\' --"ab\cd"로 시작하는 모든 문자열과 일치

또한 SQL에서는 like 대신 not like 연산자를 사용하여 일치하지 않는 문자열을 찾을 수도 있다.

Attribute Specification in the Select Clause

select 절에서는 별표 기호(*) 를 사용하여 "모든 속성" 을 의미할 수 있다.

select instructor.*
from instructor, teaches
where instructor.ID = teaches.ID;

위 질의는 instructor.*는 instructor 릴레이션의 모든 속성을 선택한다는 의미이다. 또한 select *과 같은 표현은, from 절에서 추출한 모든 테이블에서 모든 속성을 선택한다는 의미이다.

Ordering the Display of Tuples

SQL은 사용자가 릴레이션에서 튜플이 출력되는 순서를 어느 정도 제어할 수 있도록 한다. order by 절은 질의 결과에 포함된 튜플들이 정렬된 순서로 나타나게 만든다. 예를 들어, 물리학(Physics) 학과의 모든 교수를 알파벳 순으로 나열하려면 다음과 같이 작성한다:

select name
from instructor
where dept_name = 'Physics'
order by name;

기본적으로 order by 절은 항목들을 오름차순(ascending order) 으로 나열한다. 이때 desc 키워드로 내림차순, asc 키워드로 오름차순으로 정렬 순서를 명시적으로 지정할 수 있다.

또한, 여러 속성을 기준으로 정렬할 수 있다. 예를 들어 instructor relation 전체를 급여(salary) 기준으로 내림차순 정렬하고, 같은 급여를 받는 교수들끼리는 이름(name)을 오름차순 정렬하고자 한다고 하자. 이 질의는 다음과 같이 SQL로 표현할 수 있다:

select *
from instructor
order by salary desc, name asc;

Where-Clause Predicates

between 연산자

SQL은 between 비교 연산자를 포함하고 있어, 어떤 값이 특정 값보다 작거나 같고, 다른 값보다 크거나 같은지를 명시하는 where 절을 더 간단하게 작성할 수 있게 해준다. 예를 들어, 급여(salary)가 $90,000에서 $100,000 사이인 교수들의 이름을 찾고자 할 때, 다음과 같이 between을 사용하여 작성할 수 있다:

select name
from instructor
where salary between 90000 and 100000; --salary <= 100000 and salary >= 90000; 대신 사용될 수 있음

비슷하게, not between 비교 연산자를 사용할 수도 있다.

Row Constructor

SQL은 (v1, v2, ..., vn) 형태의 표기법을 사용하여, v1, v2, ..., vn이라는 값들을 포함하는 크기 n의 튜플(tuple) 을 나타낼 수 있도록 하며, 이 표기법은 row constructor 라고 불린다. 비교 연산자들은 튜플에 대해서도 사용 가능하며, 아래와 같이 사용된다.

select name, course_id
from instructor, teaches
-- 아래는 다음 명령어를 대체함. where instructor.ID = teaches.ID and dept_name = 'Biology';
where (instructor.ID, dept_name) = (teaches.ID, 'Biology');

튜플의 비교 연산은 사전식 순서를 따른다. 이는 두 개의 튜플 (a1, a2)와 (b1, b2)가 있을 때

(a1, a2) < (b1, b2)

와 같은 수식이 있다면, 아래와 같은 규칙을 따른다는 뜻이다.

  1. 먼저 a1과 b1을 비교
  2. 만약 a1 < b1 이면, 전체 튜플도 작음 → true
  3. 만약 a1 > b1 이면, 전체 튜플도 큼 → false
  4. 만약 a1 = b1 이면 → 그다음 요소인 a2와 b2를 비교

즉, 왼쪽의 속성부터 차례로 비교하며, 차이가 생기는 순간 그 비교로 결론을 내리는 방식이다.

각주