MySql学习笔记【1】-基础知识

发布时间 2023-04-06 11:55:00作者: cx小橙

  1.TP6文档-数据库学习

  记录一些文档里,容易忽略的知识。

  (1)游标查询

    如果你需要处理大量的数据,可以使用新版提供的游标查询功能,该查询方式利用了PHP的生成器特性,可以大幅减少大量数据查询的内存开销问题。

$cursor = Db::table('user')->where('status', 1)->cursor();
foreach($cursor as $user){
    echo $user['name'];
}

    cursor方法返回的是一个生成器对象,user变量是数据表的一条数据(数组)。

  (2)时间查询

    使用whereTime方法

// 时间区间查询
Db::name('user')
    ->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1'])
    ->select();
// 不在某个时间区间
Db::name('user')
    ->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])
    ->select();
// 查询两个小时内的博客
Db::name('blog')
	->whereTime('create_time','-2 hours')
    ->select();

    查询某个时间区间

// 查询2017年上半年注册的用户
Db::name('user')
    ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30')
    ->select();
    
// 查询不是2017年上半年注册的用户
Db::name('user')
    ->whereNotBetweenTime('create_time', '2017-01-01', '2017-06-30')
    ->select();

    查询某年

//查询今年注册的用户
Db::name('user') ->whereYear('create_time') ->select();

//查询去年注册的用户
Db::name('user')
    ->whereYear('create_time', 'last year')
    ->select();   
//查询某一年的数据使用
// 查询2018年注册的用户
Db::name('user')
    ->whereYear('create_time', '2018')
    ->select(); 

    查询某月

//查询本月注册的用户
Db::name('user')
    ->whereMonth('create_time')
    ->select();
//查询上月注册用户 Db
::name('user') ->whereMonth('create_time','last month') ->select();
//查询2018年6月注册的用户 Db
::name('user') ->whereMonth('create_time', '2018-06') ->select();

    查询某周

//查询本周数据
Db::name('user')
    ->whereWeek('create_time')
    ->select();    

//查询上周数据
Db::name('user')
    ->whereWeek('create_time', 'last week')
    ->select();    

//查询指定某天开始的一周数据
// 查询2019-1-1到2019-1-7的注册用户
Db::name('user')
    ->whereWeek('create_time', '2019-1-1')
    ->select();    

    查询某天

//查询当天注册的用户
Db::name('user')
    ->whereDay('create_time')
    ->select();  
//查询昨天注册的用户 Db
::name('user') ->whereDay('create_time', 'yesterday') ->select();
//查询某天的数据使用
// 查询2018年6月1日注册的用户 Db::name('user') ->whereDay('create_time', '2018-06-01') ->select();

    时间字段区间比较

//可以支持对两个时间字段的区间比较

// 查询有效期内的活动
Db::name('event')
    ->whereBetweenTimeField('start_time', 'end_time')
    ->select();
上面的查询相当于

// 查询有效期内的活动
Db::name('event')
    ->whereTime('start_time', '<=', time())
    ->whereTime('end_time', '>=', time())
    ->select();

    自定义时间查询规则

//自定义时间查询规则
//你可以通过在数据库配置文件中设置time_query_rule添加自定义的时间查询规则,

'time_query_rule'    =>    [
    'hour'    =>    ['1 hour ago', 'now'],
],

  (3) 高级查询

     查询表达式:

EXP 表达式查询,支持SQL语法 whereExp
find in set FIND_IN_SET查询 whereFindInSet

  

 

 

    

支持更复杂的查询情况 例如:

Db::name('user')->where('id','in','1,3,8')->select();
可以改成:

Db::name('user')->where('id','exp',' IN (1,3,8) ')->select();
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。

推荐使用whereExp方法查询

Db::name('user')->whereExp('id', 'IN (1,3,8) ')->select();

 

  快捷方法

whereExists EXISTS条件查询
whereNotExists NOT EXISTS条件查询
whereExp 表达式查询
whereColumn 比较两个字段

 

 

 

 

 

 

下面举例说明下两个字段比较的查询条件whereColumn方法的用法。

查询update_time大于create_time的用户数据

Db::table('think_user')
    ->whereColumn('update_time','>','create_time')
    ->select();
生成的SQL语句是:

SELECT * FROM `think_user` WHERE ( `update_time` > `create_time` ) 
查询name和nickname相同的用户数据

Db::table('think_user')
    ->whereColumn('name','=','nickname')
    ->select();
生成的SQL语句是:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` )
相同字段条件也可以简化为

Db::table('think_user')
    ->whereColumn('name','nickname')
    ->select();
支持数组方式比较多个字段

Db::name('user')->whereColumn([
    ['title', '=', 'name'],
    ['update_time', '>=', 'create_time'],
])->select();
生成的SQL语句是:

SELECT * FROM `think_user` WHERE ( `name` = `nickname` AND `update_time` > `create_time` ) 

 

   (4) JSON字段

如果你的user表有一个info字段是JSON类型的(或者说你存储的是JSON格式,但并非是要JSON字段类型),你可以使用下面的方式操作数据。

JSON数据写入
$user['name'] = 'thinkphp';
$user['info'] = [
    'email'    => 'thinkphp@qq.com',
    'nickname' => '流年',
];
Db::name('user')
    ->json(['info'])
    ->insert($user);
JSON数据查询 查询整个JSON数据:
$user = Db::name('user') ->json(['info']) ->find(1); dump($user); 查询条件为JSON数据 $user = Db::name('user') ->json(['info']) ->where('info->nickname','ThinkPHP') ->find(); dump($user); 由于JSON字段的属性类型并不会自动获取,所以,如果是整型数据查询的话,可以设置JSON字段类型,例如: $user = Db::name('user') ->json(['info']) ->where('info->user_id', 10) ->setFieldType(['info->user_id' => 'int']) ->find(); dump($user); JSON数据更新 完整JSON数据更新 $data['info'] = [ 'email' => 'kancloud@qq.com', 'nickname' => 'kancloud', ]; Db::name('user') ->json(['info']) ->where('id',1) ->update($data); 单个JSON数据更新 $data['info->nickname'] = 'ThinkPHP'; Db::name('user') ->json(['info']) ->where('id',1) ->update($data);