오늘 아침에 지각할 까봐 겁나 뛰어서 그런지 뭔가 뇌의상태가 안 좋기도 하고 중간에 내가 쓴 것들 오류난 거 계속 해결하려고 붙들다가 놓친 부분도 꽤 있어서 제대로된 메모를 하지 못했다. 그래도 일단 남겨놓은 정보들을 토대로 글을 써보려 한다.
관계형 DB의 꽃은 테이블 붙혀서 쓰기란다.
다 붙어있는 상태에서
식당테이블의 식당명 = 메뉴테이블의 판매식당명이 같은 것만 꺼낸 것
어제에 이어서 몇가지 문제를 내주시다가 밑에 문제 같은 경우 굳이 join을 쓰지 않아도 되는건데 우리가 지금 join을 한창 배우고 있다 해서 join을 쓰려고 하지 않았으면 좋겠다 하셨다.
join은 최악의 기술이란다. 뭐만 하면 어거지로 쓰게끔 만드는 것들이 많고 HDD에 있던 데이터의 수를 늘려서 RAM에 저장 하는 과정이 발생 하는데 컴퓨터에겐 아주 부담 되는 기술이란 것이다.
그래서 이렇게 하시더라.
강의실 컴퓨터
홍길동 2000-01-01생이 서버로 사용 1번, i7-1234, 16, 500
김길동 2001-05-01생이 서버로 사용 2번, i7-2234, 8, 250
최길동 2002-10-01생이 서버로 사용 1번, i7-1234, 16, 500
최길동 2002-10-01생이 서버로 사용 3번, i7-3234, 32, 500
를 테이블로 만들어라.
테이블명 : 강의실 컴퓨터
컴퓨터 번호
CPU
RAM
HDD
테이블명 : 학생명단
이름
생년월일
사용 서버 컴퓨터 1
이런식으로 두개의 테이블을 만들었다 쳤을 때 최길동에 서버 컴퓨터의 값이 2개가 들어가야되는 건데 이게 되는건가 싶어서 그냥 손 놓고 있었다.
어제와 방금 까지 했던 것들은 1 : n 관계지만지금 이번거는 다 대 다 m : n이다. 그럼 손을 놓는게 맞다고 하셨다.
오...? 맞췄다..?
다대다 관계일 경우 얘들을 묶어줄 테이블이 하나 따로 더 필요하다 하셨다.
테이블명 : 사용하기
학생번호 컴번호
1 1
2 2
3 1
3 3
근데 이 테이블에서도 primary key가 또 필요할테니 시퀀스로 번호 만들어서 붙힌다.
이런식으로 테이블을 만들고 값 넣어주는 것은 역시 노가다로..
그리고 주인 없는 컴퓨터도 여러대 만들라 하셨다.
다시 무수한 문제들
그래도 Java 배울 때 보단 쉽다.
근데 마지막 문제를 이렇게 하려면? 정렬을 배워야 한다.
order by 필드명, 필드명, ...
기본적으로 오름차순이고 내림차순 원할시
order by 필드명, 필드명 desc, ....
이런식으로 사용한다.
1차 조건으로 (값이 동일한 이유 등으로)안 걸러질 때는 다음 2차 조건으로 다음은 3차 이런식으로 정렬을 해준다.
desc로 적었기에 숫자가 높은 순으로 정렬이 된다.
그리고 지금에야 데이터 양이 크지 않아서 몇 백개 ~ 천개 수준에서 끝나지만 회사 가서 하게 될 경우 100만개가 될 수도 있다는 것이다. 그래서 내가 원하는 페이지의 데이터만 뽑아낼 수가 있어야 한다.
한 페이지당 5개씩
1p 1~5
2p 6~10
3p 11~15
총 몇 페이지인지 정도는 계산을 해야한다.
이렇게 썼을 때 내가 원하는 페이지에 해당하는 내용만 뽑아오고 싶다면 어떡해야 할까?
우리가 컴퓨터 번호를 시퀀스를 이용해서 올렸는데
시퀀스는 다른 테이블과 함께 사용 가능하다.
시퀀스는 insert작업 실패해도 올라간다.
중간 데이터를 삭제하면 공석이 된다.
=> 결론은 어제도 언급 했듯이 시퀀스가 행번호가 되지 못한다.
rownum : select 할 때 마다 부여되는 가상필드를 사용한다.
근데 정렬을 하면 로우넘 또한 같이 뒤죽박죽이 되서 의미가 없어진다. 그런데
from에도 서브쿼리가 가능하다.
그렇게 한 뒤에 where을 써서 rownum의 범위를 지정 해줘도 안 된다. 왜냐면 1번 부터만 조회가 가능하기 때문이다.
rownum
select 할 때 마다 부여되는 가상필드
order by보다 먼저 써야 함.
1번부터 조회된다.
.
그래서 셀렉트 한번 더 넣어준다. 근데 이렇게 하면 rownum이 두번 나오면서
where에 rownum을 쓸 시 맨 앞 *에 포함된 rownum이 적용될 것이기에
이렇게 as로 rownum 이름을 rn으로 바꿔준다.
응용하자면 이렇다.
이번엔 편의점으로 테이블을 만들자고 하셨다.
홍길동, 1980-01-01, 분당사는, CU, 서초점, 포도젤리, 과자류, 1500원
최길동, 1985-01-01, 수원사는, CU, 강남점, 포도젤리, 과자류, 1600원
대충 이런 값들이 들어갈 테이블을 말이다.
CU서초점 붙힌 것을 지점명에 넣는 식으로 다 대 다를 묶어주는 편의점 테이블을 만들 생각이였지만 강사님은 그냥 점주와 편의점을 다 대 다로 보시고 연결해주는 테이블을 하나 만든 뒤 편의점과 판매물품은 1 대 다로 보시고 따로 연결해주는 테이블을 만들진 않으셨다. 어쨌든 예제를 풀어야하기에 강사님 것을 따라했다.
근데 욕심 나서 편의점 지점 갯수랑 상품 갯수 개많이 만들다가 망했다.
jul05_owner_ho : 점주 테이블
o_no : 시퀀스
o_name : 사장 이름
o_birth : 사장 생일
o_addr : 사장 주소
jul05_store_ho : 편의점 테이블
s_no : 시퀀스
s_name_name : 편의점 브랜드
s_jijum_name : 지점명
jul05_run_ho : 연결을 위한 테이블
r_no : 시퀀스
r_c_no : 점주 번호
r_s_no : 편의점 번호
jul05_product_ho : 상품 테이블
p_no : 시퀀스
p_name : 상품명
p_cate : 카테고리
p_price : 가격
p_s_no : 편의점 번호
이런식으로 4개의 테이블로 나눠서 만들었고 아까 처음 글 시작할 때 언급 했듯이 무수한 문제들을 여기서도 내주셨는데 못 풀고 돌아왔다. 문제는 대문자 소문자 때문에 발생 됬었는데 SQL이라는 것이 모든 문자를 대문자로 인식하긴 하지만 필드명으로 글자로 집어 넣을 때는 대문자 소문자가 또 구분이 된다. 편의점 명 적을 때 'CU'와 'cu'를 같이 썼던게 화근이었다.
group by 필드명, 필드명, ... : 통계를 항목별로 분류해서 보여주는 기능
having 조건식 : 통계를 낸 뒤에 내가 보고 싶은 것만 보여주는 기능
이제 CRUD 중 C와 R이 끝났고 U D가 남았는데 이 둘은 쉽단다.
U
update 테이블명
set 필드명 = 값, 필드명 = 값, ...
------- 여기 까지 하면 모든 테이블에 있는 값이 다 바뀐다.
where 조건식; 이 필요하다.
이과두주 5000원으로 수정
CU상품 10% 할인 같은 것도 가능하다. 이런식으로 항목을 찾아 들어가서 해주면 된다.
D
delete from 테이블명
where 조건식
조건식을 활용해서 가장 비싼 상품 지우기 같은 것도 가능하다.
'비전공자의 코딩 일지 > 학원 수업 정리' 카테고리의 다른 글
코딩 학원 23일차(MVC 패턴, Java + Oracle DB) (2) | 2022.07.07 |
---|---|
코딩 학원 22일차 (Java + Oracle DB) (1) | 2022.07.06 |
코딩 학원 20일차 (Oracle DB, SQL 기초) (0) | 2022.07.04 |
코딩 학원 19일차 (Oracle DB 서버 구축 및 접속) (1) | 2022.07.02 |
코딩 학원 18일차 (Java Collection) (0) | 2022.06.30 |