當前位置:首頁 » 編程語言 » sql創鏈表
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql創鏈表

發布時間: 2022-04-19 19:32:53

1. sql資料庫 建立三個表 student(學號 姓名 性別) sc(學號 課程號 成績)course(課程號 課程名 分數 )

select 姓名,savg from (select 學號,avg(成績)as savg from sc where 成績<60 group by 學號 having count(學號)>=2) t1,student where t1.學號=student.學號

1. Group By 語句簡介:
Group By語句從英文的字面意義上理解就是「根據(by)一定的規則進行分組(Group)」。它的作用是通過一定的規則將一個數據集劃分成若干個小的區域,然後針對若干個小區域進行數據處理。 2. Group By 的使用: 上面已經給出了對Group By語句的理解。基於這個理解和SQL Server 2000的聯機幫助,下面對Group By語句的各種典型使用進行依次列舉說明。 2.1 Group By [Expressions]: 這個恐怕是Group By語句最常見的用法了,Group By + [分組欄位](可以有多個)。在執行了這個操作以後,數據集將根據分組欄位的值將一個數據集劃分成各個不同的小組。比如有如下數據集,其中水果名稱(FruitName)和出產國家(ProctPlace)為聯合主鍵: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
如果我們想知道每個國家有多少種水果,那麼我們可以通過如下SQL語句來完成: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO GROUP BY ProctPlace 這個SQL語句就是使用了Group By + 分組欄位的方式,那麼這句SQL語句就可以解釋成「我按照出產國家(ProctPlace)將數據集進行分組,然後分別按照各個組來統計各自的記錄數量。」很好理解對吧。這里值得注意的是結果集中有兩個返回欄位,一個是ProctPlace(出產國), 一個是水果種類。如果我們這里水果種類不是用Count(*),而是類似如下寫法的話: SELECT FruitName, ProctPlace FROM T_TEST_FRUITINFO GROUP BY ProctPlace 那麼SQL在執行此語句的時候會報如下的類似錯誤: 選擇列表中的列 'T_TEST_FRUITINFO.FruitName' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。 這就是我們需要注意的一點,如果在返回集欄位中,這些欄位要麼就要包含在Group By語句的後面,作為分組的依據;要麼就要被包含在聚合函數中。我們可以將Group By操作想像成如下的一個過程,首先系統根據SELECT 語句得到一個結果集,如最開始的那個水果、出產國家、單價的一個詳細表。然後根據分組欄位,將具有相同分組欄位的記錄歸並成了一條記錄。這個時候剩下的那些不存在於Group By語句後面作為分組依據的欄位就有可能出現多個值,但是目前一種分組情況只有一條記錄,一個數據格是無法放入多個數值的,所以這里就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的數據格中,那麼完成這個步驟的就是聚合函數。這就是為什麼這些函數叫聚合函數(aggregate functions)了。 2.2 Group By All [expressions] : Group By All + 分組欄位, 這個和前面提到的Group By [Expressions]的形式多了一個關鍵字ALL。這個關鍵字只有在使用了where語句的,且where條件篩選掉了一些組的情況才可以看出效果。在SQL Server 2000的聯機幫助中,對於Group By All是這樣進行描述的: 如果使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜索條件的行。沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。 其中有這么一句話「如果使用ALL關鍵字,那麼查詢結果將包含由Group By子句產生的所有組...沒有ALL關鍵字,那麼不顯示不符合條件的行組。」這句話聽起來好像挺耳熟的,對了,好像和LEFT JOIN 和 RIGHT JOIN 有點像。其實這里是類比LEFT JOIN來進行理解的。還是基於如下這樣一個數據集: FruitName ProctPlace Price
Apple China $1.1
Apple Japan $2.1
Apple USA $2.5
Orange China $0.8
Banana China $3.1
Peach USA $3.0
首先我們不使用帶ALL關鍵字的Group By語句: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ProctPlace 那麼在最後結果中由於Japan不符合where語句,所以分組結果中將不會出現Japan。 現在我們加入ALL關鍵字: SELECT COUNT(*) AS 水果種類, ProctPlace AS 出產國 FROM T_TEST_FRUITINFO WHERE (ProctPlace <> 'Japan') GROUP BY ALL ProctPlace 重新運行後,我們可以看到Japan的分組,但是對應的「水果種類」不會進行真正的統計,聚合函數會根據返回值的類型用默認值0或者NULL來代替聚合函數的返回值。 2.3 GROUP BY [Expressions] WITH CUBE | ROLLUP: 首先需要說明的是Group By All 語句是不能和CUBE 和 ROLLUP 關鍵字一起使用的。 首先先說說CUBE關鍵字,以下是SQL Server 2000聯機幫助中的說明: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。在結果集內返回每個可能的組和子組組合的 GROUP BY 匯總行。GROUP BY 匯總行在結果中顯示為 NULL,但可用來表示所有值。使用 GROUPING 函數確定結果集內的空值是否是 GROUP BY 匯總值。 結果集內的匯總行數取決於 GROUP BY 子句內包含的列數。GROUP BY 子句中的每個操作數(列)綁定在分組 NULL 下,並且分組適用於所有其它操作數(列)。由於 CUBE 返回每個可能的組和子組組合,因此不論指定分組列時所使用的是什麼順序,行數都相同。 我們通常的Group By語句是按照其後所跟的所有欄位進行分組,而如果加入了CUBE關鍵字以後,那麼系統將根據所有欄位進行分組的基礎上,還會通過對所有這些分組欄位所有可能存在的組合形成的分組條件進行分組計算。由於上面舉的例子過於簡單,這里就再適合了,現在我們的數據集將換一個場景,一個表中包含人員的基本信息:員工所在的部門編號(C_EMPLINFO_DEPTID)、員工性別(C_EMPLINFO_SEX)、員工姓名(C_EMPLINFO_NAME)等。那麼我現在想知道每個部門各個性別的人數,那麼我們可以通過如下語句得到: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX 但是如果我現在希望知道: 1. 所有部門有多少人(這里相當於就不進行分組了,因為這里已經對員工的部門和性別沒有做任何限制了,但是這的確也是一種分組條件的組合方式); 2. 每種性別有多人(這里實際上是僅僅根據性別(C_EMPLINFO_SEX)進行分組); 3. 每個部門有多少人(這里僅僅是根據部門(C_EMPLINFO_DEPTID)進行分組);那麼我們就可以使用ROLLUP語句了。 SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH CUBE 那麼這里你可以看到結果集中多出了很多行,而且結果集中的某一個欄位或者多個欄位、甚至全部的欄位都為NULL,請仔細看一下你就會發現實際上這些記錄就是完成了上面我所列舉的所有統計數據的展現。使用過SQL Server 2005或者RDLC的朋友們一定對於矩陣的小計和分組功能有印象吧,是不是都可以通過這個得到答案。我想RDLC中對於分組和小計的計算就是通過Group By的CUBE和ROLLUP關鍵字來實現的。(個人意見,未證實) CUBE關鍵字還有一個極為相似的兄弟ROLLUP, 同樣我們先從這英文入手,ROLL UP是「向上卷」的意思,如果說CUBE的組合是絕對自由的,那麼ROLLUP的組合就需要有點約束了。我們先來看看SQL Server 2000的聯機中對ROLLUP關鍵字的定義: 指定在結果集內不僅包含由 GROUP BY 提供的正常行,還包含匯總行。按層次結構順序,從組內的最低級別到最高級別匯總組。組的層次結構取決於指定分組列時所使用的順序。更改分組列的順序會影響在結果集內生成的行數。 那麼這個順序是什麼呢?對了就是Group By 後面欄位的順序,排在靠近Group By的分組欄位的級別高,然後是依次遞減。如:Group By Column1, Column2, Column3。那麼分組級別從高到低的順序是:Column1 > Column2 > Column3。還是看我們前面的例子,SQL語句中我們僅僅將CUBE關鍵字替換成ROLLUP關鍵字,如: SELECT C_EMPLINFO_DEPTID, C_EMPLINFO_SEX, COUNT(*) AS C_EMPLINFO_TOTALSTAFFNUM FROM T_PERSONNEL_EMPLINFO GROUP BY C_EMPLINFO_DEPTID, C_EMPLINFO_SEX WITH ROLLUP 和CUBE相比,返回的數據行數減少了不少。:),仔細看一下,除了正常的Group By語句後,數據中還包含了: 1. 部門員工數;(向上卷了一次,這次先去掉了員工性別的分組限制) 2. 所有部門員工數;(向上又卷了依次,這次去掉了員工所在部門的分組限制)。 在現實的應用中,對於報表的一些統計功能是很有幫助的。 這里還有一個問題需要補充說明一下,如果我們使用ROLLUP或者CUBE關鍵字,那麼將產生一些小計的行,這些行中被剔除在分組因素之外的欄位將會被設置為NULL,那麼還存在一種情況,比如在作為分組依據的列表中存在可空的行,那麼NULL也會被作為一個分組表示出來,所以這里我們就不能僅僅通過NULL來判斷是不是小計記錄了。下面的例子展示了這里說得到的情況。還是我們前面提到的水果例子,現在我們在每種商品後面增加一個「折扣列」(Discount),用於顯示對應商品的折扣,這個數值是可空的,也就是可以通過NULL來表示沒有對應的折扣信息。數據集如下所示: FruitName ProctPlace Price Discount
Apple China $1.1 0.8
Apple Japan $2.1 0.9
Apple USA $2.5 1.0
Orange China $0.8 NULL
Banana China $3.1 NULL
Peach USA $3.0 NULL
現在我們要統計「各種折扣對應有多少種商品,並總計商品的總數。」,那麼我們可以通過如下的SQL語句來完成: SELECT COUNT(*) AS ProctCount, Discount FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 好了,運行一下,你會發現數據都正常出來了,按照如上的數據集,結果如下所示: ProctCount Discount
3 NULL
1 0.8
1 0.9
1 1.0
6 NULL
好了,各種折扣的商品數量都出來了,但是在顯示「沒有折扣商品」和「商品小計」的時候判斷上確存在問題,因為存在兩條Discount為Null的記錄。是哪一條呢?通過分析數據我們知道第一條數據(3, Null)應該對應沒有折扣商品的數量,而(6,Null)應該對應所有商品的數量。需要判斷這兩個具有不同意義的Null就需要引入一個聚合函數Grouping。現在我們把語句修改一下,在返回值中使用Grouping函數增加一列返回值,SQL語句如下: SELECT COUNT(*) AS ProctCount, Discount, GROUPING(Discount) AS Expr1 FROM T_TEST_FRUITINFO GROUP BY Discount WITH ROLLUP 這個時候,我們再看看運行的結果: ProctCount Discount Expr1
3 NULL 0
1 0.8 0
1 0.9 0
1 1.0 0
6 NULL 1
對於根據指定欄位Grouping中包含的欄位進行小計的記錄,這里會標記為1,我們就可以通過這個標記值將小計記錄從判斷那些由於ROLLUP或者CUBE關鍵字產生的行。Grouping(column_name)可以帶一個參數,Grouping就會去判斷對應的欄位值的NULL是否是由ROLLUP或者CUBE產生的特殊NULL值,如果是那麼就在由Grouping聚合函數產生的新列中將值設置為1。注意Grouping只會檢查Column_name對應的NULL來決定是否將值設置為1,而不是完全由此列是否是由ROLLUP或者CUBE關鍵字自動添加來決定的。 2.2 Group By 和 Having, Where ,Order by語句的執行順序: 最後要說明一下的Group By, Having, Where, Order by幾個語句的執行順序。一個SQL語句往往會產生多個臨時視圖,那麼這些關鍵字的執行順序就非常重要了,因為你必須了解這個關鍵字是在對應視圖形成前的欄位進行操作還是對形成的臨時視圖進行操作,這個問題在使用了別名的視圖尤其重要。以上列舉的關鍵字是按照如下順序進行執行的:Where, Group By, Having, Order by。首先where將最原始記錄中不滿足條件的記錄刪除(所以應該在where語句中盡量的將不符合條件的記錄篩選掉,這樣可以減少分組的次數),然後通過Group By關鍵字後面指定的分組條件將篩選得到的視圖進行分組,接著系統根據Having關鍵字後面指定的篩選條件,將分組視圖後不滿足條件的記錄篩選掉,然後按照Order By語句對視圖進行排序,這樣最終的結果就產生了。在這四個關鍵字中,只有在Order By語句中才可以使用最終視圖的列名,如: SELECT FruitName, ProctPlace, Price, ID AS IDE, Discount FROM T_TEST_FRUITINFO WHERE (ProctPlace = N'china') ORDER BY IDE 這里只有在ORDER BY語句中才可以使用IDE,其他條件語句中如果需要引用列名則只能使用ID,而不能使用IDE。

