网站进度条特效知名高端网站建设报价
查询示例
假设有一个名为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 :支持
