JavaWeb

자바 웹 공부 17 - MySql5

넴넴L 2023. 1. 20. 18:42
728x90
ON DELETE, ON UPDATE
참조키로 지정된 필드에서 참조하는 데이터가 변경되거나 삭제되었을 때 대처를 설정할 수 있도록 함

CASCADE 옵션 
- 참조하는 데이터가 변경되거나 삭제되면 참조 테이블에서도 삭제, 수정이 같이 이루어짐

SET NULL
- 참조하는 데이터가 변경되거나 삭제되면 참조키가 설정된 필드의 값이 null로 변경

 

 

만들어주고 번호대로 실행

실행

바뀌고 

roomNumber가 Null로 바뀌어져 있다.

 

실행 후

NO ACTION은 무결성 제약조건에 위배되므로 사용하면 안 되고

해봤는데 Restrict로 제한이 걸려 있어서 확인을 하지 못했다.

 

 

SET DEFAULT
- 참조하는 데이터가 변경되거나 삭제되면 기본값으로 지정한 데이터로 변경됨.

이것도 확인해 보니

이게 InnoB 엔진에서는 불가능해서 실행이 되지 않는다

 

 

RESTRICT

아래 코드 추가해 주고 Drop으로 테이블을 지운뒤 다시 만들어준다.

이 코드 실행 한 뒤 

이 둘을 실행해 주면 둘 다 불가능하다고 뜬다

데이터가 변경되거나 삭제가 불가능하기 때문


 

Multi-Table Operations(다중 테이블 연산)

JOIN

데이터베이스 내의 여러 테이블에서 가져온 레코드를 조합하여 하나의 테이블이나 결과 집합으로 표현

 

1. INNER JOIN
ON 절과 함께 사용되며, ON 절의 조건을 만족하는 데이터만을 가져온다
ON 절에서는 WHERE 절에서 사용할 수 있는 모든 조건을 사용

여기에 ON을 걸어보자

roomNumber가 같은 녀석만 나오게 된다.

 

MySQL에서는 INNER JOIN 구문을 , 로 대체하고 ON을 WHERE로 대체해서 사용 가능

실행하면 똑같이 나온다.

 

이걸 계속 쓰다 보면 테이블 이름이 기니 짜증 난다.

이때 AS(별칭)을 사용한다.

이렇게 코드를 추가하고

실행을 하면 되지 않는다.

roomNumber가 Reservation3에서 인지 Room에서 들고 와야 하는지 모른다.

그래서 실행을 시켜주려면 어디서 들고 와야 하는지 지정만 해주면 된다.

 

실제로는 RV를 다 앞에다 붙이는 경우가 많으므로

두 테이블 이상을 FROM 절에서 사용할 때는 선택할 칼럼명 앞에 어떤 테이블의 컬럼 인지를 직접 지정해 주는 것이 좋다

동일한 칼럼명이 각 테이블에 존재하면 쿼리는 어떤 테이블의 칼럼인지 구분하지 못하기 때문이다

 

 

2. LEFT JOIN
첫 번째 테이블을 기준으로, 두 번째 테이블을 조합하는 JOIN
ON 절의 조건을 만족하지 않는 경우에는 첫 번째 테이블의 필드 값은 그대로 가져온다
하지만 해당 레코드의 두 번째 테이블의 필드 값은 모두 NULL로 표시

확인하기 위해 원래 있던 곳에 데이터를 살짝 바꿔서 실행을 하자

철수는 roomNumber가 존재하기 때문에 가져왔지만

영희는 null이기 때문에 출력은 해주고 없는 값은 다 null로 해주었다.

 

3. RIGHT JOIN
두 번째 테이블을 기준으로, 첫 번째 테이블을 조합하는 JOIN
ON 절의 조건을 만족하지 않는 경우에는 두 번째 테이블의 필드 값은 그대로 가져온다

실행을 해보면 오른쪽(Room)에 대한 값에 대해 나열이 되기 때문에

roomNumber, roomSize, roomName만 있기 때문에 앞에는 다 null이 된다.

 

 

서브쿼리(subquery)
- 다른 쿼리 내부에 포함되어 있는 SELETE 문을 의미
- 서브쿼리를 포함하고 있는 쿼리를 외부쿼리, 서브쿼리는 내부쿼리
- 서브쿼리는 반드시 괄호(())로 감싸져 있어야만 한다

-
MySQL에서 서브쿼리를 포함할 수 있는 외부쿼리는 SELECT, INSERT, UPDATE, DELETE, SET, DO

특징
1. 서브쿼리는 쿼리를 구조화시키므로, 쿼리의 각 부분을 명확히 구분할 수 있게 해 준다.
2. 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공합니다.
3. 서브쿼리는 복잡한 JOIN이나 UNION 보다 좀 더 읽기 편합니다.

SELECT를 2개 이상을 할 경우 실행되지 않음, 조건을 없애도 실행되지 않음.

 

IN으로 받았기 때문에 0개 이상이 가능

(IN은 1대 다이기 때문이고, =은 1:1 관계이기 때문에 그렇다)

 

 

FROM 절의 서브쿼리
서브쿼리에 의해 선택된 결과 집합은 FROM 절에서 하나의 테이블로써 사용
SELECT 문의 FROM 절에서 사용되는 모든 테이블에는 이름이 필요

컬럼 자리에 새로운 결과를 만들어서 도출이 가능

이건 아주 복잡한 경우에서만 사용하기 때문에 참고 사진만 보고 가자


 

View
- 데이터베이스에 존재하는 일종의 가상 테이블
- 실제 테이블처럼 행과 열을 가지고 있지만, 실제로 데이터를 저장하고 있지는 않음
다른 테이블이나 다른 뷰에 저장되어 있는 데이터를 보여주는 역할

장점
1. 특정 사용자에게 테이블 전체가 아닌 필요한 필드만을 보여줄 수 있습니다.
2. 복잡한 쿼리를 단순화해서 사용할 수 있습니다.
3. 쿼리를 재사용할 수 있습니다.

단점
1. 한 번 정의된 뷰는 변경할 수 없습니다.
2. 삽입, 삭제, 갱신 작업에 많은 제한 사항을 가집니다.
3. 자신만의 인덱스를 가질 수 없습니다.

 

뷰 생성
CREATE 문을 사용하여 뷰를 생성


주의 
뷰는 원본 테이블과 같은 이름을 가질 수 없다

뷰 대체
CREATE 문에 OR REPLACE 절을 추가하여 기존에 존재하는 뷰를 새로운 뷰로 대체
해당 뷰가 존재하지 않으면 CREATE VIEW 문과 같은 결과를 반환

뷰 수정
CREATE 문을 사용하여 생성된 뷰는 ALTER 문을 사용하여 수정

한번 바꿔보자

이렇게 만들어 줄 수 있고

 

이거랑 똑같다.

삭제할 때는 Drop View