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 타이니스타
2018. 3. 23. 14:37

안녕하세요 "타이니스타" 입니다.   저는 10년도 더 이전부터 네이버 포탈 시스템의 지식인 서비스를 이용해 왔는데요.

얼마전에 네이버 지식인 식물신 등급을 달성했습니다 !  여러 카테고리에 답변을 달았는데요.

그 중에 가장 열심히 답변했던 데이터베이스 분야에서의 지식 답변들 중 다른분들이 궁금할만한 내용을 추려서 글을 올리려 합니다. 

식물신

 식물신 아이콘이에요~  등급 : 식물신,  시작일 : 2006.03.08,  순위 : 상위 1만명(0.0154%) 이내,  주요활동 분야 : 데이터베이스, 사람과 그룹, 주거살림.   2018.03.21  일자  기준으로 상위 0.0154% 군요 ㅎㅎ

참고로 저는 현재 N포탈 데이터베이스 지식인 10위에 올라있어요~ 상대적으로 주류에 속하지 않으므로 순위가 높은편에 들어가고 있습니다. ^^

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


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


질문 제목 : MS SQL에서 VIEW에 JOIN이 최대로 몇개까지 가능한가요?

내용 : VIEW가 JOIN방식으로 되는거라고 들었습니다.

JOIN은 최대 몇개까지 가능하고 VIEW에는 몇개까지 조인이 가능한지 알고 싶습니다.

지금 SQL Server2008로 101개까지 노가다로 조인해봤는데 이상없이 조인이 되네요


답변 : 조인의 최대 개수를 누군가 명시해 놓은 자료가 있을 수 있겠으나 찾기도 힘들뿐더러 필요한 정보가 아닙니다.

index 설정의 경우 250개. 255개. 라는식으로 명시된 자료가 있으나 그정도로 인덱스를 설정하지 않듯이

조인도 그렇게 많은 테이블을 사용하진 않습니다.

갯수에 제한이 있다면 인덱스와 마찬가지로 250여개 쯤 되지 않을까 추측해 봅니다.


view 가 조인 방식으로 되는걸로 들었다고 하였는데 그 이유를 아는게 더 중요합니다.


view 는 가상의 테이블로 실제로 생성되어있는 테이블 혹은 뷰에 있는 데이터를 토대로 만들어지는 가상의 테이블이며 view 를 만들기 위해선 한개 이상의 테이블이 필요합니다. 뷰는 여러 테이블을 join 하여  특정 용도의 정보를 가지게 되며 그 정보를 from 절에 기술하여 불러옴으로 사용할 수 있는겁니다.

뷰를 생성하지 않고도 뷰의 내용을 가져올 수 있으며 뷰를 생성할 때 작성하는 sql 을 인라인뷰로 작성하는 방법이 있습니다.


인라인뷰는 from 절에 작성하는 서브쿼리의 일종으로서 뷰에 더 가까운 개념으로 생각하면 됩니다.


뷰를 만드는 이유는 특정 정보를 갖는 가상의 테이블이 여러개의 쿼리에서 사용되어질 것이라 판단되는 경우

각 쿼리에 같은 내용의 인라인뷰를 만들기보다는 하나의 뷰를 만들어서 공통으로 관리 및 활용하기 위해 만들어집니다.


뷰로 만들지 않고 인라인뷰로 계속 만들어 사용할 경우 코드가 길어져서 가독성이 떨어지고 코드 관리에 불리한 점이 발생할 여지가 다분하기에 뷰로 만들어 사용하게 되는겁니다.


또한 글쓴이의 의도대로 여러 테이블을 조인하여 뷰를 작성할 경우 속도가 떨어지기에 결코 수많은 테이블을 조인하진 않습니다.

원하는 출력결과를 얻기 위해 억지로 조인을 할 수는 있겠으나 설계상의 복잡함은 물론이거니와

