資料庫程式設計 – PHP+MySQL 第 九章 混合查詢程式        下一頁

 

第九章 混合查詢程式

 

9-1 混合查詢技巧

內容:

  • 9-1-1 混合查詢簡介

  • 9-1-2 範例研討:查詢各系全學年課程

9-1-1 混合查詢簡介

只要資料表之間有建立關聯,利用合併查詢技巧幾乎可以查詢到任何訊息,但它的缺點是可能產生巨量的暫存表,甚至可能造成系統當機。我們可以再思考一個關鍵性問題,資料表經過 SQL 敘述處理之後,所產生的結果也是資料表型態的暫存表,如果我們將資料表經過 SQL 處理後產生較小的表格,再來合併的話,就會減少許多不必要的垃圾資料,這就是本章要介紹的混合查詢技巧。

如下圖所示,如果需要合併 3 個表格才能查出結果的話,我們是否可以先將兩個表格利用巢狀查詢得到一個『暫時資料表』,再與另一表格合併得到結果,如果可行的話則可減低許多不必要的系統資源,也增加執行速度。

9-1-2 範例研討:查詢各系全學年課程

(A) 系統需求:Ex9_1

教務處需要一只可以查詢各系全學年規劃課程的網頁,期望查詢網頁如下:

執行網頁的結果如下:

 (B) SQL 設計技巧

這個題目使用巢狀或合併技巧都可以達到目的,我們再演化混合技巧來作看看。如下圖所示,我們先由系別名稱(資訊管理系)查詢到 dep_ID,它也是表格型態,再利用它與 all_course 合併,如此就可以減少許多資料量。

SQL 程式設計如下:(假設查資訊管理系($dep_name),可利用 AppServ 測試果)

select A.course_ID, A.course_name, A.required, A.credit

from all_course as A, (select dep_ID

                  from department

                  where dep_name = '$dep_name') as B

where A.dep_ID = B.dep_ID;

(C) 網頁製作技巧

『表單網頁』由 department 表中查詢各系所名稱,以供下拉式選單,『執行網頁』再將 department all_course 兩表格以混合查詢出結果,如下圖:

(C) 表單網頁程式範例:Ex9_1-form.php

開啟 department 資料表建立選單方式挑選系別名稱,再傳遞給執行網頁,程式範例如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

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

        // 查詢系別名稱

        $sql_query = "select dep_name

                  from department";

        $result = mysqli_query($select_db, $sql_query);

   echo "<p><font size='3'> 查詢各系全學年規劃課程 </font></p>";

   echo "<form name='表單' method='post' action='Ex9_1-action.php'>";

        //選擇系別名稱

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

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

            echo "<option value='$row[0]'> $row[0]</option><BR>";

            }

        echo "</select>";

                echo "<BR><BR>";

                echo "<input type='submit' value='送出'>";

        echo "</form>";

    mysql_close($db_link);

?>

(D) 執行網頁程式範例:

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

<?php

        $dep_name = $_POST["dep_name"];

        $select_db = mysqli_connect("localhost", "root", "12345678", "course_db")

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

        // 查詢全學年規劃課程

    $sql_query = "select A.course_ID, A.course_name, A.required, A.credit

                from all_course as A, (select dep_ID

                                   from department

                                   where dep_name = '$dep_name') as B

                 where A.dep_ID = B.dep_ID";

        $result = mysqli_query($select_db, $sql_query);

        $items = array("課程代碼", "課程名稱", "必選修", "學分數");

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

        // 利用 foreach 迴圈印出陣列

        foreach ($items as $value) {

                echo "<td> $value </td>";

        }

        echo "</tr>";

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

                echo "<tr>";

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

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

                }

                echo "</tr>";

        }

        echo "</table>";

        mysql_close($db_link);

?>

翻轉工作室:粘添壽

 

course_db 關聯圖

資料庫程式設計:

 

 

 

翻轉電子書系列: