2018. 4. 13. 15:27

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



질문 제목 : 데이터베이스가 필요한 응용분야 질문입니다.

내용 : DB는 응용소프트웨어의 여러분야에서 사용되고있다는데 DB가 필요한 응용분야는 뭐가있고 왜 거기에 DB가 필요한지 몇가지만 알려주세요.


답변 : 지금 질문자가 접속한 인터넷도 db를 이용한거고 네이버 라는 웹사이트 역시 db를 이용한겁니다.

우선 인터넷 가입을 해야 인터넷 사용을 할 수 있겠죠? 그러기 위해선 인터넷에 가입된 아이디와 패스워드가 필요합니다.

여기서 이 아이디와 패스워드는 인터넷 회사의 db에 저장되어 있고 질문자는 그 db에 접근하여 유효한 사용자인지 판별받고 인터넷을 사용하게 되는겁니다. 네이버 역시 질문을 하기위해 로그인을 하는 경우. 회원정보 db를 이용한것이고, 현재 이 질문 역시 db 상에  지신인질문 이라는 테이블이에 들어가 있을테죠.

어떠한 형태로 저장하냐에 따라 db이기도 하고 db 가 아니기도 하지만 원론적으로 db는 데이터베이스의 약자로서 데이터베이스는 크게 데이터의 집합 으로 생각하면 되지만 dbms 를 말하는 듯 하여  위와 같이 설명을 드린겁니다.

오라클, mssql 을 포함한 다양한 db가 있으며 대부분 웹사이트나 학적관리시스템, 사원관리, 물품관리 등 각종 erp 시스템에서 주로 사용된다고 보면 됩니다.

필요한 이유야 수많은 데이터들을 공간의 낭비를 최소화하면서 효율적으로 활용하기 위해서며 또한 보안 적 측면에서도 필요하기 때문입니다.



질문 제목 : 데이터베이스 spl 문제입니다.

내용 : 아래의 관계 데이터베이스 스키마를 보고, 다음 질의들을 SQL로 표현하라.


EMPLOYEE(EMPNO, EMPNAME, TITLE, MANAGER, SALARY, DNO).

DEPARTMENT(DEPTNO, DNAME, LOCATION).

PROJEMP(PROJNO, PROJNAME, PMANAGER, BUDGET).


1. 직급이 대리인 모든 사원들의 이름과 사원번호, 이들이 소속된 부서의 이름과 부서번호를 검색하라.

SELECT E.EMPNAME, E.EMPNO, D.DNAME, D.DEPTNO,

FROM EMPLOYEE AS E, DEPARTMENT AS D WHERE E.DNO=D.DEPTNO AND E.TITLE=‘대리’; .


2. 직급이 대리인 모든 사원들의 이름과 사원번호, 이들이 소속된 부서의 이름과 부서번호를 검색하라.

SELECT EMPNAME, EMPNO, DNAME, DEPTNO, FROM EMPLOYEE, DEPARTMENT WHERE TITLE=‘대리’; .

두가지모두 맞는 답인가요? 아니면 틀렸는지 설명좀 부탁드려요.


답변 : 1번의 경우  from 절의 테이블 에 별칭을 줄때 as 를 빼주면 정확한 sql문이 됩니다.

2번의 경우  from 절에서 두개의 테이블을 가지고 온것은 맞습니다만  where 절에  두개의 테이블을 연결하기 위한 조인 식이 빠져 있기에 데이터가 사원테이블의 레코드수 X 부서 테이블의 레코드수 만큼 cross join 되어 어마무시한 양의 데이터가 발생되며

답이 될 수 없습니다.


SELECT EMPNAME, EMPNO, DNAME, DEPTNO                                                      .

FROM EMPLOYEE, DEPARTMENT   WHERE DNO = DEPTNOAND TITLE=‘대리’;                  .

