SQL은 HOW가 아닌 WHAT을 요구하는 non-procedural(비절차적), declarative(선언적) language
SELECT statement
- DB로부터 정보 검색 시 사용하는 basic statement
- relational algebra(절차적 언어)의 "selection" operation이랑 동일하지 않다.
- Practical model(or, SQL)과 formal relational model(or, relational calculus/algebra) 사이의 중요한 구별
- SQL 쿼리 결과로 table이 모든 attribute 값에서 동일한 두 개 이상의 tuple을 가지는 것을 허용한다. (중복 허용)
- tuple들의 multiset (= resultset) : bag이라고도 부른다.
- query result에서 unique하게 row를 식별하기 위해 row ID (artificial identifier)가 사용될 수 있다.
- The basic form of the SELECT statement, or a SQL "query"
SELECT
절FROM
절WHERE
절위에서 보는 바와 같이, SQL 질의는 어떻게 데이터를 찾아오라고 하지 않고 무슨 데이터를 검색하기 원하는지 기술할 수 있게 한다.
그래서 비절차적, 선언적 (non-procedural, declarative) 언어라고 부른다.
- Q. Retrieve the birth date* and address** of the EMPLOYEE(s) whose name is 'John B. Smith'
WHERE절의 조건을 만족하는 FROM절의 EMPLOYEE의 개별 tuples를 선택하고, SELECT절에 있는 Bdate, Address attributes를 projection(특정 열을 선택하여 결과로 반환)한다.
Query result
- Q. Retrieve the name and address of all EMPLOYEEs who work for the 'Research' DEPARTMENT
- selection condition : 어떤 table을 선택할 것인지 명시한다.
- join condition : 2개 이상의 table을 join
- 위의 예시에서는 Dnumber(DEPARTMENT의 PK), Dno(EMPLOYEE의 FK)
- Called a select-project-join(SPJ) query
- Q. For every project located in ‘Stafford’, list
- the project number,
- the controlling department number, and
- the department manager’s last name, address, and birth date.
- Dnum(PROJECT의 FK), Dnumber(DEPARTMENT의 PK) -> 첫 번째 JOIN
- Mgr_ssn(DEPARTMENT의 FK), Ssn(EMPLOYEE의 PK) -> 두 번째 JOIN
In EMPLOYEE: Dno -> Dnumber | Lname -> Name
In DEPARTMENT: Dname -> Name
- 모호성 제거를 위해 다음과 같이 기술한다.
- But, Table name을 붙임으로써 모호성을 제거하였지만, Query를 작성하는 성능의 저하를 초래할 수 있다.
-> "Aliasing"이 필요함
모호성을 제거하기 위해 일종의 별칭을 사용한다.
같은 관계를 두 번 참조하는 쿼리의 경우에서 attribute의 name이 모호할 수 있다.
Query : "For each employee, retrieve the employes's first and last names and the first and last names of his/her supervisor."
Self-join
aliasing를 위한 권장 사항
Query result
The attribute names can also be renamed
WHERE
clause in a QueryWHERE
절이 없는 경우FROM
절에서 참조된 table의 Cartesian product의 결과SELECT E.Ssn FROM EMPLOYEE E
SELECT Ssn, Dname FROM EMPLOYEE, DEPARTMENT
SQL은 query 결과를 automatically하게 동일한 tuple을 제거하지 않는다.
- Formal한 SQL에서는 중복을 제거한다.
- 만약 query result에서 제거를 원한다면 ?
-> 중복이 제거됨
UNION
(set union), EXCEPT
(set difference), INTERSECT
(set intersection)A Query Example
“Make a list of all project numbers for projects that involve an employee whose last name is ‘Smith’, either as a worker or as a manager of the department that controls the project.”
부분 문자열 패턴 매칭
LIKE
비교 연산자 : 문자열 패턴 매칭을 위해 사용한다.
Attribute value가 '%'나 '_'를 포함하고 있는 경우 앞에 '\'를 추가한다.
산술 연산
SELECT
절의 부분으로써 포함될 수 잇다.BETWEEN
comparison operator질의 결과 정렬
ORDER BY
clauseDESC
: 내림차순ASC
: 오름차순Insert
UPDATE
DELETE
+ INSERT
로도 실행이 가능DELETE
쉽게 말하면, 테이블에 하나 이상의 행을 추가할 때 사용한다.
attribute는 CREATE TABLE
에서 지정된 순서대로 나열해야 한다.
data type에 대한 제약 조건은 자동으로 관찰된다.
DDL statement에 정의된 무결성 제약 조건이 강제된다.
NULL값을 포함한 모든 값들이 attribute 순서에 맞게 제공되어야 한다.
다음과 같이 사용자가 Command에서 제공한 값에 해당하는 attribute에 지정할 수도 있다.
명시되지 않은 attribute에 대해서는 DEFAULT
or NULL
로 set된다.
여러 tuple을 insert
하며 새로운 테이블을 만들 때 query result에서 값을 가져와 넣을 수도 있다.
- 많은 tuples를 "bulk-loading(대용량 적재)"하는 경우에도 사용할 수 있다.
- 새로운 table (say, D5EMPS)은 이미 존재하는 table(say, EMPLOYEE)와 동일한 attribute를 가진다.
이 때,LIKE
andWITH DATA
를 이용해서 생성한다.- 또한, 전체 데이터를 적재할 수 있다.
- Table 생성과 적재를 동시에 수행했다.
- EMPLOYEE table을 그대로 만들고, query의 결과를 data로 load하며
Insert
를 하는 Query
WHERE
절을 통해 제거할 tuple을 선택 CASCADE
가 명시되어 있다면 삭제할 tuple을 참조하는 모든 tuple도 삭제된다.WHERE
절이 없는 경우DROP TABLE table_name
WHERE
절을 만족하는 table의 rows의 갯수에 의존한다.WHERE
절로 수정할 tuple을 선택한다.SET
절을 사용하여 수정할 속성 및 그들의 새로운 값들을 지정한다. (UPDATE할 값을 지정하는 역할)UPDATE
할 경우 다른 table의 tuple의 FK값에도 전파될 수 있다.
P.Dnum = 5
를 참조하는 다른 tuple의 attribute 값도 변경해야 한다.
Reference
Database System Concepts | Abraham Silberschatz
데이터베이스 시스템 7th edition