2. 數據鏈表的使用場景哪些是正確的

#include <stdio.h>
#include <stdlib.h.>

typedef int ElemType;

typedef struct node {
int data;
struct node *prior,*next;
} *SqList;

SqList CreateList1(int n) { // 創建單向循環鏈表
SqList head,p,q;
head = p = (SqList)malloc(sizeof(node));
for(int i = 0;i < n;i++) {
q = (SqList)malloc(sizeof(node));
q->data = 2*i + 1;
p->next = q;
p = q;
}
p->next = head;
return head;
}

SqList CreateList2(int n) { // 創建單向非循環鏈表
SqList head,p,q;
head = p = (SqList)malloc(sizeof(node));
for(int i = 0;i < n;i++) {
q = (SqList)malloc(sizeof(node));
q->data = 2*(i + 1);
p->next = q;
p = q;
}
p->next = NULL;
return head;
}

void ChangeList1(SqList head) { // 單向循環鏈表改為雙向循環鏈表
SqList p,q;
p = head;
q = p->next;
while(q != head) {
q->prior = p;
p = q;
q = q->next;
}
head->prior = q;
}

void ChangeList2(SqList head) { // 單向非循環鏈表改為雙向循環鏈表
SqList p,q;
p = head;
q = p->next;
while(q != NULL) {
q->prior = p;
p = q;
q = q->next;
}
p->next = head;
head->prior = p;
}

