10月12号 leetcode SQL复习

这篇博客探讨了如何在SQL中实现复杂查询,包括找出部门的第二高薪资、实现员工性别互换以及计算分数排名。通过使用子查询、LIMIT语句和CASE WHEN END语句,可以解决这些问题。同时,还展示了如何查找连续数字序列以及在座位交换场景下更新学生座位的方法。这些技巧对于理解和优化SQL查询至关重要。

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

  1. Department Highest Salary

Having 条件是用来筛选group的而不是用来筛选group内部条件的。

  1. Second Highest Salary

查询第二多花费得工资。Limit语句

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

如果不存在这种情况,直接会输出空字符,然而我们想让他输出null
如果遇到NULL的情况
再套一层,因为 select null会返回null

# Write your MySQL query statement below
select
    (Select 
        Distinct Salary SecondHighestSalary 
    From 
        Employee 
        order by Salary Desc
        limit 1,1) as SecondHighestSalary

同理,找到第N高的工资:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  set N=N-1;
  RETURN (
      # Write your MySQL query statement below.
      select
    (Select 
        Distinct Salary SecondHighestSalary 
    From 
        Employee 
        order by Salary Desc
        limit N,1) as SecondHighestSalary
      
  );
END
  1. Swap Salary

update 题目

update Salary 
set 
    sex = if (sex='m','f','m')

推荐使用case when end

UPDATE Salary 
SET sex =
CASE
		sex 
	WHEN 'm' THEN
	'f' ELSE 'm' END;
  1. Rank Scores

rank 排序题目:

select Score,dense_rank() over(order by score desc) as "Rank" from scores

dense_rank()
rank()
over(partition by sth order by sth)

  1. Consecutive Numbers

连续数的思路

select
    distinct l1.num ConsecutiveNums 
From 
    logs l1,
    logs l2,
    logs l3
where
    l1.Num = l2.num and l2.num= l3.num and l1.id =l2.id-1 and l2.id= l3.id-1

inner join的解法

# Write your MySQL query statement below
SELECT
	DISTINCT M.num ConsecutiveNums 
FROM
	(
	SELECT
		l1.id,
		l1.num 
	FROM
		LOGS l1
		INNER JOIN LOGS l2 ON l1.num = l2.num 
		AND l1.id = l2.id - 1 
	) M
	INNER JOIN LOGS l3 ON M.num = l3.num 
	AND M.id = l3.id - 2

分辨好主体

select distinct(l.Num) ConsecutiveNums 
from Logs l 
inner join Logs l2 on l.Num = l2.Num and  l.id = l2.id+1
inner join Logs l3 on l.Num = l3.Num and  l.id = l3.id+2
  1. Exchange Seats

case when的例子:

select 
    (case 
        when id%2=1 and id =(select count(*) from seat) then id
        when id%2=1 then id+1
        else id-1
     end
     ) as id,student
from
    seat
