資料庫程式設計 – PHP+MySQL 第六章 巢狀查詢程式     下一頁

翻轉工作室:粘添壽     course_db E-R 關聯圖 <開啟>

 

第六章 巢狀查詢程式

6-1 單一資料表查詢

6-1-1 Select 查詢語法

Select SQL 最基礎的命令,格式看起來非常簡單,但它的變化萬千,是否能在資料庫中萃取資訊,完全要看 select 語句靈活運用的能力,我們需用許多範例來探討。Select 敘述的意思是:依照某些條件底下(Where),要由某資料表 (From),擷取哪些欄位(Select)的資料。另外條件也許由若干個條件的邏輯組合(Andor),查詢結果可將分組設定(Group by),也可依照某條件分組(Having),甚至也可由大到小(AscDesc),或由小到大排列(Order by)。查詢語法如下:

Select 想要擷取的欄位(欄位_1, 欄位_2, ..)

From 想要查詢的資料表

Where 查詢條件 (條件敘述 | And 條件敘述 | or 條件敘述)

Group By 分組設定(Asc Desc)

Having 分組條件

Order By 排序設定

Limit 限制設定

 

6-1-2 範例研討查詢學生資料

(A) 程式功能:Ex6_1

學務處需要一個供查詢學生資料的網頁,可以由學號或姓名查詢,期望查詢網頁如下:

查詢結果的網頁如下:

(B) 製作技巧

題目是希望能由學號或姓名來查詢學生資料。首先我們須知道學生資料儲存哪一個資料表,從系統架構圖中可以看出是儲存於 students 資料表內,用簡單的 select 命令就可以達到目的。

Select  *

From students

Where student = “查詢學號 name = “查詢姓名

(C) 查詢網頁的程式:Ex6_1-form.html

系統要求可以用學號或姓名查詢,因此表單 (<form>) 裡我們增加了兩個按鈕選項 (<input type=”radio”>),為學號與姓名的選項,兩則的輸出名稱都相同(name=”method”),由內容(value=”no”value=”name”) 辨識使用者按哪一個鍵(學號或姓名)。程式範例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢學生資料</title>

</head>

<body>

   <form name="表單" method="post" action="Ex6_1-action.php">

      <input type="radio" name="method"  value="no">學號<BR>

      <input type="radio" name="method"  value="name">姓名<BR><BR>

      請輸入:

      <input type="text" name="value"><BR>

      <input type="submit" value="送出">

   </form>

</body>

</html>

(D) 執行網頁的程式:Ex6_1-action.php

查詢網頁傳遞過來兩個訊息,其中 $method是使用者選擇學號(no) 或姓名(name),因此$value 有可能是學號或姓名內容。如果是學號,則將查詢敘述設定為 where condition 的條件 $condition = [“ student_ID = $value”],否則設定為 $condition = [“name = $value”]。但牽涉到字串連接的問題,我們需要寫成 $condition “條件式,條件式為:

Student_ID = ”.””.$value.”,意思是 student_ID = 連結(“.”)、再連結 $value(“.$value”)

再將所有語句用雙引號包起來 (“ …”),程式範例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<! Ex6_1-action.php>

<?php

 

        $method = $_POST["method"];

        $value = $_POST["value"];

        if ($method == "no") {

             $condition = "student_ID = "."'".$value."'";

        } else{

             $condition = "name = "."'".$value."'";

        }

        $db_link = mysql_connect("localhost", "root", "123456")

                or die("MySQL 伺服器連結失敗 <br>");

        $select_db = mysql_select_db("course_db");

        $sql_query = "select *

                from students

                where $condition";

  

        mysql_query("SET NAMES 'utf8'");

        $result = mysql_query($sql_query);

       

        echo "<table border = '2'><tr align='center'>";

        for($i=0; $i<mysql_num_fields($result); $i++) {

                echo "<td>".mysql_field_name($result, $i)."</td>";

        }

        echo "</tr>";

        while($row=mysql_fetch_row($result)) {

                echo "<tr>";

                for($j=0; $j<mysql_num_fields($result); $j++) {

                        echo "<td>$row[$j]</td>";

                }

                echo "<tr/>";

        }

        mysql_close($db_link);

?>

 

6-1-3 範例研討人性化顯示學生資料

(A) 程式功能:Ex6_2

學務處看過 Ex6_1 網頁後,認為顯示資料項目應該可供選擇較理想,且查詢結果就與電腦儲存一樣,也不夠人性化,期望查詢網頁如下:

執行結果的網頁如下:

(B) 製作技巧

 Ex6_1 的做法是直接將查詢結果的動態資料表顯示出來。目前系統是要求各項資料分別顯示。首先須知道資料表各欄位的順序(如上圖所示),我們建立一個陣列儲存各欄位的中文名稱,如,$fields = array("學號","姓名","班級代碼","性別", "電話","電子郵件","地址"),當讀出陣列內每一元素內容時,再配對欄位內容即可。

(C) 查詢網頁的程式:Ex6_2-form.html( Ex6_1-form.html 相同)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>查詢學生資料</title>

</head>

<body>

   <p><font size="3"> 查詢學生資料(學號或姓名) </font></p>

   <form name="表單" method="post" action="Ex6_2-action.php">

      <input type="radio" name="method"  value="no">學號<BR>

      <input type="radio" name="method"  value="name">姓名<BR><BR>

      請輸入學生姓名或學號:

      <input type="text" name="value"><BR>

      <input type="submit" value="送出">

   </form>

</body>

</html>

(D) 執行網頁的程式:Ex6_2-action.php

(1) 23 ~ 24 行:讀取 $fields[$i] $row[$i] 同一位置($i) 的元素。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<! Ex6_2-action.php>

