1. View
뷰란 가상의 테이블이다! 실제 데이터를 가지고 있지는 않고 테이블을 참조해서 원하는 칼럼만을 조회할 수 있다.
그렇기 때문에 참조한 테이블이 변경되면 뷰도 당연히 함께 변경된다.
하지만 뷰의 입력/수정/삭제에는 제약이 있다. 애초에 가상의 테이블이니까~ 그래서 특정 칼럼만 조회시킬 수 있어 보안성을 향상시킨다. 원하는 칼럼만 조회할 수 있으니까 당연히 보안이 좋을 수 밖에!
뷰는 한 번 생성하면 변경할 수 없고, 변경해야 한다면 삭제 한 후에 다시 생성하는 수 밖에 없다! (alter문도 안 돼요.)
뷰를 생성할 때 create view문을 사용하고 참조할 테이블은 select문으로 지정한다.
ex) create view v_emp as select * from emp;
이렇게 생성해두고 나면 select로 일반 테이블처럼 조회할 수 있고, 삭제는 drop view를 사용한다.
1) view의 장점과 단점
-장점
특정 칼럼만 조회할 수 있어 보안기능이 있다.
데이터 관리가 용이하다.
select문이 간단해진다.
하나의 테이블에 여러 개의 뷰를 생성할 수 있다.
-단점
뷰는 독자적 인덱스를 만들 수 없다.
삽입, 수정, 삭제 연산이 제약된다. (안 되는 건 아님, 제약이 있다는 거예요.)
데이터 구조를 변경할 수 없다.
2. order by
맨 마지막에 실행되고 기본적으로 오름차순으로 정렬한다.
오름차순 = asc --기본적으로 오름차순이라 생략할 수 있다.
내림차순 = desc --내림차순으로 정렬하고 싶으면 꼭!! 사용해야 한다.
정렬하기 때문에 DB 메모리를 많이 사용하게 되고, 대량의 데이터를 정렬하게 되면 성능 저하가 발생할 수 밖에 없다.
*select문의 구문 실행 순서는 from, where, select, order by 순.
3. distinct와 alias
1) distinct
칼럼명 앞에 지정해 중복된 데이터를 한 번만 조회하게 한다.
중복된 거 다 나타내는 것이 아니라 하나로 깔끔하게 조회할 수 있게 해준다는 것!
#dept 테이블에 deptno 값이 10, 10, 20, 30이 있을 때
select distinct deptno from dept;
=> 10, 20, 30이 조회돼요!
2) alias
테이블명이나 칼럼명이 너무너무너무~ 길어질 수 있는데 이것을 간략하게 할 때 사용하는 것으로 코드로 칠 때는 as!
특히 join 사용하면 좀 많이 길어지니까요~
4. where문
비교/부정비교/논리/SQL/부정SQL 연산자를 사용할 수 있다.
1) 비교 연산자는 등호!
2) 논리 연산자는 and, or, not이 있다.
and | 조건을 모두 만족해야 참 |
or | 조건 중 하나만 만족해도 참 |
not | 참이면 거짓으로, 거짓이면 참으로! |
3) SQL 연산자
like '%비교 문자열%' | 비교 문자열 조회, '%'는 모든 값 |
between A and B | A와 B 사이의 값 조회, 이상/이하 |
in (list) | or을 의미하며, list 값 중에 하나만 일치해도 조회 |
is NULL | NULL값을 조회 |
* 와일드 카드
% | 어떤 문자를 포함한 모든 것 조회 ex) '우%'는 '우'로 시작하는 모든 문자 조회 |
_ | 한 개인 단일 문자 |
4) 부정SQL 연산자
not between A and B | A와 B 사이에 해당되지 않는 값 조회, 미만/초과 |
not in (list) | list와 불일치한 것 조회 |
is not NULL | NULL값이 아닌 것 조회 |
# in (list)
*이거 보고 처음에 무슨 list...? 생각했는데 그냥 영어로 써있어서 겁먹은 거 같아요. 정말 말그대로 list였답니다. 이런 식으로요!!
where addr in ("부산", "서울", "세종", "뉴욕", ...);
5. 실습을 해봅시다!
create table emp(
empno int not null primary key,
ename varchar(30) not null,
deptno number(5) not null,
mgr number(5),
job varchar2(20) not null,
sal int not null
);
insert into emp values(1000, 'test1', 20, 0, 'clerk', 800);
insert into emp values(1001, 'test2', 30, 1000, 'salesman', 1600);
insert into emp values(1002, 'test3', 30, 1000, 'salesman', 1250);
insert into emp values(1003, 'test4', 30, 1000, 'manager', 2975);
insert into emp values(1004, 'test5', 30, 1000, 'salesman', 1250);
insert into emp values(1005, 'test6', 30, 1001, 'manager', 2850);
insert into emp values(1006, 'test7', 10, 1002, 'manager', 2450);
insert into emp values(1007, 'test8', 30, 1002, 'manager', 2200);
insert into emp values(1008, 'test9', 10, 1002, 'manager', 2750);
insert into emp values(1009, 'test10', 30, 1002, 'salesman', 1500);
insert into emp values(1010, 'test11', 20, 1002, 'clerk', 1100);
commit;
select /'+ index_asc(emp_sys_C007731) * / * from emp;
select * from emp
order by deptno desc, job;
select distinct deptno
from emp
order by deptno;
select deptno as "부서번호"
from emp;
select * from emp
where deptno=30
and sal > 2000;
select * from emp
where ename like 'test%';
select *from emp
where ename like 'test_';
select * from emp
where sal between 1000 and 2000;
select * from emp
where sal not between 1000 and 2000;
select * from emp
where job in ('clerk', 'manager');
select * from emp
where job not in ('clerk', 'manager');
'SQL' 카테고리의 다른 글
SQLD 10 (1) | 2023.09.09 |
---|---|
SQLD 8 (0) | 2023.09.08 |
SQLD 7 (0) | 2023.09.07 |
SQLD 6 (0) | 2023.09.07 |
SQLD 5 (0) | 2023.09.07 |