mysql以,分隔的精确匹配方法HQL和SQL

本文详细介绍了 SQL 中 find_in_set 函数的使用方法及其应用场景,包括如何进行模糊匹配、强制排序等,并提供了实际应用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以看find_in_set

我们在sql中经常会遇到模糊匹配,但是有的地方却不能简单的用like来区分

find_in_set(str1,str2) 函数:返回str2中str1所在的位置索引,其中str2必须以","分割开。

使用语法:

select * form table where FIND_IN_SET(str,strlist)。

如:




或者说:


find_in_set(str1,str2)还可以查找到str1所在str2中位置。

同样适用上面的例子数据。

sql语句:

select FIND_IN_SET(2,type) from t_news



还可以适用find_in_set来强制排序。

我们修改一下新闻表数据。

如图:

还可以适用find_in_set来强制排序。

我们修改一下新闻表数据。

如图:


现在我们有一个需求,需要根据type为2,1,3这种顺序排序。

sql语句:

select * from t_news order by find_in_set(type,'2,1,3');

结果:




SQL写法与动态设置值:

/**
 * 查询调色订单详情
 *
 * @param id 订单id
 * @return
 */
@Override
public Map<String, Object> saveGetColorOrder(Long id) {
    String sql = "SELECT\n" +
            "  mc.*,\n" +
            "  mo.maor_no,\n" +
            "  IF(mo.maor_pay_date!=NULL ,0 ,1) isPayed\n" +
            "FROM mall_order_color mc LEFT OUTER JOIN mall_order mo ON mo.maor_id = mc.mcol_gen_order_id\n" +
            "WHERE FIND_IN_SET(:id,mc.mcol_order_id) and mc.mcol_payed=1";
    Map<String, Object> params = new HashMap<>();
    params.put("id",id);
    List<Map<String, Object>> list = manageDao.findMapBySQL(sql, params);

    OperationRecord record = new OperationRecord();
    record.setOrecOperationType(OperationRecord.OPERATION_FIND);
    record.setOrecOperation("查询调色订单详情");
    record.setOrecOperationDetail("查询调色订单详情:订单id=" + id);
    manageDao.saveOperationRecord(record);
    return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}

HQL写法:

注意:HQL写法一定要写>0,不然直接报错。

hql = "from MallOrderColor moc where  find_in_set(:id,moc.mcolOrderId)>0  and mcolPayed=1";
for (String id : ids) {
    params.clear();
    params.put("id", id );
    List<MallOrderColor> colors = appDao.getList(hql, params);
    if (CollectionUtils.isNotEmpty(colors)) {
        throw new BusiHandlerException("该订单:" + id + "已经生成调色订单,不能重复生成");
    }
}


还可以适用find_in_set来强制排序。

我们修改一下新闻表数据。

如图:

