left join on
在left join下,两者的区别:
首先明确两个概念:
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方法,并且不能和字符串方式混合使用。
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(数据表)
/ 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的中的第一条数据。
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');
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()
$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();
$model = U('数据表');
$model->where('条件')->setField('字段', 值);//根据条件设置数据表中指定字段的值
$model->where('条件')->getField('字段');//根据条件获取数据表中指定字段的值
M()->getLastSql();//返回最后执行的sql语句
mysql的通配符是 %
where tel like '137%' 查以137 开头的
where tel like '%137'查以137 结尾头的
where tel like '%137%' 只要包含137的都查出来
二、添加
$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 方法添加数据成功,返回影响记录的行数
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()
$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();
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;
1.for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。
2.要测试for update的锁表情况,可以利用MySQL的Command Mode,开启二个视窗来做测试。
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。
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;
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;
MySQL DATEDIFF
函数计算两个DATE,DATETIME或TIMESTAMP值之间的天数。
mysql> SELECT DATEDIFF('2017-08-17','2017-08-17');
+-------------------------------------+
| DATEDIFF('2017-08-17','2017-08-17') |
+-------------------------------------+
| 0 |
上例表示当天。第一个参数-第二个参数,为负数时,表示加一天。为正数时,表示减一天。
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['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'],
];
thinkphp:M()->query($sql . $where . ' order by id desc' . $limit);//sql语句写法
distinct();//去除查询结果中的重复记录,只能在查询中使用
向日期添加指定的时间间隔。
例:
现在,我们希望向 "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;
再一个系列同时操作多种表的话 最好是用事务, 这样不容易出错
数据库类型要是InnoDB,
加锁必须跟事务同时使用,
查询的时候都必须带锁,
比如: $user_mod->lock(true)->where('id=1')->select();