MySql系統(tǒng)設(shè)計.doc_第1頁
MySql系統(tǒng)設(shè)計.doc_第2頁
MySql系統(tǒng)設(shè)計.doc_第3頁
MySql系統(tǒng)設(shè)計.doc_第4頁
MySql系統(tǒng)設(shè)計.doc_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系網(wǎng)站刪除開始界面,及各個語句的反饋信息SQL語句解析內(nèi)部SQL語句解析用戶部分*Select查找記錄Update更新記錄Delete刪除記錄Alter修改屬性Create創(chuàng)建.dbf表Insert插入記錄語句處理解析部分創(chuàng)建修改.dbf文件調(diào)用不同函數(shù),分類處理語句處理判斷不符合格式,返回界面修改,更新記錄信息查找記錄,回顯給用戶屬性,字段,表單,語句等的處理錯誤,返回。圖表(1),解析系統(tǒng)的邏輯處理結(jié)構(gòu)。注釋說明: 讀取,寫入數(shù)據(jù)庫。調(diào)用Create語句,創(chuàng)建符合條件的dbf文件,存入數(shù)據(jù)庫,或讀取文件,修改表單屬性。 讀取,寫入數(shù)據(jù)庫。從數(shù)據(jù)庫中讀取表單,修改表中記錄,再寫入庫中。 只讀取數(shù)據(jù)庫。讀取選擇相關(guān)信息,反饋給用戶。 底層數(shù)據(jù)庫為上層用戶界面提供反饋信息2.2 系統(tǒng)文件構(gòu)成分析圖表(2),解析系統(tǒng)的文件結(jié)構(gòu)程序文件文件概述MySql.c主程序文件,包括main主函數(shù)在內(nèi),以及對各個語句的判斷Sql.c包括所有的sql語句處理函數(shù),前期的讀入,詞句分析函數(shù),以及分析后調(diào)用函數(shù)處理文件Dbf.c包括所有對.dbf文件的創(chuàng)建,修改,刪除等的函數(shù)Sql.hSql語句處理函數(shù)的定義Dbf.h處理文件的函數(shù)的定義演示文檔對初學(xué)者的提示,以及異常輸入的演示2.3 系統(tǒng)總體流程分析圖表(3),程序的主要執(zhí)行流程程序開始,顯示界面,讀入用戶輸入,存入sql數(shù)組并進行判斷便于后序的分析處理處理order語句,講元組存入select文件,然后篩選需要的信息輸出讀取錯誤,返回Insert插入記錄本小組主要完善了select語句,故在此不做其他語句的詳細分析判斷詞句的讀入,選擇后序的處理語句Alter修改表屬性Delete刪除記錄Updata更新記錄Select選擇語句Create創(chuàng)建文件將sql數(shù)組的字符存入sql_select數(shù)組,然后讀取字符,分別存入s,f,w,o,h,g數(shù)組作為select,where的屬性進行后續(xù)處理處理group語句,從表中讀取信息,放入內(nèi)存,使用冒泡排序,篩選所需元組,屬性等判斷是否有orderYN判斷格式正確不符合輸入條件,直接返回上級判斷單雙表查詢表單不符合條件,直接返回從表中提取元組,判斷,按照要求篩選用戶需要的進行輸出分別從兩個表中提取元組,判斷,按照要求篩選用戶需要的進行輸出不是單表也不是雙表,直接返回上一級單個表兩個表顯示查詢結(jié)構(gòu),提示是否繼續(xù)進行是否繼續(xù)不繼續(xù),程序結(jié)束。繼續(xù)使用,返回開始界面繼續(xù)進行。不是Y也不是N,則繼續(xù)詢問2.4系統(tǒng)基本設(shè)計概念1)系統(tǒng)總體設(shè)計分析:系統(tǒng)解析了sql語句,包括對表的創(chuàng)建,刪除,對表內(nèi)記錄的插入,刪除等。其中:(1)表定義中列(屬性)的類型至少支持三種(integer、char、float); (3)記錄的插入、刪除、修改等,即時更新原始數(shù)據(jù);(4)記錄的搜索至少實現(xiàn)按主鍵查找,只是主鍵上的范圍查找,包含遍歷。2)本次select語句的模塊完善分析和結(jié)構(gòu)分析(1)增加了group by 語句,可以處理group by語句的各個條件,包括having語句或和order by連接使用;(2)完善了order的排序模塊,從單屬性排序優(yōu)化到了多屬性排序;(3)SortGroupRec()優(yōu)化了內(nèi)部排序,加快了大數(shù)據(jù)處理速度;2.5程序模塊說明2.5.1 Main()模塊1)目標(biāo):協(xié)調(diào)各其他各模塊之間的關(guān)系,最終負責(zé)系統(tǒng)運行2)程序文件:MYSQL.c3)主要數(shù)據(jù)結(jié)構(gòu):字符串(用來存儲用戶的輸入數(shù)據(jù))4)調(diào)用的其他模塊:文件處理模塊(dbf),處理操作模塊(sql)5)算法:c面向過程的函數(shù)處理機制6)邏輯流程圖:int main()Show(); / 界面構(gòu)造Getsinput(); / 得到用戶輸入,存儲Switch()case CREATE : Create(.); break; 創(chuàng)建記錄 case SELECT : Select(.); break; 選擇記錄 case INSERT : Insert(.); break; 插入記錄 case UPDATE : Update(.); break; 更新記錄 case DELETE : Delete(.); break; 刪除記錄 case SELECT : Select (.); break; 查詢記錄 case QUIT : return;Judge(); / 判斷用戶是否繼續(xù)操作,繼續(xù)或者結(jié)束程序Return 0; 其中界面和讀取操作算是前期的處理,屬于數(shù)據(jù)的初始化階段; Switch屬于對輸入的判斷,然后在其函數(shù)體內(nèi)執(zhí)行操作,屬于本函數(shù)的主要組成部分,語句select是本組這次設(shè)計的重點完善對象;2.5.2 數(shù)據(jù)操作處理模塊1)目標(biāo):完成對底層數(shù)據(jù)的各種操作,方便上層的調(diào)用,簡化操作2)程序文件:dbf.c dbf.h3)主要數(shù)據(jù)結(jié)構(gòu):以結(jié)構(gòu)體為主struct _DbfHead char dbFlag; char year; char month; char day; int recCounts; short firstRecAddr; short recLen; char undo20;typedef struct _DbfHead DbfHead, *pDbfHead;/字段描述結(jié)構(gòu)體定義struct _FieldDcp char fieldName10; char undo1; char fieldType; short offset; char undo22; char fieldLen; char numDecis; char undo314;typedef struct _FieldDcp FieldDcp, *pFieldDcp;/字段數(shù)據(jù)結(jié)構(gòu)體定義struct _DbfField char *fieldData; char fieldName10; char fieldType; char fieldLen; char fieldDcis; short offset;typedef struct _DbfField DbfField, *pDbfField;/記錄結(jié)構(gòu)體定義struct _DbfRec char delFlag;DbfField fieldMAX_FIELD_COUNTS;int realCounts;typedef struct _DbfRec DbfRec, *pDbfRec;/dbf文件句柄定義struct _DbfHandchar filename50;DbfHead header;DbfRec rec; long curRecNo; long curFpAddr;FILE *fd;typedef struct _DbfHand DbfHand, *pDbfHand;同時也在dbf.h 中進行了一些宏定義,方便其它函數(shù)直接使用:#define GET_YEAR 0#define GET_MONTH 1#define GET_DAY 2#define FOX_VERISON_INFO 262#define WIN_32#define MAX_FIELD_COUNTS 40/字段類型#define FIELD_CHAR_TYPE 0x43#define FIELD_DATE_TYPE 0x44#define FIELD_FLOAT_TYPE 0x46#define FIELD_LOG_TYPE 0x4C#define FIELD_MEMO_TYPE 0x4D#define FIELD_NUMIC_TYPE 0x4E#define FIELD_INT_TYPE 0x49/條件查詢#define CON_SMALL 0#define CON_EQUAL 1#define CON_LARGE 2/排序#define CON_SORT_INCREASE 0#define CON_SORT_DECREASE 1#define TRUE 1#define FALSE 0#define BOOL int4)調(diào)用的其他模塊:無5)算法:C語言面向過程的設(shè)計* 2.5.3 解釋器模塊 (由于本組只完善修改了數(shù)據(jù)查詢語句,所以在這里只分析select 語句,其他模塊只簡單闡述,不再仔細分析)1)目標(biāo):命令解釋器的基本功能就是將用戶的輸入命令進行語法分析和語義解析并得到需要的命令參數(shù),最后根據(jù)命令參數(shù)對底層數(shù)據(jù)進行操作。2)程序文件:sql.h、sql.cpp3)主要數(shù)據(jù)結(jié)構(gòu):有意字符串,一個以回車或空格或標(biāo)志符來分割的有獨立含義的字符串(不包括空格,回車,但標(biāo)志符入“;”視作有意字串,如一條命令。4) 調(diào)用其他模塊: 數(shù)據(jù)操作處理模塊。5) 算法:排序算法(內(nèi)部和外部)6)模塊內(nèi)部詳細分析(select 語句解釋模塊,int Sql_SELECT())(1)首先判斷第一個操作是否是selectfor (i=0;sql_selecti= ;i+); /處理輸入的空格,以后每次讀入都會有這個語句for (;sql_selecti!= ;i+) sni=tolower(sql_selecti); /將語句轉(zhuǎn)化成小寫,存入sn t+;snt=0; /結(jié)束符,表示字符串結(jié)束然后,strcmp ( sn, “select”) ,如果是select,則繼續(xù)后續(xù)的讀入處理分析,否則,返回。(2)讀取select后的字符串,即所要查詢的屬性,存入s 中。Do t=0; snum+; / 代表select后的屬性的數(shù)量 for (;sql_selecti= ;i+); /處理輸入中的多余的空格 for (;sql_selecti!= ;i+) ssnumt=tolower(sql_selecti); /轉(zhuǎn)化成小寫字符 t+; ssnumt=0; /結(jié)束符,表示這個屬性結(jié)束 if (ssnumt-1=;) /如果遇到“;”字符,表示輸入結(jié)束,break跳出 break; if (strcmp(ssnum,from)=0) / 如果遇到from字符串,則表示select結(jié)束,break跳出讀取from后的表的信息 break; while (1); / 循環(huán)處理讀取字符串,直到以上兩種情況,結(jié)束然后判斷是否有查詢聚集函數(shù):for (p=0;psnum;p+)/判斷有無聚集函數(shù) ,并記錄在st中比較判斷是哪個聚集函數(shù),在這里以count為例說明執(zhí)行過程if (strcmp(sp,count)=0) cnum+; / 記錄count的數(shù)量 if (strcmp(sp,*) /判斷count后是否有 * sign=1; / 標(biāo)記含有* strcpy(st,sp+1); /記錄在st串中 ststrlen(sp+1)=0; /結(jié)束符 else / 同上,沒有*的情況 strcpy(st,sp+1); ststrlen(sp+1)=0; sign=2; strcpy(st_gcnum-1,sp+1);數(shù)據(jù)測試:(3)依次讀取where , group , having , order 等后面的屬性,分別存入w,g,h,o數(shù)組,方法同上在這里不在重復(fù)。注意,在讀取from后面的所要查詢的表的信息時,在后面加上.dbf 方便后期的查詢ffnumt=.;ffnumt+1=d;ffnumt+2=b;ffnumt+3=f;ffnumt+4=0;讀取之后分別標(biāo)記各個語句的存在,即:group_yes 是否存在groupwhere_yes 是否存在wherewhere_group where和group同時存在(4)group語句的處理打開所要查詢的表,讀取按要求多屬性排序(冒泡)處理聚集函數(shù)打印查詢的表頭信息每次打開一個表的時候都判斷表的存在,不存在則回顯“打開文件失敗!”給用戶提示。調(diào)用Aggrega1函數(shù)處理聚集函數(shù),記錄所要查詢的信息解釋 :為了提高排序的效率,使用了內(nèi)部排序,即打開所要查詢的表之后把記錄放入到內(nèi)存(group_rec_t)中:/將符合條件的記錄放入到group_rec_t中,然后排序recount=GetRecCounts(hand); / 記錄查詢的表中有多少元組,hand是表的指針pDbfRec group_rec_trecount+1; /在內(nèi)存中開辟一塊空間存儲表中元組的地址GotoTop(hand); / 跳到表的開始然后依次讀取for (j=0;jrecount;j+) / 循環(huán)將元組信息放入的內(nèi)存中 if (NULL = (rec = (pDbfRec)malloc(sizeof(DbfRec) return 0; if (NULL = (rec = GetCurRec(hand) return 0; group_rec_tj = rec;GoNextRec(hand); / 跳到下一個,繼續(xù)循環(huán) / 內(nèi)存中進行記錄的排序SortGroupRec(group_rec_t,recount,g,gnum);排序函數(shù)解釋如下:/內(nèi)部排序,快速,高效,但占用了交大的內(nèi)存/在內(nèi)存中對gRec中記錄進行排序,根據(jù)g數(shù)組中的group by后的屬性進行比較/此處采用了冒泡排序,代碼簡單明了,易于看懂void SortGroupRec(pDbfRec *gRec,int ncount,char g10020,int g_sum) if(ncount 2 | g_sum 1) return ; pDbfRec temp ; int i,j,k,p; for(i=0;i realCounts; long double suma =0 ; long double sumb =0 ; /臨時變量,用于排序/比較每兩個元組,判斷是否需要交換 for(i = 0;i ncount - 1; i+) for(j=i+1;j ncount;j+) yes_to_swap = 0; char cmpstr20; for(k = 1;kg_sum;k+) / 依次查找每一個屬性,標(biāo)記 strcpy(cmpstr,gk); for(p = 0;p fieldp.fieldName) = 0) fieldNum = p; / 屬性的標(biāo)號,以后每次比較的就是這個屬性 break; switch(gRec0-fieldfieldNum.fieldType) / 判斷這個屬性是什么類型 / 然后根據(jù)每種屬性類型進行處理,比較 case FIELD_DATE_TYPE: case FIELD_CHAR_TYPE: puts(gReci - fieldfieldNum.fieldData); puts(gRecj - fieldfieldNum.fieldData); if(strcmp(gReci - fieldfieldNum.fieldData,gRecj - fieldfieldNum.fieldData) 0) / 判斷如果后面的元組小于前面的,進行標(biāo)記 yes_to_swap = 1; break; case FIELD_FLOAT_TYPE: case FIELD_INT_TYPE: case FIELD_NUMIC_TYPE:for (p=0; gReci-fieldfieldNum.fieldDatap!=. & gReci-fieldfieldNum.fieldDatap; p+) suma=suma*10+(gReci-fieldfieldNum.fieldDatap-0); for (p=0; gRecj-fieldfieldNum.fieldDatap!=. & gRecj-fieldfieldNum.fieldDatap; p+) sumb=sumb*10+(gRecj-fieldfieldNum.fieldDatap-0); if(suma sumb) yes_to_swap = 1; break; / 如果需要交換 if(yes_to_swap = 1) temp = gReci; gReci = gRecj; gRecj = temp; break; return ;數(shù)據(jù)測試:單表sc,單個字段排序sno,帶有聚集函數(shù)avg(5)order語句的處理if (o00!=0) 首先判斷是否有order存在,然后根據(jù)后面的屬性進行升序或者降序排序if (strcmp(oi+1,asc)=0|strcmp(oi+1,ASC)=0) SortDbf(hand1,order_filedid,CON_SORT_INCREASE); /升序 else if (strcmp(oi+1,desc)=0|strcmp(oi+1,DESC)=0)SortDbf(hand1,order_filedid,CON_SORT_DECREASE); /降序 else SortDbf(hand1,order_filedid,CON_SORT_INCREASE); /缺省為升序多個表,where是否存在,不同情況處理類似不在重復(fù)說明。數(shù)據(jù)測試:(6)開始單表查詢判斷是否滿足條件,輸出打開表單,查找屬性單表查詢就是在單個表中對所選擇屬性進行查找,輸出:判斷條件時有多種情況,如單屬性還是多屬性比較,是否查詢所有屬性,即是否有 * 存在等,分情況分析,所以代碼很多重復(fù)的部分,在這里只闡述重點。判斷條件時的多種情況的不同分析:單個屬性則不需要判斷。每個條件中都要判斷where的存在,是否查詢所有屬性,即是否有 * 。然后在每種情況中讀取屬性,判斷是否滿足查詢條件if (strcmp(f1-fieldData,w2)=0&strcmp(f3-fieldData,w6)=0)/ 如果滿足條件,則加入到hands中 AddRec(hands,rec); if (sign2!=1) for (k=0;kfieldData); / 格式化輸出 printf(n); for (k=0;ksnum;k+) printf(-+); printf(n); 其他情況與此類似,不再重復(fù),下面是測試數(shù)據(jù): (多條件判斷的)(單個條件判斷的)(7)開始雙表查詢:雙

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論