前言
练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
今日题目:
1517.查找拥有有效邮箱的用户
表:Users
列名 | 类型 |
---|---|
user_id | int |
name | varchar |
varchar |
user_id 是该表的主键(具有唯一值的列)。该表包含了网站已注册用户的信息。有一些电子邮件是无效的。
编写一个解决方案,以查找具有有效电子邮件的用户。
一个有效的电子邮件具有前缀名称和域,其中:
- 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 ‘_’ ,点 ‘.’ 和/或破折号 ‘-’ 。前缀名称 必须 以字母开头。
- 域 为 ‘@leetcode.com’ 。
以任何顺序返回结果表。
我那不值一提的想法:
首先梳理表内容,题干给了一张用户表,记录了用户id,姓名,邮箱,其次分析需求,需要找到有效的电子邮箱,其中有效的电子邮箱前缀是一个字符串,我的第一个想法是用like将其连接起来,但实际上运行不出来结果,看了题解发现我们需要用到正则表达式,也就是用regexp或者是rlike来匹配正则表达式。
- 正则表达式的相关功能
- ^ :表示一个字符串的开头
- []:表示其中的任意字符范围
- $:表示一个字符串或行的结尾
- \ :但实际在SQL的正则表达式中有的特殊符号需要加两条\才能正确转义,比如.,题干中加\不行,得加\
- *:表示重复前面字符任意次数
这道题整体邮箱就三个部分:
1.以字母开头 [^a-zA-z]
2.字母或是数字或是".“,”_“,”-"作为中间的字符串,因为这三个符号在SQL里面都有特殊用途,所以需要加上\对其进行转义,显示字符原本的样子。[a-zA-z0-9\\.\\-\\_]*
3.以@leetcode结尾。@leetcode\\.com$
select user_id,name,mail
from Users
where mail rlike "^[a-zA-Z][a-zA-Z0-9\\_\\-\\.]*@leetcode\\.com$"
结果:
总结:
能运行就行。