前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL刷题

SQL刷题

原创
作者头像
用户2794661
修改2022-06-02 16:24:50
6110
修改2022-06-02 16:24:50
举报
文章被收录于专栏:程序人生小记程序人生小记

SQL是程序员工作中不可缺少的拉取数据的工具,本教程按天进行更新,分10天完成,共刷题100道,彻底熟悉sql的相关语法和使用。

1 相关链接:

题目链接:https://leetcode.cn/study-plan/sql/?progress=71t6kwc

https://leetcode.cn/tag/database/problemset/

教程链接:https://zhuanlan.zhihu.com/p/57451327

https://zhuanlan.zhihu.com/p/52428930

2 SQL基础

INSERT

代码语言:javascript
复制
INSERT INTO Product (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫',
'衣服', 1000, 500, '2009-09-20');

比如说:有表table,列id,name ,email (id为自增主键)

代码语言:javascript
复制
可以怎么写: INSERT INTO table1(name,email)VALUES ('abc','123@qq.com');
1

也可以这样写: insert into tbl (id, name,email) values (null,’liu’,’123@163.com’));

NULL值判断

MySQL 使用三值逻辑 —— TRUE,FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 ISNULL 和 ISNOTNULL 两种操作来对 NULL 特殊判断。

string函数

代码语言:javascript
复制
# mysql 字符串函数各种复习
-- CONCAT(str1, str2):字符连接函数
-- UPPER(str):将字符串改为大写字母
-- LOWER(str):将字符串改为小写字母
-- LENGTH(str):判定字符串长度
-- SUBSTRING(str, a, b):提取字段中的一段,从字符串str的第a位开始提取,提取b个字符
-- LEFT(str, n):提取字符串最左边的n个字符
-- RIGHT(str, n):提取字符串最右边的n个字符

CASE表达式

代码语言:javascript
复制
SELECT product_name,
       CASE WHEN product_type = '衣服'
            THEN CONCAT('A:', product_type)
            WHEN product_type = '办公用品'
            THEN CONCAT('B:', product_type)
            WHEN product_type = '厨房用具'
            THEN CONCAT('C:',product_type)
            ELSE NULL
       END AS abc_product_type
  FROM Product;

IF( expr1 , expr2 , expr3 )

expr1条件,条件为true,则值是expr2 ,false,值就是expr3

代码语言:javascript
复制
SELECT 
o.id,u.account,catagory.`name`,orderTime,detail.amount,periodtime,if(direction='0','看涨','看跌') directionName
FROM t_order_detail detail
LEFT JOIN t_order o ON o.id = detail.orderId
LEFT JOIN t_catagory catagory ON catagory.id = o.catId
LEFT JOIN t_user u ON u.id = o.userId

正则表达式全集

代码语言:javascript
复制
将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\”匹配“\”而“(”则匹配“(”。
^
匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$
匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
*
匹配前面的子表达式零次或多次。例如,zo能匹配“z”以及“zoo”。等价于{0,}。
+
匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?
匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n}
n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}
n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o”。
{n,m}
m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?
当该字符紧跟在任何一个其他限制符(,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
.
匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern)
匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。
(?:pattern)
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern)
正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)
正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?<=pattern)
反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)
反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y
匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz]
字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]
负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
[a-z]
字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z]
负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B
匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx
匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d
匹配一个数字字符。等价于[0-9]。
\D
匹配一个非数字字符。等价于[^0-9]。
\f
匹配一个换页符。等价于\x0c和\cL。
\n
匹配一个换行符。等价于\x0a和\cJ。
\r
匹配一个回车符。等价于\x0d和\cM。
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S
匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t
匹配一个制表符。等价于\x09和\cI。
\v
匹配一个垂直制表符。等价于\x0b和\cK。
\w
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn
匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
\num
匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n
标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm
标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml
如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un
匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。
常用正则表达式
用户名
/^[a-z0-9_-]{3,16}$/
密码
/^[a-z0-9_-]{6,18}$/
十六进制值
/^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱
/^([a-z0-9_.-]+)@([\da-z.-]+).([a-z.]{2,6})$/
/^[a-z\d]+(.[a-z\d]+)*@(\da-z?)+(.{1,2}[a-z]+)+$/
URL
/^(https?://)?([\da-z.-]+).([a-z.]{2,6})([/\w .-])/?$/
IP 地址
/((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
HTML 标签
/^<([a-z]+)([^<]+)(?:>(.)</\1>|\s+/>)$/
删除代码\注释
(?<!http:|\S)//.*$
Unicode编码中的汉字范围
/^[\u2E80-\u9FFF]+$/

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

代码语言:javascript
复制
SELECT column_name, aggregate_function(column_name) 
FROM table_name 
WHERE column_name operator value 
GROUP BY column_name 
HAVING aggregate_function(column_name) operator value;

3 刷题

DAY1

选择

1 595. 大的国家

代码语言:javascript
复制
select name,population, area
from World
where area>= 3000000 or population>=25000000

2 1757. 可回收且低脂的产品

代码语言:javascript
复制
select product_id
from Products
where low_fats='Y' and recyclable = 'Y'

3 584. 寻找用户推荐人

代码语言:javascript
复制
MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。这个“任何值”包括 NULL 本身!这就是为什么 MySQL 提供 IS NULL 和 IS NOT NULL 两种操作来对 NULL 特殊判断。
select name
from customer
where referee_id !='2' or referee_id is null

4 183. 从不订购的客户

代码语言:javascript
复制
select Name as Customers
from Customers
left join Orders
on Customers.Id=Orders.CustomerId
where Orders.CustomerId is null

排序 & 修改

5 1873. 计算特殊奖金

代码语言:javascript
复制
select 
    employee_id,
 if (employee_id %2 = 1 and left(name,1)!='M', salary, 0) as bonus
from Employees

6 627. 变更性别

代码语言:javascript
复制
update salary set sex = case sex when 'm' then 'f' else 'm' end;

7 196. 删除重复的电子邮箱

代码语言:javascript
复制
DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id;

8 1667. 修复表中的名字

代码语言:javascript
复制
select  
    user_id,  CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2))) name