성능의 저하가 필연적으로 따라오게 되며 그럴 경우 설계단계에서 이미 잘못된 것입니다.

 

결론적으로 최대 개수는 250개라고 추측이 되며 정확한 값을 아는 사람은 실무에서도 별로 없으리라 생각됩니다.


중학교 수학에서 pi 라는 값을 배우셨나요? 3.14 입니다.

소수점 이하로 더 말해보자면  3.141592653589793.....

이런식으로 계속 나아갑니다. 여기서 우리는 3.14 만 알면 되고 뒤의 값은 필요가 없듯이


최대 몇개까지 가능하냐에 대한 의문은 접어두는게 낫다고 봅니다.

마지막으로 쿼리 작성에 가장 중요한 점은 원하는 결과를 가장 빠른 속도로 보여주는 것입니다.

질문에 대한 답이 아니라 다른소리를 늘어놓았으나 도움이 되길 바라며 글을 남깁니다.


* 최대 개수에 대한 정보를 포함하고 있군요.  제가 지금까지 쿼리를 짜면서 저렇게 수십개를 초과하는 조인이 필요한 적은 단 한번도 없었습니다.  그런 경우가 발생한다면 처음부터 DB설계를 잘못했을 가능성이 높겠습니다.

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

질문 제목 및 내용 : SQL문!!!

SQL문의 (성격, 특징, 레코드삽입, 레코드삭제, 테이블삭제, 업데이트, 검색)이 먼지 알고싶고,

그리고 SQL문의 예시하나 들어주세요.


답변 : 질문이 참 그러네요. 과제인가 싶네요

성격이라.. 표현하기 힘드네요 철학적인 질문에 가깝게 느껴집니다.


sql문은   작성된 실행문에 따라 굉장히 효율적인 처리결과가 나오거나 매우 비효율적인 처리결과가 나오는 극단적인 성격을 지녔습니다.   같은 결과를 만들어낸다고 하더라도 성능을 고려하여 작성한 쿼리의 경우 매우 빠르게 처리되어 시간 및 비용을 감소시키는 반면,  부적절한 쿼리의 경우 불필요한 비용을 발생시키고 잘못하면 중요 데이터가 날아가는 등의 사고가 발생할 수 있습니다.


특징으로는  sql문 작성자의 실력에 크게 영향을 받는다는 것과 굉장히 논리적인 구조로 되어있다는 점이 있습니다.


레코드 삽입 - insert into 문을 통해 특정 테이블에 데이터를 추가하는 작업입니다.

레코드 삭제 - delete 문을 통해 특정 테이블의 데이터를 삭제하는 작업입니다.

테이블 삭제 - drop 명령을 통해 테이블을 날려버리는 작업입니다.

업데이트    - update 문을 통해 특정 테이블의 조건에 맞는 데이터를 수정하는 작업입니다.

검색        - select 문을 통해 특정 테이블의 조건에 맞는 데이터를 출력하는 작업입니다.


select eno, ename

from emp

where deptname = '영업'

이라는 sql 이 검색의 select 문을 이용한 쿼리입니다.


emp 라는 사원정보 테이블에서 from emp <- 이부분

select (선택한다) eno (사원번호), ename(사원명) 을. 선택하여 출력한다.

영업 부서에 속한 정보중에서  ->  where edeptname = '영업'  <-  이부분


즉, 위의 쿼리는 영업 부서에 속한 모든 사원의 번호와 이름을 불러온다는 뜻입니다.

성격 이나 특징의 경우 철학적인 질문이기에 명확한 답을 드릴 수 없습니다.


만약 과제라면 과제를 내주신 분의 의도가 무엇인지 담거나 수업 내용에서 강조한 내용을 참고하여야 할듯 싶습니다.


