

데이터가 서로 중복되지 않는 경우 -> '유일한 값을 가진다'



SUM/COUMT -> AVG
수치형만 가능
AVG로 평균값 구하기

NULL을 0으로 반환하여 평균값 계산하기


그룹화를 통해 집계함수의 활용범위를 넓힐 수 있다
지정된 열의 값이 같은 행이 하나의 그룹으로 묶인다
name 열로 그룹화하기

DISTINCT와 같이 중복을 제거하는 효과가 있다

name열을 그룹화하여 계산하기
GROUP BY구와 집계함수를 조합

집계함수는 where구의 조건식에서 사용X
-> where구의 검색 처리가 그룹화보다 앞순서이기 때문!!
-> HAVING을 사용하자

HAVING 구는 GROUP bY구 뒤에 기술하며 where구와 동일하게 조건식 지정이 가능하다

HAVING구로 걸러내어 검색하기

내부처리 순서
SELECT구보다 먼저 처리되는 구에서는 별명 사용 불가

아래의 명령은 실행이 불가능하다

그룹화에 지정한 열 외의 열은 집계함수를 사용하지 않고 select구에 지정불가







서브쿼리를 사용할 때는 select명령이 어떤 값을 반환하는지 주의해야한다
SELECT 명령이 하나의 값만 반환하는 것을 '스칼라 값을 반환한다'라고 한다!
DELETE FROM sample54 WHERE a = (SELECT MIN(a) FROM sample51);
여기에서 서브쿼리 부분은 스칼라 값을 반환하는 select명령으로 되어 있으므로 = 연산자를 사용해 열 a의 값과 비교가 가능하다!

UPDATE sample54 SET a = (select MAX(a) from sample54);












스칼라끼리 비교할 때는 = 연산자를 사용한다. 다만 집합 비교시는 사용 불가 -> IN을 사용하면 집합 안의 값이 존재하는지 조사 가능
열명 IN(집합)
OR로 사용할 때보다 훨씬 조건식이 깔끔해진다
IN을 사용해 조건식 기술하기

IN의 오른쪽을 서브쿼리로 지정하기

NOT IN의 경우, 집합 안에 NULL값이 있으면 왼쪽 값이 집합 안에 포함되어 있지 않아도 참을 반환하지 않는다 -> 결과가 '불명'이 된다
데베의 객체란 테이블,뷰,인덱스 등 데베 내에 정의하는 모든 것을 일컫는 말이다
객체 = 데이터베이스 내에 실체를 가진다

이름을 붙일때는 제약사항을 따른다

데이터베이스 객체는 스키마라는 그릇 안에서 만들어진다.-> 스키마가 다르면 이름이 같아도 됨

데이터만 삭제시 DELETE명령어 사용 where조건을 지정하지 않으면 모든 행 삭제 주의!!
열 추가
ALTER table 테이블명 ADD 열 정의

NOT NULL 제약이 걸린 열을 추가할 때는 기본값을 지정해줘야한다
열 속성 변경
ALTER TABLE 테이블명 MODIFY 열 정의

열 이름 변경
alter table 테이블명 CHANGE (기존열이름) (신규 열 정의)

열 삭제
alter table 테이블명 DROP 열명









열 p가 기본키인 테이블 생성

sample634에 행 추가하기

sample634에 중복하는 행 추가하기
기본키 제약에 중복되어 에러 표시

sample634를 중복된 값으로 갱신하기

기본키 제약이 설정된 열에는 중복된 값을 저장할 수 없다!
복수의 열로 기본키 구성하기
기본키로는 null값이 허용X
기본키를 구성하는 열은 복수라도 상관 X

인덱스는 테이블에 붙여진 색인이라고 할 수 있다.
인덱스의 역할은 검색속도의 향상으로 테이블에 인덱스가 지정되어 있으면 효율적으로 검색할 수 있으므로 where로 조건이 지정된 select 명령의 처리 속도가 향상된다.

