< 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이상인 집단만 출력되었음.
'UOS@DB' 카테고리의 다른 글
4장 관계대수와 SQL(트리거, 내포된 SQL) (1) | 2023.11.05 |
---|---|
4장 관계대수와 SQL(SELECT 및 삽입 삭제 수정문) (0) | 2023.11.05 |
4장 관계대수와 SQL (4.1 관계대수) (0) | 2023.11.04 |
3장 오라클 (1) | 2023.11.03 |
2장 관계 데이터 모델과 제약조건 (1) | 2023.10.16 |