thinkphp5.0 mysql 操作

left join on

在left join下,两者的区别:

  • on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。
  • where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉。

首先明确两个概念:

  • LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
  • 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
  • join()
    $Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select();
    $Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();
    $Model->join(array(' work ON artist.id = work.artist_id','card ON artist.card_id = card.id'))->select();
    默认采用LEFT JOIN 方式,如果需要用其他的JOIN方式,可以改成第二种
  • 如果join方法的参数用数组的话,只能使用一次join方法,并且不能和字符串方式混合使用。
     
  • Case具有两种格式。简单Case函数和Case搜索函数。 

    --简单Case函数
  • CASE sex 
             WHEN '1' THEN '男' 
             WHEN '2' THEN '女' 
    ELSE '其他' END 
    --Case搜索函数 
    CASE WHEN sex = '1' THEN '男' 
             WHEN sex = '2' THEN '女' 
    ELSE '其他' END 

    这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式
  • M('game')->field('rate,times,CASE WHEN times>0 && times<50 THEN 1 WHEN times>=50 && times<100 THEN 2 WHEN times>=100 && times<500 THEN 3 WHEN times>=500 && times<1000 THEN 4 ELSE 5 END AS flag')->order('flag,rate DESC')->select();
  • SUM()函数用于计算一组值或表达式的总和
  • $pay_fee = M('order')->where(['deliverid' => $deliver_id, 'state' => ['IN', '4,5,10,12']])->sum('actualmoney');
    计算在指定状态下的实际支付运费的总金额

 

一、查询

查询某个字段在哪个数据库哪个数据表

select table_schema,table_name from information_schema.columns where column_name = '字段名';

table_schema(数据库名)    table_name(数据表)

 

find() 查询一个一维数组数据

/ table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();
//find 方法查询结果不存在,返回 null,存在则返回一条一维数组

//多个字段相同条件的and查询优化,用'&'符号链接多个字段
Db::table('think_user')
    ->where('name&title','like','%thinkphp')
    ->find();
//多个字段相同条件的or查询优化,用'|'符号链接多个字段
Db::table('think_user')
    ->where('name|title','like','%thinkphp')
    ->find();
// 使用whereOr 方法进行OR关系查询,一般whereOr 方法根where 方法在一起使用
Db::table('think_user')
    ->where('id','>','10')
    ->whereOr('title','like','%thinkphp')
    ->find();
find()
$model = M('WxuserCollection');
$res1 = $model - >find(1);
$res2 = $model - >find(2);
$res3 = $model - >where('good_id=1105 AND store_id = 1 AND user_id = 20') - >find();
 
find获取一条数据,find(1)获取id为1的数据,find(2)获取id为2的数据。最后一个是获取条件为where的中的第一条数据。

 

select() 查询多维数组数据集

 

Db::table('think_user')->where('status',1)->select();
select 方法查询结果不存在,返回空数组,存在则返回二维数组集合

 

 

2、条件查询方法
//where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用,下面举个例子:
$result = Db::table('think_user')->where(function ($query) {
    $query->where('id', 1)->whereor('id', 2);
})->whereOr(function ($query) {
    $query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp');
})->select();

3、getTableInfo 方法
//使用getTableInfo可以获取表信息,信息类型 包括 fields,type,bind,pk,以数组的形式展示,可以指定某个信息进行获取
  // 获取`think_user`表所有信息
  Db::getTableInfo('think_user');
  // 获取`think_user`表所有字段
  Db::getTableInfo('think_user', 'fields');
  // 获取`think_user`表所有字段的类型
  Db::getTableInfo('think_user', 'type');
  // 获取`think_user`表的主键
  Db::getTableInfo('think_user', 'pk');

 

where in

 

select * from user where id in(1,2,3);  select  * from  user where id in(select id from menu);

thinkphp框架 :$where = array();  $where['id'] = array('in', 'value1,value2....'); D('user') -> where($where) ->select();

order by 关键词用于对记录集中的数据进行排序。

order()
$model = M('WxuserCollection');
$res = $model - >order('id desc') - >select();
$res = $model - >order('id asc') - >select();
$res = $model - >order(array('id' = >'desc')) - >select();
$res = $model - >order(array('id')) - >select();

 

GROUP BY  MySQL中 使用 GROUP BY 关键字用于对某个或某些字段查询分组,并返回重复记录的第一条。

 

$model = U('数据表');

$model->where('条件')->setField('字段', 值);//根据条件设置数据表中指定字段的值