라고 해주면 정확한 답이 됩니다. 또한가지, 위의 1번 sql 문의 경우 FROM절에 EMPLOYEE AS E 라고 되있는거에서 AS 를 빼서 FROM EMPLOYEE E, DEPARTMENT D  라고 해주는게 맞습니다. 테이블에 별칭을 줌으로서 어떤 컬럼이 어떤 테이블에서 가져왔는지 명확히 알 수 있도록 해주며, 만약 사원 테이블의 DNO 가 DEPTNO 로 되있다면  두 테이블에서 동일한 이름의 컬럼이 있게되어 시스템에서는 어떤 테이블의 컬럼을 가져올지 혼동이 되어 에러가 발생하게 될 여지가 있기에  테이블에 별칭을 주는게 좋습니다.

잘못된 이유 : AS 를 통한 별칭은 SELECT 문에서 사용하는 것이고 FROM 절에서는 에러가 발생합니다.


SELECT E.EMPNAME, E.EMPNO, D.DNAME, D.DEPTNO  FROM EMPLOYEE E, DEPARTMENT D 

WHERE E.DNO = D.DEPTNO AND E.TITLE=‘대리’;  이라고 해주는게 가장 정확한 답이 되겠습니다



질문 제목 : sql having을 where절로 바꾸려면 어떻게 해야하나요.

내용 : 공부하는 책의 예제인데 having 절을 안쓰고 where절로 바꾸려하는데요 모르겠어요 ㅠ.

select dept_name, avg(salary) from instructor group by dept_name having avg(salary)>42000;  .

이 질의를 having 절 안쓰고 where절을 써서 바꿔주세요.


답변 : select a.dept_name, a.avg_sal  from (select dept_name, avg(salary) as avg_sal  from instructor group by dept_name)where a.avg_sal > 42000 ; .

인라인뷰로 한번 감싸서 문제를 풀어주는 겁니다. 부서별 평균 급여를 구하되 평균 급여가 42000보다 많은 부서를 찾는 문제입니다. 그렇기에 부서별로 평균급여를 구한 후에 구해진 데이터들로 이루어진 가상의 테이블을 만들어주고 각 부서별 평균급여가 있으니 where 절에 평균급여가 42000보다 많다. 라는 조건을 주면 변경이 가능합니다. 이해 안되는 부분이 있다면 의견 남겨주세요.

*


질문 제목 : 오라클 고수님들 도움요청합니다. 급해요.

내용 : 학교에서 오라클수업을듣는 학생입니다. 오늘 수업시간에 기초를배우고 실습을해봤는데요.

모르는문제들이있어서 질문드립니다. 수업할때는 scott 계정으로하구요, 문제가 모르겠는데 2개가있는데 EMP 테이블에서 보너스가(comm) 급여(sal)의 10퍼센트 이상인 모든 종업원에 대하여 이름,급여,보너스를 출력하는 SELECT 문을 작성하여라입니다.

이문제는 그냥 아예 갈피를못잡겠고 또 한가지는 EMP 테이블에서 이름(ename)이 L이 두 자가 있고 부서(deptno)가 30이거나 또는 관리자(mgr)가 7782인 사원의 모든정보를 출력하는 SELECT 문을 작성하여라.

SELECT * FROM emp  WHERE ename LIKE '%L%' and (deptno = '30' or mgr = '7782') <--제가생각한 SELECT문 이렇게하니깐 L자 이름 1개인 사람도 포함이 되서 이 문제는 이름에 'L'2개가 들어가는 사람인데 배울 때는 분명히 WHERE ename LIKE '%X\_Y%' ESCAPE '\'; 이런식으로 하면 X랑Y 값이 포함된 문자열 조회가 된다고 한거 같은데 안되네요.

오라클 고수님들의 정확한답변 기다리고있겟습니다!!.


답변 : 1번.  테이블에 대한 정보가 없으니 정확한 답을 해드리기가 어렵습니다.

select 이름, 급여, 보너스 from EMP where comm >= (sal*0.1) ;

select 절에  출력할 컬럼명을 적습니다.  이름, 급여, 보너스를 출력하라고 되어있으니 세개의 컬럼을 , <- 콤마 구분자를 통해 적습니다.

EMP 테이블에서 <- 라고 되있으니 from 절에는 데이터를 가져올 emp 테이블을 적습니다.from EMP 조건이 보너스가 급여의 10퍼센트 이상이라고 되있으니  보너스가    (급여 * 0.1 을 하여 10% 값을 구한 값) 이상이라는 조건을 where 조건절에 기입합니다.

