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. 3. 19. 10:39

안녕하세요  "타이니스타" 입니다


이 카테고리에서 다룰 내용은 프로그램 관점의 데이터베이스, sql 등입니다.

즉흥적으로 써내려가는만큼 부족한 부분이 많겠지만 감안하고 봐주시기 바랍니다.

 

 

PK. 테이블의 레코드를 구분할 수 있는 최소의 컬럼.  FK. PK에 참조되며 같은 데이터를 지닐 수 있는 컬럼. PK 부.  FK 자 .    부모와 자식관계로 볼 수 있습니다.

 PK는 주로 학번, 주민번호, 사원번호 등  유일한 값을 가지는 컬럼이 주로 PK의 대상이 됩니다.

 예 )

학생table 

학번(pk)    이름       주소             학과번호(fk)

  1111       홍길동   옛날옛날             a11

  1112       강감찬   먼옛날                a11

  1113       대장군   전장터                a12

  1114       김철수   뒷동네                a12

 

학과table

학과번호(pk)   학과명

   a11             수학과

   a12             영문과

 

위와 같이 두개의 테이블이 있습니다.  학생 테이블에서 학생 개개인을 유일하게 구분할 수 있는 컬럼으로 학번이 적절하기에 PK가 되며  학과번호 컬럼은 중복이 되기에 구분이 가능한 키가 아닙니다만

학과 테이블의  학과번호와 연결될 수 있기에 FK 가 됩니다. 이러한 관계를 통해 두 테이블은 조합하여 데이터를 추출할 수 있게 됩니다.  예를들어 학생 테이블의 모든 학생의  학번, 이름, 학과명을 출력하고자  하면

 

select 학번, 이름, 학과table.학과명

   from 학생table, 학과table

 where 학생table.학과번호 = 학과table.학과번호 ;

 

라고 조인을 걸어서 해결할 수 있습니다. 이렇게 pk 와 fk를 나누게 된 이유는 데이터의 중복을 최소화 하기 위한 정규화에 의해 테이블이 나뉘어졌기 때문입니다. 예를들어 학생, 학과 테이블로 나눠지지 않고 처음부터 합쳐져 있었다면

 

합쳐진table

학번    이름          주소     학과번호   학과명

1111    홍길동    옛날옛날     a11       수학과

1112    강감찬     먼옛날       a11       수학과

1113    대장군     전장터       a12       영문과

1114    김철수     뒷동네       a12       영문과

 

으로 되있겠으나 학과명이 중복됩니다. 현재 예제는 컬럼의 양이 적어서 크게 느껴지지 않겠지만

컬럼이 10개 20개 30개만 되도 엄청난 데이터의 낭비가 발생함을 알 수 있습니다. 이렇게 중복되는 데이터를 최소화 하고자  정규화가 생겨났습니다.

이 정규화에는 제1정규화 제2정규화 등  다양한 방식이 존재합니다. 정규화에 대한 자료는 인터넷에 검색하면 쉽게 얻을 수 있으니 자세한 내용은 생략합니다.

 

결론 -  PK와 FK는 관계형 데이터베이스 RDBMS 에서 반드시 필요하다.

 

pk는 데이터를 구분할 수 있는 컬럼이며 fk는 pk와 대응되거나 null 값을 갖는다 정도로 정리하겠습니다.

 


2번 글에서 말씀드린 SELECT SQL 에 내용 추가 합니다.

 SELECT

 - 출력하고 하는 컬럼들을 명시하는 영역.

SELECT EMPNO, EMPNM, DEPTNM    <- EMP테이블의 사원번호, 사원명, 부서명을 출력.

 FROM EMP

 

FROM

 - 출력할 컬럼의 데이터가 있는 테이블을 불러오는 영역.

SELECT EMPNO, EMPNM, DEPTNM

 FROM EMP   <-  SELECT 절에서 출력하고자 하는 데이터가 들어있는 테이블 명을 명시.

  

WHERE

 - FROM 절에서 불러온 테이블에 조건을 줘서 데이터를 걸러주는 영역.

