小程序容器助力企业在金融与物联网领域实现高效合规运营,带来的新机遇与挑战如何管理?
392
2023-12-29
这篇文章主要讲解了“SQL和nGQL区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQL和nGQL区别有哪些”吧!
SQL (Structured Query Language) 是具有数据操纵和数据定义等多种功能的数据库语言,这种语言是一种 特定目的编程语言,用于管理 关系数据库管理系统(RDBMS),或在 关系流数据管理系统(RDSMS)中进行流处理。
nGQL 是一种类 SQL 的声明型的文本查询语言,相比于 SQL, nGQL 为可扩展、支持图遍历、模式匹配、分布式事务(开发中)的图数据库查询语言。
数据定义语言(DDL)用于创建或修改数据库的结构,也就是 schema。
索引对比项SQLnGQL创建索引CREATE INDEXCREATE {TAG | EDGE} INDEX删除索引DROP INDEXDROP {TAG | EDGE} INDEX列出索引SHOW INDEX FROMSHOW {TAG | EDGE} INDEXES重构索引ANALYZE TABLEREBUILD {TAG | EDGE} INDEX <index_name> [OFFLINE]数据操作语言(DML)数据操作语言(DML)用于操作数据库中的数据。
数据查询语言(DQL)数据查询语言(DQL)语句用于执行数据查询。本节说明如何使用 SQL 语句和 nGQL 语句查询数据。
SELECT [DISTINCT] select_expr [, select_expr] ... [FROM table_references] [WHEREwhere_condition] [GROUP BY {col_name | expr | position}] [HAVING where_condition] [ORDER BY{col_name | expr |position} [ASC | DESC]]GO [[<M> TO] <N> STEPS ] FROM <node_list> OVER <edge_type_list>[REVERSELY] [BIDIRECT] [WHERE where_condition] [YIELD [DISTINCT]<return_list>] [| ORDER BY<expression> [ASC | DESC]] [| LIMIT [<offset_value>,] <number_rows>] [| GROUP BY {col_name | expr | position} YIELD<col_name>] <node_list> | <vid> [, <vid> ...] | $-.id <edge_type_list> edge_type [, edge_type ...] <return_list> <col_name> [AS <col_alias>] [, <col_name> [AS <col_alias>] ...]数据控制语言(DCL)数据控制语言(DCL)包含诸如 GRANT 和 REVOKE 之类的命令,这些命令主要用来处理数据库系统的权限、其他控件。
对比项SQLnGQL创建用户CREATE USERCREATE USER删除用户DROP USERDROP USER更改密码SET PASSWORDCHANGE PASSWORD授予权限GRANT <priv_type> ON [object_type] TO <user>GRANT ROLE <role_type> ON <space> TO <user>删除权限REVOKE <priv_type> ON [object_type] TO <user>REVOKE ROLE <role_type> ON <space> FROM <user>查询语句基于以下数据模型:
RDBMS 关系结构图Nebula Graph 最小模型图本文将使用 NBA 数据集。该数据集包含两种类型的点,也就是两个标签,即 player 和 team ;两种类型的边,分别是 serve 和 follow。
在关系型数据管理系统中(RDBMS)中,我们用表来表示点以及与点相关的边(连接表)。因此,我们创建了以下表格:player、team、serve 和 follow。在Nebula Graph 中,基本数据单位是顶点和边。两者都可以拥有属性,相当于 RDBMS 中的属性。
在 Nebula Graph中,点之间的关系由边表示。每条边都有一种类型,在 NBA 数据集中,我们使用边类型 serve 和 follow 来区分两种类型的边。
首先,让我们看看如何在 RDBMS 中插入数据。我们先创建一些表,然后为这些表插入数据。
CREATE TABLE player (id INT, name VARCHAR(100), age INT); CREATE TABLEteam (id INT, name VARCHAR(100)); CREATE TABLE serve (player_id INT, team_id INT, start_year INT, end_year INT);CREATE TABLE follow (player_id1 INT, player_id2 INT, degree INT);然后插入数据。
INSERT INTO player VALUES (100, Tim Duncan, 42), (101, Tony Parker, 36), (102, LaMarcus Aldridge, 33), (103, Rudy Gay,32), (104, Marco Belinelli, 32), (105, Danny Green, 31), (106, Kyle Anderson, 25), (107, Aron Baynes, 32), (108, Boris Diaw, 36), (109, Tiago Splitter, 34), (110, Cory Joseph, 27); INSERT INTO team VALUES (200, Warriors), (201, Nuggets), (202, Rockets), (203, Trail), (204, Spurs), (205, Thunders), (206, Jazz), (207, Clippers), (208, Kings); INSERT INTO serve VALUES (100,200,1997,2016), (101,200,1999,2010), (102,200,2001,2005), (106,200,2000,2011), (107,200,2001,2009), (103,201,1999,2018), (104,201,2006,2015), (107,201,2007,2010), (108,201,2010,2016), (109,201,2011,2015), (105,202,2015,2019), (109,202,2017,2019), (110,202,2007,2009); INSERT INTO follow VALUES (100,101,95), (100,102,91), (100,106,90), (101,100,95), (101,102,91), (102,101,75), (103,102,70), (104,103,50), (104,105,60), (105,104,83), (105,110,87), (106,100,88), (106,107,81), (107,106,92), (107,108,97), (108,109,95), (109,110,78), (110,109,72), (110,105,85);在 Nebula Graph 插入数据在 Nebula Graph中插入数据与上述类似。首先,我们需要定义好数据结构,也就是创建好 schema。然后可以选择手动或使用 Nebula Graph Studio (Nebula Graph 的可视化工具)导入数据。这里我们手动添加数据。
在下方的 INSERT 插入语句中,我们向图空间 NBA 插入了球员数据(这和在 MySQL 中插入数据类似)。
INSERT VERTEX player(name, age) VALUES 100: (Tim Duncan, 42), 101: (Tony Parker, 36), 102: (LaMarcus Aldridge, 33), 103: (Rudy Gay, 32), 104: (Marco Belinelli, 32), 105: (Danny Green, 31), 106: (Kyle Anderson, 25), 107: (Aron Baynes, 32), 108: (Boris Diaw, 36), 109: (Tiago Splitter, 34), 110: (Cory Joseph,27);考虑到篇幅限制,此处我们将跳过插入球队和边的重复步骤。你可以点击 此处-示例数据亲自尝试。
本节介绍如何使用 SQL 和 nGQL 语句创建(C)、读取(R)、更新(U)和删除(D)数据。
插入数据mysql> INSERT INTO player VALUES (100, Tim Duncan, 42); nebula> INSERT VERTEX player(name, age)VALUES 100: (Tim Duncan, 42);查询数据查找 ID 为 100 的球员并返回其 name 属性:
mysql> SELECT player.name FROM player WHERE player.id = 100; nebula> FETCH PROP ON player 100 YIELD player.name;更新数据mysql>UPDATE player SET name =Tim; nebula> UPDATE VERTEX 100 SET player.name = "Tim";删除数据mysql>DELETE FROM player WHERE name =Tim; nebula> DELETE VERTEX 121; nebula> DELETE EDGE follow 100 -> 200;返回年龄超过 36 岁的球员。
SELECTplayer.nameFROM player WHERE player.age < 36;使用 nGQL 查询有些不同,因为您必须在过滤属性之前创建索引。更多信息请参见 索引文档。
CREATETAG INDEX player_age ON player(age);REBUILD TAG INDEX player_age OFFLINE; LOOKUPON player WHERE player.age <36;本节提供一些示例查询供您参考。
示例 1在表 player 中查询 ID 为 100 的球员并返回其 name 属性。
SELECTplayer.nameFROM player WHERE player.id = 100;接下来使用 Nebula Graph 查找 ID 为 100 的球员并返回其 name 属性。
FETCH PROP ON player 100 YIELD player.name;Nebula Graph使用 FETCH 关键字获取特定点或边的属性。本例中,属性即为点 100 的名称。nGQL 中的 YIELD 关键字相当于 SQL 中的 SELECT。
示例 2查找球员 Tim Duncan 并返回他效力的所有球队。
SELECTa.id, a.name, c.nameFROM player a JOIN serve b ON a.id=b.player_id JOIN team c ON c.id=b.team_id WHERE a.name = Tim Duncan使用如下 nGQL 语句完成相同操作:
CREATE TAG INDEX player_name ON player(name); REBUILD TAG INDEX player_name OFFLINE; LOOKUP ON player WHERE player.name == Tim Duncan YIELD player.name AS name | GO FROM $-.VertexID OVER serve YIELD $-.name, $$.team.name;这里需要注意一下,在 nGQL 中的等于操作采用的是 C 语言风格的 ==,而不是SQL风格的 =。
示例 3以下查询略复杂,现在我们来查询球员 Tim Duncan 的队友。
SELECT a.id, a.name, c.name FROMplayer aJOIN serve b ON a.id=b.player_id JOIN team c ON c.id=b.team_id WHERE c.name IN (SELECT c.name FROM player a JOIN serve b ON a.id=b.player_id JOIN team c ON c.id=b.team_id WHERE a.name = Tim Duncan)nGQL 则使用管道将前一个子句的结果作为下一个子句的输入。
GO FROM 100 OVER serve YIELD serve._dst AS Team | GO FROM $-.Team OVER serve REVERSELY YIELD$$.player.name;感谢各位的阅读,以上就是“SQL和nGQL区别有哪些”的内容了,经过本文的学习后,相信大家对SQL和nGQL区别有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~