어? 이게 되네
2022.04.25. 월요일 이공계 전문기술 연수사업 21일차 본문
오늘 배운 것
데이터 정의어(ddl)
ㄴ테이블 생성 create
ㄴ테이블 구조 변경 alter
ㄴ테이블 삭제 drop
---------------------------------------------------------------------
create table newbook(
bookname varchar2(20),
publisher varchar2(20),
price number,
primary key(bookname,publisher)
);
북네임 개인으로는 중복가능
퍼블리셔 개인으로는 중복가능
하지만 북네임+퍼블리셔 같이 중복 불가능
SQL> insert into newbook values('재미있는자바','한빛',30000);
1 개의 행이 만들어졌습니다.
SQL> insert into newbook values('재미있는자바','쌍용',30000);
1 개의 행이 만들어졌습니다.
SQL> insert into newbook values('즐거운자바','한빛',34000);
1 개의 행이 만들어졌습니다.
SQL> insert into newbook values('재미있는자바','한빛',20000);
insert into newbook values('재미있는자바','한빛',20000)
*
1행에 오류:
ORA-00001: 무결성 제약 조건(C##MADANG.SYS_C008382)에 위배됩니다
create table newcustomer(
custid number primary key,
name varchar2(40),
address varchar2(40),
phone varchar2(30)
);
create table neworders(
orderid number,
custid number not null references newcustomer(custid) on delete cascade,
bookid number not null,
saleprice number,
orderdate date
);
SQL> select * from newbook;
BOOKNAME
----------------------------------------
PUBLISHER PRICE BOOKID
---------------------------------------- ---------- ----------
재미있는자바
쌍용 10000
재미있는자바
한빛 2000
재미있는자바
2000
ㄴ이 상태로는 bookid에 not null을 적용할 수 없음!
bookid의 값을 설정한 후에 적용하거나
아니면 모든 레코드를 삭제한 후에 적용해야함
drop과 delete
drop은 ddl (테이블까지 모두 삭제)
delete는 dml (데이터만 삭제)
---------------------------------------------------------------------
데이터 조작어(dml)
insert 삽입
update 수정
delete 삭제
레코드=튜플
exit
sqlplus system/manager
create user c##sist01 identified by sist01;
grant connect, resource, dba to c##sist01;
exit
sqlplus
//새 계정 만들기
create table book(
bookid number primary key,
bookname varchar2(50),
publisher varchar2(30),
price number
);
insert 문의 기본 문법
insert into 테이블이름 values(값리스트); //값리스트는 테이블 구조에 있는 컬럼의 순서와 동일해야함
insert into book values(1,'스프링의정석','몰라몰라',30000);
insert into 테이블이름(속성리스트) values(값리스트);//값리스트는 속성리스트의 순서와 동일해야함
insert into book(bookid,bookname,price,publisher) values(2,'자바의정석',24000,'자바의아버지');
이 때 not null이나 pk는 반드시 속성리스트에 포함시켜야 함
이미 있는 테이블의 레코드를 검색하여 대량의 데이터 추가하기
insert into 테이블명 ([컬럼리스트] select * from 테이블명);
insert into newbook select * from book;
insert into newbook(bookname, publisher, price, bookid)
select bookname,publisher,price,bookid from book;
-----------------------------------------------------------------------------------------
자료의 수정
update 테이블이름 set 컬럼1=값1,컬럼2=값2, ... [where 조건식];
한꺼번에 여러 개의 컬럼을 수정할 수도 있음
조건식이 없으면 모든 레코드의 값이 수정됨
조건식이 있으면 조건식을 만족하는 레코드의 값이 수정됨
update 테이블명 set 컬럼명 = 값 where 조건식
ㄴ값이 오는 자리에 서브쿼리가 올 수 있음
ex)customer 테이블에서 김연아 고객의 주소를 손흥민 고객의 주소로 변경
update customer set
address=(select address from customer where name='손흥민') where name='김연아';
-------------------------------------------------------------------------------
자료의 삭제
delete 테이블명 where 조건식
조건식이 없으면 모든 테이블의 모든 레코드가 삭제됨
조건식이 있으면 조건식을 만족하는 컬럼의 데이터만 삭제됨
ex)customer 테이블에서 고객번호가 5인 레코드를 삭제
delete customer where custid=5;
rollback
ㄴdml 작업을 가장 최근의 commit 지점까지 취소함
ㄴdcl이나 ddl은 자동커밋임!!
ex)박지성이 구매한 도서의 출판사와 같은 출판사에서 도서를 구매한 고객의 이름
select distinct name
from book b, orders o, customer c
where c.custid=o.custid and b.bookid=o.bookid
and publisher in
(select distinct publisher from book b, orders o, customer c
where c.custid=o.custid and b.bookid=o.bookid
and name='박지성') and name <> '박지성';
ex)전체 고객의 30%이상이 구매한 도서의 이름
//내풀이
select bookname,count(b.bookid) from book b, orders o
where o.bookid=b.bookid
group by bookname having count(o.orderid)>2;
//강사님풀이
//전체 고객의 30프로
select count(*)*0.3 from customer;
select bookname,count(b.bookid) from book b, orders o
where o.bookid=b.bookid
group by bookname having count(b.bookid)>=(select count(*)*0.3 from customer);
ex)두 개 이상의 서로 다른 출판사에서 도서를 구매한 고객의 이름
ㄴ고객이름별로 구매한 출판사의 수부터 출력!
select name,count(distinct publisher)
from customer c, orders o, book b
where c.custid=o.custid and o.bookid=b.bookid
group by name having count(publisher)>=2;
--------------------------------------------------------------------------------------------
내장함수를 이용한 sql
수학과 관련된 함수
abs 절대값
select abs(-78) from dual;
ceil 크거나 같은 최소의 정수(올림)
select ceil(56.89) from dual;
floor 작거나 같은 최대의 정수(버림)
select floor(56.99) from dual;
round(값,자리수) 반올림한 정수를 반환 (자리수가 0이면 정수부만 표시함, 자리수가 n이면 소수점 n번째 자리까지 표시함, 자리수가 -1이면 10의자리 수까지 표시함)
select round(4342.2432,1) from dual;
log
power(값,n) 값의 n제곱을 반환
select power(7,7) from dual;
sqrt 값의 제곱근을 반환
select sqrt(8) from dual;
sign
ex)고객별 평균 주문금액을 100원 단위로 반올림하여 출력
select custid, round(avg(saleprice), -2) from orders group by custid;
--------------------------------------------------------------------------------------------------------------------------
문자 함수의 종류
chr 정수 아스키코드를 문자로 반환
select chr(65) from dual;
concat 두 문자열을 연결
select concat('i','loveyou') from dual;
initcap 단어의 첫 번째 알파벳을 대문자로 반환
select initcap('sea of love') from dual; =>Sea Of Love
lower 대상 문자열을 모두 소문자로 반환
upper 대상 문자열을 모두 대문자로 반환
lpad 대상 문자열의 왼쪽부터 지정한 자리 수까지 지정한 문자로 채움
lpad('page 1',10,'*') ****page 1 (왼쪽을 채워라)
rpad (오른쪽을 채워라)
replace 어떤 문자열을 찾아서 변경
substr 대상 문자열의 지정된 자리에서 부터 지정된 길이만큼 잘라서 변환
ltrim 왼쪽 공백 제거
rtrim 오른쪽 공백 제거
trim 좌우 공백 제거
length 문자열 길이 반환
select length('hello') from dual; 5
select length(' hello ') from dual; 11
select length(ltrim(' hello ')) from dual; 8
select length(rtrim(' hello ')) from dual; 8
select length(trim(' hello ')) from dual; 5
오늘 헷갈린 것
- jsp에서 if(request.getParameter("bookid")!=null) 꼭 컨디션 만들어줘야하는 이유!!! 넘겨짚고가기
오늘 한 생각
생각보다 자바 복습할 시간이 많이 없다 ㅠㅠㅠㅠㅠ눈물나....
왜겠어니가주말에논탓이지이제주말도공부해라좋은말로할때
'TIL' 카테고리의 다른 글
2022.04.27. 수요일 이공계 전문기술 연수사업 23일차 (0) | 2022.04.27 |
---|---|
2022.04.26. 화요일 이공계 전문기술 연수사업 22일차 (0) | 2022.04.26 |
2022.04.22. 금요일 이공계 전문기술 연수사업 20일차 (0) | 2022.04.25 |
2022.04.21. 목요일 이공계 전문기술 연수사업 19일차 (0) | 2022.04.21 |
2022.04.20. 수요일 이공계 전문기술 연수사업 18일차 (0) | 2022.04.20 |