首先,先談一下對查詢的理解:查詢的對象是數據庫中的數據表,一個或多個;查詢的限制就是各種條件或要求;查詢的結果=表對象+限制(條件)。
對數據表的操作(CRUD)查詢是最復雜也是最關鍵的一步!'SELECT * FROM WHERE [condition]',WHERE是對基本的限制條件。
對象即數據庫中數據表是不用變化的,需要變化的是查詢的條件。
條件的形式
1.基本形式----字符串形式。萬能形式,查詢不安全(不會自動添加安全符號``),就相當於在前邊的sql語句上連綴后邊的條件。
1 $user = M('User'); 2 //字符串的查詢條件 3 $where_str = '`this is a string`'; 4 //顯示測試結果 5 $result = $user -> where($where_str) -> select(); 6 var_dump($result);
結果:
可見就是在WHERE之后的條件中寫入該字符串,也就該形式可以實現所有的WHERE關鍵字的SQL查詢。
例如:
1 $user = M('User'); 2 //字符串的查詢條件 3 $where_str = 'id=1'; 4 //顯示測試結果 5 $result = $user -> where($where_str) -> select(); 6 var_dump($result);
結果:
2.數組形式條件。還是針對WHERE查詢,就是把WHERE查詢的條件分開,例如id=1條件,分成 id 和 1兩部分,寫入數組id做鍵,1做值,另外寫入控制符。
數組是比較推薦的形式,這里是數組形式,值是字符串或整型或浮點
例子:
1 $user = M('User'); 2 //數組形式的條件 3 $condition['id'] = array(1); 4 //顯示測試結果 5 $result = $user -> where($condition) -> select(); 6 var_dump($result);
結果:
示例
3.對象形式的條件。和數組很像,只是更換了數據的載體為對象(stdClass空對象,PHP程序提供)
4.表達式查詢。實際就是來更改條件中運算符的。根據運算符的不同可能有不同的結構,這種形式相對靈活,可以寫出很復雜的SQL查詢語句,不行不是還有一個自定義嗎。
基本結構: 查詢表達式格式:$map['字段名'] = array('表達式','查詢條件');---數組形式,值是數組.查詢條件可以是數組,只是對有的表達式沒有作用,比如EQ
LIKE/NOTLIKE
BETWEEN/NOT BETWEEN
1 $user = M('User'); 2 //表達式形式 3 // $map['id'] = array('BETWEEN','1,10');這兩種形式一樣 4 $map['id'] = array('BETWEEN',array(1,10)); 5 6 $result = $user -> where($map) -> select(); 7 var_dump($result);
IN/NOTIN-----IN是IN,BETWEEN是BETWEEN!
$user = M('User'); //表達式形式 $map['id'] = array('BETWEEN','1,10'); // $map['id'] = array('IN',array(1,6));這兩種形式一樣 $result = $user -> where($map) -> select(); var_dump($result);
自定義形式:有點像連綴
還有幾種其他的形式,多寫,找到合適簡便就可以了
快捷方式 | &
等價效果:
1 $user = M('User'); 2 //快捷方式 3 $map['id&user'] = 1; 4 // 等價於 5 // $map['id'] = 1; 6 // $map['user'] = 1; 7 // $map['_logic'] = 'AND'; 8 // 或等價於 9 // $condition = 'id=1 AND user=1'; 10 $result = $user -> where($map) -> select(); 11 var_dump($result);
和表達式結合:
1 $user = M('User'); 2 //快捷方式 3 $map['id&user'] = array(array('NEQ',1),array('EQ',1),'_multi'=>true); 4 $result = $user -> where($map) -> select(); 5 var_dump($result);
結果:
SELECT * FROM `think_user` WHERE ( (`id` <> 1) AND (`user` = 1) ) [ RunTime:0.001000s ]感覺這是最好的
還有,不一定是連個字段,可以是3個或多個字段
再:
$map['_string'] = '';連綴字符串,可以連接到其他條件上
$map['query'] = '';URL模式,比較方便
$map['_complex'] = '';被覆蓋的時候使用
1 $user = M('User'); 2 //組合查詢 3 /* $map['id'] = 1; 4 $map['_string'] = 'user=1 AND email like 3';繼續連接字符串形式的條件 5 */ 6 /* $map['id'] = 1; 7 $map['_query'] = 'user=1&email=2';//貌似運算符只能是= 8 */ 9 /* $where['id'] = 1; 10 $map['id'] = 1; 11 $map['_complex'] = $where; 12 $map['_logic'] = 'OR'; 13 */ 14 $result = $user -> where($map) -> select(); 15 var_dump($result);
統計查詢:$user->count();
動態查詢: getById() getFieldByUser();
SQL原生
query();讀
excute();寫