本帖最后由 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'
这个查询产生的数据集的每“行”都有两列:艺术家和书。
类继承
现在,由于这是一家现代书店,有几种媒体可供选择:音频、视频、书籍。它们都被声明为从数据模型中类别派生的类,如下图所示:
由于Audio、Video和Book对象也是项(多亏了类继承),所以它们都可以在一个查询中检索到。例如,让我们检索所有不是法国生产的类别:
SELECT
Item
JOIN Producer ON Item.produced_by = Producer.id
WHERE Producer.country != ’France’
这个查询也将返回books,因为Book是一个项目……这是由于类继承:Book继承自Item,或者我们可以说Book是一个专门化的类别。
数据层次结构
让我们假设一本书有一个主题。
主题被组织为对象的层次结构。因此,一个主题可以有一个父主题:
让我们考虑以下主题层次结构:
书被附加到任何级别。
让我们列出所有关于历史的书:
这个查询将返回所有与“历史”、“考古”、“文明”、“埃及学”等主题相关的书籍,但不返回“艺术”。不管层次结构的深度如何,“历史”树中的所有主题都将被返回。
以下查询将只返回主题严格是“考古学”的书籍,例如“文明”、“考古学家”和“埃及学”:
|