where 보너스  >=  (급여 * 0.1) ;

where 절은 조건을 기입합니다.  보너스가 급여의 10%이상. 이라는 조건이 되는겁니다. 끝입니다.


2번.  select * from emp  where 이름 like '%L%%L%'  and (부서 = 30 or 관리자 = 7782) ; 라고 하면 됩니다.


select *   <- 별표 표시는 테이블의 모든 컬럼을 출력하라는 뜻으로서 emp 테이블의 모든 정보를 출력하게 됩니다.  참고로 테이블이 한개일 때만 * 이라고 표시해야 하고 여러 테이블일 경우, 테이블에 별칭 (일종의 가짜이름) 을 줘야합니다. 

ex) from emp e, food f   라고 쓴다면 emp 테이블은 e가 되고 food 테이블은 f 가 되어서  select e.* 이라고 해줘야 emp 테이블의 모든 정보만 가져오게 되는겁니다.

from emp   <- 1번의 설명과 같음.   where 조건절에  이름 에서 like 닮은애를 찾아라.  라고 되있는데 L 이 두개 들어간 녀석을 찾아야 하니까 like '%L%'한번이 아니라 L% 를 이어서  '%L%L%' 라고 해주면 됩니다.

% 연산자는 다른애들이 중간에 껴있다. 의 의미입니다.


마지막으로  and (deptno='30' or mgr = '7782') 이 부분은 잘 하셨습니다. 한가지 걸리는점은 테이블 컬럼의 데이터형이 어떻게 설정되어 있느냐 입니다. deptno 의 경우 해석하면 부서번호가 되며 no 는 보통 number 를 의미하므로 자료형이 number 일 가능성이 높습니다.

이럴 경우  deptno = 30 과 같이 '' <- 를 빼주는게 좋습니다. 물론 결과가 나오는데 문제는 없습니다만 사용자는 모르겠지만 오라클 내부적으로  '30' 이라는 문자를 30 이라는 숫자로 변환해주는 과정이 들어가서 속도상에 문제가 발생할 수 있습니다.  초보 입장에서는 크게 중요한 문제는 아니겠습니다마는 데이터가 많을수록 성능에 악영향을 끼칠 수 있다는 점을 참고하셔야겠습니다.

*


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


Posted by 타이니스타
2018. 4. 11. 12:14

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




질문 제목 : 데이터베이스 야생동물들의 key

내용 : 학교 데이터베이스 시간에 교수님께서 간단하게 키에개념에대해서 설명해주시고 말에 key가 될수있는 것(후보키를말하는것인지 슈퍼키를 말하는것인지는 잘 모르겠습니다.)에 대해서 생각해 오라고 하셨는데요. 이게 모든 말(야생의 말까지 포함)이 가지고있고 모든말이 다른것인데 전혀 감이 안오네요. 정답이 없을수도 있는거같은데 알고계시면 좀알려주세요.


답변 : 질문이 너무 모호하네요.

교수님이 말한 키가 무엇인지. 그리고 가장 강조한 키의 개념이 후보키인지, 주키인지를 알아야 답에 근접할 수 있을듯 합니다만, 그리고 말이라면 horse. 동물인 말을 말하는건가요?.

대 분류로 말. 이라는 동물이 되겠지만 정식 명칭으로 얼룩말, 조랑말 등으로 세밀하게 나뉜다면.


말 이라는 테이블을 두고,

말ID  |  말학계명 

a01     얼룩말

a02     조랑말

a03     적토마

a04     야생마

a05     경주마


와 같이 나눠서 말ID라는 값을 키로 지정해야 됩니다만 질문의 의도를 알 수가 없네요.

키의 개념에 대해 다시한번 숙지 하시고  말의 학계명칭, 학계명칭에 대한 말의학계명칭코드 를 키 정도로 생각하는게 맞다고 생각됩니다.

질문자가 글에도 남겼듯이 전혀 감이 안온다고 했는데요. 교수님이 생각해 오라고 한 바가 무엇을 의미하는지 질문자도 모르는 상황에서 나온 질문이기 때문에 다시 한번 거쳐서 보는 입장에서는 명확한 답을 드릴 수 없겠네요.