SELECT EMPNO, EMPNM, DEPTNM

FROM EMP

WHERE EMPNM LIKE '김%'  <- 사원의 이름이 김 씨로 시작하는 사람들만 출력

   

GROUP BY

 - 걸러진 데이터를 토대로 그룹으로 묶어주는 영역.

SELECT COUNT(EMPNO), DEPTNM

FROM EMP

GROUP BY DEPTNM   <-  부서별로 그룹화.  COUNT = 몇 개의 데이터가 있는지 알아내는 함수로서 부서명을 그룹화 하였으므로 부서별로 몇명이 있는지 알 수 있음.

  

ORDER BY

 - 출력결과에 정렬을 해주는 영역.

SELECT EMPNO, EMPNM, DEPTNM

FROM EMP

ORDER BY DEPTNM, EMPNM   <-  부서별로 정렬하고 각 부서에서 이름별로 정렬.


Posted by 타이니스타
2018. 3. 7. 16:53

안녕하세요  "타이니스타" 입니다

이 카테고리에서 다룰 내용은 프로그램 관점의 데이터베이스, sql 등입니다.

즉흥적으로 써내려가는만큼 부족한 부분이 많겠지만 감안하고 봐주시기 바랍니다.

SQL 에 대한 설명에 앞서서 테이블에 대해 알아보겠습니다.

데이터베이스에는 데이터를 저장하는 공간인 테이블이 존재하고, 테이블은 다시 열과 행으로 이루어져 있습니다.

표를 예로 들어보면,

 학번

이름 

학과 

주소 

기타 

 001

 홍길동

 수학

 주소1

 

 002 

 강감찬

 화학

 주소2

 

 003

 이순신

 기계공학

 주소3

 

이와같이 학번, 이름, 학과, 주소, 기타 를  로, 그 아래에 각 항목에 대한 값들이 들어간 한줄 한줄을 이라고 합니다.

열은 달리말하여 컬럼이라고 합니다. 컬럼이라는 항목과 그에 대한 값이 있는 행으로 이루어진 표를 테이블이라고 하며, 이와 같은 구조로 데이터를 갖고 놀수 있는게 SQL 언어입니다.

SQL 언어는 프로그래밍적 요소가 들어갔으며 여기에는 논리적이고 산술적인 기술이 필요합니다.

데이터베이스에 저장된 데이터를 사용하는 큰 갈래로 조회, 추가, 수정, 삭제 가 있습니다.


조회 - 데이터베이스에 저장된 데이터를 사용자의 요구사항에 맞춰서 출력

추가 - 데이터베이스의 특정 공간에 데이터를 추가적으로 입력

수정 - 데이터베이스에 저장된 데이터를 사용자의 요청에 맞춰서 변경

삭제 - 데이터베이스에 저장된 데이터를 사용자가 지정한 조건에 따라 삭제


위와 같이 4가지 방식으로 데이터베이스를 활용하게 되는데, 이를 활용하기 위한 sql 문의 키워드를 알아보겠습니다.


조회 연산 - SELECT

  - SELECT 구문은 SELECT 표현할 컬럼, 컬럼, 컬럼 FROM 데이터가 저장된 테이블명 ;  이 기본 형식입니다.


추가 연산 - INSERT

  - INSERT 구문은 INSERT INTO 데이터를 추가할 대상 테이블명 (추가대상컬럼1, 추가대상컬럼2, 추가대상컬럼3) VALUES (추가대상컬럼1에 들어갈 값, 추가대상컬럼2에 들어갈 값, 추가대상컬럼3에 들어갈 값,) ;  이 기본 형식입니다.


수정 연산 - UPDATE

  - UPDATE 구문은 UPDATE 데이터를 수정할 테이블명 SET 수정대상컬럼 = 수정할값;  이 기본 형식입니다.


삭제 연산 - DELETE

  - DELETE 구문은 DELETE 테이블; 이 기본 형식입니다.


여기서 확실히 짚고 넘어갈 것이 있는데, 위에서 나열한 구문은 모두 기본 구문으로서 대부분의 경우 WHERE 라는 조건절을 추가해줍니다.


