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






