Laravel框架学习(数据库高级查询)
2017-11-03 16:53
696 查看
1、连接查询(join)
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。
我们将用户表users和文章表posts关联到一起进行查询,在此之前,我们先创建posts表,其字段及初始值如下:
其中user_id对应users表中的用户id。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
显示结果如下:
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:
输出结果为:
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
输出结果为:
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
如果操作符为“=”,该语句也可简化为:
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:
更多where子句查询条件可查看Illuminate\Database\Query\Builder源码。
4、排序
查询构建器使用orderBy方法对查询结果进行排序:
根据代码可以看到orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,asc代表升序,desc代表倒序
5、分组
为了更好地演示分组,我们给数据表posts新增两个字段:cat_id和views,代表分类ID和浏览数:
分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
输出结果为:
注意:having中的条件字段必须出现在select查询字段中,否则会报错。
6、分页
查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:
对应的输出结果为:
连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。
我们将用户表users和文章表posts关联到一起进行查询,在此之前,我们先创建posts表,其字段及初始值如下:
其中user_id对应users表中的用户id。
1.1 内连接
内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:
$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get(); dd($users);
显示结果如下:
array:3 [▼ 0 => {#226 ▼ +"id": 1 +"name": "Laravel" +"email": "laravel@test.com" +"password": "123" +"remember_token": "x" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test1" +"content": "test1" +"user_id": 1 } 1 => {#227 ▼ +"id": 2 +"name": "Laravel" +"email": "laravel@test.com" +"password": "123" +"remember_token": "x" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test2" +"content": "test2" +"user_id": 1 } 2 => {#228 ▼ +"id": 3 +"name": "Academy" +"email": "academy@test.com" +"password": "123" +"remember_token": "y" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test3" +"content": "test3" +"user_id": 2 } ]
1.2 左连接
左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:
$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get(); dd($users);
array:4 [▼ 0 => {#226 ▶} 1 => {#227 ▶} 2 => {#228 ▶} 3 => {#229 ▼ +"id": null +"name": "test3" +"email": "test3@test.com" +"password": "123456" +"remember_token": "z" +"created_at": null +"updated_at": null +"title": null +"content": null +"user_id": null } ]
1.3 更加复杂的连接查询
很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:
$users = DB::table('users')->join('posts',function($join){ $join->on('users.id','=','posts.user_id') ->where('posts.id','>',1); })->get(); dd($users);
输出结果为:
array:2 [▼ 0 => {#226 ▼ +"id": 2 +"name": "Laravel" +"email": "laravel@test.com" +"password": "123" +"remember_token": "x" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test2" +"content": "test2" +"user_id": 1 } 1 => {#227 ▼ +"id": 3 +"name": "Academy" +"email": "academy@test.com" +"password": "123" +"remember_token": "y" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test3" +"content": "test3" +"user_id": 2 } ]
2、联合查询(union)
联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:
$users = DB::table('users')->where('id','<',3); $users = DB::table('users')->where('id','>',2)->union($users)->get(); dd($users);
输出结果为:
array:3 [▼ 0 => {#226 ▼ +"id": 3 +"name": "test3" +"email": "test3@test.com" +"password": "123456" +"remember_token": "z" +"created_at": "2016-03-08 09:45:10" +"updated_at": "0000-00-00 00:00:00" } 1 => {#227 ▼ +"id": 1 +"name": "Laravel" +"email": "laravel@test.com" +"password": "123" +"remember_token": "x" +"created_at": "2016-03-15 09:45:03" +"updated_at": "0000-00-00 00:00:00" } 2 => {#228 ▼ +"id": 2 +"name": "Academy" +"email": "academy@test.com" +"password": "123" +"remember_token": "y" +"created_at": "2016-03-13 09:45:07" +"updated_at": "0000-00-00 00:00:00" } ]
3、where子句
使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:
$user = DB::table('users')->where('name','=','Laravel')->get(); dd($user);
如果操作符为“=”,该语句也可简化为:
$user = DB::table('users')->where('name','Laravel')->get();
需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:
$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();
更多where子句查询条件可查看Illuminate\Database\Query\Builder源码。
4、排序
查询构建器使用orderBy方法对查询结果进行排序:
$users = DB::table('users')->orderBy('id','desc')->get(); dd($users);
根据代码可以看到orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,asc代表升序,desc代表倒序
5、分组
为了更好地演示分组,我们给数据表posts新增两个字段:cat_id和views,代表分类ID和浏览数:
分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:
$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get(); dd($posts);
array:2 [▼ 0 => {#226 ▼ +"cat_id": 1 +"num": 2 } 1 => {#227 ▼ +"cat_id": 2 +"num": 1 } ]
我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:
$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get(); dd($posts);
输出结果为:
array:1 [▼ 0 => {#226 ▼ +"cat_id": 1 +"views": "900" } ]
注意:having中的条件字段必须出现在select查询字段中,否则会报错。
6、分页
查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:
$posts = DB::table('posts')->skip(0)->take(2)->get(); dd($posts);
对应的输出结果为:
array:2 [▼ 0 => {#225 ▼ +"id": 1 +"title": "test1" +"content": "test1" +"user_id": 1 +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"cat_id": 1 +"views": 100 } 1 => {#226 ▼ +"id": 2 +"title": "test2" +"content": "test2" +"user_id": 1 +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"cat_id": 2 +"views": 500 } ]
相关文章推荐
- 数据库基础学习4--表格的 增 删 改 查(简单查询与高级查询)
- php Laravel框架学习(二) 之 Eloquent 高级应用
- laravel框架学习之数据库相关操作(三)
- Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
- Laravel 5框架学习之数据库迁移(Migrations)
- Laravel 5框架学习之数据库迁移(Migrations)
- Laravel学习笔记(五)---操作数据库--查询构建器(Query Builder)
- 数据库学习(四)----高级查询
- php Laravel框架学习(一) 之 建立数据库并填充测试数据
- CI框架学习之六 ( 数据库查询缓存优化 )
- php laravel框架学习笔记 (二) 数据库操作
- MySQL 数据库 高级查询
- Laravel入门教程(四)- 数据库操作之 - 查询构造器
- PHP codeigniter 框架编程学习之【数据库编程】
- laravel框架学习-配置,路由
- Yii框架学习CDbCriteria查询条件收集
- laravel框架的学习(一)
- SQL SERVER设计与高级查询 第五章 学习笔记
- Laravel 5框架学习之Eloquent (laravel 的ORM)
- XMPP框架 微信项目开发之CoreData学习——CoreData的查询方式(模糊查询,嵌套查询,分页查询)