2018. 4. 10. 07:00

지식인 답변모음 3번에서 14.07.22 까지 답변했었고, 이후의 답변 추려봤습니다.


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


질문 제목 : select, from, where 절에 들어가는 추가 select 구문 선택 방법

내용 : 안녕하세요. 어제 쿼리 작성중에 몇시간 삽질을 했었는데...다른분께 여쭤보니 프럼절에 select절로 바로 해결을 하는 일이 있어서...ㅠㅠ 서브 쿼리 를 작성 할때 언제 어떻게 사용하면 좀 더 좋은 쿼리를 알수 있나...싶어서 질문 드립니다.

SQL쪽을 잘 알지는 못하고 필요할때 쿼리를 짜고 적용합니다. 기본적으로 보면 select , from, where 에 필요에따라서 서브 쿼리를 작성하게 되는데 물론 참 정의 하기 애매하기는 하지만 어떤상황일때 저 3가지에 구분을 해서 서브쿼리를 작성 할수 있나요?

익숙하신분들은 대략적으로 만들어야 할 쿼리에 대해 ... 주변 요청 사항을 생각해서 쿼리를 바로 생각하시는데.. 이때 언제 서브 쿼리를 어떻게 넣는다고 생각 하시나요?

SELECT ->

FROM ->

WHERE ->

이렇게해서 어떤 상황에서 서브 쿼리를 넣는다.. 라고 좀 정의 부탁 드리겠습니다.


답변 : select 절에 쓰이는 서브쿼리는 스칼라 쿼리라고 합니다.

주로 from 절에서 참조하는 컬럼의 한개의 레코드 값을 활용하여 다른 테이블 혹은 현재 테이블의 다른 데이터와 비교하여 원하는 값을 출력하고자 할 때 사용됩니다.

굉장히 비효율적이므로 반드시  꼭 필요하며 데이터의 양이 적을때가 아니면 사용하지 않길 권합니다.

from 절에 쓰이는 것은 인라인뷰라고 합니다.  뷰. 라는 것은 하나 이상의 테이블에서 데이터를 추출하여 테이블처럼 만들지만 실제로 저장된 데이터가 아닌 쿼리의 결과물로 보면 됩니다.

이렇게 가상으로 만들어진 데이터 테이블은  일반 테이블과 마찬가지로 from 절에 명시하여 명시한 뷰의 데이터를 테이블에서 가져오는것과 같이 가져올 수 있게됩니다.

이때, 뷰로 만들지 않고 인라인뷰에 쿼리를 작성하고 나온 결과물을 하나의 테이블로 사용하는 것이 인라인뷰입니다.

from 테이블명  이라고 사용하는게 보통이지만 인라인뷰는  from (select 컬럼1, 컬럼2 from 테이블 where 날짜컬럼 >= '2014-01-01') a   와 같이 하나의 쿼리를 내포하고 내포된 쿼리의 결과를 테이블 형식으로 사용하기 위해 사용합니다.

쿼리를 한번 더 타는것과 같기에 필요에 의해서만 사용해야 합니다. 물론 인라인뷰나 where 절의 서브쿼리는 자주 사용되며 필요시엔 사용해주는게 맞습니다.

되도록 안쓰는게 좋으나 써야될땐 써야되는 . 성능에 크게 악영향을 끼치지 않는 서브쿼리 입니다. 남발하면 저하되는건 당연하니 sql튜닝에 대해 어느정도 공부한 후에 사용하길 권합니다.


where 절에 쓰이는것이 일반적으로 알고 있는 서브쿼리입니다.

select 테이블.컬럼1, 테이블.컬럼2, 테이블.컬럼3

 from 테이블

where 테이블.학과 in (select 테입.컬럼1 from 테입 where 학과 like '컴퓨터')

과 같이 조건절에 비교할 값을 쿼리형식으로 반환하여 사용하고자 할 때 사용하는게 where절의 서브쿼리 입니다.

사용하는 경우는 기본적으로 쿼리의 돌아가는 로직을 생각하면 어렵지 않게 이해가 가능할겁니다.


* 서브쿼리에 대한 내용이었습니다. 서브쿼리는 상황에 맞춰서 적절히 사용한다면 상당히 유용합니다. 서브쿼리에 대한 기본적인 이해를 갖춘다면 SQL 작성에도 자신감이 생길겁니다.


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