중요한건 말의 key 가 무엇인지를 아는게 아니라, key의 개념을 정확히 알고, 알고 있는지 확인하기 위해 특정 사물 (여기서는 말)을 대상으로 무엇이 키가 될 수 있는지 생각해 보라고 한 듯 합니다.

질문에 보면 생각해 오라고 한걸 보니 레포트로 작성하는 건 아니겠네요.

그렇다면 키의 개념을 명확히 알고 간 후에 발표하는 시간이 된다면 다른 사람들은 어떻게 조사해갔으며, 교수님이 하는 말에 따라서 생각해보아도 될 듯 합니다.

데이터베이스 과목이 이론을 파다보면 헷갈리는 부분이 많이 발생할 수 있는데요. 교수님이 말을 할 때 어떤 의도로 말하는지 주의깊게 듣고 중요하나 부분을 확실히 이해하기 위한 복습이 중요합니다.


* 사실 정답이 정해진 내용보다는 어떻게 생각하는지, 어떻게 받아들였는지, 특정 현상이나 대상에 대해서 아는대로 말해보라는 등의 질문은 정말 답변하기 어렵습니다. 답 자체가 어려운거보다는 질문한 사람이 어떤 의도로 무엇을 생각하며 질문을 던졌는지 파악하기가 어렵기 때문이죠. 질문자와 대화를 했거나 질문자가 특정 질문을 하기까지의 과정에서 발생된 정보가 없으면 답변을 달면서도 확신이 들지는 않게 됩니다.



질문 제목 : 데이터베이스에 대한 지식많으신분만.

내용 : 프로그래밍을 할 때 DB의 장점이 뭐죠? 저는 그냥 DB의 장점만 배웠는데 프로그래밍 할 때 DB 장점은 모르겠어여. 그냥 DB장점이랑 똑같은건가요?.


답변 : 디비의 장점이랑 같은면도 있지만 관점이 다르죠. 디비를 프로그래밍에 접목하여 관리가 용이하다는게 장점입니다.

예를 들어서 학적관리 프로그램을 만들어야된다면 여러 데이터들이 필요하겠죠. 수많은 데이터를 효율적으로 관리하기 위하여 디비를 이용해야되고 본인이 프로그램 개발에 사용할 언어를 이용해 연동하여 사용할 수 있으려면 디비를 어느정도 알아야겠죠.



질문 제목 : 데이터베이스 오라클 sql에서 as 질문입니다.

내용 : 오라클에서 as 랑 연산자중에 \ 두개는 무엇을 할때 사용하는건가요?.


답변 : as는 별칭을 부여합니다. 예를들어, sum(점수) 를 셀렉절에 표기하면 반환되는 필드의 명칭이 sum(점수) 와 같이 나오기에 이를 바꿔줘야할때 주로 사용됩니다. sum(점수) as 총점 과 같이 사용합니다. \\는 concat함수와 같은 역할을 하는것으로 두 문자를 이어줍니다. 예를 들어, 학번 컬럼과 이름 컬럼을 연결하여 한컬럼에 쓰고자할때 씁니다.

학번 이름

A01 홍길동 이라고있다면 select 학번 // 이름 as 학번이름 이라고하면.

학번이름

A01홍길동 이라고 출력됩니다.


*


질문 제목 : 쿼리문에대한 정의좀 내려주세요. 

내용 : 쿼리문에 대한 정확한 정의좀 내려주세요. 예제를 들어서 설명해주시면 더욱더 좋을꺼같습니다 !. 부탁드립니다.


답변 : 쿼리는 질의문. 즉, 사용자의 요구에 맞는 데이터를 불러오는 SQL 언어를 말합니다.

DBMS 에 저장된 테이블에 접근하여 원하는 조건에 부합하는 데이터를 효과적으로 가져올 수 있는 언어로서 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY 절로 구성되어 있습니다.

SELECT 와 FROM 절은 필수요소이며 SELECT 는 출력하고자 하는 필드와 그 필드에 필요한 값을 얻기 위해 함수 및 스칼라서브쿼리 등을 기술할 수 있습니다.

