Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : http://sp.cs.msu.ru/courses/prak2/sql_int.pdf
Äàòà èçìåíåíèÿ: Tue Feb 25 14:37:14 2003
Äàòà èíäåêñèðîâàíèÿ: Mon Oct 1 21:32:24 2012
Êîäèðîâêà:
. ..

.., .., ..

SQL-
( , )

2003


519.6+681.3.06 2 « ». . . .. .. .

: . .. . .. .., .., .. « SQL ( )» -- , . ( 040777 23.07.96), 2003.-- 30 . - . .. .

ISBN 5-89407-033-3

Ö . .. , 2003

2


SQL- : 1. « -- ». 2. SQL-. 3. SQL- . 4. SQL-. 5. , . - ++. « -- » ( ) -, , SQL. -, . SQL- SQL, SQL. SQL . « ». SQL [4]. SQL- , . 2. SQL- . . I. « -- ». 1. . . 2. . . 3. . . 4. . . II. . 1. SQL, , . . , . , - . 2. SQL, , . ,

3


. . SQL- ++ , , : -- , -- , -- ++ , -- ++. ( ). - . . -, . ++ ( ).

1. 2. 3. 4. 5.

4




1. « -- ».
, « -- ». , , , -- . , - . (pipe) - , , . , ( ), . , . , , (socket) ( , ). , , - . , «» () -. , . , , . (), , . c , , , , . , , , .

5


( Berkeley UNIX) socket. . :
int socket (int domain, int type, int protocol);

-- -- . UNIX-, UNIX. AF_UNIX (AF -- Address Family). , . , UNIX, : SOCK_STREAM -- «» ; , ( ); SOCK_DGRAM -- , (); , , , ( -- ). . , . socket -- ( , , read write ). - (, ), -1, errno . , socket, sys/socket.h sys/types.h. bind. . bind (.. - , ) -. :
int bind(int s, struct sockaddr * name, int namelen);

6


-- -, . -- struct sockaddr. . UNIX- sockaddr_un, sys/un.h :
struct sockaddr_un { short sun_family; char sun_path[108]; };

, , AF_UNIX, -- , . c , sun_path, , unlink, , , . listen. listen , , («») . . :
int listen(int s, int backlog);

-- , (backlog) -- , , . . , , . backlog , . . accept. . . , accept , . , accept , «» . :
int accept(int s, struct sockaddr * name, int * anamelen);

-- - . -- ( sockaddr) . -- -- .
7


, . , NULL-. connect. connect - . :
int connect(int s, struct sockaddr * name, int namelen);

-- - . -- ( sockaddr) . -- -- . 0, , -1 . send. . :
int send(int s, void * buf, int len, int flags);

-- -, . -- , . -- , . flags , (, , ) . flags MSG_OOB, . ( len) -1 . , , -. - recv (. ). , . recv. . :
int recv(int s, void * buf, int len, int flags);

-- -, . -- , . -- , . flags , . flags MSG_PEEK, ( ) recv. -1 . , .

8


- . shutdown. . :
int shutdown(int s, int how);

-- -, . -- , , , : RD -- ; WR -- ; RDW R -- . close. . shutdown close , «», . :
int close (int s);

-- -. - ""
#include #include #include #include #define ADDRESS "mysocket" /* */ void main () { char c; int i, s, len; FILE *fp; struct sockaddr_un sa; /* -: */ if ((s = socket (AF_UNIX, SOCK_STREAM, 0))<0){ perror ("client: socket"); exit (1); } /* , : */ sa.sun_family = AF_UNIX; strcpy (sa.sun_path, ADDRESS); /* : */ len = sizeof ( sa.sun_family) + strlen ( sa.sun_path); if ( connect ( s, &sa, len) < 0 ){ perror ("client: connect"); exit (1); } /*--------------------------------------------- */

9


/* , : */ fp = fdopen (s, "r"); c = fgetc (fp); /* ............................ */ send (s, "client", 7, 0); /* ............................ */ close (s); exit (0); }

