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