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

从零掌握数据库:CRUD、联表、分组查询

一、什么是 CRUD?

CRUD 是四个英文单词的首字母缩写,代表数据库中最基础的四种操作:

  • Create(创建/插入)
  • Read(读取/查询)
  • Update(更新)
  • Delete(删除)

这些操作构成了绝大多数应用程序与数据库交互的核心。

1. Create(INSERT)

向表中插入新记录。

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

2. Read(SELECT)

查询数据是最常用的操作。
基础查询

SELECT * FROM users;

条件查询(WHERE)

SELECT name, email FROM users WHERE age > 25;

排序(ORDER BY)

SELECT * FROM users ORDER BY age DESC;

限制结果数量(LIMIT / TOP)

-- MySQL / SQLite
SELECT * FROM users LIMIT 5;-- SQL Server
SELECT TOP 5 * FROM users;

3. Update(UPDATE)

修改已有记录。

UPDATE users
SET email = 'newemail@example.com'
WHERE id = 1;

⚠️ 警告:务必加上 WHERE 条件!否则会更新整张表!

4. Delete(DELETE)

删除记录。

DELETE FROM users WHERE age < 18;

警告:务必加上 WHERE 条件!否则会导致整表数据被清空!

二、联表查询(JOIN)

联表查询(JOIN) 是在查询时,把两个或多个表按照某个“关联字段”组合在一起,从而同时获取多个表中的信息。

常见应用场景:

  • 查询订单时,把用户信息一起查出来
  • 查询学生课程成绩时,把课程名称同时查出来
  • 查询文章时,把作者信息联查显示

1.联表查询的核心思想

所有 JOIN 的本质:

“根据两个表的关联字段(通常是主键/外键)进行匹配,把相关的行拼在一起。”

常见关联字段例子:

  • orders.user_id = users.id
  • student.class_id = class.id
  • product.category_id = category.id

2.JOIN 的类型(最常用的 3 类)

以下示例假设有两个表:
users(用户表)

idname
1张三
2李四
3王五

orders(订单表)

iduser_idamount
11100
21200
32300

1️⃣ INNER JOIN(内连接)— 只保留两边都匹配的

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

查询结果:

nameamount
张三100
张三200
李四300

特点:
只显示“有订单的用户”,王五没有订单,所以不会出现。
2️⃣ LEFT JOIN(左连接)— 保留左表全部,右表没有则 NULL

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

结果:

nameamount
张三100
张三200
李四300
王五NULL

特点:
左表(users)全部保留,没有匹配的地方显示 NULL。

常用于:

  • 查询所有用户,即使没下过订单
  • 查询所有学生,即使没选过课
    3️⃣ RIGHT JOIN(右连接)— 保留右表全部
    (和 LEFT JOIN 反过来)
SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

结果与 INNER JOIN 一样(因为 orders 全都有匹配),但通常实际开发里 很少用 RIGHT JOIN,一般用 LEFT JOIN 完成同样效果。

3.多表联查(3 张或更多表)

假设我们有三张表:
1. 用户表 users

idname
1张三
2李四

2. 订单表 orders

iduser_idproduct_id
1011201
1021202

3. 商品表 products

idnamecategory
201iPhone电子产品
202咖啡杯日用品

💡 目标:查出每个订单对应的用户名和商品名
理解逻辑:分步连接
第一步:users 和 orders 连接
通过 users.id = orders.user_id,得到:

nameorder_idproduct_id
张三101201
张三102202

第二步:把上一步结果 和 products 连接
通过 product_id = products.id,得到最终结果:

nameproduct_name
张三iPhone
张三咖啡杯

✅ 数据库内部就是这样一步步“嵌套连接”的,只是 SQL 语法让我们可以一次性写完。
按照顺序查找,第一次联表查询的表作为新表与下一个连接的表进行联表表查询

SELECT u.name AS 用户名,p.name AS 商品名
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;

三、分组查询(GROUP BY)与聚合函数

你查询什么字段,查询的字段就作为一列
分组查询用于把数据按某个字段分组,并对每组分别进行统计。

直白理解:

GROUP BY = “把相同字段的行归成一组,再对每组统计一次”。

常用于:

  • 统计每个部门有多少员工
  • 统计每类商品的销量
  • 统计每个用户下了多少订单
  • 按日期统计每日访问量

1.常见聚合函数(必须记住)

聚合函数是对“每组数据”做统计的函数。

函数作用
COUNT()统计数量
SUM()求和
AVG()平均值
MAX()最大值
MIN()最小值

必须记住:

聚合函数 只对每一组 生效

非聚合字段 必须出现在 GROUP BY 之后

2.最基本的 GROUP BY 示例