void PrintList1(SqList head) { // 順向列印非循環鏈表數據
SqList p = head->next;
while(p != NULL) {
printf("%3d",p->data);
p = p->next;
}
printf("\n\n");
}

void PrintList2(SqList head) { // 反向列印循環鏈表數據
SqList p = head->prior;
while(p != head) {
printf("%3d",p->data);
p = p->prior;
}
printf("\n\n");
}

void FreeList(SqList head) {
SqList p,q;
p = head;
q = p->next;
while(q != head) {
p = q;
q = p->next;
free(p);
}
free(head);
}

int main() {
SqList head = CreateList2(10); // head為非循環鏈表
PrintList1(head); // 順向列印非循環鏈表
ChangeList2(head);
PrintList2(head);
FreeList(head);
return 0;
}

3. 數據結構,鏈表,指針函數int LocateElem(List L,ElemType e,Status(*compare)(ElemType,ElemType))

  1. 把一個函數當做表達式,作為另一個函數的實參。

  2. 把一個函數指針(指向函數的指針)當做另一函數的形參,把函數名(地址)作為實參進行傳遞。

第一種比較簡單,現在我們只說第二種,直接上代碼,有幫助的話請點個贊,有問題的可以評論留言。

Statuscompare(ElemTypec1,ElemTypec2){
if(c1==c2)
returnTRUE;
else
returnFALSE;
}
intLocateElem(LinkListL,ElemTypee,Status(*compare)(ElemType,ElemType)){
p=L;j=0;
while(p->next){
p=p->next;j++;
if(compare(p->data,e)==TRUE){
printf(" 數據元素%d存儲在第%d個結點。 ",e,j);
returnj;
}
}
printf(" 數據元素%d不存在。 ",e);
return0;
}
intmain(){
……//創建鏈表
LocateElem(L,3,compare);//函數作為實參
}