FROM 은 원하는 데이터가 들어있는 테이블을 기술하게 됩니다.  예를들어서 사원 테이블과 급여 테이블에서A001 이라는 사번을 지닌 사원의 사원과 이름, 급여를 출력하라는 요구가 있다면.

SELECT EMPNO(사번), ENAME(사원명), SALARY(급여)

FROM 사원테이블명, 급여테이블명

WHERE 사원테이블명.EMPNO = 급여테이블명.EMPNO

   AND 사원테이블명.EMPNO = 'A001' ; .

위와 같이 작성하여 원하는 결과를 얻어올 수 있습니다. 이와같이 데이터베이스에 들어있는 테이블에서 원하는 데이터를 가져오기 위해 DBMS 에서 알아먹을 수 있는 언어로 명령을 내리게 되는데, 이를 SQL문 이라고 합니다.


* 쿼리문에 대한 설명입니다만 정의라고 하기엔 부족한 답변이었습니다.



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


Posted by 타이니스타
2018. 4. 10. 09:20


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




질문 제목 : 친구관리 db를 어떻게 짜야 할지 조언좀 해주세요.

내용 : jsp 페이지에서 a라는 사람의 db가 있는데 친구추가 페이지에서 b를 친구추가하면 b가 가진 정보를 a의 정보와 함께 나타내고 싶습니다.

그리고 친구를 끊으면 당연히 b의 정보는 사라지고 a의 정보만 남게요.. 조언 부탁드립니다.


답변 : 그리드로 관리 되는 화면인지 알아야죠. 또한 폼 형식이라면 개개인의 데이터만 나올 테니 함께 나타낼 순 없습니다.

굳이 나타내자면 폼을 더 만들순 있겠지만요. (여기서 폼은 html 의 TABLE 로 보면됩니다.)

최대 몇명까지 나타낼수 있을까요. 즉, 여러 친구를 보고 싶다면 그리드로 만들어지는게 맞고, 그리드 (목록) 라면  그리드 한개 로우 마다 친구의 id 값을 가지고 있게 한 후 그리드를 선택하여  친구 끊기 버튼을 누르면 끊을껀지 물어보는 메세지를 띄워주고 "예"를 누르면 그리드의 선택된 로우의  친구ID 값을 넘겨줘서 delete 쿼리를 태우면 됩니다.

delete 테이블명 where 친구ID = 그리드에서 선택된 친구ID값.


* 친구 관리 db를 구축하면서 나온 의문점에 대한 간단한 조언 이었습니다.



질문 제목 : 조인식 질문입니다.

내용 : SELECT DISTINCT 계약상황.*,B.수금액 FROM 계약상황 LEFT OUTER JOIN(SELECT 계약번호,SUM(수금액) AS 수금액 FROM 수금상황 GROUP BY 계약번호) B ON 계약상황.계약번호=B.계약번호,참여기술자 WHERE 참여기술자.참여자='전지현' and 계약상황.계약번호=참여기술자.계약번호" 계약상황,참여기술자,수금상황 테이블이 있고 수금테이블에 해당계약건들로 sum하여 계약테이블에 조인시키고 해당 참여기술자가 참여한 계약을 찾으려 하는데 조인식이 지원되지 않습니다. 라고 에러 메세지가 뜨네요.

참여기술자 요거를 FROM절에 어떻게 넣어야 정상적으로 처리되나요? ㅠㅠ.


답변 : SELECT DISTINCT A.*, B.수금액

  FROM 계약상황 A LEFT OUTER JOIN(SELECT 계약번호, SUM(수금액) AS 수금액 FROM 수금상황 GROUP BY 계약번호) B

   ON A.계약번호 = B.계약번호 INNER JOIN 참여기술자 C ON A.계약번호 = C.계약번호 WHERE C.참여자='전지현'; .


* 간략하게도 답해놨었군요. SQL ANSI 표준에 따라 작성된 쿼리라고 볼 수 있습니다. 물론 오라클 기준의 SQL문입니다.



질문 제목 : 오라클 EXISTS 어떻게 동작 하나요??

내용 : CREATE TABLE test1 (idx int, type char(1), title varchar(10));