* 지식인 활동을 하다보면 공부를 하거나 문제를 해결하면서 발생한 질문이 아닌 과제에 대한 답을 구하는 경우가 종종 있는데요, 질문의 내용, 글에 묻어나는 정성이나 답변할 대상에 대한 존중어린 말투 등에 따라서 단순히 도움주려고 질문만 보는데 기분이 상할때가 있습니다.  데이터베이스의 경우 어느정도 전문적인 지식이 필요하므로 장난성 혹은 툭 던지는 듯한 말투를 자제하고, 문제 줄테니 답주세요.  느낌의 무성의한 질문도 피하는게  도움을 구하는 입장에서도, 도움을 주려는 사람의 입장에서도 서로 좋겠죠?  

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

질문 제목 : sql 예제 해석부탁드려욤

내용 : select Emlid, Dept

from ASSIGNMENT, JOB

WHERE ASSIGNMENT. Jobid = JOB.JOBID

         and ASSIGNMENT. TermData = "*"


insert into EMPLOYEE

values ('43212', ' Sue A. Burt', 33 Fair St.', '444661111')


delete from EMPLOYEE

where Name = 'G. Jerry Smith'


update EMPLOYEE

set Address = '1812 Napoleon Ave.'

where Name = 'Joe E. Baker'


답변 : 1. select Emlid, Dept   :  두개의 컬럼을 출력하라

from ASSIGNMENT, JOB     어싸인먼트, 잡 테이블에서 데이터를 가져와서

where 절    :  어싸인먼트 테이블의 직업id와 직업 테이블의 직업id 가 같도록 조인(연결) 한 데이터로 간추리고   어싸인먼트 테이블의 텀데이타 값이 * 값인 데이터들만 나오게 하라.


2. employee 테이블에 데이터를 입력하라.

괄호안의 순서대로 (첫번쨰 컬럼 값 = 43212, 두번째 컬럼값 = Sue A. Burt   이런식으로 값이 들어가는것이며

테이블의 컬럼들을 명시하지 않은경우 모든 컬럼에 값을 대입해줘야 명령어가 정상실행.


3. 지워라 empoyee 테이블에 있는 데이터를. 

무엇을 지우는가?  이름이 G. Jerry Smith 인 데이터 전부를


4. 수정하라. empoyee 테이블을

주소 컬럼의 값을 1812 Napoleon Ave. 로 수정하라는 뜻이며  이름이 Joe E. Baker 인 데이터의 주소를

변경하라는 조건식이 where 절에 명시되어 있음.

* SQL 문의 기본이 되는 select, insert, delete, update 쿼리 구문이었습니다. select 구문의 경우 조인 연산을 포함하고 있군요.  SELECT 쿼리를 잘 보면  from 테이블명, 테이블명  이라고 명시가 되었고, 이 둘간의 관계를 where 조건절에서 테이블.컬럼명 = 테이블.컬럼명 과 같이 조인연산으로 이어주고 있는데요, 이와같은 표기는 dbms 중 오라클 에서 주로 쓰이는 문법이고, inner join 연산을 수행하라는 의미를 갖고 있습니다.

기본이 되는 쿼리인만큼 이 질문/답변도 가져와봤습니다.

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

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


Posted by 타이니스타
2018. 3. 21. 17:17

안녕하세요 "타이니스타" 입니다.   저는 10년도 더 이전부터 네이버 포탈 시스템의 지식인 서비스를 이용해 왔는데요.

얼마전에 네이버 지식인 식물신 등급을 달성했습니다 !  여러 카테고리에 답변을 달았는데요.

그 중에 가장 열심히 답변했던 데이터베이스 분야에서의 지식 답변들 중 다른분들이 궁금할만한 내용을 추려서 글을 올리려 합니다. 

식물신

 식물신 아이콘이에요~  등급 : 식물신,  시작일 : 2006.03.08,  순위 : 상위 1만명(0.0154%) 이내,  주요활동 분야 : 데이터베이스, 사람과 그룹, 주거살림.   2018.03.21  일자  기준으로 상위 0.0154% 군요 ㅎㅎ

참고로 저는 현재 N포탈 데이터베이스 지식인 10위에 올라있어요~ 상대적으로 주류에 속하지 않으므로 순위가 높은편에 들어가고 있습니다. ^^

13.11.28 ..  이때부터 데이터베이스 분야 지식인 답변을 시작했군요.  이 시기부터 천천히 올라가보겠습니다.

질문 제목 : "저게 왜 라만 출력되요?"  해당 질문의 질문 내용은 이렇습니다.

select substr('오라클매니아', 3, 4), substrb('오라클매니아', 3, 4) from dual;

답변 : substrb 는 2글자로 치기때문입니다. 오 = 2바이트. 1,  라 = 4바이트. 3.

* 오라클에서는 substr 과 substrb 라는 두가지 함수가 있는데요, 한글을 몇바이트로 구분해서 글자수를 셀건지 그 기준에 따라서 사용할 함수가 달라집니다.  이러한 차이점을 알고 있다면 나중에 substr 함수를 사용하는데 도움이 되겠죠?


다음 질문입니다.  토드 포 오라클 질문드려요

첨부 이미지 

엑셀에서 표를 만들어서 해당 표에서 가 컬럼 값이 1일때 남자, 2일때 여자를 if문으로 할 수 있는지에 대한 질문이군요.

답변 : select decode(가, 1, '남자', '여자') as 가  from table1;

 오라클 자체에서 if문은 사용할 수 없음. pl/sql 이면 가능합니다.  decode 문은 오라클에서만 지원이 되기에 확장성을 고려한다면 case when 문을 추천.

select case when 가 = 1 then '남자' else '여자' end as 가  from table1;

* 기본 sql 구문에서는 if문을 사용할 수 없습니다. 대신 decode나 case when 을 통해서 if문과 같은 효과를 줄 수 있어요. 물론 지원하는 함수가 모든 데이터베이스시스템이 조금씩 상이합니다. 일례로 오피스 소프트웨어에 포함된 "엑세스" 에서는 iif문을 통해서 if문과 같은 효과를 줄 수 있습니다.

여기서 한가지 더 짚고 넘어갈것이 decode 는 함수식이지만 case when은 표현식이기에 case when을 사용하는것이 성능상 더 유리하다는 점 참고하시기 바랍니다.


다음 질문은 오라클 독학을 어떻게 해야할지에 대한 질문이었군요. 

질문 : 프로그래밍을 전공으로 하려는 목적이아닌 취미개념으로 데이터베이스를 공부하고자 합니다

 지금하는 업무가 DB를 수정하거나 하는건 아니고 실제 개발업무는 타 업체의 개발자가 진행을 하고있으니..

오라클과 같은 데이터베이스를 기초만이라도 하나의 개념이라도 잡기위해서 추천해주실만한 책이있는지 해서 질문올립니다.

답변 : 데이터베이스를 공부하고자 한다면 먼저 데이터베이스의 이론적인 부분을 공부해야합니다. 기본 지식을 위해 먼저  데이터베이스 시스템 이라는 책을 추천합니다. 책 검색 후에 간략한 설명을 토대로 본인이 원하는 책으로 선택하시면 됩니다.  이어서 오라클을 공부하실때 실무적인 부분을 공부하고자 하면 많은 시간과 노력, 실습경험이 필요합니다.  오라클 도서로는 10G로 시작하는 오라클 SQL PLSQL 을 추천합니다.  기초적인 부분에서 중급 개발자도 헤매는 부분 까지 수록되어 있습니다. 기초를 알고자 하시면 간단한 sql 문부터 조인에 대한 부분까지 공부하시면 되겠고. 더 심화있는 공부를 하고자 하면 뒷부분도 열심히 익혀보시길 권합니다

* 독학을 어떻게 할지에 대한 질문이었네요  14년도 답변이라서 오라클 10g 버전을 언급하고 있으나 현재는 12C 버전이 최신인거 같습니다.


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

Posted by 타이니스타