運行結果:

4. 怎麼一句sql既能insert到表1又能insert到表2

創建視圖,在視圖中用鏈表查詢,然後插入視圖數據,就相當於兩個insert插入兩個表。

5. c語言 問題

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{int number;/*學號*/
char name[10];/*姓名*/
float cyuyan;/*c成績*/
float vbyuyan;/*vb成績*/
float sqlyuyan;/*sql成績 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k為全局變數,本程序中的函數均可以使用它*/
/*==============================================================================================*/
score *creat2311(void)
/*函數creat2311,功能:創建鏈表,此函數帶回一個指向鏈表頭的指針*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*開辟一個新單元*/
printf("請輸入學生資料,輸0退出!\n");
repeat1: printf("請輸入學生學號(學號應大於0):");/*輸入學號,學號應大於0*/
scanf("%d",&p1->number);
while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat1;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);/*輸入學生姓名*/
printf("請輸入c成績(0~100):");/*輸入c成績,成績應在0-100*/
scanf("%f",&p1->cyuyan);
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");/*輸入錯誤,重新輸入c成績直到正確為止*/
scanf("%f",&p1->cyuyan);}
printf("請輸入vb成績(0~100):");/*輸入vb成績,成績應在0-100*/
scanf("%f",&p1->vbyuyan);
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");/*輸入錯誤,重新輸入vb成績直到正確為止*/
scanf("%f",&p1->vbyuyan);}
printf("請輸入sql成績(0~100):");/*輸入sql成績,成績應在0-100*/
scanf("%f",&p1->sqlyuyan);
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&p1->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else

p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("請輸入學生資料,輸0退出!\n");
repeat2:printf("請輸入學生學號(學號應大於0):");
scanf("%d",&p1->number);/*輸入學號,學號應大於0*/

while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat2;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}

}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);/*輸入學生姓名*/
printf("請輸入c成績(0~100):");
scanf("%f",&p1->cyuyan);/*輸入c成績,成績應在0-100*/
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");
scanf("%f",&p1->cyuyan);}/*輸入錯誤,重新輸入c成績直到正確為止*/
printf("請輸入vb成績(0~100):");
scanf("%f",&p1->vbyuyan);/*輸入vb成績,成績應在0-100*/
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");
scanf("%f",&p1->vbyuyan);}/*輸入錯誤,重新輸入vb成績直到正確為止*/
printf("請輸入sql成績(0~100):");
scanf("%f",&p1->sqlyuyan);/*輸入sql成績,成績應在0-100*/
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&p1->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/

}

