查詢語言的那些事兒:程序員應該知道的SQL、HQL、JPQL和CQL
本文轉載自微信公眾號「活在信息時代」,作者活在信息時代。轉載本文請聯系活在信息時代公眾號。
對于很多經常與數據庫打交道的程序員們來說,SQL自然是輕車熟路了,但是很多程序員經常在一些源代碼里看到一些長得很像SQL,卻感覺哪里有些不對的類似語言,但因為沒有系統的學習過,所以不知道他們叫什么。
有些人可能知道他們有些是JPQL有些是HQL,但是卻不知道他們各自有什么區別。今天我們就來看看QL家族的這些成員。
一、SQL
毫無疑問,SQL是大部分用過數據庫的程序員最為熟悉的了。SQL 是 Structured Query Language 的縮寫,中文譯為“結構化查詢語言”。SQL 是一種計算機語言,用來存儲、檢索和修改關系型數據庫中存儲的數據。SQL 是關系型數據庫的標準語言,所有的關系型數據庫管理系統(RDBMS),比如 MySQL、Oracle、SQL Server、MS Access、Sybase、Informix、Postgres 等,都將 SQL 作為其標準處理語言。雖然現在主流的數據庫SQL語言大體上都是遵循SQL92標準的,但是在具體實現上卻有些細微的差別。例如:判斷一個值如果是空的話就返回另一個值,否則返回其自身的函數,在Mysql里是isnull(a, b),而在Oracle里則是nvl(a,b)。而查詢student表里前n行的語句,在SQL Server里用
select top n name from student,
而在Mysql里使用select name from student limit 5。
正因為這些細微的實現不一樣,所以這些主流數據庫用的SQL在名字上也不太一樣。例如SQL Server里叫T-SQL,而Oracle叫PL/SQL。
二、HQL
HQL是Hibernate Query Language(Hibernate 查詢語言)的縮寫,它是一種面向對象的查詢語言,類似于 SQL,但不是去對表和列進行操作,而是面向對象和它們的屬性。HQL查詢被 Hibernate 翻譯為傳統的 SQL 查詢從而對數據庫進行操作。
所謂面向對象的查詢語言在使用上更貼近人們對于自然的理解,例如說,我們要查詢一個部門的人員名單,這是一個接近于人們理解的,面向對象的查詢。而實際的人員名單,則可能保存在數據庫里、Excel表里、Word里,這些實現的具體細節為面向對象的查詢所忽略。無論是最終從哪里查詢出來的(轉換成什么樣的SQL語句),最終得到的就是人員名單這個對象的信息。
一個典型的HQL如下:
- From Student s;
- 其對應的SQL則為
- Select * from student;
三、JPQL
JPA(Java Persistence query language, Java持久化查詢語言)是在EJB3出現的時候同時出現的面向對象查詢語言,其標準為JSR 220。他是在面向EJB2.0的JavaBeans的查詢語言EJB QL基礎上,吸收了HQL的優點而形成的。所以他長得和HQL非常的像。
這種面向對象的查詢語言與SQL語句最大的區別在對于多對一或一對多的查詢之中。例如說訂單類Order里有一個類型為Customer的屬性customer。在數據庫里體現為訂單表order里有一個字段用戶ID為指向用戶表customer的一個外鍵。那么在JPQL里,查詢張三訂單的語句如下:
而對應的SQL語句則為
大家可以看到,JPQL里面最大的特點是其對象之間的關聯關系可以通過導航運算符“.”一路點過去,而在SQL里則需要關聯表查詢。
四、CQL
相比于其它三種QL家族的成員,CQL則有些小眾了,甚至命名權的歸屬都還存在爭議。目前來講,主流的CQL有以下三種。
一種是CQL(Common Query Language,公共查詢語言)是OGC為 Catalogue Web Services specification (目錄Web服務規范)創建的查詢語言,用于地圖相關信息的查詢,這是一種基于過濾機制的查詢語言,寫出來類似于這樣:
第二種是CQL(Cassandra Query Language),是key-value數據庫cassandra中提供的一種類SQL查詢語言,它的語言和SQL差不多。
第三種是CQL(Cypher Query Language),是圖數據庫提供的數據查詢語言,是一種聲明性模式匹配語言,寫出來大致長這樣
以上只是目前比較常見的幾種查詢語言,隨著技術的發展,未來沒準還會有更多的QL家族成員出現呢。