1. 程式人生 > >php資料查詢之基礎查詢

php資料查詢之基礎查詢

---恢復內容開始---

資料查詢語言(Data Query Language)

基本查詢

  • 語法形式:
    select [all | distinct ] 欄位或者表示式列表 [from子句] [where子句] [group by 子句] [having 子句] [order by 子句] [limit 子句]

 

  • 解釋說明
    • select 從“資料來源”中,找出(取出)資料。
      •  “資料來源通常指“表”,也可以是“直接資料”或者函式返回結果。示例:
        mysql> select 5, 8*9, now();
        
        +---+-----+---------------------+ | 5 | 8*9 | now() | +---+-----+---------------------+ | 5 | 72 | 2018-10-24 15:36:07 | +---+-----+---------------------+ 1 row in set (0.00 sec)

 

      • 也可以加欄位(別)名:
        mysql> select 5 as num, 8*9 as
        multi, now() as time; +-----+-------+---------------------+ | num | multi | time | +-----+-------+---------------------+ | 5 | 72 | 2018-10-24 15:40:35 | +-----+-------+---------------------+ 1 row in set (0.00 sec)
      • 不能使用“表”的欄位而沒有from 子句
        mysql
        > select id; ERROR 1054 (42S22): Unknown column 'id' in 'field list'
    • [all | distinct]
      • 用於設定所select的資料是否允許出現重複行
      • all:允許出現
      • distinct:不允許出現---就是所謂的“消除重複行”
    • from 子句
      • 指定資料的來源,其實就是“表”。可以是單個“表”,也可以是多個“表”,用逗號隔開。
        mysql> select id, title, NO, context from sqltest, set_test;
        +----+--------+----+---------+
        | id | title  | NO | context |
        +----+--------+----+---------+
        |  1 | 第一個 |  1 | aa      |
        |  1 | 第一個 |  2 | aa,cc   |
        |  2 | 第二個 |  1 | aa      |
        |  2 | 第二個 |  2 | aa,cc   |
        |  3 | 第三個 |  1 | aa      |
        |  3 | 第三個 |  2 | aa,cc   |
        +----+--------+----+---------+
        6 rows in set (0.00 sec)
        
        mysql> select * from sqltest;
        +----+--------+----------------------------------------------------------+
        | id | title  | content                                                  |
        +----+--------+----------------------------------------------------------+
        |  1 | 第一個 | 這是ID=1的資料
        1111111111111111111111111111111111111111 |
        |  2 | 第二個 | 這是ID=2的資料
        2222222222222222222222222222222222222222 |
        |  3 | 第三個 | 這是ID=3的資料
        3333333333333333333333333333333333333333 |
        +----+--------+----------------------------------------------------------+
        3 rows in set (0.00 sec)
        
        mysql> select * from set_test;
        +----+---------+
        | NO | context |
        +----+---------+
        |  1 | aa      |
        |  2 | aa,cc   |
        +----+---------+
        2 rows in set (0.00 sec)
    • where 子句
      • 相當於php或者js中的if語句-條件判斷語句,最終結果為布林值(true/false)。
      • 常用運算子
        1. 算術運算子:+  -  *  /  %
        2. 比較運算子:
          • >  >=  <  <=  =(等於)  <>(不等於)-標準的sql語言
          • ==(等於)  !=(不等於)--mysql擴充套件
        • 邏輯運算子:and(與)  or(或)  no(非)
          mysql> select * from production where pro_id<5 and price-300<3000;
          +--------+-----------------------------------+------+-------+-------+--------+
          | pro_id | name                              | type | price | brand | origin |
          +--------+-----------------------------------+------+-------+-------+--------+
          |      1 | 康佳(KONKA)42英寸全高清液晶電視 |    1 |  1999 | 康佳  | 深圳   |
          |      2 | 索尼(SONY)4G手機(黑色)        |    2 |  3238 | 索尼  | 深圳   |
          +--------+-----------------------------------+------+-------+-------+--------+
          2 rows in set (0.00 sec)
          
          mysql> select * from production;
          +--------+-----------------------------------+------+-------+-------+--------+
          | pro_id | name                              | type | price | brand | origin |
          +--------+-----------------------------------+------+-------+-------+--------+
          |      1 | 康佳(KONKA)42英寸全高清液晶電視 |    1 |  1999 | 康佳  | 深圳   |
          |      2 | 索尼(SONY)4G手機(黑色)        |    2 |  3238 | 索尼  | 深圳   |
          |      3 | 海信(Hisense)55英寸智慧電視     |    1 |  4199 | 海信  | 青島   |
          |      4 | 聯想(Lenovo)14.0英寸膝上型電腦  |    3 |  5499 | 聯想  | 北京   |
          |      5 | 索尼(SONY)13.3英寸觸控超極本    |    3 | 11499 | 索尼  | 天津   |
          |      6 | 索尼(SONY)60英寸全高清液晶電視  |    1 |  6999 | 索尼  | 北京   |
          |      7 | 聯想(Lenovo)12.0英寸膝上型電腦  |    3 |  2999 | 聯想  | 北京   |
          |      8 | 聯想 雙卡雙待3G手機               |    2 |   988 | 聯想  | 北京   |
          |      9 | 惠普(HP)黑白鐳射印表機          |    3 |  1169 | 惠普  | 天津   |
          +--------+-----------------------------------+------+-------+-------+--------+
          9 rows in set (0.00 sec)
      • 布林值和空值判斷
        • 布林值(true/false):範圍,整數。實際就是tinyint(1)的數字,0為true,非零為false
          • xx is true
          • xx is false
        • 空值(null)
          • xx is null
          • xx is not null
      • 常用語法
        • between 語法
          • xx between 值1 and 值2 
          • xx 值介於值1和值2之間(包含值1和值2),相當於 值1<=xx and xx <=值2
        • in 語法
          • xx in(值1 , 值2, ...)
          • 欄位值xx等於其中任何一個都成立,相當於 xx=值1 or xx=值2 ...
        • like 語法(模糊查詢)
          • 形式: like '要查詢的字元'---範圍為字元型欄位
          • 說明
            • like語法用於多字元型別的欄位進行字元匹配
            • 要查詢的字元中有2個特殊的字元%、_
              • %--代表任意多個任意字元
              • '_'代表單個的任意字元
          • 要使用字元'%'和'_',需要使用轉義字元'\'
    • group by 分組子句   
      mysql> select * from production;
      +--------+-----------------------------------+------+-------+-------+--------+
      | pro_id | name                              | type | price | brand | origin |
      +--------+-----------------------------------+------+-------+-------+--------+
      |      1 | 康佳(KONKA)42英寸全高清液晶電視 |    1 |  1999 | 康佳  | 深圳   |
      |      2 | 索尼(SONY)4G手機(黑色)        |    2 |  3238 | 索尼  | 深圳   |
      |      3 | 海信(Hisense)55英寸智慧電視     |    1 |  4199 | 海信  | 青島   |
      |      4 | 聯想(Lenovo)14.0英寸膝上型電腦  |    3 |  5499 | 聯想  | 北京   |
      |      5 | 索尼(SONY)13.3英寸觸控超極本    |    3 | 11499 | 索尼  | 天津   |
      |      6 | 索尼(SONY)60英寸全高清液晶電視  |    1 |  6999 | 索尼  | 北京   |
      |      7 | 聯想(Lenovo)12.0英寸膝上型電腦  |    3 |  2999 | 聯想  | 北京   |
      |      8 | 聯想 雙卡雙待3G手機               |    2 |   988 | 聯想  | 北京   |
      |      9 | 惠普(HP)黑白鐳射印表機          |    3 |  1169 | 惠普  | 天津   |
      +--------+-----------------------------------+------+-------+-------+--------+
      9 rows in set (0.01 sec)
      mysql> select * from production group by brand;
      +--------+-----------------------------------+------+-------+-------+--------+
      | pro_id | name                              | type | price | brand | origin |
      +--------+-----------------------------------+------+-------+-------+--------+
      |      1 | 康佳(KONKA)42英寸全高清液晶電視 |    1 |  1999 | 康佳  | 深圳   |
      |      9 | 惠普(HP)黑白鐳射印表機          |    3 |  1169 | 惠普  | 天津   |
      |      3 | 海信(Hisense)55英寸智慧電視     |    1 |  4199 | 海信  | 青島   |
      |      2 | 索尼(SONY)4G手機(黑色)        |    2 |  3238 | 索尼  | 深圳   |
      |      4 | 聯想(Lenovo)14.0英寸膝上型電腦  |    3 |  5499 | 聯想  | 北京   |
      +--------+-----------------------------------+------+-------+-------+--------+
      5 rows in set (0.00 sec)

       

      • 形式:group by 欄位1 排序方式1, 欄位2 排序方式 2 ...
        • 通常只進行一個欄位的分組   
      • 含義
        • 分組?以某個欄位的值為“依據”,分到不同的“類別”中。
      • 結果
        • 分組結果只能是“組”---沒有資料本身的個性
        • 分組結果很“可能”死去很多特性,比如:序號,名字等等
        • 實際上,分組結果中通常只剩下以“組”為單位的整體資訊,如:分組依據本身,成員個數,總和,最大值,最小值,平均值
      • 上述結果反映在select 語句中為“欄位或者表示式部分”
        mysql> select brand, count(*) as counts, sum(price) as amount, avg(price) as avg
        Price, max(price) as maxPrice from production group by brand;
        +-------+--------+--------+-------------------+----------+
        | brand | counts | amount | avgPrice          | maxPrice |
        +-------+--------+--------+-------------------+----------+
        | 康佳  |      1 |   1999 |              1999 |     1999 |
        | 惠普  |      1 |   1169 |              1169 |     1169 |
        | 海信  |      1 |   4199 |              4199 |     4199 |
        | 索尼  |      3 |  21736 | 7245.333333333333 |    11499 |
        | 聯想  |      3 |   9486 |              3162 |     5499 |
        +-------+--------+--------+-------------------+----------+
        5 rows in set (0.00 sec)

         

      • 在分組查詢中,基本上依賴於一下幾個函式(聚合函式,統計函式)
        • sum(欄位x)--分組後欄位x的總和
        • max(欄位x)--分組後欄位x中的最大值
        • min(欄位x)--分組後欄位x中的最小值
        • avg(欄位x)--分組後欄位x中的平均值
        • count(*)--分組內成員數
      • 預設分組查詢結果正序顯示,想要倒序顯示,需在分組依據後加關鍵字“desc”
        mysql> select brand, count(*) as counts, sum(price) as amount, avg(price) as avg
        Price, max(price) as maxPrice from production group by brand desc;
        +-------+--------+--------+-------------------+----------+
        | brand | counts | amount | avgPrice          | maxPrice |
        +-------+--------+--------+-------------------+----------+
        | 聯想  |      3 |   9486 |              3162 |     5499 |
        | 索尼  |      3 |  21736 | 7245.333333333333 |    11499 |
        | 海信  |      1 |   4199 |              4199 |     4199 |
        | 惠普  |      1 |   1169 |              1169 |     1169 |
        | 康佳  |      1 |   1999 |              1999 |     1999 |
        +-------+--------+--------+-------------------+----------+
        5 rows in set (0.00 sec)

         

      • 如果是2個欄位或者以上的分組,其實是在前一分組組內,在依據後一分組依據進行分組。

        mysql> select brand, origin, count(*) as counts from production group by brand,
        origin;
        +-------+--------+--------+
        | brand | origin | counts |
        +-------+--------+--------+
        | 康佳  | 深圳   |      1 |
        | 惠普  | 天津   |      1 |
        | 海信  | 青島   |      1 |
        | 索尼  | 北京   |      1 |
        | 索尼  | 天津   |      1 |
        | 索尼  | 深圳   |      1 |
        | 聯想  | 北京   |      3 |
        +-------+--------+--------+
        7 rows in set (0.00 sec)

         

 

    • having 子句
      • having 子句和where 子句概念相同,不同之處在於:
        • where 子句是以欄位為“判斷條件”
        • having 子句是以group by 後“組”資料為“判斷條件”
        • 既having 後 不能跟欄位,如:having priice >3000.但是可以跟“組”資料或者“組”資料別名,包含分組依據本身,如:having avg(price) > 3000。
    • oder by 子句
      • 形式:
        • oder by 欄位1 排序方式1, 欄位2 排序方式2, ...
      • 說明:
        • 是對前面資料(where 子句,from 子句, group by 子句, having 子句等)按照某個欄位進行大小排序,有
        • 2中排序方式:
          • 正序:ASC(預設值)
          • 倒敘:DESC
      • 多種方式排序指在前一排序的相同欄位內按照後一欄位大小在進行排序
        mysql> select name,origin,price from production order by origin,price desc;
        +-----------------------------------+--------+-------+
        | name                              | origin | price |
        +-----------------------------------+--------+-------+
        | 索尼(SONY)60英寸全高清液晶電視  | 北京   |  6999 |
        | 聯想(Lenovo)14.0英寸膝上型電腦  | 北京   |  5499 |
        | 聯想(Lenovo)12.0英寸膝上型電腦  | 北京   |  2999 |
        | 聯想 雙卡雙待3G手機               | 北京   |   988 |
        | 索尼(SONY)13.3英寸觸控超極本    | 天津   | 11499 |
        | 惠普(HP)黑白鐳射印表機          | 天津   |  1169 |
        | 索尼(SONY)4G手機(黑色)        | 深圳   |  3238 |
        | 康佳(KONKA)42英寸全高清液晶電視 | 深圳   |  1999 |
        | 海信(Hisense)55英寸智慧電視     | 青島   |  4199 |
        +-----------------------------------+--------+-------+
        9 rows in set (0.00 sec)
        
        mysql> select name,origin,price from production order by origin,price;
        +-----------------------------------+--------+-------+
        | name                              | origin | price |
        +-----------------------------------+--------+-------+
        | 聯想 雙卡雙待3G手機               | 北京   |   988 |
        | 聯想(Lenovo)12.0英寸膝上型電腦  | 北京   |  2999 |
        | 聯想(Lenovo)14.0英寸膝上型電腦  | 北京   |  5499 |
        | 索尼(SONY)60英寸全高清液晶電視  | 北京   |  6999 |
        | 惠普(HP)黑白鐳射印表機          | 天津   |  1169 |
        | 索尼(SONY)13.3英寸觸控超極本    | 天津   | 11499 |
        | 康佳(KONKA)42英寸全高清液晶電視 | 深圳   |  1999 |
        | 索尼(SONY)4G手機(黑色)        | 深圳   |  3238 |
        | 海信(Hisense)55英寸智慧電視     | 青島   |  4199 |
        +-----------------------------------+--------+-------+
        9 rows in set (0.00 sec)

         

    • limit 子句
      • 形式:
        • limit [起始行號]start, [要取出的行數]rows;
      • 說明:
        • 前面所取得的資料,對之取“區域性若干資料”。
        • 起始行號:start 第一行為0,預設值,省略則取預設值
        • 要取出的行數:如果資料記錄不足,則取出當前資料行
      • 此子句很常用。比如:網頁中很常見的需求---分頁
    • 實用示例:
      • delete-- 刪除指定行
      • limit-----分頁顯示
      • php程式碼:
        <?php
            /*定義表
            create table user_list(
                id int(10) not null primary key auto_increment,
                user_name varchar(30) not null,
                user_pass char(32) not null,
                user_age tinyint(1) unsigned,
                user_edu enum('小學', '初中', '高中' , '大專', '本科', '本科以上'),
                use_interest set('籃球', '足球', '跑步', '讀書', '畫畫', '旅遊'),
                user_nativePlac
            
            e enum('華北', '華中', '華南', '東北', '西北', '華東')
                );*/
            $conn = mysqli_connect("localhost", "root", "root", "test1"); 
            if (!$conn) 
            { 
                die("連線錯誤: " . mysqli_connect_error()); 
            } 
        
            if($_POST){
                
            
                $user_name = $_POST['user_name'];
                $user_pass = $_POST['user_pass'];
                $user_age = $_POST['user_age'];
                $user_edu = $_POST['user_edu'];//注意user_edu陣列
                $user_interest = $_POST['user_interest'];
                $user_nativePlace = $_POST['user_nativePlace'];
                
                if(empty($user_name)||empty($user_pass)){
                    $errMsg = "發生錯誤:使用者名稱/密碼不能為空!";
                }else {
                    //對愛好/$user_interest[]做求和出來
                    $user_interest_sum = array_sum($user_interest);
                    $sql_add = "insert into user_list(user_name, user_pass, user_age, user_edu, user_interest, user_nativePlace, reg_time)values";
                    $sql_add .= "('$user_name', '$user_pass', $user_age, $user_edu, $user_interest_sum, $user_nativePlace, now());";
                    echo $sql_add."<br />";
                    $result_add = mysqli_query($conn, $sql_add);
                    if($result_add){
                        $errMsg = "插入成功<hr />";
                    }else {
                        $errMsg = "插入失敗<hr />";
                    }
                }
            }else {
                    
            
        
                if(($_GET)){
                    if(!empty($_GET['ID'])){
                        $id = $_GET['ID'];
                        $sql_delrec = "select * from user_list where id = $id";
                        $sql_del = "delete from user_list where id = $id";
                        echo "<hr />";
                        $result_delrec = mysqli_query($conn, $sql_delrec);
                        echo "記錄:";
                        $out_del = mysqli_fetch_array($result_delrec);
                        echo $out_del['id']." ".$out_del['user_name']." ".$out_del['user_pass']." ".$out_del['user_age']." ".$out_del['user_edu']." ".$out_del['user_interest']." ".$out_del['user_nativePlace']." ".$out_del['reg_time']."<br />";
                        
                        $result_del = mysqli_query($conn, $sql_del);
                        if($result_del){
                            echo "刪除成功<hr />";
                        }else{
                            echo "刪除失敗<hr />";
                        }
                    }
                    if(!empty($_GET['page'])){
                        $page = $_GET['page'];
                    }else {
                        $page = 0;
                    }
                    
                }
                else {
                
            }
            }
        ?>
        
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
        <head>
            <meta http-equiv="Content-Type" content="text/html;charset=utf8" />
            <title>Apache、PHP、MySQL可執行測試</title>
            <meta name="keywords" content="關鍵字列表" />
            <meta name="description" content="網頁描述" />
            <link rel="stylesheet" type="text/css" href="" />
            <style type="text/css">
                .special {
                    color: red;
                }
        
                span {
                    font: 700 13px/13px "microsoft yahei";
                    margin-right: 5px;
                }
            </style>
            <script type="text/javascript"></script>
        </head>
        <body>
            <div>
            <?php
                if(!empty($errMsg)){
                    echo $errMsg;
                } 
            ?>
            </div>
            <form action="" method="post">
                <span>使用者名稱:</span><input type="text" name="user_name" /><br />
                <span>密碼&nbsp;&nbsp;:</span>   <input type="password" name="user_pass" /><br />
                <span>年齡&nbsp;&nbsp;:</span>   <input type="text" name="user_age" /><br />
                <span>學歷&nbsp;&nbsp;:</span>  <select name="user_edu" id="">
                            <option value="1">小學</option>
                            <option value="2">初中</option>
                            <option value="3">高中</option>
                            <option value="4">大專</option>
                            <option value="5">本科</option>
                            <option value="6">本科以上</option>
                        </select><br />
                <span>愛好&nbsp;&nbsp;:</span> 
                        <input type="checkbox" name="user_interest[]" value="1="/>籃球
                        <input type="checkbox" name="user_interest[]" value="2" />足球
                        <input type="checkbox" name="user_interest[]" value="4" />跑步
                        <input type="checkbox" name="user_interest[]" value="8" />讀書
                        <input type="checkbox" name="user_interest[]" value="16" />畫畫
                        <input type="checkbox" name="user_interest[]" value="32" />旅遊<br />
                <span>籍貫&nbsp;&nbsp;:</span>    <input type="radio" name="user_nativePlace" value="1" />華北
                        <input type="radio" name="user_nativePlace" value="2" />華中
                        <input type="radio" name="user_nativePlace" value="3" />華南
                        <input type="radio" name="user_nativePlace" value="4" />華西
                        <input type="radio" name="user_nativePlace" value="5" />東北
                        <input type="radio" name="user_nativePlace" value="6" />西北<br />
                <input type="submit" value="提交" /><br />    
            </form>
        
            <?php
                
                
                echo "<hr />";
                $pageRecords = 3;
                
                $start = $page*$pageRecords;
                $sql_dis ="select * from user_list limit $start,$pageRecords";
                $result_dis = mysqli_query($conn ,$sql_dis);
                $filename = $_SERVER['SCRIPT_NAME'];
                
                echo "<table border = 1 >";
                echo "<tr>";
                echo "<th>"."id"."</th>";
                echo "<th>"."user_name"."</th>";
                echo "<th>"."user_pass"."</th>";
                echo "<th>"."user_age"."</th>";
                echo "<th>"."user_edu"."</th>";
                echo "<th>"."user_interest"."</th>";
                echo "<th>"."user_nativePlace"."</th>";
                echo "<th>"."reg_time"."</th>";
                echo "<th>"."action"."</th>";
                echo "</tr>";
                
                
                while ($res = mysqli_fetch_array($result_dis)) {
                    echo "<tr>";
                    echo "<td>".$res['id']."</td>";
                    echo "<td>".$res['user_name']."</td>";
                    echo "<td>".$res['user_pass']."</td>";
                    echo "<td style='color:red;'>".$res['user_age']."</td>";
                    echo "<td>".$res['user_edu']."</td>";
                    echo "<td>".$res['user_interest']."</td>";
                    echo "<td>".$res['user_nativePlace']."</td>";
                    echo "<td>".$res['reg_time']."</td>";
                    echo "<td>";
                    echo "[<a href='$filename?ID={$res['id']}'>刪除</a>]";
                    echo "</td>";
                    echo "</tr>";
                }
                echo "</table><br />";
                
                for($i = 0; $i <=10; $i++){
                    echo "<a href='$filename?page=$i'>".($i+1)."</a>   ";
                }
                echo "<br />";
            ?>
        </body>
        </html>

         

      • 網頁效果:
        • 第一頁
        • 第二頁

連線查詢

子查詢

聯合查詢

---恢復內容結束---