INSERT INTO test1 VALUES(1, 'C', '나라'); INSERT INTO test1 VALUES(2, 'D', '자동차'); INSERT INTO test1 VALUES(3, 'E', '비행기');.
CREATE TABLE test2 (idx int, type char(1), name varchar(50));
INSERT INTO test2 VALUES(1, 'C', '페라리'); INSERT INTO test2 VALUES(2, 'C', '소나타'); INSERT INTO test2 VALUES(3, 'E', 'F16'); INSERT INTO test2 VALUES(3, 'E', 'F18'); .

SELECT * FROM TEST1 A WHERE EXISTS(SELECT * FROM TEST2 B WHERE A.TYPE = B.TYPE);

도출 결과 
첨부 이미지 
테이블이 어떤 식으로 WHERE 절에서  A.TYPE = B.TYPE 어떻게 조인이 되어서.. 테이블들을 찾는지 잘 이해가 되지 않습니다. ㅠ.ㅠ 자세한 설명좀 부탁드리겠습니다. 


답변 : 타입을 서브쿼리의 조건으로 줬으니  type 과 조인을 하게 됩니다. 메인쿼리에서 a 테이블을 선언했고  where 절에서 서브쿼리를 사용했습니다.

a테이블의 한 건의 레코드와  b테이블의 모든 데이터를 비교하여 같은게 한개라도 있다면 값이 출력 됩니다. 즉,  a 테이블의 레코드수 X b테이블의 레코드 수 만큼 크로스 조인이 된다고 볼 수 있지만 엄밀히 보면 크로스조인도 아니지요.

a테이블의 type C 와 같은게 있는지 확인하기위해 b테이블의 type 컬럼을 전부 비교하게 됩니다. b테이블에 type C 가 있기에 

a테이블의 type C 가 출력되고   a테이블의 type D는 b테이블의 type 컬럼에 존재하지 않기에 넘어가고 다시 a테입르의 type E 는 b테이블에 type E 가 있기에 출력되는겁니다.


* 서브 쿼리 내에서 조인조건을 줘서 유효한 데이터를 필터링 해주는 기능인 exists 에 대한 질문이었습니다.



질문 제목 : 엑세스 기본키 뜻?! .

내용 : 엑세스에 기본키가 있잖아요! 그 기본키의 뜻이 궁금하네요~ (기본키에대한 정의).


답변 : 기본키는 테이블 내에 수많은 레코드가 존재할 경우, 각각의 레코드를 유일하게 구분할 수 있는 컬럼을

기본키(PK)라 정의하게 됩니다.


예를 들어 학생 테이블이 있을 경우

학번     이름        학과    .

001      아무개     수학과  .

002      돌팔매     영문과  .

003      김장군     수학과  .

004      홍길동     수학과  .

005      마동탁     영문과  .

006      김탁수     영문과  .

007      나이름     영문과  .


여기서 중복이 될 수 없는 값. 즉, 학번이 기본키가 되는겁니다. 기본키를 설정하는 이유는  학생 테이블과 관련된 다른 테이블과의 연결을 해주기 떄문입니다. 이를 관계라고 하며, 엑세스나 기타 데이터베이스는    서로 관계 있는 데이터들에 의해 여러테이블에 나뉘어진 데이터를 연결하여 사용할 수 있게 되는겁니다.


학생-자격증 테이블이 있다고 칩시다.


학번     자격증명            .

001      정보처리산업기사    .

001      정보기기운용사      .

006      워드1급            .

007      컴활1급            .

007      MOS                .

 

위 테이블을 보면  학번이 있으며 학생 테이블과   학생-자격증  테이블의  학번은 같은 속성 값을 지니므로 연결이 가능하며 이는 곧  학생 테이블과   학생-자격증 테이블이 서로 관계가 있음을 뜻합니다.여기서 sql 문으로 원하는 데이터를 만들어 낼 수 있습니다.


수학과 학생의 학번과 이름, 자격증을 출력하시오.


select a.학번, a.이름, b.자격증명 from 학생 a, 학생-자격증 b where a.학과 = '수학과'; .


이렇게 할 경우 

학번     이름     자격증명.