假设 orders 表:

user_idamount
1100
1200
2300

查询每个用户的消费总额:

SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id;

结果:

user_idtotal_amount
1300
2300

3.SQL 分组查询(GROUP BY)与聚合函数 —— 总结总表

功能语法示例说明典型结果或用途
按字段分组GROUP BY user_id把同一用户的订单归为一组每用户一行
统计数量(COUNT)COUNT(*)统计每组行数订单数、访问量
求和(SUM)SUM(amount)求每组字段总和每用户总消费
平均值(AVG)AVG(score)每组平均数平均成绩、平均金额
最大/最小(MAX/MIN)MAX(price) / MIN(price)每组最大/最小最高订单金额
分组前过滤(WHERE)WHERE amount > 100过滤原始数据只统计大额订单
分组后过滤(HAVING)HAVING COUNT(*) > 5过滤聚合后的结果只显示下单≥5次的用户
分组 + 排序(ORDER BY)ORDER BY total DESC按聚合结果排序从高到低显示统计值
多字段分组GROUP BY user_id, date多维统计每用户每天订单数
JOIN + GROUP BYJOIN ... GROUP BY u.id先联表拼数据,再统计统计用户订单数最常见
SELECT 中非聚合字段必须出现在 GROUP BY 中✔ 正确:SELECT user_id, COUNT(*) FROM orders GROUP BY user_idSQL 规则避免报错
完整常见结构(最重要)SELECT… FROM… WHERE… GROUP BY… HAVING… ORDER BY…SQL 执行顺序必背口诀

SQL 分组查询顺序
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

  • WHERE:分组前过滤
  • GROUP BY:进行分组
  • HAVING:分组后的过滤
  • ORDER BY:最后排序

四、数据库基础核心概念总结

概念核心含义关键点实际应用场景
CRUD数据库最基本的四类操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)✔ 是所有数据库应用的基础
✔ Web、后台、接口开发必用
✔ SQL 对应 INSERT / SELECT / UPDATE / DELETE
- 用户注册:Create
- 查询列表:Read
- 修改资料:Update
- 删除订单:Delete
JOIN多表之间按关联字段进行连接查询✔ LEFT JOIN 保留左表全部数据
✔ INNER JOIN 只保留两表都匹配的部分
✔ 多表关联时要清楚主外键关系
- 订单关联用户信息
- 学生关联班级
- 文章关联作者
GROUP BY将相同字段的行分组,再对每组做统计✔ 搭配聚合函数:COUNT / SUM / AVG / MAX / MIN
✔ HAVING 用于过滤分组后的结果
✔ SELECT 中非聚合字段必须出现在 GROUP BY 中
- 每类商品总销量<br- 每个用户订单数量
- 每天访问量统计
http://www.dtcms.com/a/605611.html

相关文章:

  • 输油管道国内段增压泵站罗克韦尔PLC通过cclinkie转ethernetip智能网关和三菱FX5U进行通讯方案案例
  • php做的购物网站代码国外排版网站
  • 做模板下载网站挣钱吗东莞网站推广及优化
  • Springboot 配置属性绑定
  • 什么是生成模型
  • iTwin开源包系列(一) 树组件
  • 网站暂停怎么做dz动力 wordpress
  • sql评估存储的速度和稳定性
  • Kafka 菜鸟教程:从入门到实践
  • pytorch——从核心特性到多模态与相机系统优化的实践
  • 广东广东网站建设工作网页平面设计公司
  • 可视化图解算法68:数组中出现次数超过一半的数字
  • 在ec2上部署CosyVoice2模型
  • wish跨境电商平台四川成都网站优化
  • GitHub Copilot 与 Visual Studio 漏洞可致攻击者绕过安全防护功能
  • 将qt界面中加载css或者qss样式
  • 离线部署指南:本地下载MySQL 8.0.37并上传服务器Centos7.9安装
  • Camera Tuning:视觉时代的核心岗位
  • 商城类网站怎么优化网站建设实验代码
  • 【JavaEE】-- IoC DI
  • 制作网站低价网页设计的重点和难点
  • 基于灵动MM32F0130 MCU微控制器的智能插排设计
  • Java-170 Neo4j 事务、索引与约束实战:语法、并发陷阱与速修清单
  • Javaee—— CAS
  • 图片上传git时压缩
  • Flutter 聊天界面使用ListView的reverse:true,导致条目太少的时候会从下往上显示,导致顶部大片空白
  • 湛江市政工程建设公司网站仿别人的网站违法嘛
  • 石景山企业网站建设公司网站开发策划
  • RDMA拥塞控制之CNP
  • 终端Kitty,主要是看有人聊到opencode需要的终端