×

微信扫一扫,快捷登录!

标签: 暂无标签
本帖最后由 adminlily 于 2020-12-4 16:36 编辑

书店数据库

对于设计去管理书店的示例数据库,我们如何使用OQL呢?

最基本的查询是简单的一个SELECT,并且只有一个类名称:

SELECT                

    Book

此查询返回数据库中存在的任何书籍。您可以注意到,不需要像在SQL SELECT语句中那样指定期望的列,因为OQL查询总是返回完整的对象。

连接类

我想列出所有以“Camus”的名字开头的人写的书


注意,不需要指定连接是内部连接还是左连接。这在数据模型中是众所周知的。OQL引擎将根据相关选项创建一个SQL查询,我们不想关心这些细节,不是吗?

现在,你可能认为一本书作者的名字很重要。想要列出一套书籍或者查询关键词的列表。

然后您可以选择更改数据模型,并将作者的名字定义为外部字段。这样的外部字段将由外部键written_by和目标属性名定义。让我们将这个新字段定义为writer_name。

查询可简化为:

SELECT   
       Book   
       WHERE Book.writer_name LIKE 'Camus%'

连接实际上是由底层SQL查询执行的,但是对于OQL来说这是完全透明的。每次查询这些对象时都会发生这种情况,这样writer_name属性就会成为书籍属性的一部分——尽管它是只读的。

也可以在一个查询中检索作者及其著作。例如,让我们检索2001年及以后每个作者写的书的列表。这可以使用查询实现:

SELECT
    Artist, Book FROM
    Book
    JOIN Artist ON Book.written_by = Artist.id
    WHERE Book.issued > '2001-01-01'

这个查询产生的数据集的每“行”都有两列:艺术家和书。

类继承
现在,由于这是一家现代书店,有几种媒体可供选择:音频、视频、书籍。它们都被声明为从数据模型中类别派生的类,如下图所示:

  • Item

    • Audio
    • Video
    • Book


由于Audio、Video和Book对象也是项(多亏了类继承),所以它们都可以在一个查询中检索到。例如,让我们检索所有不是法国生产的类别:

SELECT   
        Item   
       JOIN Producer ON Item.produced_by = Producer.id   
       WHERE Producer.country != ’France’

这个查询也将返回books,因为Book是一个项目……这是由于类继承:Book继承自Item,或者我们可以说Book是一个专门化的类别。

数据层次结构
让我们假设一本书有一个主题。

主题被组织为对象的层次结构。因此,一个主题可以有一个父主题:

让我们考虑以下主题层次结构:

  • 艺术
  • 历史

    • 考古学
      • 文明
      • 考古学家
      • 埃及学
    • 科学历史
    • 战争


书被附加到任何级别。

让我们列出所有关于历史的书:




这个查询将返回所有与“历史”、“考古”、“文明”、“埃及学”等主题相关的书籍,但不返回“艺术”。不管层次结构的深度如何,“历史”树中的所有主题都将被返回。

以下查询将只返回主题严格是“考古学”的书籍,例如“文明”、“考古学家”和“埃及学”:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x




上一篇:系统管理-管理员手册-OQL查询语言-iTop中的应用示例
下一篇:系统管理-管理员手册-OQL查询语言-历史版本
佳信

写了 280 篇文章,拥有财富 1490,被 3 人关注

您需要登录后才可以回帖 登录 | 立即注册
B Color Link Quote Code Smilies

成为第一个吐槽的人

Powered by IT 运维管理
返回顶部