当前位置: 首页 > news >正文

深入理解sql:进阶版

目录

  • 背景
  • 举例
    • 子查询和嵌套查询:
    • 联合查询(UNION和UNION ALL):
    • 窗口函数:
    • CTE(公共表达式):
    • 索引优化:
    • 事务隔离级别和锁定:
    • 性能优化:
    • 存储过程和函数:
    • 触发器:
    • 动态SQL:
    • 数据库安全性:
    • 详细说说多表联查
      • 内连接(INNER JOIN):
    • 左连接(LEFT JOIN):
    • 右连接(RIGHT JOIN):
    • 全外连接(FULL OUTER JOIN):
    • 交叉连接(CROSS JOIN):
  • 总结

背景

进阶版sql,让我们写的sql效率更高。

举例

子查询和嵌套查询:

示例:查询具有最高工资的员工姓名。

SELECT first_name, last_name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

联合查询(UNION和UNION ALL):

示例:从两个表中检索不同地区的客户姓名。

SELECT customer_name FROM customers_A
UNION
SELECT customer_name FROM customers_B;

窗口函数:

示例:为每个部门计算工资排名。

SELECT department_id, first_name, last_name, salary,RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROM employees;

CTE(公共表达式):

示例:使用CTE找出订单数量最多的客户。

WITH OrderCounts AS (SELECT customer_id, COUNT(*) AS order_countFROM ordersGROUP BY customer_id
)
SELECT customers.customer_name, OrderCounts.order_count
FROM customers
JOIN OrderCounts ON customers.customer_id = OrderCounts.customer_id
ORDER BY OrderCounts.order_count DESC;

索引优化:

示例:为产品表的名称列创建索引。

CREATE INDEX idx_product_name ON products (product_name);

事务隔离级别和锁定:

示例:设置事务隔离级别为REPEATABLE READ。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
-- Your SQL statements here
COMMIT;

性能优化:

示例:分析查询执行计划以查找潜在的性能问题。

性能优化:示例:分析查询执行计划以查找潜在的性能问题。

存储过程和函数:

示例:创建一个简单的存储过程,计算两个数的和。

DELIMITER //
CREATE PROCEDURE CalculateSum(IN num1 INT, IN num2 INT, OUT result INT)
BEGINSET result = num1 + num2;
END //
DELIMITER ;-- 调用存储过程
CALL CalculateSum(10, 20, );
SELECT ;

触发器:

示例:创建一个触发器,在插入新订单时更新客户的最近订单日期。

DELIMITER //
CREATE TRIGGER UpdateLastOrderDate
AFTER INSERT ON orders
FOR EACH ROW
BEGINUPDATE customersSET last_order_date = NEW.order_dateWHERE customer_id = NEW.customer_id;
END //
DELIMITER ;-- 插入新订单时,触发器会自动更新相应的客户最近订单日期
INSERT INTO orders (customer_id, order_date) VALUES (1, '2023-08-30');

动态SQL:

示例:根据用户提供的条件生成动态查询。

SET  = 'price > 100';SET  = CONCAT('SELECT * FROM products WHERE ', );
PREPARE dynamic_query FROM ;
EXECUTE dynamic_query;
DEALLOCATE PREPARE dynamic_query;

数据库安全性:

示例:创建一个只读用户,限制其对员工表的访问权限。

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON database_name.employees TO 'readonly_user'@'localhost';

详细说说多表联查

内连接(INNER JOIN):

内连接返回两个表中匹配行的交集。只有在连接条件成立时,才会返回数据。

示例:查找每个部门的员工和部门名称。

SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.department_id;

左连接(LEFT JOIN):

左连接返回左表中的所有行,以及与右表匹配的行。如果没有匹配,右表的结果列将为 NULL。

示例:查找每个客户以及他们的订单数量。

SELECT customers.customer_name, COUNT(orders.order_id) AS order_count
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_name;

