我忘记的那些数据库知识(三)-通配符及orderby/groupby

背景:

最近想复习一下数据库相关的一些命令或知识,为后续排查故障提供有力的支持,所以从leetcode上找到高频50道sql题进行复习,这里记录一下而已。

题目如下:

620. 有趣的电影

1211. 查询结果的质量和占比

1075. 项目员工 I

1633. 各赛事的用户注册率

2356. 每位教师所教授的科目种类的数量

1729. 求关注者的数量

596. 超过5名学生的课

1. 使用like进行通配符(wildcard)进行匹配

一般只能用于文本字段或字符串,非文本数据类型不能使用通配符搜索。

% 表示任何字符出现任意次数,也就是能匹配0个、1个或多个字符

例如 "Fish%" 代表以 "Fish"开头的字符串都会被匹配

"%Fish%" 代表 字符串包含Fish的都会被匹配

_ 表示只匹配单个字符而不是多个字符

\[\] 表示用来指定一个字符集,必须匹配指定位置(通配符的位置)的一个字符

例如 "JM%" ,其中JM匹配任何以方括号中的字母开头的字符串

"\^JM%" ,其中^用于取反,即 非J或者非M的字母开头的字符串。

复制代码
620. 有趣的电影
//  like 或  not like
select * from cinema
where cinema.id % 2 = 1 and cinema.description not like '%boring%'
order by rating desc;


// 使用mod进行取余
select * from cinema
where mod(id,2) = 1 and cinema.description not like '%boring%'
order by rating desc;

2. 聚合函数

复制代码
// 1211. 查询结果的质量和占比

select query_name,
round(avg(rating/position),2) as quality, 
round(sum(if(rating<3,1,0))*100 / count(*),2) as poor_query_percentage
from Queries
where query_name is not null
group by query_name;


// 1075

select project_id, 
round(avg(experience_years),2) as average_years
from Project as p
left join 
Employee as e
on p.employee_id = e.employee_id
group by project_id;

// 1633. 各赛事的用户注册率

select contest_id,
round(count(Register.user_id)*100/(select count(*) from Users),2) as percentage
from Register
group by contest_id
order by percentage desc,contest_id asc;


解析:

select count(*) from Users    // 计算Users表中有多少行,这里是有多少个用户,在这里相当于是一个定值,固定值,整形数值

count(Register.user_id)*100/(select count(*) from Users) // 对group by进行分组后的逻辑小组进行计算,这里得出用户的注册率

round(xxx,2)        // 对 xxx 进行保留两位小数

group by contest_id // 对 contest_id进行分组,进而对小组内的内容进行统计和分析

order by percentage desc,contest_id asc    // 对结果集进行排序,以percentage进行倒序,如果注册率相同再以contest_id进行正序排序

3. order by

order by 子句的位置:应该保证它是select语句中最后一条语句。如果它不是最后的子句,将会出现错误消息,主要分为单个列排序和多个列排序

要按多个列排序,简单指定列名,列名之间用逗号分开即可,类似选择多个列时那样,类似于上一个题1633.各赛事的用户注册率

order by percentage desc,contest_id asc

重要的是理解在按多个列排序时候,排序的顺序完全按照规定进行,对于上述例子中的输出,列出多个行具有相同的percentage值时才对contest_id进行排序。

如果是升序排序,可以省略asc;如果是降序排序,需要指定 desc关键字。

这里注意了: 所以 如果想在多个列上降序排序,必须对每一列指定 desc关键字。这里和 distinct关键字恰恰相反。

4. group by

我记不住的数据库Group BY使用-CSDN博客

复制代码
select 类别, SUM(数量)from A
where 数量 > 8
group by 类别
having SUM(数量) > 10 

先通过where进行过滤行,数量>8的行被选择,然后进行分组,将同类别的数量和>10的分组被选择。

复制代码
// 2356. 每位教师所教授的科目种类的数量
select teacher_id,count(distinct subject_id) as cnt
from Teacher
group by teacher_id

// 1193. 每月交易 I

select 
date_format(trans_date,'%Y-%m') as month,
country,
count(*) as trans_count,
count(if(state='approved',1,NULL))as approved_count,
sum(amount)as trans_total_amount,
sum(if(state='approved',amount,0))as approved_total_amount
from Transactions
group by month,country


count和if
sum和if

if(state='approved',amount,0) 如果state等于approved,返回amount,否则为0

// 1729. 求关注者的数量
select user_id,count(follower_id) as followers_count
from Followers
group by user_id
order by user_id

// 596. 超过5名学生的课
select class
from Courses
group by class
having count(*)>=5
相关推荐
Databend13 小时前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
ClouGence2 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
飞将2 天前
从零实现数据库(2)——HashIndex + IndexManager
数据库
Nturmoils3 天前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波3 天前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
倔强的石头_4 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_7 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab7 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence8 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神8 天前
三、用户与权限管理
数据库·mysql