SQL基础入门:从CRUD到JOIN再到索引(通俗易懂版)

一、为什么需要SQL?

想象你在管理一个图书馆:

  • 传统方法:手动记录每本书的位置、借阅者、归还日期
  • SQL方法:用数据库系统自动管理,快速查询《Java编程思想》在哪个书架

SQL(Structured Query Language)就是数据库的"魔法咒语",让你高效管理数据。

二、CRUD操作:数据库的四大基本技能

1. 创建表(CREATE)

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,age INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 插入数据(INSERT)

INSERT INTO users (name, email, age)
VALUES ('张三', 'zhangsan@example.com', 25);

3. 查询数据(SELECT)

-- 查询所有用户
SELECT * FROM users;-- 查询年龄大于18岁的用户
SELECT id, name, age 
FROM users 
WHERE age > 18 
ORDER BY created_at DESC;-- 分页查询(第2页,每页10条)
SELECT * FROM users LIMIT 10 OFFSET 10;

4. 更新数据(UPDATE)

-- 将ID为1的用户年龄改为26
UPDATE users 
SET age = 26, email = 'new@example.com' 
WHERE id = 1;

5. 删除数据(DELETE)

-- 删除ID为5的用户
DELETE FROM users WHERE id = 5;

三、JOIN操作:关联表查询的魔法

假设我们有两个表:

-- 用户表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
);-- 订单表
CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,amount DECIMAL(10,2),FOREIGN KEY (user_id) REFERENCES users(id)
);

1. 内连接(INNER JOIN)

SELECT u.name, o.amount
FROM users u
INNER JOIN orders o 
ON u.id = o.user_id;

结果:只显示同时存在于用户表和订单表的数据。

2. 左连接(LEFT JOIN)

SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o 
ON u.id = o.user_id;

结果:显示所有用户,包括没有订单的用户(订单金额为NULL)。

3. 右连接(RIGHT JOIN)

SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o 
ON u.id = o.user_id;

结果:显示所有订单,包括未匹配到用户的订单(用户名为NULL)。

4. 全连接(FULL OUTER JOIN)

SELECT u.name, o.amount
FROM users u
FULL OUTER JOIN orders o 
ON u.id = o.user_id;

结果:显示所有用户和订单,无论是否匹配。

四、索引:让查询速度起飞的秘籍

1. 为什么需要索引?

  • 未加索引:逐行扫描数据(像在图书馆逐本书找《红楼梦》)
  • 加索引:快速定位数据(像用图书馆的分类目录查找)

2. 创建索引

-- 在email字段创建普通索引
CREATE INDEX idx_users_email ON users(email);-- 在name和age字段创建复合索引
CREATE INDEX idx_users_name_age ON users(name, age);

3. 索引适用场景

  • 经常用于查询条件的字段(如WHERE子句)
  • 外键关联字段
  • 排序字段(ORDER BY)

五、常见问题解答

1. WHERE和HAVING的区别?

  • WHERE:过滤行(在聚合前)
  • HAVING:过滤分组(在聚合后)
SELECT user_id, COUNT(*) AS order_count
FROM orders
WHERE amount > 100  -- 过滤金额>100的订单
GROUP BY user_id
HAVING order_count > 2;  -- 过滤订单数>2的用户

2. 如何防止SQL注入?

  • 使用预编译语句(PreparedStatement)
  • 避免直接拼接SQL字符串
// Java示例
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
stmt.setString(1, userEmail);

六、推荐学习资源

  1. SQL Zoo 互动教程
  2. W3Schools SQL教程
  3. 《SQL必知必会》
  4. MySQL官方文档

七、总结

SQL是数据时代的通用语言,掌握CRUD、JOIN和索引将使你:

  • 高效管理数据
  • 快速构建应用
  • 解锁数据分析能力

现在就打开MySQL客户端,尝试用今天学到的知识创建一个用户表吧!记得每次操作前备份数据,享受SQL的乐趣。🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MINIQMT学习课程Day11

现在开始进行策略的交易买卖分析: 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件 导入包: import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现

实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现 在当今数字化时代,计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中,人脸检测与分析作为计算机视觉领域的重要分支,已广泛应用于安防监控、智能交互、…

Python Cookbook-5.14 给字典类型增加排名功能

任务 你需要用字典存储一些键和“分数”的映射关系。你经常需要以自然顺序(即以分数的升序)访问键和分数值,并能够根据那个顺序检查一个键的排名。对这个问题,用dict 似乎不太合适。 解决方案 我们可以使用 dict 的子类,根据需要增加或者重…

十四种逻辑器件综合对比——《器件手册--逻辑器件》

目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…

如何更改wsl2中的ubuntu默认安装位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目录,wsl装ubuntu的home目录在哪,如何更改home?_wsl安装的ubuntu在哪里-CSDN博客 这次是要更改wsl中ubuntu的安装目录,毕竟默认安装到c盘下会占用不少空间的。 从微软商店get后…

