본문 바로가기

학교공부/데이터베이스

데이터베이스 4-2 SQL

관계대수 - SQL로 둘다 표현 할줄 알아야한다.

 

디비전자는 편의를 위해 만들어진거다. 필수 연사자로 디비전을 만들어보자 (여집합 사용, 시험문제)

 

 

 

 

 

 

인터페이스는 두개

대화식은 콘솔창 이용해서 사용

아래는 호스트 언어 + 내포된 SQL

 

 

 

 

검색 & 조작

INSERT DELETE UPDATE 조작

SELECT 검색

 

 

 

 

데이터 정의어

 

인스턴스가 아닌 스키마를 제거 변경 생성

 

 

AUTHORIZATION 소유자

RESTRICT 스키마안에 데이터 없을 때 삭제

CASCADE 걍 다 삭제

 

밑에 세줄은 무결성 제약조건 거는거??

찾아볼것

 

 

 

 

고정길이 -> 공간 낭비

가변길이 -> 비교할때 힘듬

그래서 보통 길이가 안변하고, 비교가 많은건 고정길이로 저장

 

 

 

 

 

제약조건

NOT NULL :  null 허용 안함 default로는 허용함

UNIQUE : 중복 허용안함

default check primary key foreign key 등 등등

 

 

 

이런식으로 두개 사용해서 제약할 수도 있음.

 

 

삭제할때 네가지 모드

 

 

 

 

 

 

 

 

 

 

 

 

기본적인 SQL 질의

 

 

 

별칭 사용 가능

 

 

DISTINCT 사용하면 중복된 데이터 삭제됨, unique하게 만들어버림

 

특정 투플 검색 비교연산자 다양한거 사용가능

 

 

문자열 비교

문자열 비교할때만 LIKE 사용    %,- 사용

이% -> 이씨성

이- ->성이 이씨인 외자사람들

 

ex)

SELECT *

FROM EMPLOYEE AS E,

DEPARTMENT AS D

WHERE D.DNO = 2;

 

 

다수 검색 조건 

 

요런건 잘못된거

 

위에거는 알맞는거임 ㅇㅇ

 

 

요런식으로도 가능

 

 

IN사용하면 연산자 쓸필요없이 편하게 사용가능

 

 

 

 

 

 

SELECT절에 산술 연산 가능

 

 

 

널값

 

널값을 포함한 다른 값과 널값을 연산하면 결과는 널값

COUNT(*)를 제외한 집단 함수들은 널값을 무시함

// count는 튜플개수 세는건데 얘는 null포함해서 세준다

어떤 애트리뷰트에 들어 있는 값이 널인가 비교하기 위해서 DNO = NULL 처럼 나타내면 안됨

 

잘못된 표현

NULL > 300 

NULL <> 300 

이런거 그냥 다 결과는 NULL 따라서 위의 식을 아래와 같이 변경해 줘야한다.

 

반대는 IS NOT NULL

 

null하고 연산

true = 1, false = 0, unknown = 0.5 C1 AND C2 = min(C1, C2)

C1 OR C2 = max(C1, C2)

NOT(C1) = 1 ‐ C1

산술 연산으로도 표현 가능

 

 

 

ex)

범위 비교할 때

SALARY BETWEEN  300 AND 400

1,3 아닌 부서

DNO NOT IN (1, 3)

 

 

 

SELECT 애트리뷰트 list => expression list

FROM

WHERE ....

 

expressioin : 단일 값을 나타내는 식

- 애트리뷰트 : DNO

- 산술식 : SALARY * 1.5

 

CASE 애트리뷰트 when 값1 THEN 값x

                          when 값2 THEN 값y

                          else 값z

end

 

 

 

만약 

SELECT EMPNAME, SALARY

FROM EMPLOYEE,

에서 salary에 따라 다르게 출력하고 싶다면 어떻게 할까?

 

SELECT EMPNAME, case

when salary > 500 then '와우'

when salary < 100 then '에휴~'

else '오케이'

end

FROM EMPLOYEE

 

 

 

10/8

 

nullisfirst nullislast로 지정할수도있음

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

HAVING

 

 

 

ex) 만약 직급 순서대로 출력하고싶으면 어칼까?

SELECT *

FROM EMPLORYEES

ORDER BY TITLE; 

하면 가나다순으로 오름차순되어버림

따라서

ORDER BY CASE TITLE WHEN '과장' THEN 1

                             WHEN '대리' THEN 2

else

end 

이런식으로하면 됨

 

 

 

A
1
2
3
null

SUM(A)는 6

AVG(A)는 2

null값 무시

COUNT(A)는 3

COUNT(*) = 4  여기서만 특별하게 null포함

 

 

 

 

 

두개 이상의 릴레이션에서 검색

 

 

 

 

 

결과는 밑에 테이블에서 EMPNAME하고 DEPTNAME 프로젝션한거임

 

 

 

자체조인

 

과정

결과

 

 

 

select *

from A, B

where A.x = B.y

 

select *

from A INNER JOIN B ON A.x > b.y and A.xx = B.yy;

 

OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN CROSS JOIN(카티션 곱)

 

UNION  / UNION ALL      # ALL하면 중복제거안함.

INTERSECT / INTERSECT ALL #ALL하면 중복허용 { A A B} {A A A B} 면 {A A B} (all)

 

 

별칭은 AS ""로 표현 별칭에 공백없으면 ""생략가능

 

DESCRIVE employees ( 테이블 구조 보임 live sql에서는 그냥 메뉴에 schema 검색)

 

릴레이션이나 스키마 애트리뷰트는 대소문자 구분 안함

 

 

인덱스란 key 값 pointer 쌍들의 집합. 튜플 식별자 

 

Unnamed constraint 삭제할라면 어카지?

사용자를 위한 공간과 데이터베이스 자체를 위한 메타공간은 다르게 저장된다.

시스템 카탈로그나 data 딕셔너리에 직접 접근해서 삭제한다. 

 

 

% 0개이상 

- 하나

 

%영% 영들어간 모든이름