3일째 DQL의 늪에서 허덕이고 있는 나.
조건에 따라서 출력하라면 만들 수는 있는데, 뭔가 무의식으로 하는 느낌이 강하다.
계속해서 정리하다 보면 깨달음이 오겠지..
무튼 오늘은 DQL의 심연과 DDL. DCL을 잠시 배워봤다. ( 평가 때문에..급하게 진도 뺌 )
- 그룹화 :
group by
,having
- 그룹 함수
- DDL
- DCL
- DML - ETC
DQL의 기본 구조는 다음과 같다.
select <컬럼명, 연산식, 리터럴> from 테이블
여기에 우리는 추가적으로 조건과 정렬을 붙여봤다. 거기서 좀 더 나아가, 특정 기준을 기반으로 데이터를 묶고, 조건에 따라 묶고자 한다. 그러나 한 가지 짚고 넘어갈 것이 DQL의 실행 순서이다.
우리가 그룹화까지 진행하게 되면 다음의 문장 구조를 가진다.
select 5 from 1 where 2 group by 3 having 4 order by 6
위의 입력된 숫자대로 실행되게 된다. 이에 따라 출력 결과가 달라질 수 있으니 주의해서 사용하자.
다시 본론으로 돌아와 그룹화를 알아보자.
: 특정 기준을 기반으로 데이터를 묶는다.
select dept_code from employee group by dept_code;
select emp_name, dept_code from employee group by dept_code;
select dept_code from employee group by dept_code;
select sum(salary) from employee group by dept_code;
select
case
when (2022 - (1900+substr(emp_no, 1,2))) between 30 and 39 then '30대'
when (2022 - (1900+substr(emp_no, 1,2))) between 40 and 49 then '40대'
when (2022 - (1900+substr(emp_no, 1,2))) between 50 and 59 then '50대'
else '60대'
end 연령대,
count(*) 인원
from
employee
group by
case
when (2022 - (1900+substr(emp_no, 1,2))) between 30 and 39 then '30대'
when (2022 - (1900+substr(emp_no, 1,2))) between 40 and 49 then '40대'
when (2022 - (1900+substr(emp_no, 1,2))) between 50 and 59 then '50대'
else '60대'
end
이때, 분류해둔 데이터에서 추출하기 때문에 select
에서 출력하는 데이터와 group by
로 묶은 양식이 일치해야 한다.
위와 같이 그룹화된 데이터는 실행 순서에 따라 where
로 조건을 걸 수 없다. 따라서 DQL 에는 그룹화된 데이터를 대상으로 적용되는 조건 문법이 있다.
: 그룹화된 데이터에 대한 조건을 걸 때 사용
부서별 급여합계가 1000만원 이하만 출력
select dept_code, sum(salary)
from employee
group by dept_code
having sum(salary)<=10000000 --group by에 대한 조건문
order by 1;
지난 시간 단일행 함수에 대해서 배웠다. 단일행 함수는 각 행 하나마다 적용되는 함수를 의미한다. 따라서 출력 결과도 각 행 별로 나오게 된다.
하지만 위에 보면, 그룹화된 데이터는 각 행별로 출력될 수 없다.
왜냐면 컴퓨터는 그룹화 된 데이터에서 특정 데이터를 고를 수 없기 때문이다.
따라서 그룹화 된 데이터를 대상으로 적용되는 함수가 있다.
: 특정 컬럼 전체에 한번에 적용되는 함수
1) sum(컬럼명) : 총합 함수
select sum(salary) from employee; --- 70096240
select to_char(sum(salary), 'L999,999,999') from employee; --- ₩70,096,240
2) avg(컬럼명) : 평균 함수
select round(avg(salary), 1) from employee;
3) count() : null값을 제외한 행의 개수를 계산해줌 (행 갯수 계산 목적)
select count(dept_code) from employee;
select count(*) from employee;
4) max() : 컬럼에서 최대치를 구한다. | min : 컬럼에서 최소치를 구한다.
select max(salary) as "최고연봉" from employee;
이렇게 DQL의 기본을 살펴보았다. 원래 여기서 더 나가야 하는데, 다음날 평가가 있는 사실을
강사님이 늦게 전달받았기 때문에, 급격하게 평가 범위 진도를 나가게 되었다.
: 객체를 생성, 수정, 삭제하는 명령어
: 객체를 생성하는 명령어
[ 계정 생성 ]
create user OO identified by OO;
[ 테이블 생성 ]
create table cafe(
컬럼명 자료형 제약조건
);
객체를 만들면서, 우리는 들어오는 데이터에 대한 조건을 걸 수 있다.
이게 ‘제약 조건’이다.
① not null
: 데이터의 공백을 방지하기 위한 조건
insert into
로 값을 입력하지 않으면 에러가 난다. not enough values
create table cafe(
pid number not null,
pname varchar(30) not null,
price number not null
);
활용법
create table cafe(
pid number not varchar,
pname varchar(30) not number,
);
이런 식으로 여러 조건으로 활용이 가능.
② primary key : 식별자 데이터의 중복을 막기 위한 조건
not null
+ 중복 방지create table cafe(
pid number primary key — 컬럼 레벨 주키 설정
);
create table cafe(
pid number,
pname varchar(30) not number,
primary key(pid, pname) — 테이블 레벨 주키 설정
);
컬럼 레벨 : 한 데이터에만 주키를 줄 때 사용.
테이블 레벨 : 여러 개의 컬럼을 혼합해서 주키를 줄 때 사용.
예외상황 : 주키 설정한 컬럼에 중복 데이터를 입력하면 발생한다.
unique constraint (account.SYS_C007022) violated
③ unique : 데이터의 중복을 방지하기 위해 사용
unique not null
로 사용하고 이는 primary key
와 같다.create table cafe(
pid number primary key,
pname varchar(30) unique not null,
price number unique not null
);
④ check : 컬럼 안에 들어갈, 값을 통제.
[ 특징 ]
check
로 설정하면 설정된 데이터만 넣을 수 있다.check + 조건식
create table cafe(
pid number primary key,
pname varchar(30) unique not null,
price number not null,
iced varchar(1) check (iced in ('Y', 'N')) not null
);
⑤ Foreign key(외래키) : 데이터 무결성을 유지하기 위한 수단
primary key
unique
로 제약되어야 한다.컬럼명 references 테이블(부모컬럼)
create table product(
pid number primary key,
);
create table sales_history(
sid number primary key,
pid references product(pid),
sdate date default sysdate not null
);
pid references product(pid)
해당 코드가 실행되면, 부모 테이블로 가서 데이터를 확인하고 받아온다.
쉽게 말하면 부모 테이블에 존재하는 값만 받도록 하는 목적으로 사용한다.
문제는 부모키를 삭제할 때 일어난다.
데이터 무결성을 위해 부모 키를 삭제하면 전 테이블 안에 그 값이 남아있으면 안 된다.
그러나, 자식 키에 그 값이 남아있다.
따라서 부모 키를 삭제하기 위해선 3가지 방법이 있다.
1) 외래키 제약조건을 없앤다. - references 제거
2) 자식 레코드를 지운 뒤, 부모 레코드를 지운다.
3) 자식 테이블 자체를 재생성하고 옵션을 준다.
on delete cascade
: 부모 키 삭제 시, 연결된 자식 키도 함께 삭제create table sales_history(
sid number primary key,
pid references product(pid) on delete cascade,
sdate date default sysdate not null -- default 는 제약조건 앞에만 가능
);
on delete set null
: 부모 키 삭제 시, 모든 자식 키의 값을 null
로 세팅create table sales_history(
sid number primary key,
pid references product(pid) on delete set null,
sdate date default sysdate not null
);
: 객체를 삭제하는 명령어
drop | 지울 객체 유형 | 객체명;
drop table cafe;
: 자동으로 순차적으로 증가하는 순번을 반환하는 DB객체
nocache
는 설정하는 것이 좋다. 캐시가 있으면 메모리에 미리 올려놓기 때문에 의도치 않은 값이 들어갈 수 있다..
을 통해 메서드 활용이 가능하다.create sequence [시퀀스명]
start with [시작점] -- 예) start with 1 “1부터 시작”
increment by [증감숫자] -- 1씩 증가한다. (변경 가능)
maxvalue -- 최대값 || nomaxvalue — 최대값 없음
minvalue — 최소값 || nominvalue – 최소값 없음
nocache;
-- 활용
insert into cafe values(cafe_seq.nextval, 'Orange Juice', 4000, 'Y');
: 객체 또는 데이터에 대한 접근 권한을 생성, 수정, 삭제하는 명령어
: 계정 생성 후, 해당 계정에 권한을 부여할 때 사용한다.
grant connect, resource to admin;
connet
: 접근권한resource
: 자원 생성: 객체가 아닌 데이터를 넣을 때 사용하는 명령어.
insert into <테이블명> values (입력값);
into
values()
와 함께 사용된다.insert into <테이블명> (컬럼명) values (입력값);
: 데이터를 지울 때 사용하는 명령어.
delete from <테이블명> where 조건;