MySQL和HiveSQL在查询上的区别
查询示例
假设有一个名为sales
的表,包含字段product_id
(产品ID)、product_name
(产品名称)、amount
(销售额)、sale_date
(销售日期)。
查询某产品类别下各产品的总销售额,并按销售额降序排列
- MySQL :
SELECT product_name, SUM(amount) AS total_sales
FROM sales
WHERE product_name LIKE '类别名称%'
GROUP BY product_name
ORDER BY total_sales DESC;
- HiveSQL :
SELECT product_name, SUM(amount) AS total_sales
FROM sales
WHERE product_name LIKE '类别名称%'
GROUP BY product_name
ORDER BY total_sales DESC;
从这个简单的查询示例来看,两者的语法在基本的SELECT
、FROM
、WHERE
、GROUP BY
、ORDER BY
子句的使用上较为相似,但在一些细节和特定功能上存在以下差异:
查询差异
-
表连接方式 :
- MySQL :支持使用逗号分隔表名结合
WHERE
子句进行等值连接,如SELECT * FROM dual a,dual b WHERE a.key = b.key
。 - HiveSQL :不支持等值连接,只能使用
JOIN
关键字进行表连接,如SELECT * FROM dual a JOIN dual b ON a.key = b.key
。
- MySQL :支持使用逗号分隔表名结合
-
特殊字符处理 :
- MySQL :在拼接特殊字符时,可直接使用分号等,如
SELECT concat(key,concat(';',key)) FROM dual
。 - HiveSQL :特殊字符如分号需先进行八进制的ASCII码转义,如
SELECT concat(key,concat('\\073',key)) FROM dual
。
- MySQL :在拼接特殊字符时,可直接使用分号等,如
-
更新操作支持 :
- MySQL :支持数据的更新操作,如
UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition
。 - HiveSQL :不支持数据的更新操作,只能通过
INSERT
或INSERT OVERWRITE
等方式覆盖或追加数据。
- MySQL :支持数据的更新操作,如
-
函数使用 :
-
分隔字符串 :
- MySQL :使用
substring_index
函数,如SELECT substring_index("1,2,3",",",1)
返回结果为1
。 - HiveSQL :使用
split
函数,如SELECT split("1,2,3", ',')[0]
返回结果为1
。
- MySQL :使用
-
时间转换函数 :
- MySQL :使用
from_unixtime
函数,格式为from_unixtime(unix_timestamp, format)
,如SELECT p_id, from_unixtime(p_create_time/1000,'%y-%m-%d') AS times FROM poi WHERE p_parent_id = 4782760
。 - HiveSQL :同样使用
from_unixtime
函数,但日期格式化字符串的写法有所不同,如SELECT p_id, from_unixtime(p_create_time div 1000,'YYYY-MM-dd HH:mm:ss') AS times FROM poi WHERE p_parent_id = 4782760
。
- MySQL :使用
-
-
空值判断 :
- MySQL :
NULL
表示空值,对于IS NULL
的判断符合常规的空值逻辑。 - HiveSQL :对于
String
类型的字段,若为空字符串(长度为0
),对其进行IS NULL
判断时结果为False
。
- MySQL :
-
分桶查询支持 :
- HiveSQL :支持分桶查询,如
CLUSTER BY
分桶排序字段,或使用DISTRIBUTE BY
分桶字段结合SORT BY
排序字段。 - MySQL :不支持分桶查询。
- HiveSQL :支持分桶查询,如
-
CTE 表达式支持 :
- HiveSQL :支持
CTE
表达式,可临时存储某些语句的执行结果,方便复杂查询的编写。 - MySQL :部分旧版本的 MySQL 不支持 CTE 表达式,但从 MySQL 8.0 开始支持。
- HiveSQL :支持