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