- ""
#include #include #include #include #define ADDRESS "mysocket" /* */ void main () { char c; int i, d, d1, len, ca_len; FILE *fp; struct sockaddr_un sa, ca; /* -: */ if((d = socket (AF_UNIX, SOCK_STREAM, 0)) < 0){ perror ("client: socket"); exit (1); } /* , c */ sa.sun_family = AF_UNIX; strcpy (sa.sun_path, ADDRESS); /* ; ADDRESS, , , bind */ unlink (ADDRESS); len = sizeof ( sa.sun_family) + strlen (sa.sun_path); if ( bind ( d, &sa, len) < 0 ) { perror ("server: bind"); exit (1); } /* */ if ( listen ( d, 5) < 0 ) { perror ("server: listen"); exit (1); } /* d1: */ if (( d1 = accept ( d, &ca, &ca_len)) < 0 ) { perror ("server: accept"); exit (1); } /* ------------------------------------------ */ /* , : */ fp = fdopen (d1, "r"); c = fgetc (fp); /* ................................ */ send (d1, "server", 7, 0);

10


/* ................................ */ putchar ( c ); /* ................................ */ close (d1); exit (0); }

«» «», - ( ). - «» -
#include #include "sock_wrap.h" //. using namespace std; using namespace ModelSQL; const char* address = "mysocket" // int main(int argc, char* argv[]) { try { // UnClientSocket sock( address ); // sock.Connect(); // sock.PutString("Hello from client!"); // cout << "Read from server: " << sock.GetString() << endl; // , // ... } catch (Exception& e) { // --- e.Report(); } return 0; }

- «» -
#include #include "sock_wrap.h" //.

11


using namespace std; using namespace ModelSQL; const char* address = "mysocket" // class MyServerSocket : public UnServerSocket { public: MyServerSocket () : UnServerSocket (address) {} protected: void OnAccept (BaseSocket * pConn) { // , cout << "Read from client: " << pConn->GetString() << endl; // pConn->PutString("Hello from server."); // , // ... delete pConn; } }; int main(int argc, char* argv[]) { try { // MyServerSocket sock; for (;;) // sock.Accept(); } catch (Exception& e) { // --- e.Report(); } return 0; }

( Berkeley UNIX) UNIX , , Internet-. UNIX . , , , UNIX, , ,

12


Internet-. Internet- . (hostname) 32- (IP-). , , 16- , ( 1025 32767). , . , , FTP 21. , FTP- 12345, Internet- (12345, 21). . , gethostname. gethostname. :
int gethostname (char * buffer, int buflen);

-- , -- ; -- -- . , -1, -- 0. , . /etc/hosts. gethostbyname. :
struct hostent * gethostbyname (char * hostname);

( hostname) -- . struct hostent, :
struct hostent { /* hostname */ char* h_name; har** h_aliases; /* */ int h_addrtype; /* */ int h_length; /* */ char** h_addr_list /* ( ) */ #define h_addr h_addr_list[0] };

, NULL.
13


/etc/services. - . getservbyname. , . :
struct servent* getservbyname(char * name, char * proto);

-- ("telnet", "ftp", "smtp", "pop3" ..), -- : "tcp" "udp". , , SOCK_STREAM ("tcp") SOCK_DGRAM ("udp"). struct servent, :
struct char * char** int char* }; servent { s_name; s_aliases; s_port; s_proto; /* */ /* */ /* */ /* */

, NULL. , 1025 32767 UNIX ARPANET (international network administration), 1025 . , . , .. , . , , network software , . , . htons.

14


:
short htons (short i);

htonl. :
long htonl (long i);

(htons) (htonl) . , .. , . ntohs. :
short ntohs (short i);

ntohl. :
long ntohl (long i);

: gethostbyname getservbyname , .. . , , , . , . -, socket AF_INET, Internet-. SOCK_STREAM SOCK_DGRAM. , sockaddr-, accept, bind, connect, send recv, sockadd_in, :
struct sockaddr_in { short sin_family; sin_port; /* */ u_short struct in_addr sin_addr; /* */ char sin_zero[8]; }; struct in_addr { u_long s_addr; };

u_short (unsigned short) u_long (unsigned long) . .

15


- ""

#include #include #include #include #include extern int errno; void main () { char c; int s; FILE *fp; char hostname[64]; struct hostent *hp; struct sockaddr_in sin; /* , . , , - , , , - */ /* hostname : */ gethostname (hostname, sizeof (hostname)); /* : */ if ((hp = gethostbyname (hostname)) == NULL){ fprintf (stderr, "%s: unknown host.\n", hostname); exit (1); } /* -: */ if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("client: socket"); exit (1); } /* , : */ sin.sin_family = AF_INET; sin.sin_port = htons (1234); /* : */ bcopy (hp -> h_addr, &sin.sin_addr, hp -> h_length); /* : */ if ( connect ( s, &sin, sizeof (sin)) < 0 ) { perror ("client: connect"); exit (1); } /* ------------------------------------------- */ /* , : */ fp = fdopen (s, "r"); c = fgetc (fp); /* ................................ */ send (s, "client", 7, 0); /* ................................ */ close (s); exit (0); }

16


- ""

#include #include #include #include #include extern int errno; void main (){ char c; int d, d1, fromlen; FILE *fp; char hostname[64]; struct hostent *hp; struct sockaddr_in sin, fromsin; /* - : */ gethostname (hostname, sizeof (hostname)); /* : */ if ((hp = gethostbyname (hostname)) == NULL) { fprintf (stderr, "%s: unknown host.\n", hostname); exit (1); } /* -: */ if ((d = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("client: socket"); exit (1); } /* , : */ sin.sin_family = AF_INET; sin.sin_port = htons (1234); : */ /* bcopy (hp->h_addr, &sin.sin_addr, hp->h_length); /* */ if ( bind ( d, &sin, sizeof (sin)) < 0 ){ perror ("server: bind"); exit (1); } /* */ if ( listen ( d, 5) < 0 ) { perror ("server: listen"); exit (1); } /* d1; fromsin */ if (( d1 = accept ( d, &fromsin, &fromlen)) < 0 ) perror ("server: accept"); exit (1); } ----------------------------------------- */ , : */ fp = fdopen (d1, "r"); c = fgetc (fp); ................................... */ send (d1, "server", 7, 0); ................................... */ putchar (c); {

/* /* /* /*

17


/* ................................... */ close (d); exit (0); }