最近在工作中感受到了设计模式的重要性

之前了解设计模式:只是应付一下面试 在之前一年多的工作中也没遇到使用场景 最近在搭建验证环境的时候,才发现这玩意这么重要 首先是设计模式的使用场景一定是在很复杂繁琐的场景下进行的 之所以说是复杂/繁琐的场景,因为一些场景也许逻辑不难…

Python深度学习基础——卷积神经网络(CNN)(PyTorch)

CNN原理 从DNN到CNN 卷积层与汇聚 深度神经网络DNN中,相邻层的所有神经元之间都有连接,这叫全连接;卷积神经网络 CNN 中,新增了卷积层(Convolution)与汇聚(Pooling)。DNN 的全连接…

Linux 第三讲 --- 基础指令(三)

前言: 在前面我们已经讲了有十几个Linux的基础指令,今天我们再补充几个常用的基础指令,为后面的学习做准备 。 目录 前言: 一、两个与时间相关的指令 1.date指令 演示 : 时间戳 设置时间 2、cal指令 演示&#x…

基于SiamFC的红外目标跟踪

基于SiamFC的红外目标跟踪 1,背景与原理2,SiamFC跟踪方法概述2.1 核心思想2.2 算法优势3,基于SiamFC的红外跟踪代码详解3.1 网络定义与交叉相关模块3.2 SiamFC 跟踪器实现3.3 主程序:利用 OpenCV 实现视频跟踪4,总结与展望在红外监控、无人机防御以及低光照场景中,红外图…

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要将现有的 Excel 计算表格部署到 Odoo 平台上,您可以按照以下步骤进行操作: 将 Excel 表格中的数据转移到 Odoo 模块中:首先,您需要将 Excel 表格中的数据导出为 CSV 格式,然后可以使用 Odoo 的数据导入功能将这些数据…

KWDB创作者计划—KWDB认知引擎:数据流动架构与时空感知计算的范式突破

引言:数据智能的第三范式 在数字化转型进入深水区的2025年,企业数据系统正面临三重悖论:数据规模指数级增长与实时决策需求之间的矛盾、多模态数据孤岛与业务连续性要求之间的冲突、静态存储范式与动态场景适配之间的鸿沟。KWDB(K…

C语言 数据结构 【栈】动态模拟实现

引言 动态模拟实现栈的各个接口 一、栈的概念与结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut…

Python itertools模块的groupby函数介绍

itertools.groupby 是 Python 标准库 itertools 模块中的一个函数,它的主要功能是对可迭代对象中相邻的相同元素进行分组。 itertools.groupby(iterable, keyNone) 函数 作用: 将连续的(相邻的)相同元素分组,返回 (…

Python实例题:使用Python生成分形图片

目录 Python实例题 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 mandelbrot 函数: 设置复平面区域和图像参数: 计算分形数据: 绘图展示: 运行思路 Python实例题 题目 使用Python生成分形图…

系统编程1(进程的概念与原理)

进程的概念与原理 计算机组成部分一般遵循冯诺依曼结构,也就是由控制器、运算器、存储器、输入设备、输出设备五个部分组成。 ⦁ 程序的编译 一般在编写出程序之后,并不能直接运行,而是需要把程序通过编译器进行编译,生成可执行…

《Vue Router实战教程》5.嵌套路由

欢迎观看《Vue Router 实战(第4版)》视频课程 嵌套路由 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下,URL 的片段通常对应于特定的嵌套组件结构,例如: 通过 Vue Router,你可以使用嵌套路由配置…

使用Python解决Logistic方程

引言 在数学和计算机科学中,Logistic 方程是描述人口增长、传播过程等现象的一种常见模型。它通常用于表示一种有限资源下的增长过程,比如动物种群、疾病传播等。本文将带领大家通过 Python 实现 Logistic 方程的求解,帮助你更好地理解这一经典数学模型。 1.什么是 Logist…

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第十二篇(完结篇):数据统计功能实现

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 《从零搭建Vue3项目实战》(AI辅助…

研究嵌入式软件架构时遇到的初始化堆栈溢出问题

文章目录 2025年4月10日新增分析PC寄存器指针值排查问题map文件设计到的知识点1. **.bss 段(Block Started by Symbol)**2. **.data 段**3. **.text 段**4. **.heap 段**5. **.stack 段**6. **.rodata 段(只读数据段)**7. **.init…

软件架构评估两大法:ATAM 和 SAAM 的对比与实践

架构权衡分析方法(ATAM)和软件架构分析方法(SAAM)是软件架构评估领域中非常重要的两种方法,以下为你详细介绍: 一、架构权衡分析方法(ATAM) 1.背景与起源:ATAM 是由卡耐…