end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交換前後結點中的c成績,使之與學號相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交換前後結點中的vb成績,使之與學號相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交換前後結點中的sql成績,使之與學號相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
}
p2->next=NULL;/*鏈表結尾*/
printf("輸入的學生數為:%d個!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *load2311(score *head)
/*函數load2311,功能:從文件讀入學生記錄*/
{ score *p1,*p2;
int m=0;
char filepn[10];
FILE *fp;

printf("請輸入文件路徑及文件名:");
scanf("%s",filepn);/*輸入文件路徑及名稱*/
if((fp=fopen(filepn,"r+"))==NULL)
{
printf("不能打開文件!\n");
return 0;
}
fscanf(fp," 考試成績管理系統 \n");
fscanf(fp,"作者:欣傑 班級: 信息E3 學號:24 \n");
fscanf(fp,"-----------------------------------------\n");
fscanf(fp,"|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
fscanf(fp,"-----------------------------------------\n");/*讀入表格域*/
printf(" 考試成績管理系統 \n");
printf(" 作者:欣傑 班級: 信息E3 學號:24 \n");
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
m=m+1;
if(m==1)
{

p1=(score *)malloc(LEN); /*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件讀入與顯示*/
head=NULL;
do
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN); /*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f\n",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件讀入與顯示*/
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}printf("-----------------------------------------\n");/*表格下線*/
fclose(fp);/*結束讀入,關閉文件*/

return (head);
}

/*==============================================================================================*/
/*==============================================================================================*/
score *add2311(score *head,score *stu)
/*函數add2311,功能:追加學生資料,並且將所有學生資料按學號排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];

p3=stu=(score *)malloc(LEN);/*開辟一個新單元*/
printf("\n輸入要增加的學生的資料!");
repeat4: printf("請輸入學生學號(學號應大於0):");
scanf("%d",&stu->number);
/*輸入學號,學號應大於0*/
while(stu->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&stu->number);}/*輸入錯誤,重新輸入學號*/
/******************************************************/
if(stu->number==0)
goto end2;/*當輸入的學號為0時,轉到末尾,結束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat4;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}

}

/******************************************************/
printf("輸入學生姓名:");
scanf("%s",stu->name); /*輸入學生姓名*/
printf("請輸入c成績(0~100):");
scanf("%f",&stu->cyuyan); /*輸入c成績,成績應在0-100*/
while(stu->cyuyan<0||stu->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");
scanf("%f",&stu->cyuyan);} /*輸入錯誤,重新輸入c成績直到正確為止*/
printf("請輸入vb成績(0~100):");
scanf("%f",&stu->vbyuyan);/*輸入vb成績,成績應在0-100*/
while(stu->vbyuyan<0||stu->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");
scanf("%f",&stu->vbyuyan);}/*輸入錯誤,重新輸入vb成績直到正確為止*/
printf("請輸入sql成績(0~100):");
scanf("%f",&stu->sqlyuyan);/*輸入sql成績,成績應在0-100*/
while(stu->sqlyuyan<0||stu->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&stu->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}/*當原來鏈表為空時,從首結點開始存放資料*/
else/*原來鏈表不為空*/
{
if(p1->next==NULL)/*找到原來鏈表的末尾*/
{
p1->next=p0;
p0->next=NULL;/*將它與新開單元相連接*/
}
else
{
while(p1->next!=NULL)/*還沒找到末尾,繼續找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}

}
n=n+1;

p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交換前後結點中的c成績,使之與學號相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交換前後結點中的vb成績,使之與學號相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交換前後結點中的sql成績,使之與學號相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
} end2:
printf("現在的學生數為:%d個!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *search2311(score *head)
/*函數search2311,功能:查詢學生成績*/
{int number;
score *p1,*p2;
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);

while(number!=0)
{
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}

printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)

{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
printf("-----------------------------------------\n");}/*列印表格域*/
else
printf("%d不存在此學生!\n",number);

printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
}
printf("已經退出了!\n");
return(head);}