질문 제목 : jsp의 내용을 사용자별로 db에 저장하려면 어떻게 해야 하나요?

내용 : jsp의 내용을 사용자별로 db에 저장하려면 어떻게 해야 하나요 A가 로그인한 상태에서 제가 만든 한 jsp에서 전송버튼을 누르면 그 A의 DB에 저장이 되고 B 가 로그인하여 사용할때엔  B 의 DB에 저장시키고 싶습니다..

페이지에서 저장하는 값이 간단하게 변수 하나라고 할때(정보가 들어있는 테이블은 따로 있고, 사용자 테이블과는 다릅니다.) 

어떻게 사용자를 찾아서 그 사용자에게 저장 시키는지.. 페이지내에서 뭐 사용자 정보라도 불러와서 사용자 아이디를 정보 테이블에 넣기라도 해야하는지.. 감이 안옵니다. 어이없는 질문이어도 친절한 답변 부탁드립니다. DB는 오라클 사용중입니다.


답변 : 로그인한 사용자의 정보를 세션에 담고 있다면 세션에서 사용자의 아이디 값을 파라미터로 넘겨주고, 없을 경우 페이지에서 해당 사용자를 선택하여 사용자의 아이디 값을 파라미터로 넘겨주는 방식으로 하면 되겠습니다.

sql 문은 update 칠지, insert 칠지에 따라 달라지겠네요. update 쿼리나 insert 쿼리는 인터넷에 검색하면 쉽게 찾아서 사용할 수 있을겁니다.

문제는 로그인한 사용자의 데이터 저장이겠죠. update 쿼리든, insert 쿼리든,   where 라는 조건절에  사용자ID = 넘겨받은 사용자아이디명  으로 걸어주면 됩니다.

예를들어, update 테이블명 set 컬럼명 = 저장할 데이터 where 사용자id = :userid;


* 웹 프로그램 관련 질문이었습니다. 로그인 기능이 있다면 세션관리는 필수입니다. 물론 흉내내는 수준이라면 굳이 사용하지 않아도 됩니다만 기본적으로 현재 로그인된 계정에 대한 처리로 세션관리는 필수요소인거죠. 로그인한 사용자의 정보가 없다면 그건 회원관리가 전혀 안되고 불가능한 단순흉내에도 못미칠겁니다.


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


질문 제목 : 컴활1급 데이터베이스 질문

내용 : 컴활 1급 데이터베이스recordsource속성에서 문제가 <거레처별상품>폼의 'txt공급업체명'에 '공급업체명'을 입력하고 '조회(cmd조회)' 버튼을 클릭하면 다음과 같은 기능이 수행되도록 구현하시오.

-<거래물품> 테이블에서 'txt공급업체명'에 입력된 공급업체의 상품정보만 조회되도록 하시오

-현재폼의 recordsource속성을 이용하여 이벤트 프로시저를 작성하시오


이게문제인데 Me.Recordsource="select * from 거래물품 where 공급업체명='" & txt공급업체명 & "'"

이렇게 쓰면 틀리고 Me.Recordsource="select 거래물품.공급업체명 from 거래물품 where 공급업체명='" & txt공급업체명 & "'"

이렇게 써야 맞다고 나오는데 select 다음에 *가 모든필드표시라는 뜻 아닌가요?

*를 쓰면 왜 틀린거고 "거래물품.공급업체명" 이라고 왜 써야하나요? 데이터베이스고수님들 답변좀부탁드려요ㅠ


답변 : 엑세스에서 컬럼을 출력할 때는 반드시 테이블명.컬럼명  으로 처리해줘야 합니다. 둘다 틀렸네요. 답은  select 거래물품.상품정보 from 거래물품 where 공급업체명='" & txt공급업체명 & "'"  가 맞습니다.

질문자의 말대로면 * 로 인해 모든 컬럼이 출력이 됩니다. 문제를 보면 상품정보만 <- 이라고 되있는데, 다른 컬럼들까지 보여주므로  결과가 틀림을 알 수 있습니다. 또한  엑세스에서 필드를 직접 끌어다 쓸 경우  테이블명.컬럼 혹은 테이블명.* 로 작성이 되는게 정상이며 select *  이라고 한 것은 표준에는 맞지만 부적합한 답으로 판단하여 정답처리가 안될 여지가 있는겁니다.

