Z-BlogPHP SQL(一)

本文内容仅适用于1.7 及更高版本!

一、基本概念

演示一:

// 使用链式语法生成 SQL 语句
$sql = $zbp->db->sql->get()
->select($zbp->table['Post'])
->where(array('=', 'log_ID', "1"))
->sql;
// 执行 SQL 语句并返回结果
$array = $zbp->db->Query($sql);
print_r($array);

演示二:

// 链式读法中直接返回查询结果
$array = $zbp->db->sql->get()
->select($zbp->table['Comment'])
->count(array('comm_ID'=>'num'))
->query;
print_r($array);

演示三:

对于以下方法或函数,其$select或者$sql参数均可以代入「sql 链式对象」:

$zbp->GetPostList()、$zbp->GetCommentList()、$zbp->GetTagList()等,其第一个参数为$select;
$zbp->GetListType()、$zbp->GetListOrigin();
#先定义一个sql链对象,再获取结果
$posts = $zbp->GetPostList(
$zbp->db->sql->get()->select($zbp->table['Post'])->where('=','log_CateID',1)
);

二、SQL SELECT

1、使用 select 指令

// 取category表所有的数据
$sql = $zbp->db->sql->get()->select($zbp->table['Category'])->sql;
$array = $zbp->GetListType('Category', $sql);
// 遍历数据输出等
foreach ($array as $a) {
...
}

SQL 语句输出:

SELECT * FROM zbp_category

2、使用selectany和from指令组合

//取category表的ID字段数组
$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中拼接字符串请一定用addslashes转义单引号:

where('​log_Title LIKE \'%' . addslashes('字符串') . '%\'')

四、AND 运算符

连续调用where()方法即可实现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 还可以先定义一个数组
$w = array();
$w[] = array('=', 'log_Type' ,'0');
$w[] = array('=', 'log_AuthorID' ,'1');
$w[] = array('=', 'log_CateID' ,'2');
// 作为参数使用
->where($w)

五、OR 运算符

$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的区别就是search会自动在字符两边加上%

$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

如果只给定一个参数,它表示返回最大的记录行数目,LIMIT n 等价于 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

关键词 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 语句用于根据指定的列对结果集进行排序。ORDER BY 语句默认按照升序对记录进行排序:

$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

取出每一个作者的所有文章的总评论数:

$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 关键字无法与合计函数一起使用;

以下示例为取出分类下文章评论总数大于 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 联表查询,还分别给 2 个表分别设了别名
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,请在链式 sql 加入 option 参数,
->option(array('straight_join' => true))

十七、UNION, UNION ALL操作符

当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 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 别名

这是一个使用表别名和字段别名的例子:

$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链式操作可参阅:《Z-BlogPHP SQL(二)

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录