/*==============================================================================================*/
/*==============================================================================================*/
score *del2311(score *head)/*函數del2311,功能:刪除學生資料*/
{
score *p1,*p2;
int number;
printf("輸入要刪除的學生的學號(輸入0時退出):");
scanf("%d",&number);
getchar();
while(number!=0)/*輸入學號為0時退出*/
{

if(head==NULL)
{
printf("\n沒有任何學生資料!\n");
return(head);
}

6. c# 雙向鏈表從sql資料庫中讀數據

這個~~~就是一條一條讀出來,形成鏈表的元素放進去啊

7. 多條sql語句如何拼接

SQL語句拼接一般使用【union all】和【union】

兩者的區別是:

【union all】:顯示多條語句里的全部記錄;

【union】:顯示多條語句里的不重復的記錄,也就是有DIstinct的功效;


【union all】示例:

select'2016-02-06'date_timeunionall
select'2016-02-14'unionall
select'2016-06-12'unionall
select'2016-09-18'unionall
select'2016-10-09'unionall
select'2016-10-09'

結果為6行


【union】示例:

select'2016-02-06'date_timeunionall
select'2016-02-14'unionall
select'2016-06-12'unionall
select'2016-09-18'unionall
select'2016-10-09'unionall
select'2016-10-09'

結果為5行

8. c語言程序

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{int number;/*學號*/
char name[10];/*姓名*/
float cyuyan;/*c成績*/
float vbyuyan;/*vb成績*/
float sqlyuyan;/*sql成績 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k為全局變數,本程序中的函數均可以使用它*/
/*==============================================================================================*/
score *creat2311(void)
/*函數creat2311,功能:創建鏈表,此函數帶回一個指向鏈表頭的指針*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*開辟一個新單元*/
printf("請輸入學生資料,輸0退出!\n");
repeat1: printf("請輸入學生學號(學號應大於0):");/*輸入學號,學號應大於0*/
scanf("%d",&p1->number);
while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat1;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);/*輸入學生姓名*/
printf("請輸入c成績(0~100):");/*輸入c成績,成績應在0-100*/
scanf("%f",&p1->cyuyan);
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");/*輸入錯誤,重新輸入c成績直到正確為止*/
scanf("%f",&p1->cyuyan);}
printf("請輸入vb成績(0~100):");/*輸入vb成績,成績應在0-100*/
scanf("%f",&p1->vbyuyan);
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");/*輸入錯誤,重新輸入vb成績直到正確為止*/
scanf("%f",&p1->vbyuyan);}
printf("請輸入sql成績(0~100):");/*輸入sql成績,成績應在0-100*/
scanf("%f",&p1->sqlyuyan);
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&p1->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else

p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("請輸入學生資料,輸0退出!\n");
repeat2:printf("請輸入學生學號(學號應大於0):");
scanf("%d",&p1->number);/*輸入學號,學號應大於0*/

while(p1->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(p1->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat2;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}

}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);/*輸入學生姓名*/
printf("請輸入c成績(0~100):");
scanf("%f",&p1->cyuyan);/*輸入c成績,成績應在0-100*/
while(p1->cyuyan<0||p1->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");
scanf("%f",&p1->cyuyan);}/*輸入錯誤,重新輸入c成績直到正確為止*/
printf("請輸入vb成績(0~100):");
scanf("%f",&p1->vbyuyan);/*輸入vb成績,成績應在0-100*/
while(p1->vbyuyan<0||p1->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");
scanf("%f",&p1->vbyuyan);}/*輸入錯誤,重新輸入vb成績直到正確為止*/
printf("請輸入sql成績(0~100):");
scanf("%f",&p1->sqlyuyan);/*輸入sql成績,成績應在0-100*/
while(p1->sqlyuyan<0||p1->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&p1->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/

}

end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交換前後結點中的c成績,使之與學號相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交換前後結點中的vb成績,使之與學號相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交換前後結點中的sql成績,使之與學號相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
}
p2->next=NULL;/*鏈表結尾*/
printf("輸入的學生數為:%d個!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *load2311(score *head)
/*函數load2311,功能:從文件讀入學生記錄*/
{ score *p1,*p2;
int m=0;
char filepn[10];
FILE *fp;

printf("請輸入文件路徑及文件名:");
scanf("%s",filepn);/*輸入文件路徑及名稱*/
if((fp=fopen(filepn,"r+"))==NULL)
{
printf("不能打開文件!\n");
return 0;
}
fscanf(fp," 考試成績管理系統 \n");
fscanf(fp,"作者:欣傑 班級: 信息E3 學號:24 \n");
fscanf(fp,"-----------------------------------------\n");
fscanf(fp,"|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
fscanf(fp,"-----------------------------------------\n");/*讀入表格域*/
printf(" 考試成績管理系統 \n");
printf(" 作者:欣傑 班級: 信息E3 學號:24 \n");
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
m=m+1;
if(m==1)
{

p1=(score *)malloc(LEN); /*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件讀入與顯示*/
head=NULL;
do
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN); /*開辟一個新單元*/
fscanf(fp,"%d%s%f%f%f\n",&p1->number,p1->name,&p1->cyuyan,&p1->vbyuyan,&p1->sqlyuyan);
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
/*文件讀入與顯示*/
}while(!feof(fp));
p2->next=p1;
p1->next=NULL;
n=n+1;
}printf("-----------------------------------------\n");/*表格下線*/
fclose(fp);/*結束讀入,關閉文件*/

return (head);
}

