php數據查詢之基礎查詢
阿新 • • 發佈:2018-10-31
筆記 ros 大小 max 邏輯運算 oct method 很多 單個
---恢復內容開始---
數據查詢語言(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)
- “數據源通常指“表”,也可以是“直接數據”或者函數返回結果。示例:
- select 從“數據源”中,找出(取出)數據。
-
-
- 也可以加字段(別)名:
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
- 不能使用“表”的字段而沒有from 子句
- [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)
- 指定數據的來源,其實就是“表”。可以是單個“表”,也可以是多個“表”,用逗號隔開。
- where 子句
- 相當於php或者js中的if語句-條件判斷語句,最終結果為布爾值(true/false)。
- 常用運算符
- 算術運算符:+ - * / %
- 比較運算符:
- > >= < <= =(等於) <>(不等於)-標準的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
- 布爾值(true/false):範圍,整數。實際就是tinyint(1)的數字,0為true,非零為false
- 常用語法
- 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個特殊的字符%、_
- %--代表任意多個任意字符
- ‘_‘代表單個的任意字符
- 要使用字符‘%‘和‘_‘,需要使用轉義字符‘\‘
- between 語法
- 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)
- 形式:group by 字段1 排序方式1, 字段2 排序方式 2 ...
-
-
- having 子句
- having 子句和where 子句概念相同,不同之處在於:
- where 子句是以字段為“判斷條件”
- having 子句是以group by 後“組”數據為“判斷條件”
- 既having 後 不能跟字段,如:having priice >3000.但是可以跟“組”數據或者“組”數據別名,包含分組依據本身,如:having avg(price) > 3000。
- having 子句和where 子句概念相同,不同之處在於:
- 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>密碼 :</span> <input type="password" name="user_pass" /><br /> <span>年齡 :</span> <input type="text" name="user_age" /><br /> <span>學歷 :</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>愛好 :</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>籍貫 :</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>
- 網頁效果:
- 第一頁
- 第二頁
- having 子句
連接查詢
子查詢
聯合查詢
---恢復內容結束---
php數據查詢之基礎查詢