물론 틀린 답은 아니지만 문제는  하나의 컬럼만 출력하라고 명시되어 있다는거죠.


* 엑세스 질문이었군요. 저도 데이터베이스를 처음 접했던 이유는 고등학교 시절에 정보기술 이라는 전국기능대회 준비를 위해 오피스 프로그램들을 배우게 되어서였죠. 지금은 필요한 공부내용이 좀 달라졌다고 들었습니다. 전공을 살리지 않는 평범한 대학교 컴퓨터학과 하위권 졸업생보다 더 나은 실력을 갖추게 되었더군요. 엑세스에서도 SQL문이나 서브쿼리, 테이블 및 관계 등에 대한 개념들이 들어있습니다만 깊이 있는 공부는 불가능하니 가볍게 맛보기 하실분은 설치도 쉽고 접근도 쉬운 엑세스로 접해보는것도 괜찮습니다.


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


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



Posted by 타이니스타
2018. 4. 9. 11:08

지식인 답변모음 3번에서 14.07월까지 답변했었고, 이후의 답변 추려봤습니다.


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


질문 제목 : ms-sql 에서 스칼라함수 가 무었인지?? 정의?랑 스칼라함수가 하는일 저장프로시저랑 무었이 다른지 좀알려주세요

내용 : 프로젝트에 넣어야 되는대 데이터 베이스 배워본적이 없어서 어중띄게 일부분 아는대 스칼라 함수에 대해서 잘 모르겠어요 찾아본 책에서는 무슨 단일 값에 적용되어 그 값의 결과를 돌려주는 함수 라는대 무언가 설명이 부족한거 같아요.. 좀더 자세히 알려주시면 감사하겠습니다 


답변 : 스칼라함수는 특정 컬럼을 가공하여 원하는 목적에 맞는 결과값을 돌려주는 역할을 합니다.

select substring('orange', 1, 3) from tableA 라는 쿼리가 있습니다. substring 함수는 인자값 3개를 받으며, 첫번째 인자는 가공하기 전의 컬럼명. 두번째 인자는 시작지점. 세번째 인자는 끝지점 을 의미하며 substring 함수의 목적은 컬럼을 시작지점에서 끝지점 까지 잘라서 그 부분만 리턴하여 보여주겠다. 라는 함수입니다.  substring 이라는 함수명으로 값을 잘라주는 코딩이 내재되어 있기에 사용자는 substring 이라는 함수를 사용할 수 있게 됩니다.

결과값은   ora 가 나오겠지요. oragne  123456    1~3 까지인 ora 가 나오게 되는겁니다.

책에서 단일 값에 적용되어 <- 이부분은 컬럼에 들어있는 값. 즉, 제가 위에서 예시로 든 테이블에서 단일값 = 'orange' 라는 값이 들어있는 컬럼이 되는겁니다. 

여러 행을 지닌 컬럼이라면 여러 값이 들었겠으나 스칼라함수의 경우 각 행별로 처리를 해주기 때문에 단일값이라고 하는겁니다.

그 값의 결과를 돌려주는 함수 <-  이부분은 위에서 명시했듯이 orange 라는 단일값을 잘라내어 ora 라는 결과 를 보내줬다는 뜻입니다.

스칼라함수에는 문자열 함수, 수치 함수, 날짜 및 시간 함수, 타입 변환 함수 등 여러가지가 있습니다.  스칼라 함수를 검색하면 더 자세한 내용을 볼 수 있으며 필요한 정보가 있다면 참고하기 바랍니다.

그리고 스칼라 함수와 저장프로시저의 차이에 대해 물어보셨는데 스칼라함수는 데이터베이스에 탑재된 내장함수를 말하며 표준이 되는 함수로서 다른 사람들도 공통적으로 사용하는 일반적인 함수들을 말합니다. 저장프로시저의 경우 for loop 문이나 if 문 등 다양한 명령어를 사용자가 입력하여 특정 결과를 만들어내는 일종의 사용자 정의 함수 라고 보면 되겠습니다. 저장프로시저의 경우 자세한 내용을 설명하자면 책 한권 이상의 분량이 나올 수 있기에 자세한 설명은 생략하겠습니다.


