일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- HTTP Status 500
- JavaScript
- git
- jQuery
- rownum
- ||
- 제약조건
- github
- HTTP Status 404
- Oracle SQL
- HTML
- Oracle DB
- 성적프로그램
- JSP
- 답변형 게시판
- 과정평가형
- sql developer
- SQL
- CRUD
- 모조칼럼
- 부트스트랩
- group by
- distinct
- 한글 인코딩
- tomcat
- Bootstrap
- 이클립스
- Java
- oracle
- alias
초급의 끄적거림
[SQL] 시퀀스 / distinct / 조건절 본문
[테이블 준비단계]
1) 테이블을 만들기 위해 스크립트 작성
⊙ 굳이 엑셀이 아니어도 됨. - 자신이 알아볼 수 있는 스크립트를 작성함 (칼럼명, 제약조건, DATA타입 등)
⊙ 위의 스크립트를 기반으로 만든 create 문
create table sungjuk(
sno number primary key
,uname varchar2(50) not null
,kor number(3) check (kor between 0 and 100)
,eng number(3) check (eng between 0 and 100)
,mat number(3) check (mat between 0 and 100)
,tot number(3) default 0
,aver number(5,2) default 0
,addr varchar2(30) check(addr in ('Seoul', 'Jeju', 'Suwon', 'Busan'))
,wdate date default sysdate
);
default |
칼럼에 데이터가 입력되지 않은 경우, 자동으로 default 뒤에 있는 것이 입력 (ex. default 0) |
|
[관계형 DB에서 테이블의 핵심기능] |
||
C |
Create |
insert문 |
R |
Read |
select문 |
U |
Update |
update문 |
D |
Delete |
delete문 |
[자동으로 일련번호 부여]
⊙ 일련번호를 넣을 때 굳이 지정하지 않고 자동으로 만들 수 있음
⊙ Oracle : 시퀀스
⊙ M*SQL : identity
[시퀀스 (sequence)]
1) 정의 : 연속적인 숫자값을 자동으로 증가시키는 숫자를 발생시키는 객체
2) 생성
create sequence 시퀀스 이름 |
시퀀스 이름 지정 |
increment by 숫자 |
몇 숫자 단위로 증가하는가 |
start with 숫자 |
시작하는 숫자 |
maxvalue 숫자 |
최대값 |
minvalue 숫자 |
최소값 |
cycle | nocycle |
일련번호 순환여부 |
cache | nocache |
빠른 처리를 위해 시퀀스의 값을 미리 받아둠, 서버가 꺼졌다 켜지면 중간에 고백이 생김 (nocache : 미리 받은게 없어서 그때그때 받아야 함) |
<시퀀스 적용 예시>
create seqeunce sungjuk_seq
increment by 1
start with 103
maxvalue 100000000
nocache
nocycle;
cf) 아무런 조건 없이 시퀀스가 진행될 경우 시작값 : 1 / 증가값 : 1
3) 시퀀스 호출 함수
⊙ 주의 : 시퀀스 생성 후 nextval을 호출해야 시퀀스에 초기값이 설정됨
⊙ nextval : 다음 값을 반환 함. 다음 번호 발급
select sungjuk_seq.nextval from dual;
★ dual : 임시테이블
⊙ currval : 현재 값을 반환함. 최근 발급된 번호
select sungjuk-seq.currval from dual; - 현재 시퀀스번호 확인
4) 서브쿼리를 이용한 일련번호 발급
⊙ 주의 : 시퀀스와 혼합해서 사용하지 않도록 주의
문) c_emp 테이블에 데이터 입력시 sequence를 이용해서 id를 입력하도록 206에서 시작하여 1씩 증가되고, 최대값은 999로 설정하여 시퀀스를 생성하시오
시퀀스 이름 : c_emp_seq
create sequence c_emp_seq
create by 1
start with 206
maxvalue 999;
⊙ 시퀀스 목록 조회
- select * from user_objects where object_type='sequence';
⊙ 국어점수의 최고점 조회 (현재 아무것도 넣은 것이 없기 때문에 null값 발생)
select max(kor) from sungjuk;
⊙ null 값이 나오면 0으로 바뀜
select nvl(max(kor), 0) from sungjuk;
elect nvl(max(kor),0)+1 from sungjuk; - 0이 나오게 하고 그 뒤에 +1을 붙여서 1을 더해줌
5) 성적 데이터 입력
⊙ 오류 보고
- SQL 오류: ORA00933: SQL command not properly ended 00933. 00000 - "SQL command not properly ended"
▶ Oracle 쿼리문 오류, 쉼표, 조건절 등 다시 확인 해볼 것
[distinct / group by]
1) distinct : 칼럼에 중복내용이 있으면 대표값 1개만 출력
⊙ 형식 : distinct 칼럼명
select distinct(addr) from sungjuk; - addr가 겹치지 않고 대표값만 1개씩 출력됨
select distinct(addr) from sungjuk order by addr; - 나온 addr 값을 오름차순으로 정렬
select distinct(addr) from sungjuk roder by addr desc; - 나온 addr 값을 내림차순으로 정렬
2) group by 절 : 칼럼에 동일 내용끼리 그룹화 시킴
⊙ 형식 : group by 칼럼명1, 칼럼명2 ~~
select addr from sungjuk group by addr; - addr를 기준으로 그룹화
⊙ 오류발생 - ORA-00979: not a GROUP BY expression00979. 00000 - "not a GROUP BY expression"
▶ group by에 의한 결과값이 오로지 1개만 존재하는 값만 조회할 수 있다
⊙ 집계함수와 많이 사용 (통계 할 때)
<집계함수 예시>
select count(*), - 레코트 개수
sum(kor), - 국어점수의 합
avg(eng), - 영어점수 평균 (주의할 것 ! : 평균 - avg), aver 아님
max(mat), - 수학점수 최고점
min(tot) - 총점 최저점
from sungjuk;
⊙ 예제
문) 각 주소별 인원수를 구하시오 (= 성적테이블을 주소를 기준으로 count 하시오) select addr, count(*) from sungjuk groop by addr; → count(*) 로 칼럼명이 표현 되기 때문에 이를 바꾸기 위해서 'select addr, count(*) as cnt' 라고 적을 수 있음
★ +) 칼럼명을 바꿀 때★ count(*) 라는 칼럼명을 바꿀 때, 위에서처럼 as 를 사용하여 : select addr, count(*) as cnt 라고 적을 수도 있고 as 없이 : select addr, count(*) cnt 도 가능
문) 주소별 인원수를 구한 후 주소순으로 정렬하시오 (내림차순이라는 말이 없으면 오름차순 정렬) select addr, count(*) from sungjuk group by addr order by addr;
문) 주소별 인원수를 구한 후 인원수 순으로 내림차순 정렬하시오 select addr, count(*) from sungjuk group by addr order by count(*) desc;
문) 주소별 국어점수 평균(소수점 제외)을 구한 후 국어점수 평균순으로 내림차순 정렬해서 조회하시오 select addr, rount(avg(kor), 0) - ★ round( , ) 함수를 이용해 소수점 관리 ( , 소수점 자리수) from sungjuk group by addr order by aver(kor) desc;
문) 지역별 국, 영, 수 최고점을 지역별순으로 정렬해서 조회하시오 select addr, max(kor), max(eng), max(mat) from sungjuk gropup by addr order by addr; |
⊙ 1차값이 동일하다면 그 그룹내에서 2차 그룹이 가능하다 (3차까지도 많이 쓰지만 7~8차까지 가지는 않음)
문) 지역별로 그룹핑을 하고 만일 지역이 동일하다면 수학점수 별로 그룹핑을 하시오
select addr, mat
from sungjuk groupby addr, mat; - 지역별로, 그 다음 수학점수 별로
⊙ 예제
문) aver 칼럼값을 구한 후 aver 칼럼값이 50점 이상인 레코드 대상으로 지역별 국영수 평균을 반올림해서 소수점 1자리까지 구한 후 조회하시오 update sungjuk set aver=(kor+eng+mat)/3; - 먼저 'aver 칼럼값'을 구함
select * from sungjuk; - 'aver칼럼값' 이 맞게 들어갔는지 확인
select addr, round(aver(kor), 1), round(avg(eng), 1), round(avg(mat), 1) - 국영수 평균을 소수점 1자리까지 반올림 from sungjuk where aver>=50 - 'aver 칼럼값이 50점 이상인 레코드' group by addr - '지역별로 묶음' order by addr; |
[조건절]
⊙ where 조건절
⊙ having 조건절 → group by 와 함께 사용
⊙ on 조건절 → 테이블 조인할 때 사용
select addr, count(*)
from sungjuk group by addr
having count(*)=3; - 성적테이블의 addr를 기준으로 그룹핑하여 count(*)가 3인 것만 보고싶을 때
⊙ 예제
문) 지역별 국어점수 평균을 구한 후 그 평균이 80점 이상인 지역만 조회 select addr, avg(kor) from sungjuk group by addr having aver(kor)>=80;
문) 지역별 국어점수 평균 (소수점 제외)을 구한 후 칼럼명을 aver_kor로 설정하고 평균이 80점 이하인 지역만 조회 select addr, round(avg(kor), 0) as aver_kor from sungjuk group by addr having aver(kor)<=80
문) 지역별 국어점수 평균을 구한 후 그 평균 60~79점 사이만 조회 select add, avg(kor) from sungjuk group by addr having avg(kor) between 60 and 79; |
'DB > Oracle' 카테고리의 다른 글
[SQL] 함수 (0) | 2019.07.22 |
---|---|
[SQL] 활용 연습 문제 (1) | 2019.07.22 |
[SQL] 제약조건 (constraint) 2 (0) | 2019.07.20 |
[SQL] Oracle SQL Developer 기본적인 사용법 (0) | 2019.07.20 |
[SQL] Oracle SQL Developer 설치 / 접속 (0) | 2019.07.20 |