<?php

        $method = $_POST["method"];

     $value = $_POST["value"];

 

        if ($method == "no") {

             $condition = "student_ID = "."'".$value."'";

        } else{

             $condition = "name = "."'".$value."'";

        }

        $db_link = mysql_connect("localhost", "root", "123456")

                or die("MySQL 伺服器連結失敗 <br>");

        $select_db = mysql_select_db("course_db");

        $sql_query = "select *

                from students

                where $condition";

        mysql_query("SET NAMES 'utf8'");

        $result = mysql_query($sql_query);

       

    $fields = array("學號","姓名","班級代碼","性別", "電話","電子郵件","地址");

 

    while($row=mysql_fetch_row($result)) {

       for($j=0; $j<mysql_num_fields($result); $j++) {

                  echo "$fields[$j] = $row[$j] <BR>";

           }

           echo "<BR>";

        }

        mysql_close($db_link);

?>

 

6-1-4 自我挑戰選擇性查詢老師資料

(A) 系統需求:PM6_1

人事處需要製作一套可供查詢老師個資的網頁,期望選擇所欲查詢老師與資料都用選單方式比較人性化,期望查詢網頁如下:

(B) 執行結果網頁如下:

(C) 製作技巧

教師資料儲存於 teachers 資料表內,我們可以利用教師代碼查詢出所要的資料。

(D) 查詢網頁的提示(PM6_1-form.php)

系統要求教師名稱必須利用下拉式選單,因此,我們必須由 teachers 資料表內讀取第 12 欄位,前者是教師代碼(teacher_ID),後者是教師姓名 (name)。另外,所欲查詢的資料也是要下拉式選單。因此,在查詢網頁上的表單( <form>) 就需要兩個選單(<select>),一個由 PHP 讀取 teachers 資料表,另一個直接編寫個資料項目選項,由變數 $item 記錄查詢哪一項資料。。程式提示如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

….

<?php

        $sql_query = "select teacher_ID, name

                from teachers";

        $result = mysql_query($sql_query);

?>

……

   <form name="表單" method="post" action="PM6_1-action.php">

<?php

           echo "選擇教師:";

           echo "<select name='teacher_ID'>";

          

            mysql_close($db_link);

?>

<p>選擇查詢資料:</p>       

         <select name="item">

               <option value="Dep_ID">系別代碼</option>

               <option value="tel">電話</option>

               <option value="title">職務</option>

               <option value="mailbox">電子郵件</option>

               <option value="address">地址</option>

         </select>

         <BR>

      <input type="submit" value="送出">

   </form>

…..

(E) 執行網頁的提示如下:(PM6_1-action.php)

查詢網頁傳遞過來 $teacher_ID $item 表示查詢哪位老師,與查詢哪一項目資料。程式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<!PM6_1-action>

<?php

 

        $teacher_ID = $_POST["teacher_ID"];

     $item = $_POST["item"];

        …

        $sql_query = "select name, $item

                from teachers

                where teacher_ID = '$teacher_ID'";

        $result = mysql_query($sql_query);

        $row=mysql_fetch_row($result);

        echo "查詢結果:<BR>";

        echo "$row[0] 老師的資料是: $row[1] <BR>";

….

?>

(F) 進階顯示結果的網頁:(PM6_1-action-1.php)

上述顯示結果好像很奇怪,沒有註明是甚麼資料,您是否可以再將它改成下列結果:

提示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

….

switch($item) {

            case "Dep_ID":

                    $sql_query_1 = "select dep_name

                                    from department

                                    where dep_ID = '$row[1]'";

                    $result_1 = mysql_query($sql_query_1);

                    $row_1= mysql_fetch_row($result_1);

                    $data = $row_1[0];

                    $message = "系別名稱";

                    break;

            case "title":

                    $message = "職務";

                    $data = $row[1];

                    break;

            case "tel":

 …………………….

            default:

                    $message = "錯誤要求";

                    $data = "沒有資料";

        }

……

 

6-1-5 自我挑戰查詢學生平均分數

(A) 系統需求:PM6_2

學務處需要製作一只以學號查詢該生各科(以開課代碼表示)修課成績與平均分數(先不考慮學分數),期望查詢網頁如下:

查詢結果的網頁如下:

(B) 製作技巧

系統要求列印學生修哪些課、各科成績與學期總平均分數。學生修課與各科成績登錄於『select_course』資料表內,但表內僅登錄學生修課與各科成績,並沒有記錄總平均分數。因此,我們需要兩個查詢動作,第一個查詢修哪些科目及成績,第二個查詢平均分數。

第一個查詢比較簡單,不再敘述。第二個查詢平均分數,需利用 Group by 語句與求平均值函數。我們以 student_ID 為群組,再計算群組學期成績(final) 的分均值(avg(final))即可,如下:(假設查詢 student_ID = “90211302” )

select student_ID, "平均分數", avg(final)

from select_course

where student_ID = "90211302"

group by student_ID;

 

(C) 執行網頁的提示:(PM6_2-action.php)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<!filename: PM6_2-action.php>

<?php

….  //查詢各科成績

     $sql_query_1 = "select open_course_ID as '開課代碼',final as '學期成績'

                      from select_course

                      where student_ID='$student_ID'";

     // 查詢平均分數

        $sql_query_2 = "select student_ID, avg(final)

                                from select_course

                                where student_ID='$student_ID'

                                group by final";

       

        $result_1 = mysql_query($sql_query_1);

        $result_2 = mysql_query($sql_query_2);

 

// 列印各科成績

 

 

// 列印總平均分數

 

        $row=mysql_fetch_row($result_2);

        echo "$row[0] 學生總平均分數 = $row[1]";

?>

 

<GOTOP>