* 스칼라서브쿼리에 대해서만 생각하고 있었는데 예전에 이전 답변도 달았었군요. 스칼라함수에 대해서는 저 역시 다시한번 정리해봐야 할 것 같습니다. 명칭에 대한 혼동도 옵니다만 확인이 필요한 내용이었군요.


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


질문 제목 : 오라클관련 질문있습니다~~ 

내용 : 안녕하세요. 기본적인 프로그램관련수업들을 듣고, 오라클수업을 들을 예정인 직장인입니다.

전공이 컴퓨터관련이 아니라, 기본적인 컴퓨터 지식은 없는 상태에서 교육과정이 시작되었습니다. 지금까지 이수한 수업들은 c 언어, java, jsp, 네트워크기초를 들었고, linux 는 현재 1주정도 수업을 남겨두고 있습니다.

맨처음 상담받고 수업에 대해 설명들을 때는 전혀 과정에 대해 모르던 때라서, 직장인과정이라는게 뭔지 몰랐는데, 확인해보니 오라클이  WDP 교육과정과 OAEC 교육과정이 나눠져있더라구요. 근데 오라클교육기간에 대해 담당자와 통화하다가 직장인과정이라 2주정도면 교육과정이 마무리된다고 하더라구요. 제가 주중엔 직장을 다니고 있어서 주말에 수업을 듣고있는데, 오라클수업은 오전부터 저녁까지 진행이 된다고 들었지만, 2주정도면 교육과정이 이수된다는것에 깜짝놀랐습니다.

제가 궁금한건, 오라클교육이 직장인과정일 경우 수업진도정도나 수업이 진행되면서 오라클이나 DB 에 대해서 전혀모르는데 잘 따라갈 수 있을지 의문입니다....ㅠㅠ 혹시 오라클수업에 대해 알고계신 분들이 있다면 답변부탁드립니다~

그리고 제가 수업전에 먼저 공부할 부분이나, 참고가 될만한 책이 있다면 추천부탁드립니다. ^^


답변 : 교육에 대한건 다른분이 남겼으니 현재 오라클을 다루는 개발자로서 답하겠습니다.

전반적인 지식이 없다고 하였으나 컴퓨터 관련 수업들을 들으며 컴퓨터 관련 전공자에 뒤지지 않는 기본 지식은 갖췄을 것입니다. 전공이 컴퓨터라고 해도 기초중의 기초만 배울 뿐이고 좀 더 이론적으로 많이 수업을 들었을 뿐이지, 별 다를건 없습니다.

오라클을 주말에. 그것도 2주간의 시간이면 토일 토일  고작 4일입니다. 하루종일 수업을 듣는다고 하여도 오라클을 공부했다고 보기는 힘듭니다.

다만 접해봤다. 정도는 되겠군요. 수업과정을 잘 모르겠으나 기초적으로 오라클에 대한 전반 적인 설명과 db에 대한 간략한 소개 및 기초 수준의 SQL 문을 작성하며 오라클을 익히리라 예상됩니다. 미리 공부하고 참고 하겠다고 하셨는데 딱히 참고할 필요는 없을겁니다.

기초적인 부분이기에 수업을 듣고, 이해가 안가는 부분은 질문을 통해 해소해도 충분히 따라가리라 생각이 되고요. 조금 더 오랜 기간을 투자하여 공부하고자 한다면  초보자를 위한 오라클10g 가 괜찮겠습니다. 먼저 기초적인 부분을 충분히 숙지한 후에 조금 더 상위 레벨의 책을 공부하는게 도움이 되겠구요

단기간에 보고자 한다면 정보처리기사 자격증 과목 중 데이터베이스 과목이 있는데, 이 자격증 도서를 가볍게 훑어보며 데이터베이스에 대한 이해를 갖고 있다면 도움이 될것입니다.


* 지금은 어떤일을 하실지 궁금한 분이군요. 공부 방법이나 교육 방향은 여러가지가 있습니다..  참 어렵고 누군가의 답변도 좋은 방향이 되겠으나 스스로 고민하고 알아가며 나아가는것 역시 하나의 길이 되겠죠.


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


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



Posted by 타이니스타