没有合适的资源?快使用搜索试试~ 我知道了~
HAL编号:tel-02309327:超越编程语言和数据库界限,跨学科存储与传播科研文献
https://theses.hal.science/tel-02309327Julien LopezJulien Lopez.Breaking boundaries between programming languages and databases.Databases[cs.DB]. Université Paris Saclay (COmUE), 2019. English. NNT : 2019SACLS235. tel-023093270HAL编号:tel-023093270提交日期:2019年10月9日0HAL是一个多学科开放获取档案,用于存储和传播科学研究文献,无论其是否已发表。这些文献可以来自法国或国外的教育和研究机构,也可以来自公共或私人研究中心。0HAL多学科开放获取档案,旨在存储和传播法国或国外的教育和研究机构、公共或私人实验室发表或未发表的科研文献。0超越编程语言和数据库之间的界限0引用此版本:Julien Lopez0博士学位论文NNT:2019SACLS2350超越编程语言和数据库之间的界限0巴黎-萨克莱大学博士学位论文,由巴黎南大学准备0第580号信息与通信科学与技术(STIC)博士学位学科:计算机科学0在2019年9月13日于奥塞举行的论文答辩,由0评审委员会成员:0James Cheney读者,爱丁堡大学评审人0Emmanuel Chailloux教授,巴黎索邦大学(UMR 7606)评审人0Alan Schmitt研究主管,INRIA雷恩(UMR 6074)考官0Jérôme Siméon首席科学家,Clause公司考官0Sarah Cohen Boulakia教授,巴黎南大学(UMR 8623)评审委员会主席0Véronique Benzaken教授,巴黎南大学(UMR 8623)博士论文导师0Kim Nguyen副教授,巴黎南大学(UMR 8623)博士论文共同导师0GiuseppeCastagna研究主管,法国国家科学研究中心和巴黎大学(UMR8243)特邀嘉宾ii0致谢0首先,我要感谢我的博士导师Véronique Benzaken和KimNguyen。Véronique总是在我需要的时候接受我,她的精力、对计算机科学的热情以及她向我介绍SQL中最大的语法错误都让我受益匪浅。Kim与我分享了他在λ演算到JavaScript最黑暗的魔法方面的科学知识,他的教学经验拓宽了我的知识面,他耐心地以不同的方式解释一个概念,直到我固执的头脑理解为止,他在论文的各个方面提供了宝贵的帮助,特别是在写作方面,尽管他每天大约有一百节课。非常感谢你们两个为我提供高质量的指导,给我机会,并在困难时期以人性的方式对待我。这个博士学位对我来说是一次非常有益的经历,我永远不会忘记你们为我所做的一切。同时也要感谢James Cheney和ÉmmanuelChailloux同意成为我的论文评审人。我很荣幸你们抽出时间仔细审查我的工作,并感谢你们的修改和有关意见。感谢Alan Schmitt、Jérôme Siméon和Sarah CohenBoulakia同意成为我的论文评审委员会成员。我非常感激GiuseppeCastagna,他不仅指导了我在工程学院的研究阶段,为我带来了第一次研究经历,还为我提供了这个博士课题的机会,支持我在MPRI的一年里,并在整个博士期间提供了宝贵的帮助。非常感谢Beppe,没有他这项工作是不可能的。我还要感谢LaurentDaynes,我的OracleLabs实习导师,他让我有机会在他的团队工作,与Oracle的工程师合作开始研究我的课题。感谢Romain Vernoux的实习工作为我的研究提供了坚实的基础,以及AlbanPetit和RomainLiautaud在实习期间对我的解决方案的工作。然后,感谢LRI的同事们和VALS团队,让我能在一个温暖的环境中工作。感谢SylvainConchon,与他一起工作是一种荣幸。0iii0我通过教学加强了我的OCaml知识,特别是如何使用match实现视频游戏,并学到了模型检测。感谢GuillaumeMelquiond教我正确地使用C++(不带*),以及ThibautBalabonski让我重新学习编译知识,这些对我非常有用。感谢Jean-ChristopheFilliâtre与我分享他在OCaml方面的知识,并借给我他的《六千万法国人不会错》一书。感谢FrédéricVoisin为一个慌乱的博士生找到了复印室的门禁码,以及在咖啡角的每周笑话(周一到周五)。感谢SylvieBoldo在JFLA的文章审查中对我提供帮助,与Véronique一起在学术招聘方面的宝贵帮助,以及关于制作海报的神奇机器的运作方式。感谢Hai和Stefania提前向我展示了我在最后一年会处于什么状态,感谢Robin倾听我关于马里奥64速通的无聊抱怨,感谢Albin的橙子酒,感谢Bruno的自行车骑行,感谢Alexandrina在我需要时逗我笑并给予友谊。啊,还要感谢Mattias的休息时间,几乎让我想玩MOBA游戏,并教我制作意大利面碳酸酱的奶油量。感谢我的老朋友们,Pierre-Alain、Pierre-Alain、Frédéric、Romain,尽管距离遥远,但一直支持我,以及Bertrand、Solenne、Thibaut和Pierre-Jean,我们一起喝酒、玩Borderlands。特别感谢我的家人,尤其是我的父母、外婆、弟弟和妹妹。没有你们的爱和支持,我永远不会走得这么远。最后,感谢你,Jenny。感谢你的支持,对我过于法式的英语进行纠正,以及我们一起度过的美好岁月。0iv0v0vi0摘要0有几类解决方案允许编程语言表达查询:特定API(如JDBC)、对象关系映射(ORM)(如Hibernate)和语言集成查询框架(如Microsoft的LINQ)。然而,大多数这些解决方案不允许进行高效的跨数据库查询,并且没有允许在查询中使用复杂的应用逻辑。本论文研究了一种名为BOLDR的新型语言集成查询框架的设计,该框架允许在数据库中评估用通用编程语言编写的包含应用逻辑的查询,并针对不同数据模型的多个数据库进行操作。在该框架中,应用查询被转换为中间表示形式。然后,它们通过一个可扩展的类型系统与数据库进行类型匹配,以便检测每个子表达式应该转换为哪种数据库语言。该类型系统还允许我们在执行之前检测一类错误。接下来,为了避免查询雪崩并充分利用数据库的优化,它们被重写。最后,查询被发送到相应的数据库进行评估,并将结果转换回应用程序。我们的实验表明,我们实现的技术适用于真实世界的数据库应用程序,能够成功处理各种语言集成查询,并具有良好的性能。0简历0有几类解决方案允许编程语言表达查询:特定API(如JDBC)、对象关系映射(ORM)(如Hibernate)和语言集成查询框架(如Microsoft的LINQ)。然而,大多数这些解决方案不允许进行高效的跨数据库查询,并且没有允许在查询中使用复杂的应用逻辑。本论文研究了一种名为BOLDR的新型语言集成查询框架的设计,该框架允许在数据库中评估用通用编程语言编写的包含应用逻辑的查询,并针对不同数据模型的多个数据库进行操作。在该框架中,应用查询被转换为中间表示形式。然后,它们通过一个可扩展的类型系统与数据库进行类型匹配,以便检测每个子表达式应该转换为哪种数据库语言。该类型系统还允许我们在执行之前检测一类错误。接下来,为了避免查询雪崩并充分利用数据库的优化,它们被重写。最后,查询被发送到相应的数据库进行评估,并将结果转换回应用程序。我们的实验表明,我们实现的技术适用于真实世界的数据库应用程序,能够成功处理各种语言集成查询,并具有良好的性能。0第七章0不允许同时查询多个数据库,并且不允许在数据库查询中使用复杂的应用逻辑。本论文提出了一种名为BOLDR的嵌入式查询框架,允许在通用编程语言中编写包含应用逻辑的查询,并在异构数据库中进行评估。在该框架中,应用程序的查询被转换为查询的中间表示。然后,使用可由数据库扩展的类型系统对其进行类型化,以确定每个子表达式应该转换为哪种数据语言。此类型化阶段还可以在执行之前检测到某些错误。然后,对查询进行重写以避免“查询雪崩”现象,并最大限度地利用数据库的优化能力。最后,将查询发送到目标数据库进行评估,并将结果转换为应用程序的编程语言。我们的实验表明,该框架中实现的技术适用于真实的数据中心应用,并能够有效地处理各种通用编程语言中的嵌入式查询。0注:为了更广泛地传播,并与巴黎-萨克雷STIC博士学院达成一致,本论文以英文撰写。有关用法语撰写的扩展摘要,请参见附录A第163页。0第八章1.2SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2ix0目录01 引言 101.1 上下文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.2.1 关系代数 . . . . . . . . . . . . . . . . . . . . . . . . . 301.2.2 在SQL中表达查询 . . . . . . . . . . . . . . . . . . . 401.3 应用程序编程语言 . . . . . . . . . . . . . . . . . . . . . . . . 501.4 从应用程序语言发送查询 . . . . . . . . . . . . . . . . . . . . . . 601.4.1 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601.4.2 ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701.4.3 LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801.4.4 Apache Calcite . . . . . . . . . . . . . . . . . . . . . . . 1201.4.5 其他接口 . . . . . . . . . . . . . . . . . . . . . . . . . 1201.5 一种新的解决方案:BOLDR . . . . . . . . . . . . . . . . . . . . . . 1201.5.1 特性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301.5.2 详细描述 . . . . . . . . . . . . . . . . . . . . . . . 1401.5.3 实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1801.6 贡献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1901.6.1 查询中间表示 . . . . . . . . . . . . . . . . . . . . . . 1901.6.2 QIR类型系统 . . . . . . . . . . . . . . . . . . . . . . 2001.6.3 QIR类型推断 . . . . . . . . . . . . . . . . . . . . . . . 2001.6.4 面向类型的评估 . . . . . . . . . . . . . . . . . . . 2101.6.5 实现和实验 . . . . . . . . . . . . . . . . . . . . . . . 2102 定义 2302.1 基本符号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2302.2 语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2402.3 推理系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2503 查询中间表示 2703.1 语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2803.2 基本语义 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3203.3 扩展语义 . . . . . . . . . . . . . . . . . . . . . . . . . . . 3403.4 默认数据库语言: MEM . . . . . . . . . . . . . . . . . 39x03.5 QIR 规范化 . . . . . . . . . . . . . . . . . . . . . . . . . . 4203.5.1 动机 . . . . . . . . . . . . . . . . . . . . . . . . . . . 4203.5.2 规范化的约简关系 . . . . . . . . . . . . . . . . . . 4303.5.3 优秀查询的度量 . . . . . . . . . . . . . . . . . 4603.5.4 通用度量 . . . . . . . . . . . . . . . . . . . . . . . 4903.5.5 基于启发式的规范化 . . . . . . . . . . . . . . . . 5104 QIR 类型系统 5504.1 QIR 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5604.2 QIR 类型系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5904.3 类型安全 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6604.3.1 类型的进展和保持 . . . . . . . . . . . . . . 6604.3.2 强规范化 . . . . . . . . . . . . . . . . . . . . . 6904.4 SQL 的规范类型系统 . . . . . . . . . . . . . . . . . . . . 7405 QIR 类型推断 8105.1 类型算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . 8305.2 MEM 的规范类型算法 . . . . . . . . . . . . . . . . . 8505.3 约束解决 . . . . . . . . . . . . . . . . . . . . . . . . . . 9705.4 SQL 的规范类型算法 . . . . . . . . . . . . . . . . . . 10606 类型导向的评估 10906.1 翻译成数据库语言 . . . . . . . . . . . . . . . . . 109 6.1.1 规范和通用翻译 . . . . . . .. . . . .06.1.2 SQL 的规范翻译 . . . . . . . . . . . . . . . . 11406.2 类型安全的 SQL 翻译 . . . . . . . . . . . . . . . . . . . . . . 11706.3 扩展到 SQL 的标量子查询 . . . . . . . . . . . . . . . 12606.4 类型导向的规范化 . . . . . . . . . . . . . . . . . . . . . 12707 实现和实验 12907.1 从宿主语言翻译到QIR . . . . . . . . . . . . . . . . . . . . . . . 12907.2 Tru�e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13607.3 实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 7.3.1 QIR . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 13807.3.2 FastR 的接口 . . . . . . . . . . . . . . . . . . . . . . . 14407.3.3 数据库中的宿主语言表达式 . . . . . . . . . . . . 14507.4 实验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14608 结论 15308.1 相关工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15308.2 结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15608.3 未来工作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1570附录 161A.4.1JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168A.4.3LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171xi0扩展简历 1630A.1 背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 A.2 SQL . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 1640A.2.1 关系代数 . . . . . . . . . . . . . . . . . . . . . 1650A.2.2 用SQL表达查询 . . . . . . . . . . . . . . . . 1660A.3 应用程序编程语言 . . . . . . . . . . . . . . . . . . . . . . . 167 A.4从应用程序语言查询 . . . . . . . . . . . . . . 1680A.4.2 ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1700A.4.4 Apache Calcite . . . . . . . . . . . . . . . . . . . . . . . 1740A.4.5 其他接口 . . . . . . . . . . . . . . . . . . . . . . . 1750A.5 一种新的解决方案:BOLDR . . . . . . . . . . . . . . . . . . . 1750A.5.1 功能 . . . . . . . . . . . . . . . . . . . . . . . . 1750A.5.2 详细描述 . . . . . . . . . . . . . . . . . . . . . 1770A.5.3 实现 . . . . . . . . . . . . . . . . . . . . . . . . 1810A.6 贡献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1820A.6.1 查询中间表示 (QIR) . . . . . . . . . . . . . . 1820A.6.2 QIR的类型系统 . . . . . . . . . . . . . . . . . 1830A.6.3 QIR的类型推断 . . . . . . . . . . . . . . . . . 1840A.6.4 基于类型的求值 . . . . . . . . . . . . . . 1840A.6.5 实现和实验 . . . . . . . . . . . . . . . . . . 1840B 完整证明 1870参考文献 213xii0符号列表0≡ 语法等价 . . . . . . . . . . . . . . . . . . . . 230= 等于 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230� 空集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230� 子集包含 . . . . . . . . . . . . . . . . . . . . . . . . . . . 230∪ , ∩ , \ 集合的并、交和差 . . . 230dom( f ) 函数 f 的定义域 . . . . . . . . . . . . . . . . . . . . 230img( f ) 函数 f 的值域 . . . . . . . . . . . . . . . . . . . . . . 230i..j 整数集合 { i, i + 1 , . . . , j } . . . . . . . . . . . . . . 230_ 占位符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230Γ 类型环境 . . . . . . . . . . . . . . . . . . . . . . . 240γ 求值环境 . . . . . . . . . . . . . . . . . . . . 240σ 类型替换 . . . . . . . . . . . . . . . . . . . . . . . . . . 240σ 1 ◦ σ 2 类型替换的组合 . . . . . . . . . . 240( E H , I H , V H , H → ) 宿主语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240( E D , V D , D → ) 数据库语言 . . . . . . . . . . . . . . . . . . . . . . . . 250( A , c ) 推理规则 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260q QIR表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280C ( q ) QIR表达式的子节点 . . . . . . . . . . . . . . 320T ( q ) QIR表达式所针对的数据库 . . . . . . . . . . . . . 320( H −→ EXP , −→ VAL H , H −→ VAL ) 宿主语言驱动程序 . . . . . . . . . . . . . .0( −−→ EXP D , −→ VAL D , D −→ VAL ) 数据库驱动程序 . . . . . . . . . . . . . . .0� 扩展的QIR语义 . . . . . . . . . . . . . . . . . . . 370MEM MEM数据库语言 . . . . . . . . . . . . . . . . . . . 400� → 规范化关系 . . . . . . . . . . . . . . . . . . . . . . 450M D ( q ) 通过数据库的QIR表达式的度量 470M ( q ) QIR表达式的通用度量 . . . . . . . 490Reds ( q ) QIR表达式的可能规约 . . . . 510B 基本QIR类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560T QIR类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560dom( R ) QIR记录类型的域 . . . . . . . . . . . . . . 560xiii0� 子类型关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580� 严格子类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580Γ � D q : T 特定类型系统 . . . . . . . . . . . . . . . . . . . . . . . 590Γ � q : T, D 通用类型系统 . . . . . . . . . . . . . . . . . . . . . . . 600j � j ′ 类型推断判断的特化 640( A , c ) � ( A ′ , c ′ ) 类型推断规则的特化 . . . . . . 650T 算法性QIR类型 . . . . . . . . . . . . . . . . . . . . . 830C , T = T ′ 类型约束集合,类型约束 . . . . . 830k 类别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 840K , α k = T 类别约束集合,类别约束 . . . . . 840Γ � A q : T , ( C , K ) , D 通用类型算法 . . . . . . . . . . . . . . . . . . 850( K , σ ) 类别替换 . . . . . . . . . . . . . . . . . . . . . . . . 1040q D � e 特定翻译 . . . . . . . . . . . . . . . . . . . . . . . . 1100q � 通用翻译 . . . . . . . . . . . . . . . . . . . . . . . . 1110� � → 面向类型的规范化 . . . . . . . . . . . . . . . 1270R � 从R到QIR的翻译 . . . . . . . . . . . . . . . . . 1320xiv10第1章0引言0注:本论文处于编程语言和数据库领域的交叉点。因此,本介绍部分描述了来自这两个领域的一些基本概念,以帮助不熟悉的读者。01.1 背景0存储、访问和操作数据对于大多数应用程序来说是不可避免且至关重要的。Web、统计和人工智能应用程序、物联网等都需要访问存储在异构数据源中的大量信息。应用程序通常使用通用编程语言编写,选择的语言取决于其对特定领域常见操作的支持(例如,R或Python用于统计分析和数据挖掘,JavaScript用于Web编程)。这些编程语言通常是命令式的,意味着用户必须使用一系列修改程序状态的语句来描述如何访问和处理信息。应用程序所需的信息存储在数据库中,这些数据库由数据库管理系统(DBMS)管理。这些系统处理存储、使用查询语言快速访问数据、容错性、可扩展性、机密性等。查询语言中的表达式称为查询,描述了所请求的数据,而不是以命令式的方式描述如何检索数据,让DBMS选择获取所请求信息的最佳方式。为了访问存储在数据库中的数据,应用程序向数据库发送以其查询语言编写的查询。典型的面向数据的应用程序包括将应用程序与不同的目标数据库进行接口的组件。例如,最近的一种技术称为多语言持久性[JSF12],它包括在一个应用程序中访问不同类型的数据库,以利用不同数据库模型在不同部分中的能力。20电子商务应用0键值数据库 关系数据库 文档数据库0用户会话 购物车0用户账户0日志0库存0财务数据0图1.1 - 使用不同类型数据库的应用程序示例0应用程序的示例如图1.1所示。0本论文是一项研究,旨在创建一种解决方案,使应用程序开发人员能够编写针对数据库的安全且高效的查询,而无需强制他们成为目标数据库的数据模型和查询语言的专家。0在本介绍中,我们首先概述数据库查询语言、应用程序开发中使用的编程语言以及接口这两个世界和过程中遇到的问题的现有解决方案。然后,我们描述了一种新的解决方案,即一种名为BOLDR的新型语言集成查询框架。01.2 SQL0SQL(结构化查询语言)是最流行的查询语言。它是一种基于关系代数的特定领域语言。30id name salary teamid01 Lily Pond 5200 202 Daniel Rogers 4700 103 Olivia Sinclair 6000 10(a) Employee表0teamid teamname bonus01 研发部 50002 Sales 6000(b) Team表0图1.2 - 数据以表形式组织的示例01.2.1 关系代数0关系代数,最初由Edgar F. Codd [ Cod70]设计,定义了对数据的操作,这些数据表示为一组n元组,其中元组的每个元素对应于以名称表示的属性。关系数据库将这些构造称为表,由行和列组成。图1.2给出了表的示例。0关系代数是大多数数据库查询语言的基础[ AHV95]。关系代数的最常见操作有投影,它将元组限制为一组属性;选择(或过滤器),它仅保留满足条件的元组;以及连接,它返回两个表中所有具有相同公共属性的元组的所有组合的集合。图1.3显示了这些操作在表上的应用示例。图1.3a显示了在属性name和salary上对表Employee进行的投影,图1.3b显示了在属性salary的值大于5000的元组上对表Employee的选择,图1.3c显示了Employee和Team之间的连接的结果。0name salary0Lily Pond 52000Daniel Rogers 47000Olivia Sinclair 60000(a) 对Employee进行投影0id name salary teamid01 Lily Pond 5200 203 Olivia Sinclair 6000 10(b) 对Employee进行选择0id name salary teamname bonus01 Lily Pond 5200 Sales 60002 Daniel Rogers 4700 Sales 60003 Olivia Sinclair 6000 R&D 5000(c) Employee和Team之间的连接0图1.3 - 关系代数应用示例401.2.2 在SQL中表达查询0SQL提供了关系代数操作的访问,作为一种声明性编程语言。换句话说,SQL编程不是逐步描述如何执行计算以实现所需的结果,而是描述所需的结果。为了实现这一点,SQL采用了类似自然语言的语法。例如,图1.3a的投影可以在SQL中写为:0SELECT name, salary FROM Employee0其中SELECT表示投影,FROM表示数据操作符From,返回表的内容。图1.3b的选择可以写成:0SELECT * FROM Employee WHERE salary > 50000其中*表示所有列。最后,图1.3c的连接可以写成:0SELECT * FROM Employee NATURAL JOIN Team0或类似地:0SELECT * FROM Employee, Team WHERE Employee.deptno = Team.deptno0如上所示,在最后一个查询中,表的名称可以用作相应表的当前行的名称,以消除对要访问的列的值的歧义。SQL还允许使用关键字AS为表创建别名,以给临时名称。例如,可以将最后一个查询写成:0SELECT * FROM Employee AS e, Team AS t WHERE e.deptno = t.deptno0这些别名在这样的查询中并不直接有用,其中表名已经区分了行,但在某些查询中是必需的,例如自连接,它在表与自身之间应用Join运算符,或者为子查询的结果给出一个名称:0SELECT * FROM Employee e, (SELECT 1 AS teamid, 'R&D' AS teamname,500 AS bonus UNION ALL SELECT 2 AS teamid, 'Sales' AS teamname, 6000WHERE e.deptno = t.deptno0在最后一个查询中,UNION ALL子查询创建了以下匿名表:0teamid teamname bonus01研发50002 Sales 600filteredTable.append(employee)50然后将其绑定到别名t,并在WHERE子句中使用该名称引用表。SQL的简单语法是它如此受欢迎的原因之一,也是最常用的查询语言。大多数数据库都支持SQL,即使没有直接适用于关系代数的数据模型。因此,SQL是一种不可避免的数据库语言,用于研究允许程序员向数据库发送查询的解决方案。01.3应用程序编程语言0大多数数据驱动的应用程序是用命令式编程语言编写的。特别是Python被广泛用于Web应用程序和机器学习。它是一种非常流行的编程语言,因为它的语法简单,并且有许多领域特定的库,如机器学习、通用算法和统计学。JavaScript广泛用于Web应用程序。R是一种专为统计应用和数据分析而设计的语言。Java是一种广泛使用的通用编程语言,具有用于Web开发、机器学习、文本处理等的众多库。与像SQL这样的声明式编程不同,命令式编程涉及逐步描述程序的控制流程,这要求这些语言的程序员描述如何达到所需的结果。例如,在Python中,过滤表通常会写成以下形式:0filteredTable = [] foremployee in employees:0if(employee['salary']> 5000):0然而,现代编程语言已经努力支持函数式编程的某些方面,使得面向数据的应用程序不再那么技术细节化。例如,我们可以使用Python的列表推导式[Kuh11]来编写上面的示例:0[employee for employee in employees if
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功