select方法

selec(false)子查询

1、功能:不执行查询,仅返回查询语句;

此处的select方法与前面学习过的select方法并无本质区别,仅参数不同罢了

2、基本语法:

$subQuery = Db::table('数据表') -> field('字段列表') -> where('查询表达式') -> select(false);

3、参数与返回值

  • 参数:false 表示不执行具体查询,仅仅返回查询SQL语句;

select方法中的布尔参数仅支持false,不支持true,请勿天真认为传入true就会执行查询。

  • 返回值:查询语句字符串,例如:
SELECT avg(salary) FROM `tp5_staff`

4、实例演示:

任务1:查询tp5_staff表中大于平均工资的员工信息

  • 显然应该分二步完成:

    • 先查询出员工平均工次;
    • 再查询工资大于平均工资的员工信息。
  • Index.php 控制器代码如下:

 field('avg(salary)') //字段列表可以使用聚合函数 -> select(false); //false表示不执行查询,仅返回SQL语句 //2.执行父查询:获取大于平均工资的员工信息 $result = Db::table('tp5_staff') //设置数据表 -> field('id,name,salary') //设置查询字段列表 -> where('salary >= '.'('.$subQuery.')') //将子查询结果传给父查询 -> select(); //执行查询获取结果集 //3.查看结果 dump($result); } }
  • 查询结果,有6条记录满足要求:
array(6) { [0] => array(3) { ["id"] => int(1006) ["name"] => string(9) "西门庆" ["salary"] => float(19801) } [1] => array(3) { ["id"] => int(1007) ["name"] => string(9) "潘金莲" ["salary"] => float(8567) } [2] => array(3) { ["id"] => int(1008) ["name"] => string(6) "宋江" ["salary"] => float(9261) } [3] => array(3) { ["id"] => int(1011) ["name"] => string(9) "李云龙" ["salary"] => float(9850) } [4] => array(3) { ["id"] => int(1023) ["name"] => string(9) "段王爷" ["salary"] => float(9560) } [5] => array(3) { ["id"] => int(1028) ["name"] => string(6) "方方" ["salary"] => float(9877) } }
  • 生成的SQL语句:
SELECT `id`,`name`,`salary` FROM `tp5_staff` WHERE ( salary >= (SELECT avg(salary) FROM `tp5_staff` ) )
  • 代码说明:
  1. 语句:where('salary >= '.'('.$subQuery.')') //将子查询结果传给父查询:一定要用字符串连接方式,用括号将子查询生成的SQL语句字符串,合并到查询表达式字符串中。

  2. 该方法适合于单值查询(即子查询生成唯一值),子查询生成数据列,我们下节课讲。