프로그래밍/데이터베이스

이경오의 SQLD ch5 연습문제

이자다 2023. 6. 9. 16:15
반응형

21.

DML: select, insert, update, delete

DDL: create, drop, alter, truncate, rename

 

 

22. 

1. 테이블 복제 시 데이터 건수는 완전동일하다.

2. DDL문은 실행시 자동 커밋.

3. 테이블 복제 시 PK 제약조건까지 복제 테이블에 적용되지는 않는다.

4. 테이블 복제 시 not null 조건은 컬럼에 그대로 적용된다.

 

 

24

DDL은 자동커밋

DML은 수동커밋

 

count()는 행의 개수를 출력!

count(*)를 제외한 모든 집계함수는 컬럼의 null을 제외하고 계산함.

 

 

25

char(5)에 길이가 4인 'sqld'를 입력하면 그 뒤에 공백을 붙여서 'sqld '를 저장한다.

char은 비교할 상대 문자열과 길이가 다르면 뒤에 공백을 추가하여 길이를 같게 한다.

문자열의 달라진 첫 번째 문자가 나올 때까지 비교한다.

 

varchar은 공백도 문자로 취급한다.

길이가 다르다면 긴 것이 더 크다. 

비교시 서로 다른 문자가 나올 때까지 비교한다.

 

문제에선 char과 varchar가 비교 됐는데 where절을 만족시키는 것은

varchar에 'D001  '(뒤에 공백 두개) 이 저장되어 길이 6이 된 것과,

char(6)에 'D001' 4자리만 저장하여 뒤에 자동으로 공백 두개가 채워져 6이 된 문자를 비교했을 때,

varchar은 공백도 문자로 취급하기에 1, 2행이 where 절을 만족시킨다.

 

 

---

Group by가 왔을 때 select 절에는

1. Group by 에 쓰인 칼럼명

2. 집계함수(칼럼명)

만 올 수 있다. 그룹핑 되니까 일반칼럼이 오면 아다리가 안맞음.

 

Group by가 왔을 때 Order by 절에서는

1. Group by에 쓰인 칼럼명

2. select 절에 쓰인 집계함수(칼럼명)

만 가져올 수 있다.

 

논리적으로 봤을 때 연산순서는 

그룹바이 -> 헤빙 -> 셀렉트 -> 오더바이 이니까

 

그룹바이로 묶여서 변형이 된 상태라서 select, order by 를 사용할 때 제약이 생긴다는 걸 알 수 있다.

---

 

 

26

char은 다른 문자열과 비교 시 길이가 차이나면 그만큼 공백을 추가한다.

그렇다고 해도 char 끼리의 비교는 공백을 무시하고 문자만 비교하기에 공백 상관없이 문자를 비교하게 된다.

 

 

27

다 풀어놓고 선지를 잘못 보고 틀린 문제.

 

23:59:00 꼴일 때 이는 (시:분:초)를 의미한다.

 

그리고 시간을 빼는 연산을 수행하는 포맷은 다음과 같다. 시간에서 1분을 빼는 식이다.

