본문 바로가기
Delphi Tip/데이터베이스

델파이 데이타베이스 기초 3

by MonoSoft 2023. 10. 5.
728x90
반응형

델파이 데이타베이스

728x90

 

 

 

 

SQL(Structured Qurey Language) 

 

SQL은 1970년대초 IBM에서 개발한 데이타베이스 질의용 언어로써

델파이에서는 실제 SQL언어자체를 가지고 응용프로그램을 만들거나 하는게 아니라

SQL문법으로 쓰여진 문장을 TQuery콤포넌트를 사용해서

BDE에 넘기면 BDE가 해석하여 어떤 역할을 수행합니다.(Local SQL사용시)

그리고 BDE Administrator를 사용하면 SQL문장을 마치 배치화일처럼 만들어 사용할수도 있습니다.

 

DML(Data Manipulation Language)

데이타 베이스로 부터 원하는 레코드를 검색하거나,

추가/삭제/수정하는등의 데이타 처리를 하는 언어

 

 

DDL(Data Definition Language) 

말그대로 DataBase테이블 새로 만들거나 필드속성을

변경하는 등의 DataBase 구조자체를 다루기 위한 언어

 

 

 

DCL (Database Control Language)

데이타베이스 콘트롤 언어 여기서는 DML에 관해 서만 설명을 드릴것입니다.

왜냐면 델파이에서 파라독스 Table을 사용해 DB어플리케이션을 만들경우

프로그램을 개발하기 전에 미리 DataBase Table을 만들어놓은 상태에서

시작을 하기때문에 DDL을 쓸기회가 거의 없을 테니깐요..

 

물론 MS-SQL서버나 오라클 서버의 경우는 Table을 만들기 위해

직접 DDL을 사용하는 경우가 많지만 이 부분은 보통은 DB관리자가 알아서 하고

프로그래머가 하지는 않죠 델파이에서는 파라독스 DB를 쓸 경우

Database Desktop을 사용하시면 쉽게 해결됩니다.

 

물론, 프로그램이 실행하는 도중에 테이블을 만들거나 해야 된다면

문제가 달라지겠지만..참고로 여기서 설명하는

델파이의 SQL Local-SQL로써 델파이 BDE를 설치하면

기본 으로 설치 되는 SQL입니다.

 

실제 다른 SQL서버를 사용하게되면 TQuery콤포넌트들을 사용하는 경우

SQL문장을 BDE가 해석하지 않고 바로 서버로 문자열을 보내서

서버가 모두 처리 하지만 Local-SQL을 사용할경우에는 BDE가 이 모든 일들을 수행합니다.

 

Local-SQL은 ANSI SQL-92의 모든 문법을 다 수용하지는 않습니다.

그리고 MS_SQL서버나 오라클 서버에 비해서는 제한적인 명령셋만 제공합니다.

하지만 stand-alone PC환경에서 쓸만큼은 충분히 지원합니다.

 

아래에서도 SQL명령을 다 설명하지는 않고 기본적인 SQL만 설명 드릴겁니다.

그것만 알면 나머지는 BDE의 함수를 쓰면 쉽게 구현이 되고 실제 델파이로 PC한대에서 사용하는

데이타베이스 프로그램을 짤때는 SQL을 전혀 몰라도 됩니다.

 

하지만 복잡한 검색을 해야 하거나 네트웍용 프로그램을 짤려면

필히 알아야 하기에 여기서는 예제에서 쓰일 간단한 명령들만 설명드릴것이고

이렇게 쓴다는 것만 알면 나머지는 책을 참고하시면 쉽게 짤수 있다고 전 생각합니다.

 

그리고 만약 도체 이게 뭐하는지 모르시는 분은 그냥 대강 훓어 보고 이런게 있구나 하고 넘어 가도 됩니다.

 

 

SQL의 DML(Data Manipulation Language) 

데이타 조작이라는 말은 결국 테이블에서 어떤 레코드를 검색하고

즉 이름이 홍길동인 사람을 찾는다던지--, 새로운 레코드를 추가하고.

기존의 레코드중에서 어떤 내용을 바꾼다던지..

아니면 어떤 레코드를 삭제한다던지..

또는 이름 순으로 정렬된 레코드들을 국어 성적순으로 정렬한다던지..

뭐 그런 일들을 하는 것이고 DML은 그런 일들을 하기위한 명령들입니다.

 

 

 

SQL에 쓰이는 명령들(예약어)
- 자료처리 명령 -
1. SELECT : 테이블로부터 원하는 필드를 선택합니다.(중요)
2. INSERT : 테이블에 레코드를 추가
3. DELETE : 테이블로 부터 레코드 삭제
4. UPDATE : 테이블상의 레코드 갱신(수정)
- 집합함수 -
5. SUM() : 레코드 집합(Group) 에서 선택한 필드의 합을 구함
6. AVG() : 레코드 집합(Group) 에서 선택한 필드의 평균을 구함
7. MIN() : 레코드 집합(Group) 에서 선택한 필드의 최소값을 구함
8. MAX() : 레코드 집합(Group) 에서 선택한 필드의 최대값을 구함
9. COUNT() : 레코드 집합(Group)의 레코드수 구함 - 조건 명시
10. FROM : 데이타를 가져올 테이블 명시
11. WHERE : 원하는 레코드를 찾기 위한 조건 제시
12. ORDER BY : 레코드 집합의 순서 정의
13. GROUP BY : 레코드를 특정 조건에 의해 묶음
14. HAVING : GROUP BY로 만들어진 그룹들 가운데 특정 조건을 만족하는 그룹 선택 데이타 검색

 

