当前位置: 首页 > 科技观察

查询语言的那些事儿:程序员应该知道的SQL、HQL、JPQL和CQL

时间:2023-03-21 19:47:06 科技观察

关于查询语言的那些事:程序员应该知道的SQL、HQL、JPQL、CQL看到一些类似的语言,貌似SQL,但是感觉哪里不对,但是因为没有系统的研究过,所以不了解知道他们叫什么。有些人可能知道有的是JPQL,有的是HQL,但是不知道它们的区别。今天我们就来看看QL家族的这些成员。1、SQL毫无疑问,对于大多数使用过数据库的程序员来说,SQL是最熟悉的。SQL是StructuredQueryLanguage的缩写,中文译为“结构化查询语言”。SQL是一种计算机语言,用于存储、检索和修改存储在关系数据库中的数据。SQL是关系数据库的标准语言。所有关系数据库管理系统(RDBMS),如MySQL、Oracle、SQLServer、MSAccess、Sybase、Informix、Postgres等,都使用SQL作为它们的标准处理语言。虽然目前主流的数据库SQL语言普遍遵循SQL92标准,但在具体实现上还是存在一些细微的差别。例如:判断一个值是否为空,则返回另一个值,否则返回自己的函数,在Mysql中是isnull(a,b),在Oracle中是nvl(a,b)。查询student表的前n行,在SQLServer中使用selecttopnnamefromstudent,在Mysql中使用selectnamefromstudentlimit5。因为这些细微的实现方式不同,所以这些主流数据库使用的SQL名称也不同。例如,SQLServer称为T-SQL,而Oracle称为PL/SQL。2、HQLHQL是HibernateQueryLanguage(休眠查询语言)的缩写。它是一种面向对象的查询语言,类似于SQL,但不是操作表和列,而是面向对象及其属性。HQL查询由Hibernate翻译成传统的SQL查询来操作数据库。所谓面向对象的查询语言更接近于人们对自然界的理解。比如我们要查询一个部门的人员名单,这是一个接近人的理解的面向对象的查询。实际的人员名单可能存储在数据库、Excel表格或Word中,这些实现的具体细节被面向对象的查询所忽略。不管最终从哪里查询(转换成什么样的SQL语句),最终都得到了人员列表对象的信息。一个典型的HQL如下:FromStudents;对应的SQL是Select*fromstudent;3、JPQLJPA(JavaPersistencequerylanguage,Java持久化查询语言)是一种与EJB3同时出现的面向对象的查询语言。它的标准是JSR220,它是在EJBQL的基础上形成的,一种面向EJB2.0的JavaBeans查询语言,吸收了HQL的优点。所以他看起来很像HQL。这种面向对象的查询语言与SQL语句的最大区别在于多对一或一对多的查询。例如订单类Order中有一个Customer类型的属性customer。反映在数据库中,订单表order中有一个字段userID,它是指向用户表customer的外键。那么在JPQL中,查询张三订单的语句如下:SelectofromOrderowhereo.customer.name='ZhangSan';对应的SQL语句为Selectorder.*fromorder,customerwhereorder.cid=customer.idandcustomer.name='张三';可以看到,JPQL中最大的特点是可以通过导航操作符“.”来传递对象之间的关系,而在SQL中则需要关联表查询。4.与其他三个QL家族的成员相比,CQL有些小众,甚至冠名权的归属也存在争议。目前主流的CQL有以下三种。一种是CQL(CommonQueryLanguage,公共查询语言),它是OGC为目录网络服务规范(CatalogueWebServiceSpecification)创建的一种查询语言,用于查询地图相关信息。这是一种基于过滤机制的查询语言。这样写:filter=WITHIN(geometry,POLYGON((-80.0-80.0,-80.050,80.050,-80.0-80.0)))ANDid<>371第二种是CQL(CassandraQueryLanguage),它是键值数据库cassandra中提供的一种类似SQL的查询语言,其语言类似于SQL。第三种是CQL(CypherQueryLanguage),它是图数据库提供的一种数据查询语言。它是一种声明式模式匹配语言。大致是这样写的MATCH(emp:Employee)RETURNemp.empid,emp.name,emp.salary,emp.deptno只是目前比较常见的一些查询语言。随着技术的发展,未来QL家族的成员可能会更多。