to_date('2020-12-25 00:00:00', YYYY-MM-DD HH24:MI:SS') - 1/24/60*10/10

 

이와 같이 

하루를 빼고 싶으면 -1

1시간을 빼고 싶으면 - 1/24

3시간을 빼고 싶으면 - 1/24*3

1분을 빼고 싶으면 -1/24/60

10분을 빼고 싶으면 -1/24/60*10

로 표현하면 된다.

 

 

28

묵시적 형변환 문제.

오라클에서 2 + '2'를 수행하면 숫자형과 문자형을 연산해야한다.

하지만 숫자와 문자를 연산할 수 없기에 숫자처럼 생긴 문자는 내부적으로 to_number('2')를 발생시켜 자연스럽게 계산한다.

하지만 숫자와 문자를 계산하는데 2 + 'A' 와 같이 문자가 숫자처럼 생기지 않으면.

 

2 + 'A'. ->  2 + to_number('A'). ->  invalid number(유효하지 않은 숫자) SQL 오류

 

이런 흐름을 거쳐서 결과로 SQL 오류가 출력되게 된다.

 

 

29

case when 문 풀 때 머릿속으로만 생각하지 말고 화살표 그려가면서 흐름도를 그리자.

 

과정까지는 정확하게 생각한 거 같은데 결론이 이상하게 꼬여서 틀렸다. 변명 못하니까 제대로 풀자.

 

 

30

* null은 order by에서 가장 큰 값으로 취급해서 오름차순에서는 맨 밑, 내림차순에서는 맨 위에 위치하고 Group by는 이 내용과 상관없음.

* Group by로 먼저 팀 넘버별로 묶었음. 즉 행이 4개여야함. 이후 max()는 각 그룹별로 집계한 거임. 그룹당 height 값이 하나만 있으니 그게 곧 max()의 출력값이 됨.

* Group by 의 기준컬럼에 null이 포함되어 있으면 null도 같이 출력해줌.

 

 

31

avg는 팀넘버를 기준으로 그룹핑 된 선수들의 평균키가 180 이상이면 출력이라 오답이고,

max는 그룹핑 된 선수 중 한명만 180이 넘어가면 출력되니 오답이고,

min은 그룹핑 된 선수 중 한명이라도 180 미만이면 출력이 안되니 그룹별로 묶인 선수들 중 전원이 180cm가 초과하는 선수들이 묶인 T103의 선수들의 평균키만 출력 가능하다.

 

 

32

order by col1, col2를 작성하면

1. col1을 기준으로 먼저 오름차순 혹은 내림차순으로 정렬.

2. 정렬 후 col1에 동일한 값이 있을 시, col2를 기준으로 한번 더 정렬하라. 중복값 없으면 2번은 작동 안함.

 

 

33

null로 출력이 됐다면 1번이 정답이었음. 오름차순 시 null이 아래로 몰릴 테니까.

하지만 nvl()을 사용하여 null을 'AAAA'로 출력되게 하였음.

그리고 AAAA는 T101의 T보다 알파벳이 먼저오기에 값이 작음. 즉, 결과창에서 값이 적은 AAAA가 아래로 쏠렸으니 이건 내림차순임.

내림차순으로 정렬한 2번이 정답.

 

* order by는 alias 사용 가능, Group by 는 alias 사용불가.

* alias를 테이블에 사용 하더라도 테이블이 하나면 order by에 칼럼을 입력할 때 꼭 alias를 언급하지 않고 그냥 칼럼명만 지정해도 됨.

 

 

34

조인하면서 행 4개로 추출이 되었고 행 4개짜리 칼럼을 count로 추출함.

 

 

35

n개의 테이블이 조인하기 위해서 필요한 조인 조건의 개수는 n-1 개이다.

생각해보면 간단하다. 4개의 테이블이 조인하기 위해 필요한 최소한의 연결고리는

1 - 2- 3- 4. '-'가 3개 나온다. 즉 연결고리가 3개 필요하다.

 

 

36

CTAS 문제.

create 문으로 테이블 생성 시 기존 테이블을 복제하는 문법.

Create Table (테이블명) As Select * from (가져올 테이블명)

 

 

37

select 옵션 중 all은 중복 안거르고 다 가져옴. 그리고 이게 디폴트임.

distinct는 조회 결과 중 중복값은 제거함.

 

 

38

연산 순서 생각 안하고 대충 풀어서 틀렸다!

곱셈 나눗셈 먼저, 더하기 빼기 나중에. 매우 기초적인 거다 신경쓰자.

 

 

39

1. where 절이 거짓이므로 조건에 맞는 값이 dual 에 존재하지 않아 공집합이 리턴될 상황.

2. select 절의 nvl은 dummy 칼럼이 null(아무것도 없음)을 반환하면 이를 'DUMMY'로 출력.

3. DUMMY가 출력된다.

 

 

40

고립성은 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받으면 즉시 작업을 중지하는 것이 아니라 애초에 영향을 받으면 안된다는 것이다.

 

 

41

* 함수에 NOT이 붙었나 안붙었나 확인.

* A이면서 B인 값을 찾을 때 이 sql 문을 실행하면 A, B로 짝지어지는지 제대로 확인. 짝이 어긋날 때가 있다.

 

 

42

집계함수는 count(*) 말고 전부 null을 제외하고 연산한다.

1. count(dept_cd) 는 dept_cd 칼럼에서 null을 제외한 나머지 행의 숫자 반환

2. count(*) 는 null 포함한 테이블 행의 수 반환

3. count(distinct dept_cd) 는 컬럼에서 중복값들 전부 제외하고 반환.

 

 

43

* 조인은 특정 시점에서는 반드시 2개의 집합에 대해서만 조인 연산을 수행하여 결과 집합을 출력한다.

* 일반 칼럼이라도 논리적으로 성립되면 조인 연산이 가능하다

 

 

44

정규화는 테이블을 분할하여 데이터의 정합성을 확보하고, 불필요한 중복을 줄이는 프로세스이다.

 

중복을 일부러 늘리는 것은 반정규화이다.

 

 

45

* 테이블에 별다른 엘리어스를 주지 않아도 대신에 테이블명을 쓸 수 있다.

* SQL에서 AS는 반드시 컬럼 뒤에 와야한다. 테이블 뒤에 올 수 없다.

 

 

46

문제에서 적절한 걸 고르라 했는데 아닌걸 골랐다. 제대로 보자.

 

1. 커밋 명령 이전 상태는 변경상태가 디스크에 쓰여진 상태가 아니다. 단지 메모리 Buffer에만 영향을 줘서 이전 상태로 복구가 가능한 것이다.

2. 커밋 이전에, 데이터를 변경한 사용자는 자기 자신이 변경내역이 가능하다. 다른 사람은 이를 조회하지 못한다.

3. 다른 사용자는 데이터를 변경한 사용자가 수행한 결과를 볼 수 없다.

4. 변경된 행은 락(lock) 설정되어 다른 사용자가 변경할 수 없다.

 

 

47

4번의 emp_nm 의 언더바 개수가 틀렸다.

3번에서 '데이터사이언스학' 을 찾을 때 '데이터_____%'를 했는데 이는 정상적으로 작동한다.

 

 

48

암기!!

case (조건) when (결과1) then (출력1) end (칼럼명)

case when then end 외우기!

 

 

49

DATE 타입 기준으로 1/24/60 은 1분을 의미한다

 

 

50

Group by 의 결과는 NULL도 포함한다!!

 

Group by로 그룹별로 묶인 상태에서 각 그룹에 대해서 따로따로 select 문의 함수를 실행한다.

이걸 이해해야한다 꼭.

반응형