«»

«» , - ( ).

- «» -
#include #include "sock_wrap.h" //. using namespace std; using namespace ModelSQL; #define PORT_NUM 1234 // -

// , // . // , , //, , , //- */ int main(int argc, char* argv[]) { try { char host[64]; // if (gethostname(host, sizeof host) < 0) { // --- cerr << GetLastError(); perror("Host name"); exit (-1); } // InClientSocket sock(host, PORT_NUM); // sock.Connect(); // sock.PutString("Hello from client!"); // cout << "Read from server: " << sock.GetString() << endl; // , // ...

18


} catch (Exception& e) { // --- e.Report(); } return 0; }

- «» -
#include #include "sock_wrap.h" //. using namespace std; using namespace ModelSQL; #define PORT_NUM 1234 // -

class MyServerSocket : public InServerSocket { public: MyServerSocket () : InServerSocket (PORT_NUM) {} protected: void OnAccept (BaseSocket * pConn) { // , cout << "Read from client: " << pConn->GetString() << endl; // pConn->PutString("Hello from server."); // , // ... delete pConn; } }; int main(int argc, char* argv[]) { try { // MyServerSocket sock; for (;;) // sock.Accept(); } catch (Exception& e) { // --- e.Report(); } return 0; }

2.

19


, , , : (), () ( , SQL). -- , . : , . , .. . , .. , . -- -- . -- , . : , ; , , , " -", , " - " ; ; , ss , . , . : , [1]. , (2-5) . () . . . : , (), . , , . () . () , . , . : , ,
20




, , , , .

() -: (open), (close), (unlink), (read), (write), (lseek). . -- , , . -- ( ). , , . ( MSQLTab.cpp, MSQLTab.h, table.c, table.h), - ( MSQLTab.h).
#ifndef __MSQLTAB_H__ #define __MSQLTAB_H__ #include #include namespace ModelSQL { // EFieldType - enum EFieldType { EFTText, EFTLong, EFTBool, }; // SQLTableException - , // class SQLTableException : public Exception { public: SQLTableException(Errors errcode) : Exception(errcode) {} char * GetMessage() }; // EOpCode - // enum EOpCode { OpLike, OpNotLike, OpAdd,

21


OpSub, OpNegate, OpMult, OpDiv, OpMod, OpOr, OpAnd, OpNot, OpEq, OpNeq, OpLess, OpGreater, OpLessEq, OpGreaterEq, }; // SQLValue - class SQLValue { public: virtual EFieldType GetType() = 0; virtual SQLValue * Execute(EOpCode Op, SQLValue * pRight) = 0; virtual void GetValue(long& val) = 0; virtual void GetValue(std::string& val) = 0; }; typedef SQLValue * (*OpHandler)(SQLValue * pLeft, SQLValue * pRight); // SQLTextValue - class SQLTextValue : public SQLValue { std::string str; static OpHandler Ops[]; public: SQLTextValue(const std::string& s) : str(s) {} EFieldType GetType(); SQLValue * Execute(EOpCode Op, SQLValue * pRight); void GetValue(long& val); { throw SQLTableException(IllegalType); } void GetValue(std::string& val); }; // SQLLongValue - class SQLLongValue : public SQLValue { long l; static OpHandler Ops[]; public: SQLLongValue(long val) : l(val) {} EFieldType GetType(); SQLValue * Execute(EOpCode Op, SQLValue * pRight); void GetValue(long& val) void GetValue(std::string& val) { throw SQLTableException(IllegalType); } }; // TableRec - () class TableRec { public: TableRec(THandle& h) : tab(h) {}

22


// virtual void SetFieldValue(const char * FieldName, SQLValue * pValue) = 0; // virtual SQLValue * GetFieldValue(const char * FieldName) = 0; protected: THandle& tab; }; // NewTableRec - class NewTableRec : public TableRec { public: NewTableRec(THandle tab) : TableRec(tab); void SetFieldValue(const char * FieldName, SQLValue * pValue); // cannot read new rec fields SQLValue * GetFieldValue(const char * FieldName) { throw SQLTableException(CantReadData);} }; // CurrentTableRec - class CurrentTableRec : public TableRec { public: CurrentTableRec(THandle tab) : TableRec(tab); void SetFieldValue(const char * FieldName, SQLValue * pValue) SQLValue * GetFieldValue(const char * FieldName) }; // SQLTable - class SQLTable { THandle tab; public: // explicit SQLTable(const char * FileName) // ~SQLTable() // MoveFirst - //( ) . // , //. AfterLast BeforeFirst // true. bool MoveFirst() // MoveNext - // ( ) // .. //, " ", // . //AfterLast true. bool MoveNext() // BeforeFirst - true, , // false. bool BeforeFirst() // AfterLast - true, // " "

23


// MoveNext, false. bool AfterLast() // GetCurrentRec - TableRec * GetCurrentRec() // GetNewRec - // TableRec * GetNewRec() // UpdateCurrent - // void UpdateCurrent() // Append - void Append() }; // FieldDesc - (): // , , struct FieldDesc { std::string m_Name; EFieldType m_Type; int m_Length; FieldDesc(const char * Name, EFieldType Type, int len) : m_Name(Name), m_Type(Type), m_Length(len) {} }; // TableDef - ( ) class TableDef : public std::vector {}; // . // , // void CreateTable(const char * TableName, TableDef& ts); // void DeleteTable(const char * TableName); }; // end of namespace ModelSQL #endif

( ) SQLTable, ModelSQL. , , - , . CreateTable, . .
#include "MSQLTable.h" using namespace ModelSQL; TableDef ts;

24


// ts->push_back(FieldDesc("Name", EFTText, 10)); ts->push_back(FieldDesc("Age", EFTLong)); // ModelSQL::CreateTable("mytable", ts); // std::string text; long number; TableRec* Rec; SQLValue* Field1; SQLValue* Field2; // SQLTable Table("mytable"); // Field1 = new SQLTextValue("Sasha"); Field2 = new SQLLongValue(20); // Rec = Table.GetNewRec(); // Rec->SetFieldValue("Name", Field1); Rec->SetFieldValue("Age", Field2); // Table.Append; // ... // delete Field2; delete Field1; delete Rec;

.
#include "MSQLTable.h" using namespace ModelSQL; // ... // Table.MoveFirst(); // Rec = Table.GetCurrentRec(); // Field1 = Rec->GetFieldValue("Name"); Field1->GetValue(text); Field2 = Rec->GetFieldValue("Age")->GetValue(number);

25


Field2->GetValue(number); delete Field2; delete Field1; // - , , if (text == "Sasha") number += 1; Field1 = new SQLTextValue(text); Field2 = new SQLLongValue(number); // Rec->SetFieldValue("Name", Field1); Rec->SetFieldValue("Age", Field2); // Table.UpdateCurrent(); // ... delete Field2; delete Field1; delete Rec;

3. SQL
SQL -- , IBM. , , SQL-. SQL SQL, . : SELECT -- , ; INSERT -- ; UPDATE -- ; DELETE -- ; CREATE -- ; DROP -- . SQL , . , , , . ( DROP) , . - , . ::= | | |

26


| | ::= SELECT < > FROM < > < > ::= < > { , < > } | * < > ::= <> < > ::= <> <>::= < > SELECT-, < > , WHERE-. * -- . SELECT- , ( ) , (). ::= INSERT INTO < > (< > { , < > }) < > ::= <> | < > <> ::= '<> {<>}' <> ::= <, , '> INSERT-, < > . . . INSERT- , . ::= UPDATE < > SET < > = <> UPDATE- < >, WHERE-, < > . , . UPDATE- .

27


::= DELETE FROM < > DELETE- < > , WHERE-. DELETE- -- . ::= CREATE TABLE < > ( < > ) < > ::= < > { , < > } < > ::= < > < > < > ::= TEXT ( < > ) | LONG CREATE- < >, . . ( LONG), ( ). . ::= DROP TABLE < > DROP- < > ( ). ::= WHERE < TEXT> [ NOT ] LIKE <-> | WHERE <> [ NOT ] IN ( < > ) | WHERE < > | WHERE ALL <-> ::= <> <> ::= | < > ::= <> { , <> } | < > { , < > } ::= { <+|-> } <+|-> ::= + | -

28


::= { <*|/|%> } <*|/|%> ::= * | / | % ::= | ( ) ::= < LONG> | < > ::= < TEXT> | <> < > ::= < > { OR < > } < > ::= < > { AND < > } < > ::= NOT < > | ( < > ) | (<>)

<> ::= | ::= < > ::= < > < > ::= = | > | < | >= | <= | != WHERE- SELECT, UPDATE DELETE : , , WHERE-. WHERE- -- LIKE- -- , ( ) ( NOT) -. . : % -- ; _ -- ; [] -- . , [abcdef]. . , [a-f]. [^ ] -- , . , [^abcdef] [^a-f].

29


WHERE- -- IN- -- . . IN- , ( NOT) , < >. , , , , . WHERE- -- BOOL- -- , , IN-, . , < > . NOT, AND, OR . WHERE- -- ALL- -- , .

30


SQL 1. Students, : First_name TEXT 10, Surname TEXT 15, Age LONG Phone TEXT 9. CREATE TABLE Students (First_name TEXT (10), Surname TEXT (15), Age LONG, Phone TEXT (9) ) Students : First_name Surname Age Phone

E . 2. Stulents , , . INSERT INSERT INSERT INSERT INTO INTO INTO INTO Students Students Students Students ( ( ( ( 'Sergey', 'Ivanov', 18, '145-45-45' ) 'Alexey', 'Petrov', 20, '343-65-45' ) 'Andrey', 'Fedorov', 23, '123-45-18' ) 'Alexandre', 'Zaharov', 20, '345- 33-33' )

: First_name Sergey Alexey Andrey Alexandre Surname Ivanov Petrov Fedorov Zaharov Age 18 s20 23 20 Phone 145-45-45 343-65-45 123-45-18 450- 33-33

3. 18 29 . SELECT First_name, Surname FROM Students WHERE Age IN (18, 19, 20) : First_name Sergey Alexey lexandre Surname Ivanov Petrov Zaharov ,

4. 45.

31


SELECT * FROM Students WHERE Phone LIKE '%-%-45' : First_name Sergey Alexey 45. SELECT * FROM Students WHERE Phone LIKE '%45%' : First_name Sergey Alexey Andrey Alexandre Surname Ivanov Petrov Fedorov Zaharov Age 18 20 23 20 Phone 145-45-45 343-65-45 123-45-18 450- 33-33 Surname Ivanov Petrov Age 18 20 Phone 145-45-45 343-65-45

5. ,

6. . SELECT Phone FROM Students WHERE Surname = 'Ivanov' : Phone 145-45-45 7. . SELECT Surname FROM Students WHERE ALL : Surname Ivanov Petrov Fedorov Zaharov 8. , , m, n, o, -- , -- x. SELECT * FROM Students WHERE First_name LIKE '[ABC][^mno]_x%' :
32


First_name Alexey Alexandre

Surname Petrov Zaharov

20

Age Phone 343-65-45 20 450- 33-33

9. 19 , . SELECT Surname, Phone FROM Students WHERE (Surname > 'M') : Surname Petrov Zaharov Phone 343-65-45 450-33-33 (Age > 19) AND

10. «» 1. UPDATE Students SET Age = Age + 1 WHERE ALL : First_name Sergey Alexey Andrey Alexandre Surname Ivanov Petrov Fedorov Zaharov Age 19 21 24 21 Phone 145-45-45 343-65-45 123-45-18 450- 33-33

11. Students . DROP TABLE Students Students , -- .

33




-
"sock_wrap.h"
#ifndef __SOCK_WRAP_H__ #define __SOCK_WRAP_H__ #include #include #include #include #include #include #include

namespace ModelSQL { // Exception - , class Exception { protected: int m_ErrCode; public: Exception(int errcode) : m_ErrCode(errcode) {} void Report(); virtual std::string GetMessage() = 0; }; // SocketException - class SocketException : public Exception { static char * m_Message[]; public: enum SocketExceptionCode { ESE_SUCCESS, ESE_SOCKCREATE, ESE_SOCKCONN, ESE_SOCKILLEGAL, ESE_SOCKHOSTNAME, ESE_SOCKSEND, ESE_SOCKRECV, ESE_SOCKBIND, ESE_SOCKLISTEN, ESE_SOCKACCEPT, }; SocketException(SocketExceptionCode errcode) : Exception(errcode) {} std::string GetMessage(); }; // SocketAddress - // class SocketAddress { protected:

34


struct sockaddr * m_pAddr; public: SocketAddress () : m_pAddr(NULL) {} virtual ~SocketAddress () {} virtual int GetLength() = 0; virtual SocketAddress * Clone() = 0; operator struct sockaddr * (); }; // UnSocketAddress - AF_UNIX class UnSocketAddress : public SocketAddress { public: UnSocketAddress (const char * SockName); int GetLength (); SocketAddress * Clone(); ~UnSocketAddress (); }; // InSocketAddress - AF_INET class InSocketAddress : public SocketAddress { public: InSocketAddress (const char * HostName, short PortNum) int GetLength () SocketAddress * Clone() ~InSocketAddress () }; // BaseSocket - class BaseSocket { public: explicit BaseSocket(int sd = -1, SocketAddress * pAddr = NULL): m_Socket(sd), m_pAddr(pAddr) {} virtual ~BaseSocket(); void Write(void * buf, int len); void PutChar(int c); void PutString(const char * str); void PutString(const std::string& s) int Read (void * buf, int len); int GetChar(); std::string GetString(); int GetSockDescriptor(); protected: int m_Socket; SocketAddress * m_pAddr; void CheckSocket() }; // ClientSocket - class ClientSocket: public BaseSocket { public: void Connect(); }; // ServerSocket - class ServerSocket: public BaseSocket { public: BaseSocket * Accept(); protected:

35


void void virtual void };

Bind(); Listen(int BackLog); OnAccept (BaseSocket * pConn) {}

// UnClientSocket - //AF_UNIX class UnClientSocket: public ClientSocket { public: UnClientSocket(const char * Address) }; // InClientSocket - //AF_INET class InClientSocket: public ClientSocket { public: InClientSocket(const char * HostName, short PortNum); }; // UnServerSocket - //AF_UNIX class UnServerSocket: public ServerSocket { public: UnServerSocket(const char * Address); }; // InServerSocket - //AF_INET class InServerSocket: public ServerSocket { public: InServerSocket(short PortNum) throw (SocketException); }; }; // namespace ModelSQL #endif

36



[1] . . . -- .: , 2001. [2] . . SQL. -- .: - , 1996. [3] . . UNIX. System V. Release 4.2. . -- .: «-», 1996. [4] .. , .. . . . -- .: - , 1996.

37


1. « -- ». ( Berkeley UNIX) - "" - "" - «» - - «» - ( Berkeley UNIX) - "" - "" - «» - - «» - 2. 3. SQL SQL - 3 3 4 4 5 5 6 9 10 11 11 12 16 17 18 19 19 26 31 34 34 37

38