本学习课程以学习为目的一周三篇持续更新,学习代码更新在码云公开仓库,不足之处欢迎朋友们前来指导,写作不易请多多支持,本人创作新手写的不好,不喜勿喷,谢谢大家。
学习目标
- 按时间查询
- 快捷查询
- 年月日时间查询
- 其他查询
- 聚合查询
- 子查询
- 原生查询
一.按时间查询
码云提交编号:2657ce26949de3340ad4f0242b2c352c9868f322
- 正常情况下我们可以使用>、<、>=、<=来筛选匹配时间的数据
public function time(){ $data0 = Db::name('user')->where('create_time', '>', '2022-3-23')->select(); $data1 = Db::name('user')->where('create_time', '<', '2022-3-23')->select(); $data2 = Db::name('user')->where('create_time', '>=', '2022-3-23')->select(); $data3 = Db::name('user')->where('create_time', '>=', '2022-3-23')->select(); return json($data3); }
- 也可以使用 between 关键字来设置时间的区间
$data = Db::name('user')->where('create_time', 'between', ['2022-3-23', '2022-3-24'])->select(); return json($data);
-
也可以在 between 前加 not 关键字来设置时间的区间的反向查询
$data = Db::name('user')->where('create_time', 'not between', ['2022-3-23', '2022-3-24'])->select(); return json($data);
二.快捷查询
- 时间查询的快捷方法为 whereTime(),直接使用>、<、>=、<=,个人觉得和上面的查询方式区别不大,但是这样写会更加有语义,默认的大于>,可以省略
$data = Db::name('user')->whereTime('create_time', '>', '2022-3-23')->select(); return json($data);
- 快捷方式也可以使用 between 和 not between
$data = Db::name('user')->whereBetween('create_time', ['2022-3-23', '2022-3-24'])->select(); $data = Db::name('user')->whereNotBetween('create_time', ['2022-3-23', '2022-3-24'])->select(); return json($data);
- 还有一种快捷方式为:whereBetweenTime()和 whereNotBetweenTime()
三.年月日时间查询
- 使用 whereYear 查询今年的数据、去年的数据和某一年的数据
$data = Db::name('user')->whereYear('create_time')->select();//今年 $data = Db::name('user')->whereYear('create_time', 'last year')->select();//去年 $data = Db::name('user')->whereYear('create_time', '2020')->select();//指定某一年 return json($data);
- 使用 whereMonth 查询当月的数据、上月的数据和某一个月的数据
$data = Db::name('user')->whereMonth('create_time')->select();//当月 $data = Db::name('user')->whereMonth('create_time', 'last month')->select();//上一个月 $data = Db::name('user')->whereMonth('create_time', '2022-1')->select();//指定某一个月 return json($data);
- 使用 whereDay 查询今天的数据、昨天的数据和某一个天的数据
$data = Db::name('user')->whereDay('create_time')->select();//今天 $data = Db::name('user')->whereDay('create_time', 'yesterday')->select();//昨天 $data = Db::name('user')->whereDay('create_time', '2022-4-8')->select();//指定某一天日期 return json($data);
四.其他查询
- 查询指定时间的数据,比如两小时内的
$data = Db::name('user')->whereTime('create_time', '-2 hours')->select(); return json($data);
- 查询当前时间(此时此刻)在两个时间字段范围,比如开通的会员在当前时间是否到期间
$data = Db::name('user')->whereBetweenTimeField('create_time', 'update_time')->select(); return json($data);
五.聚合查询
码云提交编号:685345920893f08872b60d94b200f4de937ad82e
- 使用 count()方法,可以求出所查询数据的数量
$data = Db::name('user')->count(); return json($data);
- count()可设置指定 id,比如有空值(Null)的 id,不会计算数量
$data = Db::name('user')->count('id'); return json($data);
- 使用 max()方法,求出所查询数据字段的最大值
$data = Db::name('user')->max('id'); return json($data);
- 如果 max()方法,求出的值不是数值,则通过第二参数强制转换
$data = Db::name('user')->max('remarks',false); return json($data);
- 使用 min()方法,求出所查询数据字段的最小值,也可以强制转换
$data = Db::name('user')->min('id',false); return json($data);
- 使用 avg()方法,求出所查询数据字段的平均值
$data = Db::name('user')->avg('id'); return json($data);
- 使用 sum()方法,求出所查询数据字段的总和
$data = Db::name('user')->sum('id'); return json($data);
六.子查询
- 开始之前先整一些关联数据
DROP TABLE IF EXISTS `tp_member`; CREATE TABLE `tp_member` ( `uid` int(111) NOT NULL COMMENT '用户id', `grade` char(15) COLLATE utf8_unicode_ci NOT NULL COMMENT '会员等级', `balance` int(10) NOT NULL COMMENT '账户余额', PRIMARY KEY (`uid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*Data for the table `tp_member` */ insert into `tp_member`(`uid`,`grade`,`balance`) values (1,'vip',100); insert into `tp_member`(`uid`,`grade`,`balance`) values (3,'svip',4); insert into `tp_member`(`uid`,`grade`,`balance`) values (8,'vip',454); insert into `tp_member`(`uid`,`grade`,`balance`) values (10,'svip',57); insert into `tp_member`(`uid`,`grade`,`balance`) values (12,'svip',242); insert into `tp_member`(`uid`,`grade`,`balance`) values (5,'vip',723); insert into `tp_member`(`uid`,`grade`,`balance`) values (7,'svip',7737); insert into `tp_member`(`uid`,`grade`,`balance`) values (15,'vip',57570); insert into `tp_member`(`uid`,`grade`,`balance`) values (20,'svip',177); insert into `tp_member`(`uid`,`grade`,`balance`) values (9,'svip',22); insert into `tp_member`(`uid`,`grade`,`balance`) values (16,'vip',7213); insert into `tp_member`(`uid`,`grade`,`balance`) values (17,'svip',777); insert into `tp_member`(`uid`,`grade`,`balance`) values (18,'vip',5770);
- 使用 fetchSql()方法,可以设置不执行 SQL,而返回 SQL 语句,默认 true
$data = Db::name('user')->fetchSql(true)->select(); return $data;
- 使用 buildSql()方法,也是返回 SQL 语句,不需要再执行 select(),且有括号
$data = Db::name('user')->buildSql(true); return $data;
-
结合以上方法,我们实现一个子查询;
如图
表二是表一的会员信息,现要求查出会员等级为svip的用户
$query = Db::name('member')->field('uid')->where('grade','svip')->buildSql(true); //sql:( SELECT `uid` FROM `tp_member` WHERE `grade` = 'svip' ) $data = Db::name('user')->where('id','exp','in'.$query)->select(); //sql:SELECT * FROM `tp_user` WHERE ( `id` in( SELECT `uid` FROM `tp_member` WHERE `grade` = 'svip' ) ) //return Db::getLastSql(); return json($data);
- 使用闭包的方式查询
$data = Db::name('user') ->where('id', 'in', function ($query) { $query->name('member')->where('grade','svip')->field('uid'); }) ->select(); //return Db::getLastSql(); return json($data);
七.原生查询
- 使用 query()方法,进行原生 SQL 查询,适用于读取操作,SQL 错误返回 false
$data = Db::query('select * from tp_user'); return json($data);
- 使用 execute 方法,进行原生 SQL 更新写入等,SQL 错误返回 false
Db::execute('update tp_user set username="小王子" where id=21');