前言[随时更新]
MySQL快速复习
MySQL原生查询
选择数据表
删除数据
聚合查询
时间查询
视图查询
子查询
总结/参考
此处的select方法与前面学习过的select方法并无本质区别,仅参数不同罢了
$subQuery = Db::table('数据表') -> field('字段列表') -> where('查询表达式') -> select(false);
select方法中的布尔参数仅支持false,不支持true,请勿天真认为传入true就会执行查询。
SELECT avg(salary) FROM `tp5_staff`
显然应该分二步完成:
Index.php 控制器代码如下:
<?php
namespace app\index\controller;
//导入数据库类
use think\Db;
class Index {
public function index(){
//1.生成子查询:计算平均工资
$subQuery = Db::table('tp5_staff') //设置数据表
-> field('avg(salary)') //字段列表可以使用聚合函数
-> select(false); //false表示不执行查询,仅返回SQL语句
//2.执行父查询:获取大于平均工资的员工信息
$result = Db::table('tp5_staff') //设置数据表
-> field('id,name,salary') //设置查询字段列表
-> where('salary >= '.'('.$subQuery.')') //将子查询结果传给父查询
-> select(); //执行查询获取结果集
//3.查看结果
dump($result);
}
}
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)
}
}
SELECT `id`,`name`,`salary` FROM `tp5_staff` WHERE ( salary >= (SELECT avg(salary) FROM `tp5_staff` ) )
语句:where('salary >= '.'('.$subQuery.')') //将子查询结果传给父查询:一定要用字符串连接方式,用括号将子查询生成的SQL语句字符串,合并到查询表达式字符串中。
该方法适合于单值查询(即子查询生成唯一值),子查询生成数据列,我们下节课讲。