/*==============================================================================================*/
/*==============================================================================================*/
score *add2311(score *head,score *stu)
/*函數add2311,功能:追加學生資料,並且將所有學生資料按學號排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];

p3=stu=(score *)malloc(LEN);/*開辟一個新單元*/
printf("\n輸入要增加的學生的資料!");
repeat4: printf("請輸入學生學號(學號應大於0):");
scanf("%d",&stu->number);
/*輸入學號,學號應大於0*/
while(stu->number<0)
{getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&stu->number);}/*輸入錯誤,重新輸入學號*/
/******************************************************/
if(stu->number==0)
goto end2;/*當輸入的學號為0時,轉到末尾,結束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{printf("學號重復,請重輸!\n");
goto repeat4;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}

}

/******************************************************/
printf("輸入學生姓名:");
scanf("%s",stu->name); /*輸入學生姓名*/
printf("請輸入c成績(0~100):");
scanf("%f",&stu->cyuyan); /*輸入c成績,成績應在0-100*/
while(stu->cyuyan<0||stu->cyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入c成績");
scanf("%f",&stu->cyuyan);} /*輸入錯誤,重新輸入c成績直到正確為止*/
printf("請輸入vb成績(0~100):");
scanf("%f",&stu->vbyuyan);/*輸入vb成績,成績應在0-100*/
while(stu->vbyuyan<0||stu->vbyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入vb成績");
scanf("%f",&stu->vbyuyan);}/*輸入錯誤,重新輸入vb成績直到正確為止*/
printf("請輸入sql成績(0~100):");
scanf("%f",&stu->sqlyuyan);/*輸入sql成績,成績應在0-100*/
while(stu->sqlyuyan<0||stu->sqlyuyan>100)
{getchar();
printf("輸入錯誤,請重新輸入sql成績");
scanf("%f",&stu->sqlyuyan);}/*輸入錯誤,重新輸入sql成績直到正確為止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}/*當原來鏈表為空時,從首結點開始存放資料*/
else/*原來鏈表不為空*/
{
if(p1->next==NULL)/*找到原來鏈表的末尾*/
{
p1->next=p0;
p0->next=NULL;/*將它與新開單元相連接*/
}
else
{
while(p1->next!=NULL)/*還沒找到末尾,繼續找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}

}
n=n+1;

p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;

if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cyuyan;
max->cyuyan=p1->cyuyan;
p1->cyuyan=fen;
/*交換前後結點中的c成績,使之與學號相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p1->vbyuyan;
p1->vbyuyan=fen;
/*交換前後結點中的vb成績,使之與學號相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p1->sqlyuyan;
p1->sqlyuyan=fen;
/*交換前後結點中的sql成績,使之與學號相匹配*/
}

}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
} end2:
printf("現在的學生數為:%d個!\n",n);
return(head);

}
/*==============================================================================================*/
/*==============================================================================================*/
score *search2311(score *head)
/*函數search2311,功能:查詢學生成績*/
{int number;
score *p1,*p2;
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);

while(number!=0)
{
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}

printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)

{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);
printf("-----------------------------------------\n");}/*列印表格域*/
else
printf("%d不存在此學生!\n",number);

printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
}
printf("已經退出了!\n");
return(head);}

/*==============================================================================================*/
/*==============================================================================================*/
score *del2311(score *head)/*函數del2311,功能:刪除學生資料*/
{
score *p1,*p2;
int number;
printf("輸入要刪除的學生的學號(輸入0時退出):");
scanf("%d",&number);
getchar();
while(number!=0)/*輸入學號為0時退出*/
{

if(head==NULL)
{
printf("\n沒有任何學生資料!\n");
return(head);
}

p1=head;

while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首結點,並且後面還有結點*/
{
p2=p1;p1=p1->next;
} /*p1後移一個結點*/

if(number==p1->number)
/*找到了*/
{
if(p1==head)
head=p1->next;
/*若p1指向的是首結點,把地二個結點地址賦予head*/
else
p2->next=p1->next;
/*否則將下一個結點地址 賦給前一結點地址*/
printf("刪除:%d\n",number);n=n-1;
}
else
printf("%d不存在此學生!\n",number);
/*找不到該結點*/

printf("輸入要刪除的學生的學號:");
scanf("%d",&number);
getchar();
}
#ifdef DEBUG
printf("已經退出了!\n");
#endif
printf("現在的學生數為:%d個!\n",n);
return(head);
}

