ThinkPHP--SQL 查询语句
一.查询方式
件查询。在大多数情况下,推荐使用索引数组和对象方式作为查询条件,因为会更加安全
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 推荐使用数组形式更加高效。
二.表达式查询
达式查询方式。
查询表达式格式:$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 为id<>1
//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<1
//ELT:小于等于(<=)
$map["id"] = array("elt", 1); //where 为id<=1
//[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` ="蜡笔小新") )
三.快捷查询
隔开表示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());
四.区间查询
//区间查询
$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());
五.组合查询
合查询(_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 可以构建实现。
六.统计查询
//数据总条数
$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"));
七.动态查询
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 查询
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:由于子查询用了不少连贯操作,我们会在连贯操作讲解。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。