from 
    users
order by 
    user_id;

9 1484. 按日期分组销售产品

代码语言:javascript
复制
select
    sell_date,
    count(distinct product) num_sold,
    GROUP_CONCAT(distinct product) products
from
    activities
group by sell_date
order by sell_date;

10 1527. 患某种疾病的患者

代码语言:javascript
复制
SELECT * FROM PATIENTS
WHERE CONDITIONS REGEXP '^DIAB1|\\sDIAB1'

11 1965. 丢失信息的雇员

代码语言:javascript
复制
# Write your MySQL query statement below
select 
    employee_id 
from 
    (
    select employee_id from employees
    union all 
    select employee_id from salaries
) as t
group by 
    employee_id
having 
    count(employee_id) = 1
order by 
    employee_id;

12 1795. 每个产品在不同商店的价格

代码语言:javascript
复制
select product_id, 'store1' as store, store1 as price
from products
where store1 is not null
union all  #用union all是因为它不去重,这里去不去重都不影响结果,所以选个更少运算的
select product_id, 'store2' as store, store2 as price
from products
where store2 is not null
union all
select product_id, 'store3' as store, store3 as price
from products
where store3 is not null;

13 608. 树节点

代码语言:javascript
复制
SELECT id,
        IF(p_id IS NULL,
        'Root',
        IF(id NOT IN (
                SELECT DISTINCT p_id  FROM tree
                WHERE p_id IS NOT NULL
                    ),'Leaf','Inner')
        ) AS Type
FROM tree

176. 第二高的薪水

代码语言:javascript
复制
SELECT DISTINCT
    Salary AS SecondHighestSalary
FROM
    Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1

第 5 天

合并

175. 组合两个表

数据库

简单

通过率 73.6%

待开启

1581. 进店却未进行过交易的顾客

数据库

简单

通过率 82.2%

待开启

1148. 文章浏览 I

数据库

简单

通过率 71.5%

待开启

第 6 天

合并

197. 上升的温度

数据库

简单

通过率 53.4%

待开启

607. 销售员

数据库

简单

通过率 68.0%

待开启

第 7 天

计算函数

1141. 查询近30天活跃用户数

数据库

简单

通过率 48.3%

待开启

1693. 每天的领导和合伙人

数据库

简单

通过率 81.9%

待开启

1729. 求关注者的数量

数据库

简单

通过率 63.1%

待开启

第 8 天

计算函数

586. 订单最多的客户

数据库

简单

通过率 73.2%

待开启

511. 游戏玩法分析 I

数据库

简单

通过率 72.6%

待开启

1890. 2020年最后一次登录

数据库

简单

通过率 73.8%

待开启

1741. 查找每个员工花费的总时间

数据库

简单

通过率 85.1%

待开启

第 9 天

控制流

1393. 股票的资本损益

数据库

中等

通过率 85.1%

待开启

1407. 排名靠前的旅行者

数据库

简单

通过率 67.9%

待开启

1158. 市场分析 I

数据库

中等

通过率 56.0%

待开启

第 10 天

过滤

182. 查找重复的电子邮箱

数据库

简单

通过率 79.3%

待开启

1050. 合作过至少三次的演员和导演

数据库

简单

通过率 77.1%

待开启

1587. 银行账户概要 II

数据库

简单

通过率 84.4%

待开启

1084. 销售分析III

数据库

简单

通过率 55.3%

待开启

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 相关链接:
    • 题目链接:https://leetcode.cn/study-plan/sql/?progress=71t6kwc
      • https://leetcode.cn/tag/database/problemset/
        • 教程链接:https://zhuanlan.zhihu.com/p/57451327
          • https://zhuanlan.zhihu.com/p/52428930
          • 2 SQL基础
            • NULL值判断
              • string函数
                • CASE表达式
                  • IF( expr1 , expr2 , expr3 )
                    • 正则表达式全集
                      • HAVING 子句
                      • 3 刷题
                        • DAY1
                          • 选择
                            • 1 595. 大的国家
                            • 2 1757. 可回收且低脂的产品
                            • 3 584. 寻找用户推荐人
                            • 4 183. 从不订购的客户
                          • 排序 & 修改
                            • 5 1873. 计算特殊奖金
                            • 6 627. 变更性别
                            • 7 196. 删除重复的电子邮箱
                            • 8 1667. 修复表中的名字
                            • 9 1484. 按日期分组销售产品
                            • 10 1527. 患某种疾病的患者
                            • 11 1965. 丢失信息的雇员
                            • 12 1795. 每个产品在不同商店的价格
                            • 13 608. 树节点
                        • 第 5 天
                          • 合并
                          • 第 6 天
                            • 合并
                            • 第 7 天
                              • 计算函数
                              • 第 8 天
                                • 计算函数
                                • 第 9 天
                                  • 控制流
                                  • 第 10 天
                                    • 过滤
                                    相关产品与服务
                                    云数据库 SQL Server
                                    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档