$model->where('条件')->getField('字段');//根据条件获取数据表中指定字段的值

M()->getLastSql();//返回最后执行的sql语句

like

 

mysql的通配符是 %
where tel like '137%' 查以137 开头的
where tel like '%137'查以137 结尾头的
where tel like '%137%' 只要包含137的都查出来



二、添加

insert() 添加

 

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
//insert 方法添加成功,返回值是影响记录的行数
Db::table('think_user')->insertGetId($data);
//insertGetId 方法添加成功,返回插入数据的自增id值

添加多条数据

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
//insertAll 方法添加数据成功,返回影响记录的行数

mysql addall() 和 add()

1.add()是记录单条插入

1 // 添加一条数据
2 $User = M("User"); // 实例化User对象
3 $data['name'] = 'ThinkPHP';
4 $data['email'] = '[email protected]';
5 $User->add($data);

 

2.addAll()是记录批量插入

1 // 批量添加数据
2 $dataList[] = array('name'=>'thinkphp','email'=>'[email protected]');
3 $dataList[] = array('name'=>'onethink','email'=>'[email protected]');
4 $User->addAll($dataList);


 

3. 封装的add语句
$model = M('WxuserCollection');
$data = array('user_id' = >$user_id, 'store_id' = >$store_id, 'good_id' = >$good_id, 'addtime' = >$addtime);
$model - >data($data) - >add();
 

4.封装的修改edit语句
$model = M('WxuserCollection');
$data = array('user_id' = >$user_id, 'store_id' = >$store_id, 'good_id' = >$good_id, 'addtime' = >$addtime);
$model - >data($data) - >where('id=3') - >save();

 

 

三、修改(返回受影响的行数)

 

 

(1)更新数据表中的数据