/*==============================================================================================*/
/*==============================================================================================*/
void print2311(score *head)
/*函數print2311,功能:顯示學生成績*/
{
score *p;
if(head==NULL)
{printf("\n沒有任何學生資料!\n");}
else
{printf("%d\n",n);
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
p=head;
do
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cyuyan,p->vbyuyan,p->sqlyuyan);
printf("-----------------------------------------\n");/*列印表格域*/
p=p->next;}while (p!=NULL);/*列印完成了*/
}
}
/*==============================================================================================*/
/*==============================================================================================*/
score *statistics2311(score *head)
/*函數statistics2311,功能:統計學生成績*/
{
float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;
score *p;
int x,y=0,i=0;

p=head;
printf("1個人總分和平均分\t2單科平均分\t3總分最高分\t4總分最低分\n");
scanf("%d",&x);
getchar();

switch(x)
/*用switch語句實現功能選擇*/
{
case 1: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
else
{
printf("---------------------------------------------------------\n");
printf("|學號\t|姓名\t|c\t|vb\t|sql\t|總分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");/*列印表格域*/
while(p!=NULL)
{
sum1=p->cyuyan+p->vbyuyan+p->sqlyuyan; /*計算個人總分*/
ave1=sum1/3;/*計算個人平均分*/

printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cyuyan,p->vbyuyan,p->sqlyuyan,sum1,ave1);
/*列印結果*/
printf("---------------------------------------------------------\n");/*列印表格域*/
p=p->next;}
}

return(head); break;
case 2: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
while(p!=NULL)
{
sum1=sum1+p->cyuyan;
sum2=sum2+p->vbyuyan;
sum3=sum3+p->sqlyuyan;/*計算總分*/
y=y+1;
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*計算平均分*/
p=p->next;/*使p指向下一個結點*/
}
printf("c平均分是%.1f\n",ave1);
printf("vb平均分是%.1f\n",ave2);
printf("sql平均分是%.1f\n",ave3);/*列印結果*/
return(head); break;
case 3:
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
max=p->cyuyan+p->vbyuyan+p->sqlyuyan;
while(i<n)
{
i=i+1;
sum1=p->cyuyan+p->vbyuyan+p->sqlyuyan; /*計算個人總分*/
if(max<sum1)
max=sum1;
p=p->next;
}

printf("總分最高分:%.1f",max);
printf("\n");
return(head); break;

case 4: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
while(p!=NULL)
{
min=p->cyuyan+p->vbyuyan+p->sqlyuyan;
while(p!=NULL)
{sum2=p->cyuyan+p->vbyuyan+p->sqlyuyan;

if(min>sum2)
min=sum2;
p=p->next;
}
}

printf("總分最低分:%.1f",min);
printf("\n");
return(head); break;

default :printf("輸入錯誤,請重試!\n");
}
return(head);

}

/*==============================================================================================*/
/*==============================================================================================*/

save2311(score *p1)
/*函數save2311,功能:保存學生的資料*/
{
FILE *fp;

char filepn[20];/*用來存放文件保存路徑以及文件名*/

printf("請輸入文件路徑及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL)
{
printf("不能打開文件!\n");
return 0;
}

fprintf(fp," 考試成績管理系統 \n");
fprintf(fp," 作者:欣傑 班級: 信息E3 學號:24 \n");
fprintf(fp,"-----------------------------------------\n");
fprintf(fp,"|學號\t|姓名\t|c\t|vb\t|sql\t|\n");
fprintf(fp,"-----------------------------------------\n");
/*列印表格域*/
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->cyuyan,p1->vbyuyan,p1->sqlyuyan);

p1=p1->next;/*下移一個結點*/

}
fclose(fp);
printf("文件已經保存!\n");
return 0;
}
/*==============================================================================================*/
/*==============================================================================================*/
score *taxis2311(score *head)
/*定義排序函數。此函數帶回一個指向鏈表頭的指針*/
{ score *p,*max;
int i,j,x;
float fen;
char t[10];
if(head==NULL)
{printf("\n沒有任何學生資料,請先建立鏈表!\n");return(head);}/*鏈表為空*/
max=p=head;

for(i=0;i<80;i++)
printf("*");
printf("1按學生學號排序\t2按學生姓名排序\t3按c成績排序\n");
printf("4按vb成績排序\t5按sql成績排序\t\n");
for(i=0;i<80;i++)
printf("*");

printf("請選擇操作:");
scanf("%d",&x);/*選擇操作*/
getchar();

switch(x) /*用switch語句實現功能選擇*/
{case 1 :
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p;
p=p->next;

if(max->number>p->number)
{
k=max->number;
max->number=p->number;
p->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);
strcpy(max->name,p->name);
strcpy(p->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cyuyan;
max->cyuyan=p->cyuyan;
p->cyuyan=fen;
/*交換前後結點中的c成績,使之與學號相匹配*/

fen=max->vbyuyan;
max->vbyuyan=p->vbyuyan;
p->vbyuyan=fen;
/*交換前後結點中的vb成績,使之與學號相匹配*/

fen=max->sqlyuyan;
max->sqlyuyan=p->sqlyuyan;
p->sqlyuyan=fen;
/*交換前後結點中的sql成績,使之與學號相匹配*/
}

}
max=head;p=head;/*重新使max,p指向鏈表頭*/
}

9. SQL鏈表查詢。下圖兩個表。求怎麼查詢裡面某個學生的老師。班級。班級人數等信息

select s.name,c.classname,c.teacher from class c,student s where s.name = '小名' and c.classname = '___2%';
你的學生表好像不是ID來判別班級,而是class判別,數字是代表3年幾班是吧?
表本身有問題,最佳是把學生表和班級表的class欄位 froeign key。