본문 바로가기

Database

Database 6장-2

SQL의 기본적인 검색 질의어 SELECT문  

 

SQL은 table이 동일한 튜플을 갖는것을 허용하며 , relation은 집합이 아니구 중복을 허용하는 다중 집합구조이다. 하지만 일정 제약 조건 ( 키 제약조건, DISTINCT OPTION)으로 구분짓는게 가능하다
SELECT 검색할 column , from table명 , where 조건

select문은 select- from-where block으로 표현한다

 

attribute list : 질의어를 통해 검색하고자 하는 attribute
table list : 질의어를 통해 찾으려는 relation 이름
condition   : 질의어를 통해 찾으려는 검색조건

 

relationship relation (관계성 테이블) 각 Schema가 어떤 정보를 표현하고 어떤 관계를 갖는지 잘 알아야한다. John.B.smith의 생일과 주소를 찾아라= SELECT 생일, 주소 , FROM EMPLOYEE , WHERE 조건
테이블 찾고, 튜블 찾고, attribute 찾는 순서
5번부서에서 일하는 직원의 이름과 급여를 찾는 질의( SELECT Fname,Lname,Salary FROM EMPLOYEE WHERE Dno=5
남자거나 급여가 35,000보다 많은 사람의 last name과 급여를 찾는 질의 ( SELECT Lname, Salary FROM EMPLOYEE WHERE Sex=M OR Salary>35000)

 

Research부서에 근무하는 직원의 이름과 주소 검색 , DEPARTMENT 테이블을 보고 Dno가 5인 사람을 찾으면 된다
SELECT Fname, Lname, Address (Projection attribute) , FROM EMPLOYEE, DEPARTMENT , WHERE Dname='Research' AND DEPARTMENT.Dnumber=EMPLOYEE.Dno=>join condition이라고 부르고 WHERE문 조건 전체를 Selection condition이라고 부름. 이런 질의어를 join query라고 부른다. join query에서는 대부분 PK-FK관계로 결합되는 경우가 많고 그래야 문제가 생기지 않는다
두번째 쿼리
필요한 table은 3가지 (PROJECT ,DEPARTMENT, EMPLOYEE)
PROJECT에서는 Pnumber, Dnum DEPARTMENT에서는 PROJECT의 Dnum으로 Dnumber을 찾아간뒤 EMPLOYEE에서는 DEPARTMENT의 Mgr_ssn으로 Ssn을 찾아간뒤 Lname, Bdate, Address를 찾는다.
SELECT Pnumber,Dnum, Lname,Bdate,Address FROM DEPARTMENT,EMPLOYEE,PROJECT (순서는 상관 없다) WHERE Dnum = Dnumber AND Mgr_ssn = Ssn AND Plocation = 'Stafford'; (순서는 상관 없다)
Attribute이름의 모호성 해결방법으로 Tuple 변수.Attribute.이름 으로 해결할 수 있다. 명확성을 위해 모든 attribute앞에 talbe변수명을 붙여주는것이 좋다고 얘기한다.
쿼리 각 employee에 대해, employee의 first와 last name을 검색하고 직속 상사의 first와 last name도 검색해라. (Self-join-Query)
동일한 내용을 갖는 두개의 table로 생각하면 쉽게 해결이 가능하다. (E) 와 (S)로 테이블을 구분지어 놓았다.
SELECT E.Fname, E.Lname, S.Fname, S.Lname FROM EMPLOYEE AS E, EMPLOYEE AS S (AS를 이용해 별칭을 지어줌 생략가능) WHERE E.Super_ssn = S.Ssn;
WHERE문을 명세 안함 = 모든 조합을 다 찾는다
Astersisk ( * ) 사용 Attribute전체를 찾을 수 있도록 도와주는 의미

 
SQL에서 테이블의 집합성질


-SQL에서 테이블은 꼭 집합일 필요가 없어서 중복 튜플 생성되어도 자동으로 제거가 안됨(너무 비싼 연산 ㅠ, external sort)
-유저가 중복튜플에 대한 정보를 원할 수 도 있음
-집단함수의 경우 중복을 제거 하면 안됨
그래서 SQL은 중복을 제거할지 말지 유저에게 선택권을 준다!

쿼리 11, ALL은 중복을 검색, DISTINCT는 중복을 제거하고 보여준다
집합연산 합집합, 차집합, 교집합 그리고 합집합 전체, 차집합 전체, 교집합 전체 => 다중집합 연산
UNION한 결과 두개를 UNION시 Attribute 구조가 같으면 UNION COMPATIBLE(결합가능) 이라고 한다.
N이라는 기호는 왼쪽이 오른쪽에 있는 원소중 하나라면 TRUE, NOT IN은 포함되지 않는다면의 의미
쿼리4 Wong이 worker로서 참여한 프로젝트 또는 부서의 매니저로서 관리하는 프로젝트 정보를 찾는 질의 worker, manager경우로 나눈뒤 UNION한다
Essn = Ssn은 join condition
Wong의 Ssn으로 Mgr_ssn을 찾고 해당 Dnumber를 가지고 PROJECT의 Pnumber을 찾아간다.

SQL 질의어에서 패턴매칭 표현, 산술연산 , 결과 정렬

 

 

쿼리13 Product X 프로젝트에 참여한 직원의 급여를 10프로 인상시켜줬을때 결과값에 대한 질의 , 검색결과에 수식을 써줄수 있다(실제 데이터 값을 변경하는건 아니고 결과값만 표시해준다) 이 때 나오는 결과값은 Heading이 되지 않기 때문에 AS 를 이용해 이름을 지어주는 편이 보기좋다

쿼리결과 순서 정렬

 

부서별 정렬, 같은 부서내에선 이름순 정렬을 하라고 조건이 주어질때
ORDER BY 절을 이용 => 정렬키들을 명세 한다. ( 부서 번호별 정렬후, 마지막 이름 순서로 정렬후, 첫번째 이름순으로 정렬)
결국 ORDER BY절은 결과값에 대한 정렬이기 때문에 SELECT와 같은 subset을 가진다.

 

쿼리15 직원이 참여해서 일하는 프로젝트 이름을 부서순, 같은 부서내에선 이름순으로 정렬
오름차순 ASC, 내림차순 DESC, default는 ASC


SQL내에서 삽입,삭제,갱신

 

U1 은 모든 EMPLOYEE에 새로운 행을 새로 삽입한다 모든 Attribute값 다 들어감!
U1A 는 삽입하되 몇개의 정보만 넣기때문에 table옆에 삽입할 Attribute명을 써주어야한다.
-명세되지 않은 값은 DEFAULT값이나 NULL값을 가짐
-Attribute 순서와 값은 순서가 맞아야함
-table 옆 Attribute의 갯수만큼 써주었다면 추가적으로 같은 방식으로 추가적 튜플 삽입가능

 

U2 : 참조 무결성 위배, 삽입 거부당함

U2A : PK값이 NULL이 된채로 삽입되는 경우에도  거부당함


U3A : 테이블 생성!
U3B : INSERT INTO를 이용해 SELECT의 결과 값을 table에 집어 넣는것이 가능하다


삭제명령
-Lname이 Brown인 employee 삭제
-Ssn이 123456789인 employee 삭제
-5번 부서 직원 삭제
-EMPLOYEE 전부 삭제(전체 table삭제)
propagated deletion(연쇄 삭제) - referential triggered actions 문제가 발생할 수 있음 ㅠ 

갱신명령 UPDATE,SET,WHERE UPDATE에 명시된 table에 WHERE조건을 만족하는 튜플의 SET조건대로 값을 바꿔준다 새로운 값에 NULL or DEFAULT도 명세 가능

마지막으로 SQL의 3가지 문장은 한번에 한 table만 수정이 가능하다!! 여러개의 table에 대해 적용하는건 불가능,,ㅠ

'Database' 카테고리의 다른 글

Database 8장  (0) 2020.10.10
Database 7장-2  (0) 2020.10.02
DATABASE 7장  (0) 2020.09.26
Database 6장-1  (0) 2020.09.11
Database 5장  (0) 2020.09.07