001     아무개   정보처리산업기사.

001     아무개   정보기기운용사.


와 같은 데이터가 나오게 됩니다. 즉 pk는 학생의 정보를 학생 한명당  한개만 가지고 있으며  모든 학생은 서로 다른  학번을 가지고 있기에 중복이 되지 않고.  중복이 되지 않는다는 것은  학생 한명한명을  학번으로 구분할 수 있음을 뜻하며 "테이블에서 레코드를 유일하게 구분할 수 있는 컬럼(혹은 컬럼들)이다."  라고 정의할 수 있습니다.


* PK에 대한 설명을 하고 있습니다. PK는 데이터간에 식별을 위한 키라고 보면 되겠습니다.



질문 제목 : 데이터베이스에서 사용하는 R에 대하여 자세히 알려주실분!.

내용 : 무슨 R 언어라고 하는거 같던데 여기저기 검색을 해봐도 이렇다할 정보가 없네요. 자세히 설명해주시면 감사하겠습니다!.


답변 : R 은 릴레이션. 관계를 말합니다. 현재 주류가 되고 있는 데이터베이스들은 관계형데이터베이스 모델을 기반으로 한 RDB 입니다. 보통 디비. 데이터베이스 라고 하면 이 RDB를 가르킵니다. 오라클이나 MS-SQL 등이 대표 제품에 속합니다.

이 R 은 특정 데이터를 여러 테이블로 나누는 정규화 와 밀접한 관련이 있습니다.

예를 들어  A 대학 B군 이라는 학생의 데이터가 있다고 가정하면.


학번 이름 주소 학과 수강과목.

A001  홍길동  우리집123       데이터베이스학과          물리.

A001  홍길동  우리집123       데이터베이스학과        C언어.

A001  홍길동  우리집123       데이터베이스학과       운영체제.


와 같이 나타날 수 있는데 이렇게 되면 학번, 이름, 주소, 학과 등의 데이터가 중복이 되어 불필요한 저장공간이 발생하게 됩니다.

이를 해소하기 위해서 즉, 중복을 최소화 하고자 하나의 테이블에 있는 데이터를 여러개로 나누는 정규화를 거치게 됩니다.

학생 테이블 에는 학번, 이름, 주소, 학과 번호가 들어가게 되고 학과 테이블에는  학과번호. 학과명. 학과위치 등의 정보가 들어가며 수강 테이블에는 학번 과목  으로써 데이터의 중복을 최소화 하게 됩니다. 이렇게 나누어진 테이블의 항목(컬럼) 을 보면 학생 테이블의 [학과 번호]는 학과 테이블의 [학과 번호] 와 연결이 가능합니다.

이렇게 서로 관계있는 항목을 통해 연결이 되어 있는 것이 R . 즉 관계 입니다. 수많은 데이터는 다수의 테이블에 나누어 저장이 되어있습니다.


* RDB에 대한 설명이라고 볼 수 있습니다. 주로 사용되는 데이터베이스 모델은 관계형 데이터베이스 모델이죠.



질문 제목 : 오라클 좀 알려주세요.

내용 : 한 로우에 A,B 값이 들어있습니다. SELECT 하면 A는 사과, B 는 배 로 보여주고싶습니다. 사과, 배 이런식으로요. DECODE 써도 안되고 어떻게 해야할까요.


답변 : 한개 로우 라는것은  컬럼 하나에 A,B 라고 들어가 있다는건가요. 아니면 한개 컬럼에  A 값 혹은 B 값으로만 들어가 있다는 건가요. 값이 한개 컬럼의 한개 로우에 사과,배 라고 들어갔을 때를 가정하여 처리했습니다.


select (case substr(a.col, 1,1) when 'A' THEN '사과' when 'B' THEN '배' END) || ',' || (case substr(a.col, 2,1) when 'A' THEN '사과' when 'B' THEN '배' END) AS COL  .

  from (select regexp_replace(col, '[ ,]') as col from tbl) a ;

한개 로우당 한개의 값만 가질 경우는 아래와 같이 쓰면 됩니다.

select case col when 'A' then '사과' when 'B' then '배' end as col from tbl;.



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


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