2018. 3. 28. 21:49

지식인 답변모음 1~2번에서 14년 6월 16일까지 했었고, 이후의 답변 추려봤습니다.


------------------------------------------------------------------------------------------------------------------------


질문 제목 : 오라클 outer join 질문입니다.

내용 : 개발직을 한지 3년정도 되었는데 아직도 확실한 답을 알지 못하였습니다.

전 프로젝트 개발 중 쿼리짤때 LEFT OUTER JOIN 을 LEFT JOIN 으로 줄여 쓰고 있습니다.

RIGHT OUTER JOIN 은 RIGHT JOIN으로 하고요. INNER JOIN 은 그냥 JOIN 이라고 쓰지요.

순전히 편하기도하고 동일한 값이 나오기도 하니 문제 없다 여겼는데 얼마전 욕을 들어서요.

궁금한건 저렇게 줄여쓰면 안되는것인지.무엇때문에 안되는것인지.

DB를 오라클에서 MSSQL로 변환할때 문제가 있는건지 정말 궁금하네요.

시간 날때 한번씩 찾아보고는 있는데 LEFT JOIN이 INNER JOIN 이라느니.

대체 쿼리는 짜본적이 있는 사람들이 글을 남긴건지 참..... 알려주세요~


답변 : 결과는 같고 사용법 역시 같습니다.

욕을 먹었다면 자신의 편의상 줄여씀으로서 표준을 어긴거로 판단해서 그런듯 합니다.

같다고 누구나 안다해도 단순히 right left join 이라고 사용을 하는 것보단 outer 를 명시하여 가독성을 높이고 누군 이렇게, 또 누군 이렇게 쓰는걸 안좋게 생각하는 사람이라면 싫은소리를 할 수 있는거죠.

회사마다, 사람마다 다릅니다만 정식 명칭을 사용하는게 더 좋다고 생각합니다.


* 오라클의 경우 아우터 조인을 질문내용과 같이 (left or right) join 이나 (left or right) outer join과 같이 사용할 수 있고, 이 외에도 아우터조인의 기준이 될 테이블과 아우터조인으로 참조될 테이블간의 컬럼 조인 기술시  메인테이블.컬럼 = 참조테이블.컬럼(+) 와 같이  (+) 키워드를 통해 아우터조인 연산을 수행할 수 있습니다. 

답변당시에 저는 입사 1년차의 신입시절이고, 질문자는 3~4년차였네요. 사실 회사마다, 사람마다 모두 다르지만 표준을 지키거나 가독성을 고려한 코딩이 추후에 개발비용보다 지속적으로 발생하기에 더 비싼 유지보수 비용을 줄일 수 있게 됩니다.


------------------------------------------------------------------------------------------------------------------------


질문 제목 : 정규화 예제 질문 드립니다.

내용 : 정규화 공부중인데 예제가 이해가 안됩니다.

도움좀 부탁드립니다. 첫번째 문제입니다

성적표 (학번 이름 전공 과목번호 과목이름 교수명 연구실 성적) 밑에 속성값없이 이렇게 주어주고 정규화하라는데 뭐가 중복이고 뭐가 종속인지도 도대체 모르겠습니다.

적어도 밑에  값을 세네줄만 주면 대충 누가 무슨과목 몇개들으니 과목별로 나눠서 중복을 없애기라도할텐데 그냥 열이름만 나열되어있으니 노답입니다. 왜 뜬금없이 학생(학번 이름 전공)  성적(학번 과목번호 과목이름 교수명 연구실 성적)이 되는지도 모르겠습니다. 결과값을 봐도 도저히 추론이 되지않습니다  제발 이해좀 시켜주세요.


답변 : 
학번 | 이름  |   전공 | 과목번호 | 과목명 | 교수명 |  연구실 | 성적

111 |  홍길동 | 도술 |      A1    | 건축     | 나건축 |  C01호  |   A

111 |  홍길동 | 도술 |      A2    | 수학     | 나수학 |  C02호  |   B