WHERE 절에 대해 알기위해 SELECT 문을 심도있게 설명해보겠습니다.


SELECT 학번, 이름, 학과

  FROM 학생정보

 WHERE 학번 LIKE '18%'

 ORDER BY 이름

 

라는 SELECT 쿼리(SQL)가 있습니다. 이 쿼리문을 해석해보면,

SELECT  표시하겠다.   무엇을?  학번, 이름, 학과 컬럼(항목)을.

FROM  어떤테이블에서 데이터를 가져올거냐?  학생정보  라는 이름의 테이블에서

WHERE  데이터를 가져올때 조건을 적어라   학번 LIKE '18%'   학생정보 테이블의 학번 컬럼이 18 로 시작하는 데이터를 가져와.

ORDER BY  불러온 데이터를 정렬해라  이름  이름 컬럼 순으로 (이름 뒤에 ASC 가 붙으면 오름차순, DESC 가 붙으면 내림차순 입니다.) 오름차순으로 정렬하라.  (ASC 및 DESC 생략시에 디폴트로 ASC 인 오름차순 정렬을 수행합니다.) 가 됩니다.


이 외에 GROUP BY, HAVING 등이 들어가기도 합니다.


설명을 보면 알겠으나 WHERE 라는 조건절이 들어감에 따라 사용자가 원하는 데이터들만 데이터를 조회할 수도 있고, 

UPDATE 문이나 DELETE 문 등에서도 거의 항상 WHERE 절을 필요로 하게 됩니다.

SELECT 구문에서는 이 외에도 기본제공되는 함수, 사용자정의함수 등을 활용할 수 있습니다.

 

  

  

Posted by 타이니스타
2018. 3. 3. 20:25

안녕하세요  "타이니스타" 입니다

이 카테고리에서 다룰 내용은 프로그램 관점의 데이터베이스, sql 등입니다.즉흥적으로 써내려가는만큼 부족한 부분이 많겠지만 감안하고 봐주시기 바랍니다.


데이터베이스는 데이터의 집합체라 보면 됩니다만 프로그래밍적 관점에서 데이터베이스라 하면 DBMS(데이터베이스관리시스템) 를 의미합니다. 

DBMS를 통해 데이터의 조회, 추가, 수정, 삭제 연산을 수행하게 되고, 이를 통해 사용자가 원하는 방향대로 데이터를 이요할 수 있게 되는겁니다.

DBMS 에 대표적인 제품군이 오라클과 MS-SQL, 그리고 MySql 인데요. MySql 의 경우 무료로 사용할 수 있었으나 오라클 업체에서 사들인뒤 유료로 전환되었다고 합니다.

국내에서 가장 많이 사용하는 DBMS 는 오라클이지만 ms-sql 도 많이 쓰이고 있습니다.

저는 오라클을 위주로 사용하고 있으므로 오라클 위주의 설명을 이어나갈 예정입니다.

데이터베이스는 컴퓨터 전공자의 경우 전반적인 개념을 알고 있어야하며, 실무자의 경우 개념과 함께 데이터를 사용하기 위한 프로그램적 언어인 SQL 을 익혀야 합니다.

SQL 과 관련한 내용은 다음글에 이어집니다.

첨언하자면, 데이터베이스는 여러분이 어떤식으로든 수없이 이용하고 있다는거 알고 계신가요? 단순히 이메일을 확인하고자 로그인을 할때에도, 인터넷창을 열었을때도, 검색할때도, 스마트폰을 활용할때조차 쓰이고 있으며, 빅데이터 시대인만큼 여러분이 직접 전자기기를 사용하지 않더라도 간접적으로 여러분의 많은 행동들은 데이터베이스에 쌓이고 있습니다.

굳이 IT를, 컴퓨터를 전공으로 하지 않은 관련없는 분이더라도 데이터베이스에 대해 간단하게나마 알아두는것도 도움이 되지 않을까 싶습니다.  

Posted by 타이니스타