<think>我们正在学习Hive查询语言(HQL)的基础知识使用方法。根据提供的引用资料,我们可以总结出以下关键点: 1. Hive是建立在Hadoop上的数据仓库基础架构,提供数据提、转换、加载(ETL)以及查询分析大规模数据的能力(引用[1])。 2. Hive定义了一种类SQL查询语言,称为HQL(Hive Query Language),允许用户进行数据查询(引用[1])。 3. Hive将HQL转换成MapReduce任务执行(引用[4])。 4. Hive的元数据存储在metastore中,默认使用内嵌的Derby数据库,但生产环境中通常使用独立的数据库如MySQL(引用[5])。 现在,我们将按照以下结构来组织HQL的学习教程: - 一、HQL基础语法(DDLDML) - 二、HQL查询操作 - 三、HQL高级特性(分区、分桶等) - 四、实践示例 ### 一、HQL基础语法 #### 1. DDL(数据定义语言) DDL用于定义管理Hive中的数据库表。 **创建数据库:** ```sql CREATE DATABASE [IF NOT EXISTS] database_name; ``` **查询数据库:** ```sql SHOW DATABASES; -- 列出所有数据库 DESCRIBE DATABASE database_name; -- 描述数据库 ``` **修改数据库:** ```sql ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...); ``` **删除数据库:** ```sql DROP DATABASE [IF EXISTS] database_name [CASCADE]; -- CASCADE用于删除非空数据库 ``` **创建表:** ```sql CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- 分区 [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] -- 分桶 [ROW FORMAT row_format] -- 指定行格式 [STORED AS file_format] -- 指定存储格式 [LOCATION hdfs_path]; -- 指定HDFS存储位置 ``` 其中: - `EXTERNAL`关键字创建外部表,删除表时只删除元数据,不删除数据。 - `PARTITIONED BY`定义分区字段(分区字段不能是表中已存在的列)。 - `CLUSTERED BY`定义分桶字段,`SORTED BY`指定桶内排序,`INTO ... BUCKETS`指定桶的数量。 - `ROW FORMAT`指定行分隔字段分隔符,例如: ```sql ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' ``` - `STORED AS`指定文件格式,如`TEXTFILE`(默认)、`SEQUENCEFILE`、`RCFILE`等。 **修改表:** ```sql ALTER TABLE table_name RENAME TO new_table_name; -- 重命名表 ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...); -- 添加列 ``` **删除表:** ```sql DROP TABLE [IF EXISTS] table_name; ``` #### 2. DML(数据操作语言) DML用于向表中加载、插入、导出数据等。 **向表中加载数据:** ```sql LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE table_name [PARTITION (part_col=val, ...)]; ``` - `LOCAL`:从本地文件系统加载,否则从HDFS加载。 - `OVERWRITE`:覆盖表中已有数据,否则追加。 **插入数据:** ```sql -- 将查询结果插入表 INSERT OVERWRITE TABLE table_name [PARTITION (part_col=val, ...)] SELECT ...; -- 插入到指定分区 INSERT INTO TABLE table_name PARTITION (part_col=val) VALUES (value1, value2, ...); ``` **数据导出:** ```sql INSERT OVERWRITE [LOCAL] DIRECTORY 'directory_path' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT ...; ``` **清除表中数据:** ```sql TRUNCATE TABLE table_name; -- 仅删除数据,保留表结构 ``` ### 二、HQL查询操作 HQL查询语法与SQL类似,支持`SELECT`、`WHERE`、`GROUP BY`、`JOIN`、`ORDER BY`等。 **基本查询:** ```sql SELECT [ALL | DISTINCT] select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [HAVING having_condition] [ORDER BY col_list [ASC | DESC]] [LIMIT number]; ``` **常用函数:** - 数学函数:`round()`, `floor()`, `ceil()`, `rand()` - 字符串函数:`concat()`, `substr()`, `trim()`, `lower()`, `upper()` - 聚合函数:`count()`, `sum()`, `avg()`, `max()`, `min()` - 条件函数:`if(condition, value_if_true, value_if_false)`, `case when ... then ... else ... end` **JOIN操作:** Hive支持等值连接(不支持非等值连接),包括: - `INNER JOIN` - `LEFT OUTER JOIN` - `RIGHT OUTER JOIN` - `FULL OUTER JOIN` - `LEFT SEMI JOIN`(半连接,类似于`IN`子查询) ### 三、HQL高级特性 #### 1. 分区表 分区表通过某个字段的值将数据分成不同的目录存储,提高查询效率。 **创建分区表:** ```sql CREATE TABLE logs (ts BIGINT, line STRING) PARTITIONED BY (dt STRING, country STRING); ``` **添加分区:** ```sql ALTER TABLE logs ADD PARTITION (dt='2020-01-01', country='CN'); ``` **查询分区数据:** ```sql SELECT * FROM logs WHERE dt='2020-01-01' AND country='CN'; ``` #### 2. 分桶表 分桶表将数据分散到多个文件中(桶),通常用于提高连接查询效率。 **创建分桶表:** ```sql CREATE TABLE bucketed_users (id INT, name STRING) CLUSTERED BY (id) INTO 4 BUCKETS; ``` ### 四、实践示例 #### 示例1:创建表并加载数据 ```sql -- 创建内部表 CREATE TABLE IF NOT EXISTS employees ( id INT, name STRING, salary FLOAT, dept STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -- 加载数据(从HDFS) LOAD DATA INPATH '/user/hive/employees.csv' INTO TABLE employees; ``` #### 示例2:查询各部门的平均工资 ```sql SELECT dept, AVG(salary) AS avg_salary FROM employees GROUP BY dept ORDER BY avg_salary DESC; ``` #### 示例3:创建分区表并插入数据 ```sql -- 创建分区表(按部门分区) CREATE TABLE employees_partitioned ( id INT, name STRING, salary FLOAT ) PARTITIONED BY (dept STRING); -- 动态分区插入(需设置动态分区模式) SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE employees_partitioned PARTITION(dept) SELECT id, name, salary, dept FROM employees; ``` ### 注意事项 1. Hive不支持行级更新、删除事务(ACID),适用于批量数据处理。 2. 使用分区分桶可以优化查询性能。 3. 在Hive中执行查询时,HQL会被转换为MapReduce任务,因此延迟较高,不适合实时查询。 通过以上内容,您可以开始学习HQL的基础操作。建议在实际环境中练习这些操作,以加深理解。 §§相关问题§§ 1. Hive中内部表外部表的区别是什么? 2. 如何优化Hive查询性能? 3. Hive支持哪些数据存储格式?它们有什么优缺点? 4. Hive与传统的RDBMS(关系型数据库)有什么主要区别?</think>### Hive查询语言(HQL)基础教程 #### 一、HQL核心概念 1. **Hive定位** Hive是基于Hadoop的数据仓库工具,将结构化数据映射为表结构,通过类SQL语言(HQL)实现数据查询分析。其本质是将HQL转换为MapReduce任务执行[^4]。 2. **元数据管理** Hive的元数据(表结构、分区信息等)存储在metastore中。生产环境通常使用MySQL等独立数据库替代默认的Derby,以支持多会话访问[^5]。 3. **数据存储** 数据实际存储在HDFS上,支持多种格式: - TEXTFILE(默认) - ORC(列式存储,高效压缩) - PARQUET(跨平台列式存储) #### 二、HQL基础语法 ##### 1. DDL(数据定义) ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS sales_db; -- 创建表(含分区) CREATE TABLE user_actions ( user_id BIGINT, action_time TIMESTAMP, action_type STRING ) PARTITIONED BY (dt STRING) -- 按日期分区 STORED AS ORC; -- 添加分区 ALTER TABLE user_actions ADD PARTITION (dt='2023-10-01'); ``` ##### 2. DML(数据操作) ```sql -- 加载数据 LOAD DATA LOCAL INPATH '/data/user_actions.csv' INTO TABLE user_actions PARTITION (dt='2023-10-01'); -- 插入查询结果 INSERT OVERWRITE TABLE user_summary PARTITION (dt='2023-10-01') SELECT user_id, COUNT(*) FROM user_actions WHERE dt='2023-10-01' GROUP BY user_id; ``` ##### 3. 基础查询 ```sql -- 条件过滤 SELECT * FROM orders WHERE amount > 1000 AND region = 'Asia'; -- 聚合与分组 SELECT product_id, AVG(price) AS avg_price FROM sales GROUP BY product_id HAVING avg_price > 50; -- 多表连接 SELECT o.order_id, u.name FROM orders o JOIN users u ON o.user_id = u.id; ``` #### 三、高级特性实践 ##### 1. 分区优化 ```sql -- 分区裁剪(只扫描相关分区) SELECT * FROM logs WHERE dt BETWEEN '2023-10-01' AND '2023-10-07'; ``` ##### 2. 分桶技术 ```sql -- 创建分桶表(加速JOIN) CREATE TABLE user_bucketed ( id INT, name STRING ) CLUSTERED BY (id) INTO 32 BUCKETS; ``` ##### 3. 窗口函数 ```sql -- 计算用户消费排名 SELECT user_id, order_date, amount, RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rank FROM orders; ``` #### 四、性能优化技巧 1. **数据格式选择** ORC/Parquet格式比Textfile节省50%~80%存储空间,查询速度提升2~5倍。 2. **向量化查询** 启用向量化执行引擎(需ORC格式): ```sql SET hive.vectorized.execution.enabled=true; ``` 3. **推测执行** 防止慢任务拖累整体: ```sql SET mapreduce.map.speculative=true; ``` #### 五、实战案例:用户行为分析 ```sql -- 计算每日活跃用户(DAU) SELECT dt, COUNT(DISTINCT user_id) AS dau FROM user_actions WHERE dt = '2023-10-01' GROUP BY dt; -- 用户留存率(次日留存) SELECT a.dt, COUNT(DISTINCT a.user_id) AS day1_users, COUNT(DISTINCT b.user_id) / COUNT(DISTINCT a.user_id) AS retention_rate FROM user_actions a LEFT JOIN user_actions b ON a.user_id = b.user_id AND b.dt = DATE_ADD(a.dt, 1) WHERE a.dt = '2023-10-01' GROUP BY a.dt; ``` > **注意**:Hive适合批处理,查询延迟通常在分钟级。如需秒级响应,可结合Impala或Hive on Spark使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值