기초 SQL 소개
SQL Data-Definition Language (DDL)
SQL은 각 릴레이션의 스키마(schema), 속성의 도메인(domain), 무결성 제약 조건(integrity constraints)을 정의할 수 있다.
Domain Types in SQL
- char(n): 고정된 크기의 문자열 (n 바이트)
- varchar(n): 최대 n 바이트의 가변 길이 문자열
- int, smallint: 정수형 데이터
- numeric(p,d): 소수점 이하 d자리까지 표현하는 숫자
- real, float(n): 실수형 데이터
Create Table Construct
테이블을 생성할 때 사용된다.
CREATE TABLE r (
Ai Di, -- Ai: 속성 이름, Di: 데이터 타입
...
);
Integrity Constraints in Create Table
무결성 제약 조건을 설정할 수 있다.
- Primary Key: (A1, ..., An ) → 기본 키 설정
- Foreign Key: (Am, ..., An ) REFERENCES r → 외래 키 설정
- NOT NULL: 특정 속성이 NULL 값을 가질 수 없도록 제한
예시:
FOREIGN KEY (dept_name) REFERENCES department
- department 테이블에 dept_name 속성이 반드시 존재해야 함.
Updates to Tables
Insert (삽입)
INSERT INTO instructor VALUES ('10211', 'Smith', 'Biology', 66000);
- 테이블에 데이터를 추가할 때 사용된다.
- 테이블의 속성 순서와 동일해야 한다.
Delete (삭제)
DELETE FROM student;
- WHERE 절 없이 실행하면 모든 튜플이 삭제되므로 주의해야 한다.
Drop Table (테이블 삭제)
DROP TABLE r;
- 테이블 자체를 삭제한다.
Alter (테이블 구조 변경)
ALTER TABLE r ADD A D;
ALTER TABLE r DROP A;
- 속성을 추가하거나 삭제한다.
- 속성을 삭제할 경우 부작용이 발생할 수 있어 일부 DBMS에서는 제한한다.
Basic Query Structure
SELECT A1, A2, ..., An
FROM r1, r2, ..., rm
WHERE P;
- Ai: 선택할 속성
- Ri: 릴레이션
- P: 조건 (Predicate)
- SQL 질의 결과는 또 다른 릴레이션으로 반환됨.
Cartesian Product 적용: 쉼표(,)를 사용하여 다중 테이블을 FROM 절에 나열하면 카테시안 곱이 수행됨. 이후 WHERE 절에서 특정 조건을 만족하는 데이터를 찾는다.
The SELECT Clause
SQL은 기본적으로 중복을 허용하므로, DISTINCT 키워드를 사용하여 중복된 결과를 제거할 수 있다.
반면, ALL 키워드를 사용하면 중복이 제거되지 않는다.
- (asterisk)는 "모든 속성(all attributes)"을 의미한다.
SELECT * FROM instructor;
FROM 절이 없는 SELECT
속성을 리터럴로 지정할 수 있으며, 이때 FROM 절이 없으면 하나의 행과 한 개의 열을 가진 결과가 반환된다.
SELECT '437';
결과:
'437' |
437 |
AS 키워드를 사용하여 열의 이름을 지정할 수도 있다.
SELECT '437' AS FOO;
결과:
FOO |
437 |
FROM 절이 있는 리터럴 SELECT
리터럴을 FROM 절과 함께 사용하면, 해당 테이블의 튜플 개수만큼 동일한 값이 반복된다.
SELECT 'A' FROM instructor;
결과:
instructor 테이블의 튜플 개수(N)만큼의 행이 생성되며, 각 행의 값은 "A"로 동일하다.
The WHERE Clause
WHERE 절은 결과가 충족해야 하는 조건을 지정하는 역할을 한다.
- 관계 대수의 selection predicate(선택 술어)에 해당한다.
- 논리 연산자 AND, OR, NOT을 사용할 수 있다.
- 비교 연산자 <, <=, >, >=, =, <> (!=)를 활용하여 조건을 설정할 수 있다.
- 산술 표현식의 결과에 대한 비교도 가능하다.
예제 1: 특정 학과 소속 교수 검색
컴퓨터 과학(Comp. Sci.) 학과 소속 교수의 이름을 조회하는 SQL 쿼리:
SELECT name
FROM instructor
WHERE dept_name = 'Comp. Sci.';
• To find all instructors in Comp. Sci. dept with salary > 70000
**select** name
**from** instructor
**where** dept_name = 'Comp. Sci.' **and** salary > 70000
예제 2: 특정 학과 및 급여 조건을 만족하는 교수 검색
컴퓨터 과학(Comp. Sci.) 학과에 속하면서 급여가 70,000 이상인 교수 조회:
SELECT name
FROM instructor
WHERE dept_name = 'Comp. Sci.' AND salary > 70000;
and 연산의 순서는 앞에 논리연산이 수행된 이후에 뒷 논리연산이 실행된다.
The FROM Clause
FROM 절은 쿼리에서 사용되는 관계(relation)를 나열하는 역할을 한다.
- 관계 대수의 Cartesian product(교차 곱, 카테시안 곱) 연산에 해당한다.
- 두 개 이상의 테이블을 나열하면, 모든 가능한 튜플 조합을 생성한다.
예제 1: 교차 곱(Cartesian Product) 수행
instructor 테이블과 teaches 테이블의 모든 가능한 조합을 생성하는 SQL 쿼리:
SELECT *
FROM instructor, teaches;
위 쿼리는 instructor 테이블의 모든 튜플과 teaches 테이블의 모든 튜플을 결합한 결과를 생성한다.
모든 속성을 포함한 instructor × teaches 결과가 반환된다.
공통 속성(예: ID)이 있는 경우, 결과 테이블에서는 속성이 테이블명.속성명 형식으로 변경된다. 예: instructor.ID, teaches.ID
WHERE 절과 함께 사용
교차 곱은 단독으로 사용할 경우 의미가 없지만, WHERE 절을 활용하면 유용한 정보를 추출할 수 있다.
즉, 관계 대수에서 selection 연산과 결합하여 의미 있는 데이터 추출이 가능하다.
Instructor and Course Queries
1. 모든 강의 이력이 있는 교수의 이름과 강의 ID 조회
강의를 담당한 적이 있는 모든 교수의 이름과 해당 강의의 course_id를 조회하는 SQL 쿼리:
SELECT name, course_id
FROM instructor, teaches
WHERE instructor.ID = teaches.ID;
instructor 테이블과 teaches 테이블을 조인하여 강의를 한 적이 있는 교수만 선택한다.
instructor.ID = teaches.ID 조건을 사용하여 두 테이블의 공통 속성인 ID 값을 기준으로 결합한다.
결과에는 교수 이름(name)과 강의 ID(course_id)가 포함된다.
2. Art 학과 소속이면서 강의를 담당한 교수의 이름과 강의 ID 조회
Art 학과 소속이면서 강의를 한 적이 있는 교수의 이름과 해당 강의의 course_id를 조회하는 SQL 쿼리
SELECT name, course_id
FROM instructor, teaches
WHERE instructor.ID = teaches.ID
AND instructor.dept_name = 'Art';
instructor.ID = teaches.ID 조건을 이용해 교수와 강의 정보를 연결한다.
AND instructor.dept_name = 'Art' 조건을 추가하여 Art 학과에 속하는 교수만 필터링한다.
결과에는 Art 학과 교수들의 이름(name)과 강의 ID(course_id)가 포함된다.
The Rename Operation (AS)
SQL에서는 AS 절을 사용하여 테이블(관계) 또는 속성(컬럼)의 이름을 변경할 수 있다.
- 기본 형식: AS 키워드는 선택 사항이며 생략 가능하다. 1. 속성(컬럼) 이름 변경
- old-name AS new-name
교수(instructor) 테이블에서 **ID, 이름(name), 월급(monthly_salary)을 조회하는 SQL 쿼리:
SELECT ID, name, salary / 12 AS monthly_salary
FROM instructor;
salary / 12의 결과를 monthly_salary로 별칭(alias)을 지정하여 조회한다.
- AS 키워드는 선택 사항이며 생략 가능하다.
2. 테이블 이름 변경 (별칭 사용) 테이블에 별칭(alias)을 부여하여 사용할 수도 있다.
SELECT T.ID, T.name
FROM instructor AS T;
또는 AS를 생략하여 작성할 수도 있다.(권장안함)
SELECT T.ID, T.name
FROM instructor T;
instructor 테이블을 T라는 임시 이름(alias)으로 변경하여 사용한다.
복잡한 쿼리에서 테이블 이름을 짧게 줄여 가독성을 높이는 데 유용하다.
SQL String Matching and Operations
SQL은 문자열 비교를 위한 문자열 패턴 매칭 연산자를 제공한다.
1. 문자열 패턴 매칭 연산자 -> like안쓰면 문법 오류
- % : 임의의 문자열과 일치 substring
- 어떠한 문자열도 다 의미한다.
- _ : 단일 문자와 일치
- LIKE : 특수 문자를 활용하여 패턴을 지정하는 비교 연산자
2. 패턴 매칭 예시 -> 대소문자 구분을 한다!!
- "Intro%" → "Intro"로 시작하는 모든 문자열과 일치
- "%Comp%" → "Comp"가 포함된 모든 문자열과 일치
- "___" → 정확히 3개의 문자로 구성된 문자열과 일치
- "___%" → 최소 3개 이상의 문자를 가진 문자열과 일치
3. 특정 문자열 포함 여부 확인
이름에 "dar"이 포함된 모든 교수 조회
select name
from instructor
where name like '%dar%'
4. 특수 문자 % 검색
문자 "100 %"와 정확히 일치하는 문자열 검색
like '100 \%'; (escape '\' )
5. 문자열 관련 함수
SQL은 다양한 문자열 조작 기능을 제공한다.
5.1 문자열 연결 (Concatenation)
- || 연산자를 사용하여 문자열을 연결할 수 있다.
5.2 대소문자 변환
- UPPER() : 대문자로 변환
- LOWER() : 소문자로 변환
5.3 문자열 길이 및 부분 문자열 추출
- LENGTH() : 문자열 길이 반환
- SUBSTRING(str, position, length) : 부분 문자열 추출
Ordering the Display of Tuples
- 이름을 알파벳 순으로 정렬하기
- 강사(instructor) 테이블에서 중복을 제거한 모든 강사의 이름을 오름차순(기본값)으로 정렬할 수 있다.
- 정렬 순서 지정
- 기본값은 오름차순(ascending, ASC)이다.
- 내림차순 정렬을 원하면 DESC를 사용한다.
- ORDER BY 절에서 ASC(오름차순) 또는 DESC(내림차순)를 명시하여 정렬 순서를 지정할 수 있다.
- 여러 속성을 기준으로 정렬예를 들어, 학과명(dept_name)을 우선 정렬한 후, 같은 학과 내에서는 이름(name)을 기준으로 정렬할 수 있다.
- 정렬 기준을 두 개 이상 지정할 수도 있다.
Where Clause Predicates
Data-Centric Computing Laboratory
- BETWEEN 연산자 SQL에서는 BETWEEN 연산자를 사용하여 특정 범위 내의 값을 비교할 수 있다.
- 예를 들어, 급여(salary)가 $90,000 이상 $100,000 이하인 강사를 찾으려면 BETWEEN을 사용하면 된다.
- 이는 salary >= 90000 AND salary <= 100000 과 동일한 의미를 가진다.
select name
from instructor
where salary between 90000 and 100000
- 튜플 비교(Tuple Comparison) SQL에서는 여러 개의 속성을 한 번에 비교할 수도 있다.
- 예를 들어, instructor와 teaches 테이블을 조인(join)하여 강사의 ID가 일치하고, 학과가 ‘Biology’인 경우를 찾을 수 있다.
- 튜플 비교는 (속성1, 속성2) = (값1, 값2) 형식으로 사용되며, 여러 조건을 한 번에 확인할 때 유용하다.
이러한 WHERE 절의 조건들은 데이터 검색 시 원하는 조건을 효율적으로 적용하는 데 도움을 준다.
select name, course_id
from instructor, teaches
where (instructor.ID, dept_name) = (teaches.ID, ’Biology’);
Set Operations
집합 연산(Set Operations)
중복 제거하므로 필요시 all 필요하다.
SQL에서는 UNION, INTERSECT, EXCEPT 연산을 사용하여 여러 결과 집합을 조합하거나 필터링할 수 있다.
- UNION → 두 결과 집합을 합집합(중복 제거)
- INTERSECT → 두 결과 집합의 교집합(공통된 값만 유지)
- EXCEPT → 첫 번째 결과 집합에서 두 번째 결과 집합에 포함된 요소를 제거(차집합)
- 각 연산은 기본적으로 중복을 제거하지만, 중복을 유지하려면 UNION ALL, INTERSECT ALL, EXCEPT ALL을 사용해야 한다.
- 예제
- 2017년 가을(Fall 2017) 또는 2018년 봄(Spring 2018)에 개설된 강의 조회
- (SELECT course_id FROM section WHERE sem = 'Fall' AND year = 2017) UNION (SELECT course_id FROM section WHERE sem = 'Spring' AND year = 2018);
- 2017년 가을과 2018년 봄 모두 개설된 강의 조회
- (SELECT course_id FROM section WHERE sem = 'Fall' AND year = 2017) INTERSECT (SELECT course_id FROM section WHERE sem = 'Spring' AND year = 2018);
- 2017년 가을에 개설되었지만 2018년 봄에는 개설되지 않은 강의 조회
- (SELECT course_id FROM section WHERE sem = 'Fall' AND year = 2017) EXCEPT (SELECT course_id FROM section WHERE sem = 'Spring' AND year = 2018);
이러한 집합 연산은 여러 개의 SQL 쿼리를 조합하여 더 강력한 데이터 검색을 수행하는 데 유용하다.
Null Values
Data-Centric Computing Laboratory
- Null 값이란?
- 튜플의 일부 속성은 NULL 값을 가질 수 있다.
- NULL은 알려지지 않은 값 또는 존재하지 않는 값을 의미한다.
- NULL이 포함된 모든 산술 연산의 결과는 NULL이 된다.
- 예: 5 + NULL → NULL
- IS NULL을 사용한 검사
- = 연산자로 NULL을 비교할 수 없으며, **IS NULL*을 사용해야 한다.
- 예제: 급여(salary)가 NULL인 강사 찾기
- SELECT name FROM instructor WHERE salary IS NULL;
Null Values and Three-Valued Logic
- NULL을 포함한 비교 연산의 결과
- NULL과의 어떤 비교 연산도 unknown(알 수 없음)으로 평가된다.
- 예:
- 5 < NULL → unknown NULL <> NULL → unknown NULL = NULL → unknown
- NULL과의 어떤 비교 연산도 unknown(알 수 없음)으로 평가된다.
- 세 가지 논리값(True, False, Unknown) 사용
- NULL을 포함하는 논리 연산은 세 가지 논리값(True, False, Unknown)을 따른다.
unknown OR true true unknown OR false unknown unknown OR unknown unknown true AND unknown unknown false AND unknown false unknown AND unknown unknown NOT unknown unknown - WHERE 절에서 unknown은 false로 간주되므로 해당 조건을 만족하는 튜플은 반환되지 않는다.
- 즉, NULL 값이 포함된 조건을 명확히 처리해야 한다.
Aggregate Functions
1개의 row 나 스칼라값을 반환한다.
- 집계 함수(Aggregate Functions)
- 집계 함수는 관계(relation)의 특정 열(column)에 대해 여러 값들의 집합(multiset)에 연산을 수행하고 단일 값을 반환한다.
- 주요 집계 함수:
- AVG : 평균값
- MIN : 최소값
- MAX : 최대값
- SUM : 합계
- COUNT : 값의 개수
- 예제
- 컴퓨터공학과(Comp. Sci.) 강사의 평균 급여 조회
- SELECT AVG(salary) FROM instructor WHERE dept_name = 'Comp. Sci.';
- 2018년 봄(Spring 2018) 학기에 강의를 담당한 강사의 수 조회
- SELECT COUNT(DISTINCT ID) FROM teaches WHERE semester = 'Spring' AND year = 2018;
- course 관계에 존재하는 튜플의 총 개수 조회
- SELECT COUNT(*) FROM course;
집계 함수는 데이터 요약 및 분석에 매우 유용하며, GROUP BY와 함께 사용하여 그룹별 집계도 가능하다.
'CS 지식 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 관계 대수(Relational algebra)와 기본적인 SQL (0) | 2025.03.12 |
---|---|
[데이터베이스] DB, DBMS의 소개 (0) | 2025.03.07 |
댓글