2022-02-28(월)

Jeongyun Heo·2022년 2월 28일
0

주점의 주인이 누군지 정보를 남겨야 됨
주점을 누가 등록했는지
주점 테이블에 '회원번호' 추가 후 '주점사장번호'로 이름 바꾸기

회원이 0개 이상의 주점을 소유

주류 테이블
‐ 주류번호
‐ 주류명

술 테이블

소주 테이블
‐ 맛
어디에 쓸 건데?
원산지 : 나라를 다 보여줘서 선택하게 할 건지. 알아서 입력
맛 : 맛을 선택하게 할 건지?

소주맛 테이블 만듦
‐ 소주맛번호
입력이 아니라 선택하게 할 건지
입력을 하게 할 건지
입력이면 술 테이블에 '맛' 컬럼 추가

주류 창고 시스템 개발이었으면 다 나눠야 됐음
최저온도, 최고온도 이런 거 다 추가해야 됨
술에 대한 디테일한 정보를 다 담아야 됨
주류 관리 시스템이 아니라 회원과 주점을

맛을 특징 안에 다 집어넣는다

안동 소주 파는 곳
어느 가게가 어느 소주를 판매하는지 구분해서 정확하게 타겟팅해서 검색해라
주점 사장! 주점에서 판매하는 술에 대해서 디테일하게 다 올려라!
이렇게 관리하는 게 서비스 목표인지 아니면
이 주점을 연결하는 서비스인지 목표가 뭔지...

어떤 문제를 해결하기 위해서 나온 서비스인가?
문제점과

주점 사장이 자기 주점에서 파는 술을 등록할 때
우리는 소주 팔아요가 아니라
소수 중에서 무슨 소주, 무슨 소주 팔고
상세하게 등록해야 되기 때문에
주점 테이블 - 주점판매술 테이블
주점판매술 테이블
‐ 주점번호
‐ 술번호

회원가입 한 다음에 자기가 좋아하는 술을 선택할 때
소주 중에서 안동 소주 이렇게 선택할 건지
아니면 퉁쳐서

리뷰 시스템 문제 - 신뢰성

좋아요 눌렀는지 안 눌렀는지

리뷰좋아요 테이블 만들기
‐ 회원번호
‐ 리뷰번호

모임 테이블

여행지 테이블
‐ 위도
‐ 경도
‐ 위치명
‐ 위치아이디

댓글에 타입을..?
댓글 유형..?

주차 가능 여행지만 검색한다든가 주차 여부에 대한 건 별도 컬럼으로 뽑아야 됨
그 데이터로 조회를 하겠다는 거
설명으로 퉁치는 게
까딱하면 식당관리시스템이 되어버림
메뉴판을 통째로 올리는 경우도 있음
여행자가 사진, 메뉴명까지 입력했는데 시간이 지나면 가격이 바뀔텐데 그걸 누가 바꾸

회원번호 값이 NULL이면 서비스 업체에서 등록한 거
회원이 등록한 여행지는 회원번호에 값이 있게 한다

10주 동안 하기에는

여러 테이블에 분산되어 있는 걸 끌어와서 하나의 가상테이블로 만들어서 가져와야 됨 <- JOIN

git/bitcamp-study/eomcs-docs/sql/Exam05.sql

프로젝션

FK면서 PK

배타적 관계 : 매니저인 동시에 수강생이 될 수 없음

그 다음에 나열한 값들이 중복될 경우만 하나만 뽑으라

distinct 와 all
git/bitcamp-study/eomcs-docs/sql/Exam07_1.sql

select * from room;

교육센터 이름만 뽑아내기

select all loc from room;

loc 컬럼의 모든 데이터 출력
데이터가 중복되더라도 모두 출력

여태까지 all 생략한 거임

select loc from room;

중복된 데이터는 출력하지 않는다

select distinct loc from room;

지점명이 같으면서 강의실명까지 같은 데이터는 없어서 다 출력됨
지점명이 '강남'이면서 강의실명이 '501'인 데이터는 하나밖에 없다.

select distinct loc, name from room;

git/bitcamp-study/eomcs-docs/sql/Exam07_2.sql

ORDER BY

지정하지 않으면 기본 인덱스 컬럼을 기준으로 정렬한다.

강의실 유니크 인덱스
지점명, 강의실명을 묶어서

select절 다음에 from절
from절 다음에 order by절

select절
from절
order by절

order by 정렬할 컬럼

ascending : 오름차순
desceding : 내림차순

select rno, loc from room order by name asc;

room 테이블에서 rno, loc 컬럼을 가져오는데 name을 기준으로 정렬해라?
name 컬럼을 안 가져오는데 name순으로 정렬한다고 해서 정렬이 안 됨
실행순서가 중요함

