CSDN|乘风破浪的 SQL( 四 )
以下查询返回了 Bill 一周中的前两天计划里的第一项内容: select schedule[1:2][1:1] from sal_emp where name = 'bill';name |-----|Carol|使用下标可以访问数组的元素 , PostgreSQL 中的数组元素从 1 开始编号 。 以下语句用于修改数组中的数据切片: update sal_empset pay_by_quarter[1:2] = '{27000,27000}'where name = 'carol';PostgreSQL 为数组数据提供许多函数和运算符 , 例如以下查询使用 && 运算符查找曾经拿过 10000 报酬的员工: select name from sal_emp where pay_by_quarter && array[10000];name|----|Bill|unnest 函数可以将数组转换为关系表 , 例如: select name, unnest(pay_by_quarter), unnest(schedule) from sal_emp;name |unnest|unnest |-----|------||Bill | 10000|meeting |Bill | 10000|lunch |Bill | 10000|training |Bill | 10000|presentation|Carol| 20000|breakfast |Carol| 25000|consulting |Carol| 25000|meeting |Carol| 25000|lunch |PostgreSQL 还为数组提供了 GiST 和 GIN 类型的索引 , 可以优化数组数据的查询 。
除此之外 , 基于 PostgreSQL 的 PostGIS Raster、Oracle GeoRaster 以及 rasdaman 数组数据库则提供了更加完善的多维数组应用场景支持 。
SQL 与图形数据库
图形数据库(graph database)属于 NoSQL 的一种 , 使用节点、边和属性来表示和存储数据 , 使用图结构进行语义查询 。 图形数据库非常适合社交网络、人工智能、欺诈检测、推荐系统等领域中的复杂关系处理 。 Neo4j 是目前最著名的图形数据库 。
本文插图
2019 年 9 月 17 图形查询语言(GQL)成为了继 SQL 之后另一种新的 ISO 标准数据库查询语言 。 与此同时 , SQL 标准将会出现一个新的第 16 部分(SQL/PGQ)(Property Graph Query) , 在 SQL 中直接提供一些 GQL 功能 。
目前 , MariaDB(OQGRAPH)、Oracle、Microsoft SQL Server 等关系型数据库都提供了图结构存储支持 。 上图是 Oracle 中一个金融交易系统的图形数据库示例 , 其中 Account、Person 和 Company 是顶点 , ownerOf、worksFor 和 transaction 是边;另外 , name 和 number 是顶点的属性 , amount 是边的属性 。 它们可以使用以下数据表进行存储:
本文插图
基于这些表可以创建以下属性图形: CREATE PROPERTY GRAPH financial_transactionsVERTEX TABLES (Accounts LABEL Account,Persons LABEL Person PROPERTIES ( name ),Companies LABEL Company PROPERTIES ( name ))EDGE TABLES (TransactionsSOURCE KEY ( from_account ) REFERENCES AccountsDESTINATION KEY ( to_account ) REFERENCES AccountsLABEL ( transaction ) PROPERTIES ( amount ),PersonOwnerOfAccountSOURCE PersonsDESTINATION AccountsLABEL ownerOf NO PROPERTIES,CompanyOwnerOfAccountSOURCE CompaniesLABEL ownerOf NO PROPERTIES,PersonWorksForCompanySOURCE PersonsDESTINATION CompaniesLABEL worksFor NO PROPERTIES);接下来我们就可以直接使用 SQL 语句查询图结构 , 例如以下语句查找所有和名叫 Nikita 的人有过交易的人员和信息: SELECT owner.name AS account_holder, SUM(t.amount) AS total_transacted_with_Nikita FROM MATCH (p:Person) -[:ownerOf]-> (account1:Account) , MATCH (account1) -[t:transaction]- (account2) /* match both incoming and outgoing transactions */ , MATCH (account2:Account) <-[:ownerOf]- (owner:Person|Company) WHERE p.name = 'Nikita'GROUP BY owner
推荐阅读
- 企业家|乘风破浪的企业家丨来听听企业家们述说直挂云帆战商海
- 行业互联网|乘风破浪的企业家丨来听听企业家们述说直挂云帆战商海
- 无人科技|华测导航:人工智能让无人驾驶乘风破浪
- 索尼手机|乘风破浪!骁龙630+后置双摄,索尼现在当真玩“高价低配”
- 行业互联网|《浪姐》之后,芒果超媒靠什么继续乘风破浪?
- 行业互联网|乘风破浪,再聚蓉城!2020成都橡塑及包装展将于9月强势来袭
- 业务|乘风破浪,创维数字海外业务逆势增长
- 中老年网红|深网丨那些乘风破浪的网红奶奶们:收入比工资高,粉丝几千几千打赏
- 行业互联网,苏宁|“小姐姐经济”推动消费增长,这才是真正的“乘风破浪”
- commit|SQL中为什么经常要加NOLOCK?