인덱스는 테이블과는 별개로 독립된 데이터베이스 객체로 작성된다.
테이블을 삭제 -> 인덱스도 같이 삭제됨
풀 테이블 스캔
: 인텍스가 지정되지 않은 테이블 검색시 사용한다.
테이블에 저장된 모든 값을 처음부터 차례로 조사해 나가는 것
행이 1000건 -> 최대 1000건 값 비교
이진 탐색
: 차례로 나열된 집합에 대한 유효한 검색 방법
but 데이터가 미리 정렬되어 있어야함
집합을 반으로 나누어 조사하는 방법이다




풀 테이블 스캔으로 했다면 열 번 비교해야했지만 이진탐색이라 3회로 끝남
대량의 데이터 검색시 이진 탐색이 빠르다
이진 트리
: 테이블에 인덱스를 작성하면 테이블 데이터와 별개로 인덱스용 데이터가 저장장치에 만들어짐
이때 이진 트리라는 데이터 구조로 작성된다.

검색은 트리의 가지를 더듬어 가면서 행해진다.
원하는 수치와 비교해서 더 크면 오른쪽 가지를, 작으면 왼쪽의 가지를 조사해 나감
10이라는 값 검색하기



이진 트리에서는 집합 내에 중복하는 값을 가질 수 없다.
-> 같은 값을 허용하기 위해서는 제 3의 가지를 가져야함
-> 하지만 이진트리에서 '같은 값을 가지는 노드를 여러 개 만들 수 없다'라는 특성은 키에 대하여 유일성을 가지게 할 경우에만 유용
-> 주로 기본키 제약을 이진 트리로 인텍스를 작성함
CREATE INDEX
DROP INDEX


인덱스를 작성해두면 검색이 빨라짐
where구로 조건지정 -> select명령으로 검색하면 처리속도 빠름
인덱스를 사용해 검색하는지를 확인하는 명령


select명령 실행시 인덱스의 사용 여부를 선택하는 것은 내부의 최적화에 의해 처리되는 부분이다. 내부 처리에서는 select명령을 실행하기에 앞서 실행계획(where조건으로 지정되어 있으니 인덱스를 사용하자와 같은) 을 세운다.EXPLAIN명령은 이 실행계획을 확인하는 명령.

FROM구에서 기술된 서브쿼리에 이름을 붙이고 데이터베이스 객체화하여 쓰기 쉽게한 것을 '뷰'라함
본래 데이터베이스 객체로 등록할 수 없는 select명령을, 객체로서 이름을 붙여 관리할 수 있도록 한 것이 뷰다.
뷰는 select명령을 기록하는 데이터베이스 객체다!




뷰는 저장공간을 소비하지 않는 대신 CPU 자원을 사용한다.
뷰를 참조하면 -> SELECT 명령이 실행됨 -> 실행 결과 일시적 보존
뷰를 참조할 때마다 select명령이 실행된다.

머티리얼라이즈드 뷰
테이블에 보관 데이터양이 많은 경우, 뷰가 사용된다면 처리속도가 많이 떨어질 수밖에 없다.
뷰를 중첩해 사용해도 처리속도가 떨어짐.
이를 회피하기 위해 사용하는 것이 바로 머티리얼라이즈드 뷰
머티리얼라이즈드 뷰는 데이터를 테이블처럼 저장장치에 저장해두고 사용한다.(처음 참조되었을 때 데이터를 저장해두고 이후에 다시 그대로 사용함)
-> 매번 select명령을 실행할 필요X (다만 데이터 변경시에는 select명령어 재실행하여 데이터 저장해야함)
but mysql에서는 사용 불가 ㅠㅠ
함수 테이블
부모 쿼리와 어떤 식으로든 연관된 서브쿼리의 경우에는 뷰의 select 명령으로 사용불가
-> 이를 회피하기위해 함수 테이블을 사용
함수테이블은 테이블을 결괏값으로 반환해주는 사용자정의 함수이다.
지정한 인수의 값에 따라 where조건을 붙여 결괏값을 바꿀 수 있다. -> 서브쿼리처럼 동작 가능