우주코딩
SQL - Select , like, and , or, Foreign Key 본문
select
MariaDB Client -> 데이터 처리 요청 -> MariaDB Server -> 입출력 -> 파일
mysql.exe 는 마리아DB 클라이언트 파일
모든 컬럼 값 조회하기. 컬럼 순서는 테이블을 생성할 때 선언한 순서이다.
select * from 테이블;
특정 컬럼의 값만 조회할 때 => "프로젝션(projection)"이라 부른다.
select 컬럼명,컬럼명 from 테이블;
가상의 컬럼 값을 조회하기
select no, concat(name,'(',class,')') from test1;
서버에서 데이터 처리만 해야한다는 생각을 하는 사람은 DB에서 concat 사용하는 것을 반대한다.
방식은 상관없지만 데이터 처리에서 합치지 않는 것이 좋다.
컬럼에 별명 붙이기
select 컬럼명 [as] 별명 ...
as 생략 가능
selection / projection
select no, name from test1 where working = 'Y';
no, name 특정 칼럽 값만 선택하는 것 = projection (no, name)
특정 조건에 해당하는 레코드만 선택하는 것은 selection이다. (where 뒤의 조건)
OR, AND, NOT
- OR : 두 조건 중에 참인 것이 있으면 조회 결과에 포함시킨다.
- AND : 두 조건 모두 참일 때만 조회 결과에 포함시킨다.
- NOT : 조건에 일치하지 않을 때만 결과에 포함시킨다.
where 절을 통해 결과 데이터를 먼저 선택(selection)한 다음, 결과 데이터에서 가져올 컬럼을 선택(projection)한다.
따라서 실행 순서는: from ==> where ==> select
like
class 이름이 java로 시작하는 모든 학생 조회하기
=> % : 0개 이상의 문자
select *
from test1
where class like 'java%';
_는 딱 1자를 의미한다.
날짜를 다루는 함수
현재 날짜 및 시간 알아내기
select now();
현재 날짜 알아내기
select curdate();
현재 시간 알아내기
select curtime();
주어진 날짜, 시간에서 날짜만 뽑거나 시간만 뽑기
select regdt, date(regdt), time(regdt) from test1;
특정 날짜에 시,분,초,일,월,년을 추가하거나 빼기
date_add(날짜데이터, interval 값 단위);
date_sub(날짜데이터, interval 값 단위);
두 날짜 사이의 간격을 알아내기
datediff(날짜1, 날짜2);
날짜에서 특정 형식으로 값을 추출하기
date_format(날짜, 형식);
Foreign Key
자바 객체
Board Member
보드는 멤버를 포함한다.테이블 간 관계 (ER-Diagram / Entity Relation - Diagram)
테이블 = Entity
Board Member
1번게시글 100번 홍길동
2번게시글 101번 임꺽정
3번게시글 100번 홍길동
Board의 작성자는 Member의 primary key를 저장한다.
외부의 프라이머리 키를 가져와 저장하는 것을 foreign key라고 한다.
보드가 멤버를 포함, 가리킨다. 즉, 보드가 멤버를 참조한다라고 표현한다.
foreign key가 있는 테이블이 자식테이블이다. 즉 보드가 자식테이블이고 멤버가 부모테이블이다.
파일은 게시글 데이터 자체를 저장하는 것이 아니고, 게시글의 pk를 저장한다.
파일이 자식테이블이고 보드가 부모테이블이 된다.
ERD 표기법 :
Information Engineering Notation
객체 간의 관계와 테이블 간의 관계는 다르다
객체 간의 관계 ( 프로그래밍 하기 쉬운 쪽으로 객체 간의 관계를 설정 )
테이블 간의 관계 ( 데이터 중복을 최소화시키는 쪽으로 관계를 설정 )
자바 객체를 만들고 포함, 상속 관계 설정은 프로그램하기 쉬운 쪽으로 만들고 테이블에 저장하는 것은 파일이 아닌 파일의 pk/fk 데이터이다.
컬럼 중복
첨부 파일의 개수를 5 개로 정해 놓았다.
따라서 최대 5개의 첨부 파일만 테이블에 저장할 수 있다.
첨부파일이 없더라도 5개의 컬럼은 메모리를 차지한다.
이럴 때 테이블을 쪼개서 부모-자식 관계를 만든다. 그렇게하여 컬럼 중복 문제를 해결할 수 있다.
게시글 데이터를 보관하는 보드 테이블을 하나 만들고 AttachedFile에 중복 컬럼의 값을 저장한다.
파일에 넘버와 파일, 게시판 번호(FK)를 저장하여 어떤 게시글의 파일인지 알 수 있게 한다
하지만 FK 제약 조건이 없을 때 첨부파일 데이터를 입력할 때 존재하지 않는 게시물 번호가 들어 갈 수 있다.
그러면 첨부파일 데이터는 무효한 데이타 된다. (일관성이 없음!!!)
다른 데이터를 참조하는 경우 해당 데이터의 존재 유무를 검사하도록 강제한다. 다른 테이터에 의해 참조되는지 여부를 검사하도록 강제한다. 이것을 가능하게 하는 문법이 "외부키(Foreign Key)" 이다.
FK(foreign key) 제약 조건 설정
다른 테이블의 데이터와 연관된 데이터를 저장할 때 무효한 데이터가 입력되지 않도록 하는 문법이다.
다른 테이블의 데이터가 참조하는 데이터를 임의의 지우지 못하도록 하는 문법이다.
그래서 데이터의 무결성(data integrity; 결함이 없는 상태)을 유지하게 도와주는 문법이다.
다른 테이블의 PK를 참조하는 컬럼으로 선언한다.
alter table 테이블명
add constraint 제약조건이름 foreign key (컬럼명) references 테이블명(컬럼명);
ERD : forward / reverse engineering
ER-Diagram -> Table (forward engineering)
ER-Diagram <- Table (reverse engineering)
SQL 조인 텍스트를 위한 테이블의 ERD
memb (회원 기본 정보)
mgr stnt tcher (매니저, 학생 , 강사)
memb - mgr/ stnt / tcher = 0 또는 1의 관계, 멤버가 학생이거나 학생이거나 매니저 ( 셋 중 하나 )
lect(강의) - room(강의실) = 1 대 다의 관계, 하나의 교실에 여러 강의가 들어간다.
room - phot(강의실 사진) = 1 대 다의 관계
tcher - lect_tcher(강사 배정) = 1 대 다의 관계
lect_appl(수강신청) - lec(강의) - stnt = 수강생/강의 는 다 대 다 관계 수강생이 하나의 강의를 여러 개 들을 수 있다.
'Project' 카테고리의 다른 글
DBMS 개요, JDBC API 규격, JDBC 프로그래밍 기본 골격 (0) | 2021.10.20 |
---|---|
SQL - 조인 (0) | 2021.10.11 |
SQL 사용법 (0) | 2021.10.11 |
어플리케이션 아키텍쳐의 변환과 DBMS, SQL (0) | 2021.10.11 |
Observer 옵저버 패턴 적용하기 (0) | 2021.09.23 |