SQL을 사용하는 가장 큰 특징중의 하나가 조건을 만족하는

레코드의 검색이 쉽다는 것입니다.

 

검색을 하기위해서는

1) 검색 결과가 있는 필드를 SELECT [필드명, 필드명, ...] 이렇게 써준다

2) 참조하는 모든 테이블을 FROM [테이블명, 테이블명, ...] 이렇게 써준다

3) 검색 조건을 WHERE절에 써준다.

 

검색조건쓸때 문자열의경우 ' 또는 " 아무거나 써도 상관없습니다.

아래예제를 설명하기 위해서는 원래 예제에 나오는 모든 테이블의

필드구조를 알아야 하지만 일일이 테이블 구조를 모두 나열하기가

힘든관계로 대략 보시면 이해가 쉽게 구성을 했습니다.

자재관리를 생각하시고 테이블들을 보시면 이해가 쉬울것입니다.

 

(* : 기본키, FK : 외부키)

Company.db 테이블 : 거래처에 관한 정보 포함한 테이블

Com_Id : 거래처 코드*

Com_Name : 거래처명

Tel : 전화번호

ADR : 주소

 

Sales.db 테이블 : 거래내역에 관한 거래장부 테이블

Sale_Id : 거래내역번호*

Com_ID : 거래처 코드

FK Sale_Date : 거래일자

Item_ID : 자재코드

FK Count : 판매수량

Total : 판매가격

 

Items.db 테이블 ; 자재정보 테이블

Item_ID : 자재코드 *

Item_Name : 자재명

Item_Price : 단가

Item_Count : 재고물량

 

예1) 거래처 Table에서 "하나건설"의 전화번호를 찾고 싶을때

 

SELECT Tel FROM Company.db WHERE Com_Name = '하나건설'

이렇게 하면 끝입니다.

 

여기서 Tel은 전화번호 필드의 이름이고 Com_Name은 회사이름을 나타내는

필드의 이름이며 둘다 Company.db 테이블에 속해 있다.

 

Tel은 전화번호가 있는 Company.db 테이블의 필드명이고

이 쿼리에서는 Company.db테이블 하나만 있으면 되므로

FROM절에 하나만 써주면 되고 조건이 회사명이 "하나건설" 인 레코드를 찾으면 되므로

회사명 필드인 Com_Name = '하나건설'이라고 쓰시면 됩니다.

 

만약 하나건설에 관한 모든 필드 내용을 알고 싶을때는

SELECT Tel -> SELECT * 로 고치면 Company테이블의 모든 필드 내용이 다 나옵니다.

 

예2) 하나건설과 거래한 모든 내역을 입출고 내역 Table에서 찾고 싶을때

 

SELECT Company.Com_Name, Sales.*

FROM Sales.db,

Company.db WHERE Company.Com_Name= '하나건설'

AND Sales.Com_Id = Company.Com_Id

 

여기서는 첫예제와 많이 다릅니다.

 

첫째 입출고 내역테이블인 Sales.db에는 거래처 명이 없습니다.

단지 거래처 코드만 가지고 있습니다.

 

이런상황에서는 sales.db만가지고는 레코드를 찾을 수 없습니다.

이럴때는 거래처 이름과 거래처 코드를 동시에 가지고 있는

compnay.db 테이블에서 거래처 이름을 가지고 거래처 코드를 찾은 다음

그 코드를 가지고 다시 sales.db테이블에서 검색을 해야 합니다.

그렇기 때문에 필요한 테이블이 2개가 됩니다.

 

그때문에 SELECT나 WHERE절에 쓰이는 필드가

어느 테이블 것인지를 구별하기 위해 "Table_Name."을 필드앞에 써서

어느 테이블의 필드인지 구별해야 합니다.

 

그리고, 조건 두개를 동시에 만족해야 하므로 각 조건 사이를 AND 로 연결합니다.

마약 "--이거나"라는 조건일경우에는 OR을 써주면 됩니다.

 

처음 SELECT절에서는 company테이블의 com_Name필드와

sales테이블의 모든필드를 결과 필드로 나타낼것을 지시합니다.

 

그리고 테이블이 여러개일때 위 예처럼 테이블을 구별하기 위해

일일이 테이블 명을 쓰지 않고 별칭을 쓸수 있습니다.

 

SELECT S.* FROM Sales.db [AS] S, Company.db [AS] C

 

728x90
반응형

댓글