Back-End/Database
Oracle SQL(2)
newny
2023. 2. 23. 19:12
반응형
✅Create
sequence
- 자동으로 일련번호 부여
- 시퀀스 생성: CREAT SEQUENCE [시퀀스명];
- 시퀀스 사용: [시퀀스명].nextval → value값에 입력
- 시퀀스 삭제: DELETE SEQUENCE [시퀀스명];
-- sungjuk 테이블에서 사용할 시퀀스 생성
create sequence sungjuk_seq;
-- 시퀀스와 sysdate함수를 이용한 행 추가
insert into sungjuk(sno, uname, wdate)
values(sungjuk_seq.nextval, '홍길동', sysdate);
✅Read
데이터 조회의 제한, 데이터 조회 방법
⭐키워드 오는 순서 알고있기
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr [, select_expr] ...
[into_option]
[FROM table_references
[PARTITION partition_list]]
[WHERE where_condition]
[GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
[HAVING where_condition]
[WINDOW window_name AS (window_spec)
[, window_name AS (window_spec)] ...]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[into_option]
[FOR {UPDATE | SHARE}
[OF tbl_name [, tbl_name] ...]
[NOWAIT | SKIP LOCKED]
| LOCK IN SHARE MODE]
[into_option]
into_option: {
INTO OUTFILE 'file_name'
[CHARACTER SET charset_name]
export_options
| INTO DUMPFILE 'file_name'
| INTO var_name [, var_name] ...
}
between ~ and ~ (AND)
BETWEEN [조건1] AND [조건2]
-- 국어점수가 80 ~ 89점 사이 행을 조회하시오
select * from sungjuk where korea between 80 and 89;
in() (OR)
IN( [조건1], [조건2], …)
-- 이름이 '무궁화', '봉선화'를 조회하시오
select * from sungjuk where uname in ('무궁화', '봉선화');
like
LIKE [조회할 문자]
- 문자열 데이터에서 비슷한 유형을 검색할 때
- 문자열만 가능
- % : 글자갯수와 상관이 없음
- _ : 글자갯수까지 일치해야 함
-- 이름에서 '홍'으로 시작하는 이름을 조회하시오
select * from sungjuk where uname like '홍%';
-- 이름에서 '화'로 끝나는 이름을 조회하시오
select * from sungjuk where uname like '%화';
-- ⭐이름에 '나' 글자가 있는 이름을 조회하시오
select * from sungjuk where uname like '%나%';
-- 세글자 이름에서 '동'으로 끝나는 이름을 조회하시오
select * from sungjuk where uname like '__동';
order by (asc or desc)
ORDER BY [칼럼명] ASD / DESC
- 특정값(keyfield)을 기준으로 순서대로 재배치
- 키워드 생략하면 기본 오름차순 정렬
- 오름차순 : Ascending Sort (ASC)
- 내림차순 : Descending Sort (DESC)
-- 전체 레코드를 이름순으로 정렬해서 조회하시오
select *
from sungjuk
order by uname asc; -- 오름차순 정렬, asc 생략가능
select *
from sungjuk
order by uname desc; -- 내림차순 정렬
distinct
DESTINCT [칼럼명]
칼럼에 중복 내용이 있으면 대표값 1개만 출력
select distinct(addr) from sungjuk;
group by
[참고] https://extbrain.tistory.com/56
select [그룹컬럼], [집계함수] from [테이블명] group by [그룹컬럼];
SELECT type, COUNT(name) AS cnt FROM hero_collection GROUP BY type;
--hero_collection 테이블에서 type 컬럼을 기준으로 그룹핑한 결과를 보여주는 쿼리
[예제 테이블]
idx | type | name |
1 | 1 | 안중근 |
2 | 1 | 윤봉길 |
3 | 2 | 김유신 |
4 | 2 | 이순신 |
5 | 3 | 이성계 |
6 | 3 | 왕건 |
7 | 4 | 반갑수 |
[결과]
type | cnt |
1 | 2 |
2 | 2 |
3 | 2 |
4 | 1 |
✅테이블 제약조건
- 데이터 무결성을 위해 강제성을 테이블의 칼럼에 부여함
- 효율적인 데이터관리에 중요한 역할을 함
primary key
- 테이블의 내용에서 각각의 레코드를 대표하는 유일한 컬럼
- where 조건절에 걸릴 수 있는 대표적인 컬럼을 미리 강제함
- 테이블당 한개씩 반드시 존재해야함
- 값이 무조건 존재해야함 (not null)
create table sungjuk (
sno int primary key
);
insert into sungjuk(sno) values(1); --두번 실행했을 경우
-- ORA-00001: 무결성 제약 조건(SYSTEM.SYS_C007314)에 위배됩니다
-- primary key 로 인해 에러 발생함
not null
빈값(null)을 허용하지 않음을 의미
create table sungjuk (
sno int primary key
,uname varchar(10) not null
);
insert into sungjuk(sno) values(2);
-- ORA-01400: NULL을 ("SYSTEM"."SUNGJUK"."UNAME") 안에 삽입할 수 없습니다
-- uname 칼럼은 not null 이므로 반드시 값을 입력해야 함
varchar(제한할 문자byte 수)
create table sungjuk (
sno int primary key
,uname varchar(10) not null
);
insert into sungjuk(sno, uname) values(4, 'ABCDEFGHIJK');
insert into sungjuk(sno, uname) values(5, '대한민국');
-- ORA-12899: "SYSTEM"."SUNGJUK"."UNAME" 열에 대한 값이 너무 큼(실제: 11, 최대값: 10)
-- 문자제한 갯수가 넘어가는 문자를 입력하여 오류 발생함
default
- 사용자가 값을 넣지 않았을경우 기본값으로 사용할 값을 설정함
- insert 되는 시점에 자동으로 default 값이 들어감
create table sungjuk (
uname varchar(50) not null
,tot int default 0
,aver int default 0
,wdate date default sysdate
);
insert into sungjuk(uname)
values('홍길동');
-- tot와 aver는 0 입력, wdate는 현재 날짜가 입력됨
check
- 해당 컬럼에 들어갈 수 있는 값의 범위를 제한함
- 조건을 만족하지 않은 값은 들어가지 않음
create table sungjuk (
kor int check(kor between 0 and 100) --국어점수 0 ~ 100 사이만 입력 가능
,eng int check(eng between 0 and 100) --영어점수 0 ~ 100 사이만 입력 가능
,mat int check(mat between 0 and 100) --수학점수 0 ~ 100 사이만 입력 가능
,addr varchar(50) check(addr in ('Seoul', 'Jeju', 'Busan', 'Suwon'))
);
insert into sungjuk(kor, eng, mat)
values(-10, 20, 300);
insert into sungjuk(kor, eng, mat, addr)
values(10, 20, 30, 'Incheon')
-- ORA-02290: 체크 제약조건(SYSTEM.SYS_C007323)이 위배되었습니다
-- 조건을 만족하지 않은 값을 입력하여 오류 발생함
unique
- primary key 기능을 대체할 수 있음
- 해당 컬럼에 동일한 값이 들어가지 않도록 함
- null값 허용 (primary key와 차이점)
foreign key
- 다른 테이블의 primary key를 참조하여 사용하는 테이블의 컬럼
- 참조되는 테이블의 primary key 값을 그대로 사용함
- 다른 테이블의 primary key 값의 변경 및 삭제가 불가능하도록 제약함
반응형