INSERT, DELETE, UPDATE문

INSERT문은 기존의 릴레이션에 투플을 삽입하는 질의이다. 참조되는 릴레이션에 투플이 삽입되는 경우에는 참조 무결성 제약조건의 위배가 발생하지 않으나 참조하는 릴레이션에 투플이 삽입되는 경우에는 참조 무결성 제약조건을 위배할 수 있다. 

 

INSERT

INTO 릴레이션(애트리뷰트1, ...., 애트리뷰트n)

VALUES (값1, ... , 값n);

 

DELETE문은 한 릴레이션으로부터 한 개 이상의 투플들을 삭제한다. 참조되는 릴레이션의 삭제 연산의 결과로 참조 무결성 제약조건이 위배될 수 있으나, 참조하는 릴레이션에서 투플을 삭제하면 참조 무결성 제약조건을 위배하지 않음

DELETE FROM 릴레이션 WHERE 조건;

 

UPDATE문은 한 릴레이션에 들어 있는 투플들의 애트리뷰트 값들을 수정한다. 기본 키나 외래 키에 속하는 애트리뷰트의 값이 수정되면 참조 무결성 제약조건을 위배할 수 있다.

UPDATE 릴레이션

SET 애트리뷰트 = 값 또는 식[ , ...]

WHERE 조건;

 

트리거와 주장

트리거란 명시된 이벤트가 발생할 때마다 DBMS가 자동적으로 수행하는, 사용자가 정의하는 문이다. 데이터베이스의 무결성을 유지하기 위한 도구이며, 트리거를 이벤트-조건-동작(Event-Condition, Action) 규칙이라고도 부른다.

CREATE TRIGER <트리거 이름>

AFTER <트리거를 유발하는 이벤트> ON <릴레이션> [WHEN <조건>]

BEGIN <SQL문(들)> END;

 

이벤트의 가능한 예는 테이블에 삽입, 삭제, 수정등이 있다.

 

주장이란 제약조건을 위반하는 연산이 수행되지 않도록 하는 것이다.

CREATE ASSERTION 이름 CHECK 조건;

일반적으로 두 개 이상의 테이블에 영향을 미치는 제약조건을 명시하기 위해 사용된다.

 

SQL문 실습

1. 급여가 $12,000를 넘는 사원의 이름과 급여를 표시

 

...더보기

SELECT last_name, salary FROM employees WHERE salary>=12000; 

- 급여가 $12,000를 넘어야 하므로 이를 위한 WHERE 조건절을 추가하였다.

 

2. 사원 번호가 176인 사원의 이름과 부서 번호를 표시

 

...더보기

SELECT last_name,department_id FROM employees WHERE employee_id=176;

- 사원 번호가 176이어야 하므로 이를 위한 WHERE 조건절을 추가하였다.

 

3.급여가 $5,000에서 $12,000 사이에 포함되지 않는 모든 사원의 이름과 급여를 표시

 

...더보기

SELECT last_name,salary FROM employees WHERE salary<5000 or salary > 12000;

- 5,000미만 12,000초과이므로 or로 조건을 엮어주었다.

 

4. 2007년 2월 20일과 2007년 5월 1일 사이에 입사한 사원의 이름, 업무 ID 및 시작일을 표시하되, 시작일을 기준으로 오름차순으로 정렬하는 질의

 

...더보기

SELECT last_name,job_id,hire_date FROM employees WHERE hire_date between DATE'2007-02-20' and DATE'2007-05-01' ORDER BY hire_date;

-날짜는 DATE'YYYY-MM-DD'와 같은 꼴로 사용을 해야한다. 따라서 두 범위를 between으로 나타내었고, 이를 order by로 정렬하였다.

 

5. 부서 20 및 50에 속하는 모든 사원의 이름과 부서 번호를 이름을 기준으로 영문자순으로 표시

 

...더보기

SELECT last_name,department_id FROM employees WHERE department_id=20 or department_id=50 ORDER BY last_name;

-부서 번호 20, 50에 속하는 사원들을 출력해야 해서 WHERE문을 사용했고, 영문자순으로 표시해야하므로 order by를 사용했다.

 

6.급여가 $5,000와 $12,000 사이이고 부서 번호가 20 또는 50인 사원의 이름과 급여를 나열하고, 열 레이블을 Employee와 Monthly Salary로 각각 지정

 

...더보기

SELECT last_name "Employee", salary "Monthly Salary" FROM employees WHERE (salary between 5000 and 12000 ) and (department_id=20 or department_id=50);

- 열 레이블을 지정할 때 As를 사용하긴 하지만 위와 같이 생략을 했다. 위에서 계속 사용했던 조건들을 and를 사용해서 동시에 해당하도록 하였다.


7.1994년에 입사한 모든 사원의 이름과 입사일을 표시

...더보기


SELECT last_name,hire_date FROM employees WHERE hire_date between DATE'1994-01-01' and DATE'1994-12-31';

- 1994년만 지정해주려고 했으나 딱히 떠오르지 않아 1월 1일부터 12월 31일까지 범위로 진행하였다.

 

8.관리자가 없는 모든 사원의 이름과 업무 ID를 표시

 

...더보기

SELECT last_name,job_id FROM employees WHERE manager_id is NULL;

- 관리자 없다는 것은 관리자 번호가 NULL임을 의미한다.

 

9.커미션을 받는 모든 사원의 이름,급여 및 커미션을 급여 및 커미션을 기준으로 내림차순으로 정렬하여 표시

 

...더보기

SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct is not NULL ORDER BY salary,commission_pct DESC;

- 커미션을 받지 않는 사람들은 NULL로 표시되어 있기에 is not NULL로 값을 찾았고 내림차순으로 정렬해야 했으므로 DESC를 사용했다.

 

10.이름의 세 번째 문자가 a인모든사원의이름을표시

 

...더보기

SELECT last_name FROM employees WHERE last_name like '__a%';

- 문자열 매칭에서 %는 여러개를 뜻하고, _는 한 글자를 뜻한다.

 

11.이름에 a와 e가 있는 모든 사원의 이름을 표시

 

...더보기

SELECT last_name FROM employees WHERE last_name like '%a%' and last_name like '%e%';

-이름에 a나 e가 있기만 하면 되므로 양 쪽에 %를 사용해서 찾았다.

 

12. 업무가 영업 사원(SA_REP)또는 사무원(ST_CLERK)이면서급여가 $2,500, $3,500 또는$7,000가 아닌 모든 사원의 이름, 업무 및 급여를 표시

 

...더보기

SELECT last_name,job_id,salary FROM employees WHERE job_id='SA_REP' or job_id='ST_CLERK')  and (salary not in (2500,3500,7000));

- 급여의 조건이 2,500 , 3,500 , 7,000과 같이 되어 있으므로 in을 사용해서 조건을 주었다.

 

13.커미션 비율이 20%인 모든 사원의 이름, 급여 및 커미션을 표시

 

...더보기

SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct=0.2;

-커미션 비율이 20%라는 것을 where 절에 주도록 한다.

'Lecture Note > DataBase' 카테고리의 다른 글

[강의노트_DB]14. SQL-4  (0) 2019.07.04
[강의노트_DB]13. SQL-3  (0) 2019.07.02
[강의노트_DB]11. SQL-1  (0) 2019.06.25
[강의노트_DB]10. 관계 대수-2  (0) 2019.05.09
[강의노트_DB]9. 관계 대수 - 1  (1) 2019.05.07

+ Recent posts