4장 관계대수와 SQL ( SQL 개요, 데이터 정의어, SELECT문1/2)

< SQL 개요 >

- SQL : 1974 IBM R 시제품을 연구할 때 관계 대수 및 해석 기반으로 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 -> 1986 ANSI에서 SQL 표준을 채택

SEQUEL 이름으로 논문 발표 후 이름을 SQL로 바꿈

 

- SQL은 비절차절 언어이므로 내가 무엇을 원하는지만 DBMS에 알려줄 수 있음.

- DBMS는 SQL문을 내부적으로 관계대수들의 트리로 만들어서 밑에서부터 위로 올라가면서 수행

- 호스트언어 : JAVA, C 등

 

 

- SQL의 구성요소

DCL = 데이터 제어어 + 트랜젝션 제어

DML = 데이터 검색어 + 데이터 조작어

DDL = 데이터 정의어

 

제일 자주 쓰이는것 -> SELECT문. 여기서는 프로젝션으로 쓰임. 이 SELECT와 실렉션을 혼동하면 안된다!

 

- ALTER : 컬럼 추가, 제약조건 추가, 제약조건 삭제 등 다재다능함.

스키마 이름을 mydb, 주인이 kim

restrict : 마이디비속에 테이블이나 뷰가 하나라도 있으면 못지우게 하겠다

cascade : 지울 때 딸려있는것도 몽땅 지우겠다!

 

COMPANY의 데이터베이스라고 하면, 업무마다 서로 다른 릴레이션의 컬럼들이 필요할 수 있음.

-> 누군가가 테이블을 EMP라고 만들면 다른사람은 EMP라고 만들 수 없음

-> 그래서 스키마 개념은 mydb라는 스키마를 만들었다 : mydb 아래에 EMP를 둘 수 있음.
= 똑같은 파일을 다른 폴더 아래에 두는 것.

 

뭐 이런식으로 생성할 수 있음. 외래키 2개, DBMS에 맡기지 않아서 바보같은 코드임.

- INT 대신 NUMBER도 가능

- CHAR : 고정된 길이

- VARCHAR : 낭비를 막을 수 있음. ex) 댓글창에서 사용

- DATE : 굉장히 길게 저장되어 오히려 불편

- BLOB : 멀티미디어와 같이 큰 데이터 저장할 때 블랍이라 선언. 한 컬럼에 최대 4기가바이트

 

- 알다시피 기존 릴레이션에 새 컬럼을 추가할 때 not null옵션을 명시하면 안됨.

-> ALTER TABLE로 하는 것.

- 인덱스 생성 : 외래키와 기본키를 짝지어서 JOIN을 많이 하는데, 이 때 인덱스가 없으면 성능이 떨어질 수 있음
-> 외래키엔 자동으로 인덱스를 만들어주는 DBMS가 거의 없어서 사용자가 명시적으로 만들어주는 것.

 

- UNIQUE 제약조건 : 자동으로 인덱스를 만들어버리기 때문에 좋지 않음.

- CHECK : 한 테이블에 속하는 컬럼들 끼리 비교 가능

이런 저런 옵션들 지정이 가능.

 

 

이렇게 외래키에도 다 바꿔주는 것이 연쇄(cascade)

옵션을 지정함에 따라 달라진다.

EMPLOY와 DEPARTMENT가 서로를 참조하고 있다면,

-> 포린키를 지정하지 않고 일단 테이블을 만든 다음, ALTER TABLE해서 primary키가 뭐다, 포린 키가 뭐다 하는것 가능.

 

 

< Select 문 >

- 정의

관계 DB에서 정보 검색하는 SQL 문 -> 실렉션, 프로젝션, 조인, 카티션 곱 등을 결합한 것

- SELECT 및 FROM이 필수, 나머지는 선택 -> 표현 형식 다양

ORDER BY가 GROUP BY나 HAVING 앞에 올 수 없음. 나름의 언어이기에 문법 존재(오름차순)

 

- 별칭 : 어느 릴레이션에 속하는 테이블인지 구분하는 방법, AS 생략 가능

 

- SELECT문에서 *를 통해 모든 컬럼을 표현할 수 있음.

- 두 번째 이미지의 경우, 질의는 파이_DEPTNO, DEPTNAME (DEPARTMENT)가 될 것.

-> 간단해서 사실 쓸 일 없음

 

- 중복된게 2개 나오니까 릴레이션의 정의를 위배

-> 관계 DB의 테이블이 릴레이션의 정의와 반드시 일치하는 것은 아님.

-> 상이한 것을 보여달라는 DISTINCT를 사용할 수 있으나, 내부적으로 정렬해야하니 남용하지 말 것!

 

- WHERE : 실렉션임. 

질의를 써보자면 파이 _* (실렉션_dno=2 (EMP) )

-> 몽땅 보는 것이기 때문에 프로젝션 하지 않아도 됨.

 

- %는 0개 이상의 문자열과 모두 대응, ?는 한 개의 문자와 대응

-> % 기호는 좌우측에 모두, 동시에도 쓸 수 있음

ex) 학번이 인티저가 아닌 문자열이라면 2020% -> 20학번 전체가 조건

- SELECT절에서 부울연산 가능

- NOT 연산은 ! ~ 아니고 <>

- BETWEEN A AND B or 부등호로 범위연산 가능

- IN (1,3) = DNO = 1 or DNO = 3 -> 원소가 많으면 IN연산자 써야 간결한 질의가 됨.

 

- SELECT 문에서 산술연산 = 수식 -> 수식은 컬럼이 아닌 빈칸임 따라서 AS를 통해 이름을 지정해줘야함.

- 널값 : 현재 알 수 없는 값 or 적용할 수 없는 값

- 널값은 연산할 수 없고, 비교할 수 없음

- COUNT(*) : 모든 레코드의 개수를 세는 것 -> 값이 널인 레코드 포함.

 

 

- TRUE와 OR하면 언노운이라도 하나가 참이니까 결과도 참

- FALSE와 AND 하면 언노운이라도 하나가 거짓이니 결과도 거짓

- 언노운은 <> 해도 언노운

 

- 투플 삽입 순서이기에 사용자 입장에서는 랜덤한 순서라고 느낄 수 있음

- ORDER BY절을 통해 하나 이상의 컬럼을 지정해서 컬럼의 정렬결과 따라 검색 결과를 정렬 할 수 있음

- 디폴트는 ASC, DESC는 내림차순
-> 이미지에서 SALARY의 오름차순으로 정렬된걸 볼 수 있음

 

- 집단함수 : 여러 투플 집단에 적용됨. 엑셀에서 많이 봐왔을 것. SELECT절과 HAVING절에서만 사용 가능

 

- 그룹화 : 특정 컬럼 기준으로 데이터를 그룹화 하거나, 집단함수를 수행할 수 있음.

- DNO를 기준으로 1,2,3을 각 그룹화하여 AVG와 MAX를 나타낸 것.

 

- 해빙절은 그룹화를 했는데, 어떤 조건을 만족하는 결과만 출력하고싶을 때 사용

-> 해빙절에 사용되는 애트리뷰트는 반드시 GROUP BY의 대상 컬럼이거나, 집단함수에 있어야함.

- 해빙절을 통해서 샐러리 AVG가 2500000이상인 집단만 출력되었음.