안 적으면 기본이 오름차순

name(강의실명)으로 오름차순 정렬하되, 같은 name(강의실명)일 경우에는 loc(지점명)을 기준으로 오름차순으로 정렬해라

select rno, loc, name
from room
order by name asc, loc asc;

name은 오름차순인데 같은 name일 경우에는 loc를 기준으로 내림차순으로 정렬해라

select rno, loc, name
from room
order by name asc, loc desc;

지점명 오름차순, 강의실명 오름차순

select rno, loc, name
from room
order by loc asc, name asc;

git/bitcamp-study/eomcs-docs/sql/Exam07_3.sql

as로 컬럼에 별명(라벨명) 붙이기

as 생략 가능

라벨명에 공백을 넣고 싶으면 '' 안에 작성한다

라벨명을 부여해야 프로그래밍 할 때 컬럼을 깔끔하게 지정할 수 있다.

특별한 경우 아니면 공백 집어 넣지 말기

하나의 결과 컬럼으로 만들 수 있는데 문제는 컬럼 이름을 따로 지정하지 않으면 함수를 호출한 코드 자체가 컬럼 이름으로 사용되는데

이런 경우에 별명을 붙여야 편함

git/bitcamp-study/eomcs-docs/sql/Exam07_4.sql

합집합은 같은 집합이 있으면 하나로 퉁친다

mySQL은 차집합을 지원하지 않는다
Oracle은 지원함

git/bitcamp-study/eomcs-docs/sql/Exam07_5.sql

select : join

① CROSS JOIN (Cartesian product)
두 테이블의 데이터를 1:1로 모두 연결한다

가장 무식한 JOIN
아무 의미없는 JOIN

② INNER JOIN
기준이 되는 컬럼의 값이 같은 경우
join된 데이터가 5개 만들어진다
둘 다 일치할 때만 연결된다
지정한 컬럼이 같으면 두 레코드를 조인한다.

③ LEFT OUTER JOIN
왼쪽걸 기준으로 JOIN
왼쪽을 기준으로 하기 때문에 오른쪽 거가 안 나올 수 있음

아반떼       현대
소나타       기아
K7         르노
소울         쌍용
SM5

④ RIGHT OUTER JOIN
null - 쌍용

어느 쪽을 기준으로 하느냐에 따라
리턴되는 개수가 다르다

as를 붙이고 안 붙이고는 선택사항

natural join: 같은 이름을 가진 컬럼 값을 기준으로 레코드를 연결한다.

컬럼 이름이 다르면 natural join을 할 수 없다
두 테이블의 join 기준이 되는 컬럼 이름이 다를 때 연결되지 못한다.

같은 이름을 갖는 컬럼이 없다
Foreign Key고 뭐고 이름이 같아야 함
PK와 이름이 같게끔

부모 테이블의 PK 이름과 같다면 natural join을 사용할 수 있지만
다를 때는 natural join을 쓰지 못한다

원치 않는 join이 발생할 수 있다
상관 없는 컬럼과 이름이 같을 때 잘못 연결된다.
같은 이름의 컬럼이 여러 개 있을 경우 잘못 연결된다.

natural join이 무효한 경우

09-JDBC프로그래밍 / 29 페이지

① 부모 테이블의 PK 컬럼명과 자식 테이블의 FK 컬럼명이 다른 경우

② 부모 테이블의 PK 컬럼명과 자식 테이블의 다른 컬럼명이 같은 경우 (상관없는 컬럼과 이름이 같은 경우)

join 게시글 on 회원.no = 게시글.writer_no

두 개가 같은 경우..?

③ 상관없는 컬럼이 이름이 같이 때문에 조인 조건으로 사용되는 문제

회원 테이블
mno, name, email

게시글 테이블
bno, name, email

상관없는 컬럼이 이름이 같이 때문에 조인 조건으로 사용되는 문제
=> 해결책
회원 join 게시글 using(mno)
join 대상을 지정
조인 기준이 되는 컬럼을 명시적으로 지정한다

inner 붙여도 되고 안 붙여도 됨

inner join은 기준이 되는 컬럼 값이 같을 경우만
같은 게 없으면 안 뽑아옴
데이터가 누락되는 상황이 발생
이걸 해결하기 위해 등장한 게 OUTER JOIN

LEFT OUTER JOIN
왼쪽 테이블 데이터는 다 나옴
왼쪽 테이블과 없다 하더라도 무조건 다 나옴. (NULL로 나옴)

화면에 출력할 때는 여러 테이블에 분산된 걸 끌어와서

inner 안 붙여도 기본 join이 inner join

같은 테이블을 두번 세번 join한다

이 정보를 가지고 수강신청 목록을 출력한다

0개의 댓글