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 타이니스타