관계대수나 관계해석은 일반사용자가 이용하기 쉽지 않으므로 그 대안으로 나온 것이 Structured Query Language.
SQL은 IBM에서 개발한 연구용 관ㄱ 데이터베이스 관리 시스템인 SYSTEM R을 위한, 1974년에 개발된 SEQUEL에서 유래함.
많은 상용 관계 데이터베이스시스템이 개발되면서 서로 다른 질의어를 제공했기 때문에 이를 해결하기위해 ANSI와 ISO에서 SQL을 관계 데이터베이스의 표준 질의어로 채택함.
SQL은 DDL, DML, DCL로 나뉘어짐.
DCL은 데이터 제어어로써 데이터에 대한 접근 및 사용권한을 사용자별로 부여 취소하는 기능을 제공하는 언어, 데이터베이스 관리자가 주로 사용.
ON DELETE NO ACTION
은 외래키 정의할때 아무것도 입력하지 않으면, 적용되는 기능으로 참조받는 투플을 삭제하려고하면 다른 테이블에서 참조하고있는 투플이 있기 대문에 삭제가 안되게 되어있음.
ON DELETE CASCADE
라고 명시를 해주면 참조받는 투플을 삭제하면 참조하는 관련된 투플들을 모두 삭제함.
ON DELETE SET NULL
참조받는 투플을 삭제함녀 참조하는 관련된 투플들의 외래키의 값을 모두 NULL로 변경.
ON DELETE SET DEFAULT
이제 이건 무슨말하는지 알지?
데이터를 변경할때도 ON UPDATE ..
형식으로 명시하면 위와 같은 역할을 함.
// 예시
CREATE 아니면 ALTER
...
...
FOREIGN KEY(소속부서) REFERENCES 부서(부서번호)
ON DELETE CASCADE ON UPDATE CASCADE
// -> DELETE, UPDATE 시에 참조받는 투플을 삭제하면 관련된 참조하는 투플들을 모두 삭제
CHECK 키워드를 사용해 특정 속성에 대한 제약조건을 지정할 수 있다.
// 예시
CREATE TABLE 제품 (
제품번호 CHAR(3) NOT NULL,
제품명 VARCHAR(20),
재고량 INT,
단가 INT,
제조업체 VARCHAR(20),
PRIMARY KEY(제품번호),
CHECK(재고량 >= 0 AND 재고량 <= 10000)
);
CHECK 키워드를 사용해 CONSTRANINT 키워드와 함께 고유의 이름을 부여할 수 도 있다. 제약조건을 여러 개 지정할ㄸ ㅐ고유의 이름을 부여하면 테입르이 생성된 이후에 제약조건을 수정하거나 제거할 때 식별하기가 쉽다.
// 예시
CREATE TABLE 제품 (
제품번호 CHAR(3) NOT NULL,
제품명 VARCHAR(20),
재고량 INT,
단가 INT,
제조업체 VARCHAR(20),
PRIMARY KEY(제품번호),
CONSTRAINT CHECK_JAEGO CHECK(재고량 >= 0 AND 재고량 <= 10000)
);
COUNT(*)
는 모든 속성 값으로 구성된 투플을 대상으로 개수를 계산한다.
이 경우에는 속성 중 하나가 NULL 이더라도 일단 투플이 존재하면 개수로 친다.
그래서 투플 갯수를 반환할때 COUNT(*)
를 사용하는 것.
그러면 COUNT(나이)
라고하면 어떻게 될까?
속성 중에 나이
를 기준으로 투플의 개수를 계산한다.
만약에 어떤 투플이 나이
의 값이 NULL이면 계산하지않는다.
왜냐하면 집계함수는 NULL을 값으로 생각하지 않기 때문이다
+) COUNT(DISTINCT 제조업체)
는 제조업체의 중복을 제거하고나서 개수를 센 것. 닉네임을 붙이면 제조업체 수가 되겠다.
GROUP BY를 사용하면 그 속성을 기준으로 그룹으로 묶어서 연산 결과값을 보냄.
// 예시
SELECT 제조업체, COUNT(*) AS 제품수, MAX(단가) AS 최고가
FROM 제품
GROUP BY 제조업체;
// -> 제조업체를 DISTINCT해서 셀렉트하는거라고 생각하면됨.