zblog1.7新版链式SQL操作教程
SQL SELECT
第1种写法 使用select指令
//取category表所有的数据
$sql = $zbp->db->sql->get()->select('zbp_category')->sql;
$array = $zbp->db->Query($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_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_post")
->where(array('=', 'log_ID', "1"))
->sql;$articles = GetListType('Post', $sql);$article = $articles[0];
// where(array('=', 'log_ID', "1")) = 可以换成<>,LIKE,>=,<= 等等#如果非要在where中拼接字符串请一定用addslashes转义单引号,比如where('log_Title LIKE \'%' . addslashes('字符串') . '%\'')$sql生成数据
SELECT * FROM zbp_post WHERE log_ID = '1'
AND 运算符
用AND选择2个条件,有更多的条件就继续增加where
$sql = $zbp->db->sql->get()->select("zbp_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');
#数组$w再代入->where($w)OR 运算符
$sql = $zbp->db->sql->get()->select("zbp_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' ) )其它的几种OR类型
#自定义操作符的,like的,可以和写where条件一样
$sql = $zbp->db->sql->get()->select("zbp_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_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_post")
->where(array('IN', 'log_ID', array(1, 2, 3, 4)))
->sqlSELECT * FROM zbp_post WHERE ((1 = 1) AND (log_ID IN ( '1' , '2' , '3' , '4' ) ) )
$sql = $zbp->db->sql->get()->select("zbp_post")
->where(array('NOT IN', 'log_ID', '(1, 2, 3)'))
->sqlSELECT * FROM zbp_post WHERE (log_ID NOT IN (1, 2, 3))
BETWEEN 操作符
$sql = $zbp->db->sql->get()->select("zbp_post")
->where(array('between', 'log_ID', "1", "3"))
->sqlSELECT * FROM zbp_post WHERE (log_ID BETWEEN '1' AND '3')
EXISTS和NOT EXISTS 操作符
$sql = $zbp->db->sql->get()->select("zbp_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_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_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_post')
->limit(5,10)
->sql;SELECT * FROM zbp_post LIMIT 10 OFFSET 5
SELECT DISTINCT
关键词 DISTINCT 用于返回唯一不同的值。
$sql = $zbp->db->sql->get()->select('zbp_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_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_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_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_post'=>'p'))
->leftjoin(array('zbp_postrelation'=>'pr'))
->on('p.log_ID = pr.pr_PostID')
->where('1 = 1')
->sql;
#这里只举例了LEFTJOIN联表查询,还分别给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_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
USEINDEX FORCEINDEX IGNOREINDEX
本指令是mysql专用的,分别是使用索引,强制使用索引,跳过索引
$sql = $zbp->db->sql->get()->select('zbp_post')
->useindex('zbp_log_TPISC', 'zbp_log_VTSC')
->sql;SELECT * FROM zbp_post USE INDEX ( zbp_log_TPISC ,zbp_log_VTSC )
SQL INSERT INTO 语句
$sql = $zbp->db->sql->get()->insert('zbp_post')
->data(array('log_Title' => 'test','log_Type' => '0'))
->sql;INSERT INTO zbp_post (log_Title,log_Type) VALUES ( 'test' , '0' )
SQL UPDATE 语句
$sql = $zbp->db->sql->get()->update('zbp_post')
->where('=', 'log_ID', 1)
->data(array('log_Title' => 'test','log_Type' => '1'))
->sql;UPDATE zbp_post SET log_Title = 'test', log_Type = '1' WHERE log_ID = '1'
SQL DELETE 语句
$sql = $zbp->db->sql->get()->delete('zbp_post')
->where('=', 'log_ID', 1)
->sql;DELETE FROM zbp_post WHERE log_ID = '1'
CREATE 数据库,表,索引
CREATE DATABASE
可以在mysql和pgsql下创建数据库:
$sql = $zbp->db->sql->get()->create()->database('zbp')->ifnotexists()->sql;CREATE DATABASE IF NOT EXISTS zbp
CREATE TABLE
这里的例子只是sql链用法的展示,实际上我们已经把sql链的方法包装好了,用$zbp→db→CreateTable方法会更便捷。 创建一个表,先定义数据结构:
$tableData = array(
'a' => array('a', 'integer', '', 0, '主ID'),
'i' => array('i', 'boolean', '', false),
'k' => array('k', 'string', 250, ''),
'o' => array('o', 'string', 'longtext', '', '备注为某字段'),
'r' => array('r', 'float', '', ''),);$sql = $zbp->db->sql->get()->create('zbp_table')
->data($tableData)
->option(array('engine' => 'InnoDB'))
->option(array('charset' => 'utf8mb4'))
->option(array('collate' => 'utf8mb4_general_ci'))
->sql;$zbp->db->query($sql); echo $sql;生成的$sql值为:CREATE TABLE IF NOT EXISTS zbp_table ( a INT(11) NOT NULL AUTO_INCREMENT COMMENT '主ID', i tinyint(1) NOT NULL DEFAULT '0', k VARCHAR(250) NOT NULL DEFAULT '', o longtext NOT NULL COMMENT '备注为某字段', r FLOAT NOT NULL DEFAULT 0, PRIMARY KEY (a) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1 ;备注:可以指定表的引擎和字符集,如果不指定则从option文件读取系统的配置
CREATE INDEX
$sql = $zbp->db->sql->get()->create('zbp_post')
->index(
array('zbp_post_index_stt'=>array('log_Status','log_Type','log_Tag'))
)
->sql;CREATE INDEX zbp_post_index_stt ON zbp_post ( log_Status , log_Type , log_Tag )
DROP 数据库,表,索引
DROP DATABASE
$sql = $zbp->db->sql->get()->drop()->database('zbp')->sql;DROP DATABASE zbp
DROP TABLE
$sql = $zbp->db->sql->get()->drop()->table('zbp_table2')->ifexists()->sql;DROP TABLE IF EXISTS zbp_table2
DROP INDEX
$sql = $zbp->db->sql->get()->drop('zbp_table')->index('zbp_table_id')->sql;DROP INDEX zbp_table_id ON zbp_table
ALTER 修改 添加 字段
添加字段
$sql = $zbp->db->sql->get()->ALTER("zbp_post")->ADDCOLUMN('log_IsHide integer NOT NULL DEFAULT \'0\'')->ADDCOLUMN('log_CreateTime', 'integer NOT NULL DEFAULT \'0\'')->ADDCOLUMN('log_Note', 'text', 'NOT NULL')->sql;#ADDCOLUMN内的参数可以写成一个,也可以写成多个ALTER TABLE zbp_post ADD COLUMN log_IsHide INTEGER NOT NULL DEFAULT '0' ,ADD COLUMN log_CreateTime INTEGER NOT NULL DEFAULT '0' ,ADD COLUMN log_Note text NOT NULL
修改字段
只有mysql和pgsql支持,sqlite不能修改字段
$sql = $zbp->db->sql->get()->ALTER("zbp_post")->ALTERCOLUMN('log_IsHide INTEGER NOT NULL DEFAULT \'0\'')->sql;#mysql生成ALTER TABLE zbp_post MODIFY log_IsHide INTEGER NOT NULL DEFAULT '0'#pgsql生成ALTER TABLE zbp_post ALTER COLUMN log_IsHide INTEGER NOT NULL DEFAULT '0'
删除字段
$sql = $zbp->db->sql->get()->ALTER("zbp_post")->DROPCOLUMN('log_IsHide')->DROPCOLUMN('log_CreateTime')->DROPCOLUMN('log_Note')->sql;ALTER TABLE zbp_post DROP COLUMN log_IsHide ,DROP COLUMN log_CreateTime ,DROP COLUMN log_Note
SQL 统计函数 AVG,COUNT,MIN,MAX,SUM
在这里我们仅以COUNT做为例子,取出每一个作者的文章总数并分组显示:
$sql = $zbp->db->sql->get()->select('zbp_post')
->column('log_AuthorID')
->count('log_ID')
->where(array('=', 'log_Type' ,'0'))
->groupBy('log_AuthorID')
->sql;SELECT log_AuthorID, COUNT(log_ID) FROM zbp_post WHERE log_Type = '0' GROUP BY log_AuthorID
SQL 随机取记录
1.7里新增了随机读取的功能,同时支持三种数据库
这里举例随机取5篇文章:
$sql = $zbp->db->sql->get()->select("zbp_post")
->where('=','log_Type',0)
->random(5)
->sql;--mysql生成的sqlSELECT * FROM zbp_post WHERE log_Type = '0' AND log_ID >= (SELECT FLOOR( RAND() * ((SELECT MAX(log_ID) FROM `zbp_post`)-(SELECT MIN(log_ID) FROM `zbp_post`)) + (SELECT MIN(log_ID) FROM `zbp_post`))) LIMIT 5 --pgsql和sqlite生成的sqlSELECT * FROM zbp_post WHERE log_Type = '0' ORDER BY Random() LIMIT 5使用GetList函数随机获取文章的方法,在第7个参数中加上'random'⇒获取数量
GetList(null,null,null,null,null,null,array('random'=>5)); //1.7以更高版本的GetList加以改进了GetList(array('random'=>4,'cate'=>1)); //获取分类1下的随机4篇文章SQL 事务处理
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
#开始一个事务$zbp->db->sql->get()->transaction('begin')->query;#中间sql处理#提交事务$zbp->db->sql->get()->transaction('commit')->query;BEGIN; COMMIT;



发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。