前言[随时更新]
MySQL快速复习
MySQL原生查询
选择数据表
删除数据
聚合查询
时间查询
视图查询
子查询
总结/参考

1.该方法仅是给Query类的查询选择属性options['fetch_sql']赋值;
2.参数为布尔类型,确定是否输出当前SQL语句;
3.返回当前对象,可以继续调用后面的连贯方法。
| 序号 | 参数 | 说明 |
|---|---|---|
| 1 | true / 真 | 返回当前SQL语句字符串,后面SQL生成方法失效 |
| 2 | false / 假 | 不返回当前SQL语句字符串,后面的SQL生成方法正常执行,如select |
Db::table(表名) -> field(字段名) -> where(条件) ->fetchSql(true) -> select();
Db::table(表名) -> field(字段名) -> where(条件) ->fetchSql(false) -> select();
为了演示出实战效果,我们将原来的数据表tp5_staff做些改进
1、原表中,部门是直接使用了部门名称,例如:'开发部',这是不符合规范的,正确有做法是再新建一张部门表(tp5_dept),将部门信息(部门id,部门名称dept_name)单独存放。
2、这样,在tp_staff表中,部门dept字段只存放部门id号即可;
# 创建 tp5_dept 数据表 CREATE TABLE IF NOT EXISTS tp5_dept( id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT, dept_name VARCHAR(20) NOT NULL DEFAULT '开发部' COMMENT '部门名称', PRIMARY KEY (id) )ENGINE = MyISAM DEFAULT CHARSET = UTF8;
#给tp5_dept 数据表插入数据
INSERT tp5_dept (dept_name) VALUES ('开发部'),('市场部'),('客服部');
SELECT * FROM `tp5_dept` ;

ALTER TABLE `tp5_staff` CHANGE dept dept TINYINT(2) UNSIGNED NOT NULL ;

分析:
1、因为在tp5_staff员工信息表中,只存有部门id。详细的部门信息存放在tp5_dept部门信息表中,就是涉到二张表联合查询;
2、这个任何,如果用多表查询,是很容易解决的;
3、现在我们仅仅用我们学过的知识来完成。
SELECT id,name FROM tp5_staff WHERE dept IN (SELECT id FROM tp5_dept WHERE dept_name LIKE '%开发部%' )
1.先成子查询,获取到与开发部对应的部门id;
2.生成父查询,先获取到全部员工信息;
3.将上面的子查询做为条件传入,获取到开发部员工信息。
<?php
namespace app\index\controller;
use think\Db;
class Index {
public function index(){
// 1.获取'开发部'的部门id
$subSql = Db::table(['tp5_dept'=>'dept']) //指定tp5_dept表
->field('id') //设置返回字段
->where(['dept_name'=>['like','%开发部%']]) //设置查询条件
->fetchSql(true) //仅返回SQL查询语句,不做真实查询
->select(); // 生成SQL语句字符串
echo '1.获取[开发部]的部门id的子查询语句:<br />';
echo $subSql.'<br/>';
// 2.获取tp5_staff员工信息表全部信息的SQL语句
$parSql = Db::table('tp5_staff')->field('id,name') //设置查询条件
->fetchSql(true)->select(); //返回SQL语句字符串,不做查询
echo '2.获取tp5_staff员工信息表全部信息的SQL语句:<br />';
echo $parSql.'<br />';
//3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成SELECT查询SQL
$sql = $parSql . 'WHERE dept IN (' .$subSql.')';
echo '3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成SELECT查询SQL:<br />';
echo $sql;
//4.用我们刚学习过的原生Query,执行查询操作
dump(Db::query($sql));
}
}
1.获取[开发部]的部门id的子查询语句:
SELECT `id` FROM `tp5_dept` `dept` WHERE `dept_name` LIKE '%开发部%'
2.获取tp5_staff员工信息表全部信息的SQL语句:
SELECT `id`,`name` FROM `tp5_staff`
3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成最终查询SQL:
SELECT `id`,`name` FROM `tp5_staff` WHERE dept IN (SELECT `id` FROM `tp5_dept` `dept` WHERE `dept_name` LIKE '%开发部%' )
----------------------------------------------------------------------------------------------
下面是最终的查询结果:
array(3) {
[0] => array(2) {
["id"] => int(1001)
["name"] => string(6) "郭靖"
}
[1] => array(2) {
["id"] => int(1002)
["name"] => string(9) "洪七公"
}
[2] => array(2) {
["id"] => int(1011)
["name"] => string(9) "李云龙"
}
}
实际开发中,更多的用在调试SQL语句,用户对查询结果感兴趣,对SQL语句不感兴趣
将本课实例上机动手做一遍