SQL查缺补漏(视图、函数、find_in_set、group_concat)

1、视图

1.1 概念

视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成。

1.2 特点

  • 视图中的数据并不属于视图本身,而是属于基本的表,对视图可以像表一样进行增删改查操作。
  • 视图不能被修改,表修改或者删除后应该删除视图再重建。
  • 视图的数量没有限制,但是命名不能和视图以及表重复,具有唯一性。
  • 视图可以嵌套,一个视图中可以嵌套另一个视图。
  • 视图不能索引,不能有相关联的触发器和默认值。

1.3 语法

  1. 创建视图:

    create view 视图名称[(字段1)(字段2)(字段3...] as select 查询语句 [with check option]
    

    参数:[with check option]可选项,防止用户对数据插入、删除、更新是操作了视图范围外的基本表的数据。

  2. 删除视图

    drop view 视图名称 [cascade]
    

2、函数

SQL拥有很多可用于计数和计算的内建函数。

语法:select function(列) from 表;

类型:

  1. 合计函数(Aggregate):面向一系列的值,并返回一个单一的值
    • count(column):返回某列的行数,不包括null值
    • count(*):返回被选行数
  2. Scalar函数:面向某个单一的值,并返回基于输入值的单一的值
    • ucase(c):将某个域转换为大写
    • lcase(c):将某个域转换为小写
    • len(c):返回某个文本域的长度

3、find_in_set函数

select * from 表名 where find_in_set(str,strlist);
  • str:要查询的字符串

  • strlist:参数以,分隔

返回strstrlist中的索引,从1开始,strlist必须以,分隔开。

SELECT FIND_IN_SET('b', 'a,b,c,d'); 返回2

select FIND_IN_SET('6', '1'); 返回0

一次返回多条记录:

select * from 表名 where find_in_set(id, '1,2,3,4');

id:字段名

like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文,分隔,Find_IN_SET查询的结果要小于like查询的结果。

4、group_concat

完整语法:

group_concat([distinct] 要连接的字段 [order by asc/desc 排序字段] [separator '分隔符'])
select * from test;

在这里插入图片描述
需求:一行显示id下所有的score

select id, group_concat(score) from test group by id;

在这里插入图片描述
去重:

select id, group_concat(distinct score) from test group by id;

在这里插入图片描述
排序

select id, group_concat(score order by score desc) from tset group by id;

在这里插入图片描述
设置分隔符

select id, group_concat(score separator ';') from test group by id;

在这里插入图片描述

在人大金仓数据库中,如果你有一个表(比如`employee_info`)其中的`user_ids`字段以逗号分隔的形式存储了多用户的32位UUID,要根据特定UUID找对应的信息,可以采取以下步骤: 1. **使用SQL询**:首先,你需要使用`FIND_IN_SET()`函数来检指定的UUID是否存在于`user_ids`的值中。这个函数会返回UUID在字符串中的位置,如果存在则返回非零值。这是一个基本示例: ```sql SELECT * FROM employee_info WHERE FIND_IN_SET('your_UUID', user_ids) > 0; ``` 其中`'your_UUID'`应该替换为你要找的实际UUID。 2. **如果`FIND_IN_SET()`不支持**,你可以考虑将`user_ids`字段拆分成一个临时表,然后进行连接询。但这会对性能有影响,尤其是在大数据集上: - 首先,创建一个临时表或视图: ```sql CREATE TEMPORARY TABLE uuids AS SELECT SPLIT(user_ids, ',') as uuids_list FROM employee_info; ``` - 然后,在临时表上进行找: ```sql SELECT e.* FROM employee_info e JOIN uuids u ON e.user_ids = GROUP_CONCAT(u.uuids_list) OVER (PARTITION BY id) WHERE u.uuids_list = 'your_UUID'; ``` 3. **注意优化**:如果数据量很大,上述操作可能效率不高。你可以考虑在应用程序层面对数据进行预处理,例如定期解析用户ID列表并存储到其他结构化的表中,以便于更快地询。 请根据你的数据库版本和实际需求选择最适合的方法,同时记得将`your_UUID`替换为实际的UUID进行询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值