课程表

Slick课程

工具箱
速查手册

Slick 查询(一)

当前位置:免费教程 » 数据库/运维 » Slick

查询(一)

本篇介绍 Slick 的基本查询,比如选择,插入,更新,删除记录等。

排序和过滤

Slick 提供了多种方法可以用来排序和过滤,比如:

  1. val q = Album.filter(_.albumid === 101)
  2. //select `AlbumId`, `Title`, `ArtistId`
  3. //from `Album` where `AlbumId` = 101
  4. val q = Album.drop(10).take(5)
  5. //select .`AlbumId` as `AlbumId`, .`Title` as `Title`,
  6. // .`ArtistId` as `ArtistId` from `Album` limit 10,5
  7. val q = Album.sortBy(_.title.desc)
  8. //select `AlbumId`, `Title`, `ArtistId`
  9. //from `Album` order by `Title` desc

Join 和 Zipping

Join 指多表查询,可以有两种不同的方法来实现多表查询,一种是通过明确调用支持多表连接的方法(比如 innerJoin 方法)返回一个多元组,另外一种为隐含连接( implicit join ),它不直接使用这些连接方法(比如 LeftJoin 方法)。

一个隐含的 cross-Join 为 Query 的 flatMap 操作(在 for 表达式中使用多个生成式),例如:

  1. val q = for{a <- Album
  2. b <- Artist
  3. } yield( a.title, b.name)
  4. //select x2.`Title`, x3.`Name` from `Album` x2, `Artist` x3

如果添加一个条件过滤表达式,它就变成隐含的 inner join,例如:

  1. val q = for{a <- Album
  2. b <- Artist
  3. if a.artistid === b.artistid
  4. } yield( a.title, b.name)
  5. //select x2.`Title`, x3.`Name` from `Album` x2, `Artist` x3
  6. //where x2.`ArtistId` = x3.`ArtistId`

明确的多表连接则使用 innerJoin,leftJoin,rightJoin,outerJoin 方法,例如:

  1. val explicitCrossJoin = = for {
  2. (a,b) <- Album innerJoin Artist
  3. } yield( a.title, b.name)
  4. //select x2.x3, x4.x5 from (select x6.`Title` as x3 from `Album` x6)
  5. //x2 inner join (select x7.`Name` as x5 from `Artist` x7) x4 on 1=1
  6. val explicitInnerJoin = for {
  7. (a,b) <- Album innerJoin Artist on (_.artistid === _.artistid)
  8. } yield( a.title, b.name)
  9. //select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2
  10. //inner join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9
  11. val explicitLeftOuterJoin = for {
  12. (a,b) <- Album leftJoin Artist on (_.artistid === _.artistid)
  13. } yield( a.title, b.name.?)
  14. //select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2
  15. //left outer join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9
  16. val explicitRightOuterJoin = for {
  17. (a,b) <- Album rightJoin Artist on (_.artistid === _.artistid)
  18. } yield( a.title.?, b.name)
  19. //select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2
  20. //right outer join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9

注意 leftJoin 和 rightJoin 中的 b.name.? 和 a.title.? 的”.?” 这是因为外部查询时会产生额外的 NULL 值,你必须保证返回 Option 类型的值。

除了通常的 InnerJoin,LeftJoin,RightJoin 之外,Scala 还提供了 Zip 方法,它的语法类似于 Scala 的集合类型,比如:

  1. val zipJoinQuery = for {
  2. (a,b) <- Album zip Artist
  3. } yield( a.title.?, b.name)

此外,还有一个 zipWithIndex,可以把一个表的行和一个从 0 开始的整数序列 Zip 操作,相当于给行添加序号,比如

  1. val zipWithIndexJoin = for {
  2. (a,idx) <- Album.zipWithIndex
  3. } yield( a.title, idx)
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号