111 |  홍길동 | 도술 |      A3    | 사회     | 나사회 |  C03호  |   A

 

학생 과 성적으로 나눈 이유  =  학번과 이름, 전공  컬럼을 보면 값이 중복됨을 알 수 있습니다.

정규화의 목적중 하나는 중복값을 최소화 하는것이기 때문에 학생의 개인 정보를 저장하는 학생 테이블과 학생의 성적 정보를 저장하는  성적 테이블로 나눠지게 됩니다.

그럼으로서 중복을 최소화하게 되는것이고,  학생과 성적 테이블에는 각각 학번이라는 공통 분모를 가지고 있기 때문에 이 두 컬럼간의 JOIN을 통해 데이터를 합치거나 변별력이 생기게 되는겁니다.


* 위 같이 답변을 했군요. 정규화에 대한 내용이었는데 아무래도 정규화에 대한 설명은 많으나 이해를 위해서가 아닌, 시험에 대한 답변을 위한 자료가 대부분이다 보니 테이블 하나를 임시로 표시하며 설명했습니다. 
정규화가 잘된 디비환경에서 쿼리(SQL)를 짜다보면 자연스럽게 알게 될테지만 그런 환경을 쉽게 접하긴 어려울 사람들에게 적절한 답이지 않을까 싶습니다.


------------------------------------------------------------------------------------------------------------------------


질문 제목 : MSSQL 쿼리 해석

내용 : CASE CHARINDEX('/',Phone) WHEN 0 THEN REPLACE(REPLACE(Phone,'-',''),' ','') 

ELSE REPLACE(REPLACE(SUBSTRING(Phone,1,CHARINDEX('/',Phone)-1),'-',''),' ','')  END as 핸드폰번호


위에 질의어 인데 다른건 이해 하겠는데 

1.ELSE 문을 왜 쓰는지? 

2.WHEN 0 THEN 에서 0 의 의미가 무엇인지?

3.SUBSTRING(Column,1,CHARINDEX('/',Column)-1) 에서 -1 의 의미가 무엇인지?


이렇게 3가지가 궁금 합니다. 고수님들 답변 기다리겠습니다.  감사합니다.


답변 : 
1. Phone 컬럼에서 / 문자열을 charindex 로 추출합니다. 결과값이 0. 즉 / 가 없을경우, REPLACE(REPLACE(Phone,'-',''),' ','') 를 실행하고. 그렇지 않은경우, else 문 아래의 명령어를 실행하기 위해서 ELSE를 사용합니다.

2. WHEN 0 THEN 은 위에서 설명했듯이 Phone 이라는 컬럼의 문자열에 / 문자가 없을 경우 라는 조건을 주기 위해 0 이라는 조건을 주게됩니다. case when 문은 case 이후에 나올 값에 대해 조건을 주는 함수입니다.

3. -1 은  charindex 를 통해 / 를 찾은 값에서 -1의 위치. 즉, 01/11 이라는 값이 컬럼 값이라면 3 이라는 값을 리턴해주는데  여기서 -1을 하여 2의 값을 리턴해주겠다는 소리이며  여기에선  substring 함수를 통해 가장 앞의 문자에서 / 가 나오는 위치의 -1 에 해당하는 위치를 지정해주기 위해 사용한겁니다.

* 내용중에 한가지 정정할 부분은 case when else end 문은 함수식이 아닌 조건식입니다. 그렇기에 함수식인 decode 함수보다 성능이 좋습니다. 상황에 맞춰 적절한 사용이 필요하고, MS-SQL 에서는 decode 함수가 없으므로 참고하시기 바랍니다.


------------------------------------------------------------------------------------------------------------------------


이상으로 14.07.14 까지의 답변이었고, 꾸준히 이어나가겠습니다.  데이터베이스와 관련해서 간단한 질문정도는 언제든지 환영하며, 제가 모르더라도 여러 루트로 알아보고, 배운뒤에 답변을 도와드리도록 하겠습니다. 혹 부족한 답변이 보인다면 언제든 조언 및 지적 환영합니다.


Posted by 타이니스타