本文內(nèi)容僅適用于1.7 及更高版本!
一、基本概念
演示一:
// 使用鏈?zhǔn)秸Z法生成 SQL 語句 $sql = $zbp->db->sql->get() ->select($zbp->table['Post']) ->where(array('=', 'log_ID', "1")) ->sql; // 執(zhí)行 SQL 語句并返回結(jié)果 $array = $zbp->db->Query($sql); print_r($array);
演示二:
// 鏈?zhǔn)阶x法中直接返回查詢結(jié)果 $array = $zbp->db->sql->get() ->select($zbp->table['Comment']) ->count(array('comm_ID'=>'num')) ->query; print_r($array);
演示三:
對(duì)于以下方法或函數(shù),其$select或者$sql參數(shù)均可以代入「sql 鏈?zhǔn)綄?duì)象」:
$zbp->GetPostList()、$zbp->GetCommentList()、$zbp->GetTagList()等,其第一個(gè)參數(shù)為$select; $zbp->GetListType()、$zbp->GetListOrigin(); #先定義一個(gè)sql鏈對(duì)象,再獲取結(jié)果 $posts = $zbp->GetPostList( $zbp->db->sql->get()->select($zbp->table['Post'])->where('=','log_CateID',1) );
二、SQL SELECT
1、使用 select 指令
// 取category表所有的數(shù)據(jù) $sql = $zbp->db->sql->get()->select($zbp->table['Category'])->sql; $array = $zbp->GetListType('Category', $sql); // 遍歷數(shù)據(jù)輸出等 foreach ($array as $a) { ... }
SQL 語句輸出:
SELECT * FROM zbp_category
2、使用selectany和from指令組合
//取category表的ID字段數(shù)組 $sql = $zbp->db->sql->get()->selectany('cate_ID')->from($zbp->table['Category'])->sql; $array = $zbp->db->query($sql);
SQL 語句輸出:
SELECT cate_ID FROM zbp_category
三、SQL WHERE子句
取 ID 為 1 的文章
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('=', 'log_ID', "1")) ->sql; $articles = GetListType('Post', $sql); // where(array('=', 'log_ID', "1")) = 可以換成<>,LIKE,>=,<= 等等
SQL 語句輸出:
SELECT * FROM zbp_post WHERE log_ID = '1'
重要:如果非要在where中拼接字符串請(qǐng)一定用addslashes轉(zhuǎn)義單引號(hào):
where('?log_Title LIKE \'%' . addslashes('字符串') . '%\'')
四、AND 運(yùn)算符
連續(xù)調(diào)用where()方法即可實(shí)現(xiàn)AND查詢:
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('=', 'log_Status', "1")) ->where(array('=', 'log_Type', "0")) ->sql; $articles = GetListType('Post', $sql);
SELECT * FROM zbp_post WHERE log_Status = '1' AND log_Type = '0'
// where 還可以先定義一個(gè)數(shù)組 $w = array(); $w[] = array('=', 'log_Type' ,'0'); $w[] = array('=', 'log_AuthorID' ,'1'); $w[] = array('=', 'log_CateID' ,'2'); // 作為參數(shù)使用 ->where($w)
五、OR 運(yùn)算符
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where( array('or', array( array('log_ID', '1'), array('log_Title', '2'), ), ) ) ->sql; // 注意,此處的條件也可以寫為->where('or',array('=', 'log_ID', '1'),array('=', 'log_Title', '2'))
SELECT * FROM zbp_post WHERE ((1 = 1) AND ( log_ID = '1' OR log_Title = '2' ) )
非缺省操作符:
// 缺省操作符為 = ,也可使用其他操作符 $sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where( array('or', array( array('<>', 'log_ID', '1'), array('LIKE', 'log_Title', '2'), ), ) ) ->sql;
SELECT * FROM zbp_post WHERE ((1 = 1) AND ( log_ID <> '1' OR log_Title LIKE '2' ) )
六、LIKE 操作符
一般用于搜索中,search和like的區(qū)別就是search會(huì)自動(dòng)在字符兩邊加上%
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('search', 'log_Title', "Test")) ->sql;
SELECT * FROM zbp_post WHERE ((1 = 1) AND ( (log_Title LIKE '%Test%') ) )
七、IN 操作符
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('IN', 'log_ID', array(1, 2, 3, 4))) ->sql
SELECT * FROM zbp_post WHERE ((1 = 1) AND (log_ID IN ( '1' , '2' , '3' , '4' ) ) )
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('NOT IN', 'log_ID', '(1, 2, 3)')) ->sql
SELECT * FROM zbp_post WHERE (log_ID NOT IN (1, 2, 3))
八、BETWEEN操作符
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('between', 'log_ID', "1", "3")) ->sql
SELECT * FROM zbp_post WHERE (log_ID BETWEEN '1' AND '3')
九、EXISTS和NOT EXISTS操作符
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('exists', 'SELECT 1')) ->sql;
SELECT * FROM zbp_post WHERE EXISTS ( SELECT 1 )
十、SQL通配符
可用通配符:%、_、[charlist]、[^charlist]、[!charlist]
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->where(array('like', 'log_Title', "_aidu")) ->sql;
SELECT * FROM zbp_post WHERE ((1 = 1) AND ( (log_Title LIKE '_aidu') ) )
十一、SELECT LIMIT
如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目,LIMIT n 等價(jià)于 LIMIT 0,n。
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->limit(5) ->sql;
SELECT * FROM zbp_post LIMIT 5 // 等于 SELECT * FROM zbp_post LIMIT 5 OFFSET 0
檢索記錄行從第 6 行開始,返回最多 10 行
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->limit(5, 10) ->sql;
SELECT * FROM zbp_post LIMIT 10 OFFSET 5
十二、SELECT DISTINCT
關(guān)鍵詞 DISTINCT 用于返回唯一不同的值。
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->distinct(array('log_Title'=>'t'), 'log_ID') ->sql;
SELECT DISTINCT log_Title AS t,log_ID FROM zbp_post
十三、SQL ORDER BY
ORDER BY 語句用于根據(jù)指定的列對(duì)結(jié)果集進(jìn)行排序。ORDER BY 語句默認(rèn)按照升序?qū)τ涗涍M(jìn)行排序:
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->orderBy(array('log_PostTime' => 'desc'), array('log_ID' => 'asc')) ->sql;
SELECT * FROM zbp_post ORDER BY log_PostTime DESC, log_ID ASC
十四、SQL GROUP BY
取出每一個(gè)作者的所有文章的總評(píng)論數(shù):
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->sum('log_CommNums') ->groupBy('log_AuthorID') ->sql;
SELECT SUM(log_CommNums) FROM zbp_post GROUP BY log_AuthorID
十五、SQL HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 關(guān)鍵字無法與合計(jì)函數(shù)一起使用;
以下示例為取出分類下文章評(píng)論總數(shù)大于 100 的所有的分類:
$sql = $zbp->db->sql->get()->select($zbp->table['Post']) ->column('log_CateID') ->column('SUM(log_CommNums)') ->groupby('log_CateID') ->having(array('>', 'SUM(log_CommNums)', '100')) ->sql;
SELECT log_CateID,SUM(log_CommNums) FROM zbp_post GROUP BY log_CateID HAVING SUM(log_CommNums) > 100
十六、SQL JOIN連接
(LEFT JOIN RIGHT JOIN,FULL JOIN,INNER JOIN)
$sql = $zbp->db->sql->get()->selectany('log_ID') ->from(array($zbp->table['Post']=>'p')) ->leftjoin(array('zbp_postrelation'=>'pr')) ->on('p.log_ID = pr.pr_PostID') ->where('1 = 1') ->sql; // 這里只舉例了 LEFT JOIN 聯(lián)表查詢,還分別給 2 個(gè)表分別設(shè)了別名
SELECT log_ID FROM zbp_post AS p LEFT JOIN zbp_postrelation AS pr ON p.log_ID = pr.pr_PostID WHERE 1 = 1
// 如果要在 Mysql 下使用 STRAIGHT_JOIN,請(qǐng)?jiān)阪準(zhǔn)?sql 加入 option 參數(shù), ->option(array('straight_join' => true))
十七、UNION, UNION ALL操作符
當(dāng)使用 UNION 時(shí),MySQL 會(huì)把結(jié)果集中重復(fù)的記錄刪掉,而使用 UNION ALL ,MySQL 會(huì)把所有的記錄返回,且效率高于 UNION。
$sql = $zbp->db->sql->get()->union( $zbp->db->sql->get()->select('zbp_table')->sql, $zbp->db->sql->get()->select('zbp_table2')->sql ) ->sql;
SELECT * FROM zbp_table UNION SELECT * FROM zbp_table2
十八、SQL 別名
這是一個(gè)使用表別名和字段別名的例子:
$sql = $zbp->db->sql->get()->select(array($zbp->table['Post']=>'p')) ->column(array('log_ID'=>'id')) ->column('log_Type AS type') ->sql;
SELECT log_ID AS id,log_Type AS type FROM zbp_post AS p
更多Z-BlogPHP SQL鏈?zhǔn)讲僮骺蓞㈤啠骸?a href="http://kktzf.com.cn/23734.html">Z-BlogPHP SQL(二)》