ORDER BY id
<think>嗯,用户现在问的是零基础计算机学习计划,我需要先理解他们的需求。他们可能完全没有编程或计算机科学的基础,想要一个系统的学习路径。之前他们问过选择C++还是Python,现在可能想进一步规划整个学习过程。 首先,我应该考虑用户的学习目标。是职业导向还是兴趣驱动?如果是职业,可能需要更结构化的课程,如果是兴趣,可以更灵活。但用户没有明确说明,所以需要覆盖通用情况。 接下来,需要分阶段制定计划。零基础的话,第一阶段应该是计算机基础概念,比如硬件、软件、操作系统这些。然后是编程入门,可能用Python,因为容易上手。之后可以深入数据结构和算法,再接触实际项目,最后拓展到其他领域。 还要考虑学习资源的选择,推荐一些适合新手的书籍、在线课程和实践平台。比如《计算机是怎样跑起来的》这种入门书,Python的在线教程,LeetCode的算法练习等。 另外,用户可能担心学习过程中的困难,比如如何保持动力,遇到问题怎么解决。所以需要加入一些学习建议,比如项目驱动学习,加入社区,定期复习等。 可能还要比较不同学习路径,比如先学Python还是直接学C++,但根据之前的回答,Python更适合零基础。不过用户可能也有兴趣了解其他路径,但这次的问题更关注整体计划,所以应该以Python为主线,再逐步扩展。 最后,确保回答结构清晰,分阶段说明每个阶段的目标、内容和推荐资源,并给出实用建议,帮助用户坚持下去。</think>以下是针对零基础学习者的计算机科学系统学习计划,结合知识结构与时间管理策略,提供可操作的成长路径: --- ### 学习阶段模型(总周期约12-18个月) 设知识密度为$K(t)$,实践强度$P(t)$,理论深度$D(t)$,则学习曲线满足: $$ K(t) = \int_{0}^{t} \left(0.6P(\tau) + 0.4D(\tau)\right)d\tau \quad (t \in [0,18] \text{月}) $$ --- ### 第一阶段:基础筑基(1-3个月) **目标:建立计算机系统认知** 1. **硬件基础**(20小时) - 拆解旧电脑识别部件(主板/CPU/内存/硬盘) - 理解二进制与逻辑门(用[逻辑门模拟器](https://circuitverse.org/)搭建简单电路) - 学习进制转换:完成$ (1011)_2 = (?)_{10} $等练习 2. **操作系统原理**(30小时) - 双系统安装(Windows+Linux) - 掌握基础Shell命令: ```bash # 统计代码行数 find . -name "*.py" | xargs wc -l ``` - 用Wireshark抓包分析HTTP请求 3. **网络基础**(20小时) - 用Packet Tracer模拟网络拓扑 - 理解IP地址分类(计算C类网络$192.168.1.0/24$可用主机数) --- ### 第二阶段:编程启航(4-6个月) **选择Python作为第一语言**(推荐学习顺序) 1. **基础语法**(50小时) - 完成[Python Tutor](http://www.pythontutor.com/)可视化练习 - 实现:计算器/猜数字游戏/文件批量重命名工具 2. **核心编程范式**(80小时) - 面向过程:用递归实现汉诺塔问题 - 面向对象:设计「图书馆管理系统」类结构 ```python class Book: def __init__(self, isbn, title): self.isbn = isbn self.title = title self.borrowed = False ``` 3. **算法入门**(100小时) - 时间复杂度分析(对比冒泡排序$O(n^2)$与快速排序$O(n\log n)$) - 在LeetCode完成前100道简单题(重点:哈希表/双指针) --- ### 第三阶段:系统深化(7-12个月) **构建完整的计算机知识体系** 1. **数据结构**(60小时) - 手动实现:链表/栈/队列(C语言版) ```c typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } ``` 2. **计算机组成原理**(80小时) - 用Logisim设计8位ALU - 理解流水线技术(计算5级流水线加速比) 3. **数据库系统**(50小时) - SQL实战:设计电商数据库ER图 - 优化查询:EXPLAIN分析索引效果 --- ### 学习资源配置方案 | 知识领域 | 推荐资源 | |----------------|--------------------------------------------------------------------------| | 编程基础 | 《Python编程:从入门到实践》+ Codecademy交互课程 | | 算法训练 | LeetCode每日一题 +《算法图解》 | | 系统原理 | 《深入理解计算机系统》+ Nand2Tetris项目 | | 项目实践 | GitHub Trending项目 + 阿里云天池竞赛 | --- ### 时间管理策略 采用**番茄工作法**优化学习效率: $$ 每日学习量 = \sum_{i=1}^{n} \left( 25\text{分钟专注} + 5\text{分钟休息} \right) \times 有效性系数\gamma $$ 建议配置: - 工作日:3个番茄钟(晚7-9点) - 周末:6个番茄钟(上下午各3个) - 每月预留2天实践日(完成小项目) --- ### 关键里程碑检测 设置阶段性目标验证学习效果: 1. **3个月**:能用Python自动化处理Excel数据 2. **6个月**:实现带GUI的备忘录程序(Tkinter/PyQt) 3. **9个月**:在Kaggle完成入门级机器学习比赛 4. **12个月**:独立开发全栈博客系统(Django + MySQL + Bootstrap) --- ### 避坑指南 1. **硬件误区**:不要盲目追求顶配电脑(i5+16GB内存足够学习) 2. **语言选择**:避免陷入「应该先学C还是Python」的争论 3. **数学恐惧**:遇到离散数学难题时,使用[3Blue1Brown](https://www.3blue1brown.com/)可视化辅助 4. **求职准备**:建立GitHub作品集比证书更重要(Star数≥50为佳) --- ### 学习成效公式 设总投入时间为$T$,有效学习率为$\eta$,则技能水平: $$ S = \eta T \cdot \left( 0.5\log(项目数) + 0.3\sqrt{刷题量} + 0.2\times 社区活跃度 \right) $$ 建议参数:$\eta ≥ 0.7$(关闭手机通知可提升至0.85) 按照此计划,每天保持3小时高效学习,12个月后可达到初级开发工程师水平(对标阿里P4级)。关键是要保持代码量的持续增长,建议每周至少提交10次Git Commit。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值