一.查詢方式
ThinkPHP 提供了三種基本的查詢方式:字串條件查詢、索引陣列條件查詢和物件條
件查詢。在大多數情況下,建議使用索引數組和物件方式作為查詢條件,因為會更加安全
1.使用字串作為條件查詢
//字串作為條件查詢
$user = M('User');
var_dump($user->where('id=1 AND user="蠟筆小新"')->select());
//最終產生的SQL 語句
SELECT * FROM `think_user` WHERE ( id=1 AND user="蠟筆小新" )
PS:where 查詢方法裡面只要包含條件即可,多個條件加上AND 等連接符即可。我們會
在SQL 連貫操作詳細學習。
2.使用索引數組作為查詢條件
//索引數組作為條件查詢
$user = M('User');
$condition['id'] = 1;
$condition['user'] = '蠟筆小新';
var_dump($user->where($condition)->select());
//最終產生的SQL 語句
SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user ` = '蠟筆小
新' )
PS:索引數組查詢的預設邏輯關係是AND,如果想改變為OR,可以使用_logic 定義查
詢邏輯。
基於上面的程式碼增加如下一行:
$condition['_logic'] = 'OR'; //將預設AND 改成OR
3.使用物件方式來查詢
//物件作為條件查詢
$user = M ('User');
$condition = new stdClass();
$condition->id = 1;
$condition->user = '蠟筆小新';
var_dump($user->where($condition)- >select());
//最終產生的SQL 語句
SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = '蠟筆小
新' )
PS:stdClass 類別是PHP 內建的類,可以理解為一個空類,在這裡可以理解為把條件的
字段作為成員保存到stdClass 類別裡。而這裡的''是將命名空間設為根目錄,否則會導
致當前目錄找不到此類。使用物件和陣列查詢,效果是一樣的,可以互換。在大多數情況下,
ThinkPHP 建議使用陣列形式更有效率。
二.表達式查詢
對於那些要實現模糊判斷的查詢,例如大於、等於、小於之類的SQL查詢,可以使用表
達式查詢方式。
查詢表達式格式:$map['欄位名稱'] = array('表達式','查詢條件');
表達式查詢表
表達式意義
EQ 等於(=)
NEQ 不等於( )
GT 大於(>)
EGT 大於等於(>=)
LT 小於(ELT 小於等於([NOT]LIKE 模糊查詢
[NOT] BETWEEN (不在)區間查詢
[NOT] IN (不在)IN查詢
EXP 表達式查詢,支援SQL語法
PS:表達式不區分大小寫。
//EQ:等於(=)
$map['id'] = array('eq', 1); //where 為id=1
//NEQ:不等於()
$map[' id'] = array('neq', 1); //where 為id1
//GT:大於(>)
$map['id'] = array('gt', 1); // where 為id>1
//EGT:大於等於(>=)
$map['id'] = array('egt', 1); //where 為id>=1
//LT:小於($map['id'] = array('lt', 1); //where 為id//ELT:小於等於($map['id'] = array('elt ', 1); //where 為id//[NOT]LIKE:模糊查詢
$map['user'] = array('like', '%小%'); //where 為like %小%
//[NOT]LIKE:模糊查詢
$map['user'] = array('notlike', '%小%'); //where 為not like %小%
//[NOT] LIKE:模糊查詢的陣列方式
$map['user'] = array('like', array('%小%', '%蠟%'), 'AND');
//產生的SQL
SELECT * FROM `think_user` WHERE ( (`user` LIKE '%小%' AND `user`
LIKE '%蠟%') )
//[NOT] BETWEEN:區間查詢
$map['id'] = array ('between','1,3');
//where 為`id` BETWEEN '1' AND '2'
//同上等效
$map['id'] = array('between',array ('1','3'));
//[NOT] BETWEEN:區間查詢
$map['id'] = array('not between','1,3');
//where 為` id` NOT BETWEEN '1' AND '2'
//[NOT] IN:區間查詢
$map['id'] = array('in','1,2,4');
//where 為`id` IN ('1','2','4')
//[NOT] IN:區間查詢
$map['id'] = array('not in','1,2,4' );
//where 為`id` NOT IN ('1','2','4')
//EXP:自訂
$map['id'] = array('exp','in ( 1,2,4)');
//where 為`id` NOT IN ('1','2','4')
PS:使用exp 自訂在第二個參數直接寫where 語句即可
//EXP:自訂增加OR 語句
$map['id'] = array('exp', '=1');
$map['user'] = array('exp', '="蠟筆小新"');
$map['_logic'] = 'OR';
//WHERE 為( (`id` =1) ) OR ( (`user` ="蠟筆小新") )
三.快速查詢
快捷查詢方式是一種多字段查詢的簡化寫法,在多個字段之間用'|'隔開表示OR,用'&'
隔開表示AND。
1.不同欄位相同查詢條件
//使用相同查詢條件
$user = M('User');
$map['user|eemail'] = 'a'; //'|'換成'& '變成AND
var_dump($user->where($map)->select());
2.不同欄位不同查詢條件
//使用不同查詢條件
$user = M('User');
$map['id&user'] = array(1,'蠟筆小新','_multi'=>true);
var_dump($user->where($map)->select());
PS:設定' _multi'為true,是為了讓id 對應1,讓user 對應'蠟筆小新',否則就
會出現id 對應了1 還要對應'蠟筆小新'的情況。而且,這設定要放在數組最後。
//支援使用表達式結合快速查詢
$user = M('User');
$map['id&user'] = array(array('gt', 0),'蠟筆小新','_multi' =>true);
var_dump($user->where($map)->select());
四.區間查詢
ThinkPHP 支援某個欄位的區間查詢。
//區間查詢
$user = M('User');
$map['id'] = array(array('gt', 1), array('lt', 4));
var_dump($ user->where($map)->select());
//第三個參數設定邏輯OR
$user = M('User');
$map['id'] = array(array(' gt', 1), array('lt', 4), 'OR');
var_dump($user->where($map)->select());
五.組合查詢
組合查詢是基於索引數組查詢方式的一個擴展性查詢,添加了字串查詢(_string)、複
合查詢(_complex)、請求字串查詢(_query),由於採用的是索引數組,重複的會被覆蓋。
//字串查詢(_string)
$user = M('User');
$map['id'] = array('eq', 1);
$map['_string'] ='user= "蠟筆小新" AND email="xiaoxin@163.com"';
var_dump($user->where($map)->select());
//請求字串查詢(_query)
$user = M('User');
$map['id'] = array('eq', 1);
$map['_query'] ='user=蠟筆小新&email=xiaoxin@163.com&_logic=OR' ;
var_dump($user->where($map)->select());
PS:這種方式是URL 方式,不需要加引號。
//複合查詢(_complex)
$user = M('User');
$where['user'] = array('like', '%小%');
$where['id'] = 1;
$where['_logic'] = 'OR';
$map['_complex'] = $where;
$map['id'] = 3;
$map['_logic'] = 'OR' ;
var_dump($user->where($map)->select());
PS:複合查詢可以建構更複雜的查詢,這裡id=1 或id=3 可以建構實作。
六.統計查詢
ThinkPHP 提供了一些資料統計查詢的方法。
//資料總條數
$user = M('User');
var_dump($user->count());
//欄位總條數,遇到NULL不統計
$user = M(' User');
var_dump($user->count('email'));
//最大值
$user = M('User');
var_dump($user->max('id'));
//最小值
$user = M('User');
var_dump($user->min('id'));
//平均值
$user = M('User');
var_dump( $user->avg('id'));
//求總和
$user = M('User');
var_dump($user->sum('id'));
七.動態查詢
借助PHP5 語言的特性,ThinkPHP 實作了動態查詢。
1.getBy 動態查詢
//查找email=xiaoin@163.com的資料
$user = M('User');
var_dump($user->getByemail('xiaoxin@163.com'));
2.getFieldBy 動態查詢
//透過user得到相對應id值
$user = M('User');
var_dump($user->getFieldByUser('路飛', 'id'));
八. SQL 查詢
ThinkPHP 支援原生SQL 查詢。
1.query 讀取
//查詢結果集,如果採用分散式讀寫分離,則始終在讀取伺服器執行
$user = M('User');
var_dump($user->query('SELECT * FROM think_user'));
2.execute寫入
//更新和寫入,如果採用分散式讀寫分離,則始終在寫入伺服器執行
$user = M('User');
var_dump($user- >execute('UPDATE think_user set user="蠟筆大新" WHERE
id=1'));
PS:由於子查詢用了不少連貫操作,我們會在連貫操作講解。
以上就介紹了ThinkPHP--SQL 查詢語句,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。