右连接(RIGHT JOIN):

右连接类似于左连接,但是返回右表中的所有行。如果没有匹配,左表的结果列将为 NULL。

示例:查找每个订单以及订单对应的客户名称。

SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

全外连接(FULL OUTER JOIN):

全外连接返回左表和右表中的所有行,并将它们组合在一起。如果没有匹配,对应的结果列将为 NULL。

示例:查找每个订单以及与之相关的客户名称。

SELECT orders.order_id, customers.customer_name
FROM orders
FULL OUTER JOIN customers ON orders.customer_id = customers.customer_id;

交叉连接(CROSS JOIN):

交叉连接返回两个表的笛卡尔积,即左表的每一行与右表的每一行都组合在一起。

示例:从两个表中获取所有可能的组合。

SELECT * FROM table1
CROSS JOIN table2;

总结

做LeetCode题目有许多好处,特别是对于准备面试、提升编程技能和深化计算机科学知识的人来说。以下是一些可能的好处:

算法与数据结构掌握:LeetCode题库涵盖了各种经典的算法和数据结构问题,通过解决这些问题,你可以加深对各种常见算法和数据结构的理解和掌握。

编程技能提升:LeetCode的题目要求你在一定的时间内用有效的代码解决问题,这可以帮助你提高编写高效、优雅代码的能力,培养解决问题的思维方式。

面试准备:LeetCode上的题目往往涵盖了面试中常见的问题类型,通过刷题可以帮助你更好地准备技术面试,提高通过面试的机会。

思维训练:解决LeetCode题目需要逻辑清晰、抽象思维和创造性的问题解决能力。这些技能可以帮助你在现实生活中更好地分析和解决各种问题。

代码调试与优化:通过LeetCode的练习,你将学会调试代码和优化性能的技巧,这在实际开发中也是非常重要的。

积累解题经验:随着解决不同类型的问题,你将建立起丰富的解题经验,这些经验可以在类似问题出现时帮助你更快地找到解决方案。

学习新的编程语言特性:在解决LeetCode题目时,你可能会接触到一些新的编程语言特性和库函数,从而丰富自己的编程知识。

自信心提升:通过不断地解决难题,你会逐渐积累自信,相信自己可以解决复杂的编程问题。

http://www.lryc.cn/news/148965.html

相关文章:

  • day31 | 455.分发饼干、376. 摆动序列、53. 最大子序和
  • C# textBox 右键菜单 contextMenuStrip
  • TCP拥塞控制详解 | 7. 超越TCP
  • stm32之26.spi外设
  • C++信息学奥赛1177:奇数单增序列
  • Java的数组是啥?
  • 我的私人笔记(安装hadoop)
  • 【板栗糖GIS】——360浏览器的下载图标隐藏在内部不方便,怎么修改
  • SpringMVC之文件上传和下载
  • 简单了解OSI网络模型
  • 服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践
  • bpmnjs Properties-panel拓展(属性设置篇)
  • Debian系统上通过NFS挂载远程服务器硬盘
  • 【Linux】以太网协议以及MTU
  • UE5打完包后,启动程序不能全屏
  • 财务部发布《企业数据资源相关会计处理暂行规定》
  • 引用(个人学习笔记黑马学习)
  • 卷积神经网络实现运动鞋识别 - P5
  • C#安装“Windows 窗体应用(.NET Framework)”
  • SQL高阶语句
  • 【交换机】如何通过Web方式登陆交换机
  • Flink CDC学习笔记
  • NEOVIM学习笔记
  • Docker三剑客之docker-compose
  • 单调队列
  • effective c++ 笔记
  • 【送书活动】深入浅出SSD:固态存储核心技术、原理与实战
  • GaussDB数据库SQL系列-行列转换
  • 美国陆军网络司令部利用人工智能增强网络攻防和作战决策能力
  • Notion团队协作魔法:如何玩转数字工作空间?