Db::table('think_user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);

 

(2)助手函数

// 更新数据表中的数据
db('user')->where('id',1)->update(['name' => 'thinkphp']);
// 更新某个字段的值
db('user')->where('id',1)->setField('name','thinkphp');
//setField 方法,仅用于更新某一个字段
// 自增 score 字段
db('user')->where('id', 1)->setInc('score');
//setInc 方法,参数1:是要自增的字段名,参数2[可省略],默认为1,是每次自增的数目,特别书用于网站点击量啥的
// 自减 score 字段
db('user')->where('id', 1)->setDec('score');//score(评分/得分)
//setDec 方法,参数1:是要自减的字段名,参数2[可省略],默认为1,是每次自减的数目,特别适用于商品库存啥的

setInc()

 

setInc()
$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('score',3); // 用户的积分加3
$User->where('id=5')->setInc('score'); // 用户的积分加1
$User->where('id=5')->setDec('score',5); // 用户的积分减5
$User->where('id=5')->setDec('score'); // 用户的积分减1

 

四、删除

 

【返回值为影响的行数】

  // 根据主键删除 
 Db::table(‘think_user’)->delete(1); 
 Db::table(‘think_user’)->delete([1,2,3]);

 // 条件删除 
 Db::table(‘think_user’)->where(‘id’,1)->delete(); 
 Db::table(‘think_user’)->where(‘id’,’<’,10)->delete();

(2)助手函数

//根据主键删除
db('user')->delete(1);
//条件删除    
db('user')->where('id',1)->delete();

FOR UPDATE (记住一个原则:一锁二判三更新

MyAsim 只支持表级锁,InnerDB支持行级锁 添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改

(修改、删除) 。是表级锁时,不管是否查询到记录,都会锁定

假设表foods ,存在有id跟name、status三个字段,id是主键,status有索引。

例1: (明确指定主键,并且有此记录,行级锁)
SELECT * FROM foods WHERE id=1 FOR UPDATE;
SELECT * FROM foods WHERE id=1 and name=’咖啡色的羊驼’ FOR UPDATE;

例2: (明确指定主键/索引,若查无此记录,无锁)
SELECT * FROM foods WHERE id=-1 FOR UPDATE;

例3: (无主键/索引,表级锁)
SELECT * FROM foods WHERE name=’咖啡色的羊驼’ FOR UPDATE;

例4: (主键/索引不明确,表级锁)
SELECT * FROM foods WHERE id<>’3’ FOR UPDATE;
SELECT * FROM foods WHERE id LIKE ‘3’ FOR UPDATE;

for update的注意点

1.for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。

2.要测试for update的锁表情况,可以利用MySQL的Command Mode,开启二个视窗来做测试。

union

用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复

1、UNION 的语法如下:
     [SQL 语句 1]
      UNION
     [SQL 语句 2]

2、UNION ALL 的语法如下:
     [SQL 语句 1]
      UNION ALL
     [SQL 语句 2]

效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

MAX()函数

1,MAX()函数是求最大值的函数;

eg:查询张三的所有科目中的最高分

SELECT stuName,MAX(score) FROM t_grade WHERE stuName="张三";

2,与 GOUPE BY 关键字一起使用

eg:查询所有学生分数最高的成绩

SELECT stuName,MAX(score) FROM t_grade GROUP BY stuName;

MIN()函数

1,MIN()函数是求最小值的函数;

eg:查询张三的所有科目中的最低分

SELECT stuName,MIN(score) FROM t_grade WHERE stuName="张三";

2,与 GOUPE BY 关键字一起使用;

eg:查询所有学生分数最低的成绩

SELECT stuName,MIN(score) FROM t_grade GROUP BY stuName;

datediff()

MySQL DATEDIFF函数计算两个DATE,DATETIME或TIMESTAMP值之间的天数。

 


mysql> SELECT DATEDIFF('2017-08-17','2017-08-17'); 
+-------------------------------------+
| DATEDIFF('2017-08-17','2017-08-17') |
+-------------------------------------+
|                                   0 |

上例表示当天。第一个参数-第二个参数,为负数时,表示加一天。为正数时,表示减一天。

date_sub()

 

语法 : DATE_SUB(date,INTERVAL expr type)

date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。type:

 

MICROSECOND :微秒数
SECOND:秒
MINUTE:分钟
HOUR:小时
DAY:天
WEEK:周
MONTH:月
QUARTER
YEAR:年
SECOND_MICROSECOND:秒_微秒
MINUTE_MICROSECOND:分_微秒
MINUTE_SECOND:分_秒
HOUR_MICROSECOND:时_微秒
HOUR_SECOND:时_秒
HOUR_MINUTE:时_分
DAY_MICROSECOND:天_微秒
DAY_SECOND:天_秒
DAY_MINUTE:天_分
DAY_HOUR:天_时
YEAR_MONTH:年_月

从 "OrderDate" 减去 2 天,

SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDate
FROM Orders

where()条件

$where['publish_time'] = [
                    ['EGT', $tmp_start_time],
                    ['ELT', $tmp_end_time]
                ];
等效于:WHERE publish_time >= $tmp_start_time AND publish_time <= $tmp_end_time.
$map['_string'] = 'status=1 AND score>10';
等效于:WHERE  status=1 AND score>10

thinkPHP where条件组合:
    $tmp_where_visit = [
            'last_visit_time' => [['EGT', '2017-01-01'], ['ELT', '2017-12-22' . ' 23:59:59'], 'AND'],
            'user_id' => [['EXP', 'IS NULL'], ['EQ', ''], ['EQ', 0], 'OR'],

    ];

query();

thinkphp:M()->query($sql . $where . ' order by  id desc' . $limit);//sql语句写法

 

distinct();//去除查询结果中的重复记录,只能在查询中使用

DATE_ADD(时间字段,时间类型);

向日期添加指定的时间间隔。

例:

 

现在,我们希望向 "OrderDate" 添加 2 天,这样就可以找到付款日期。

 

OrderId ProductName OrderDate
1 'Computer' 2008-12-29 16:25:46.635

 

我们使用下面的 SELECT 语句:

 

SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 2 DAY) AS OrderPayDate
FROM Orders

结果:

OrderId OrderPayDate
1 2008-12-31 16:25:46.635

 

时间类型:

 

 

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了。
第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量
第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……
注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量
第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where ……
注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”

例:

select * from (SELECT a.uid,a.weekordercount,@rownum := @rownum + 1 AS rownum FROM  (SELECT uid, weekordercount  FROM yun_driver ORDER BY weekordercount DESC) AS a,(SELECT @rownum := 0) r ) d 
SELECT '-1' type FROM yun_company;  //将type值修改为-1;

SELECT case state when 0 then 0 when 1 then 1 when 2 then 0 else '-1' end isagree FROM yun_user;//将state的值,赋给state的别名isagree.当state不等于0,1,2时,为-1.

SELECT 1 AS is_show FROM yun_user;

 

lock(true) 锁机制的使用

再一个系列同时操作多种表的话 最好是用事务, 这样不容易出错

数据库类型要是InnoDB,

加锁必须跟事务同时使用,

查询的时候都必须带锁,

比如: $user_mod->lock(true)->where('id=1')->select();

 

 

你可能感兴趣的:(MYSQL)