初级程序员必备的十大技能之数据库基础(一)

简介: 教程来源 https://bncne.cn 本文系统讲解关系型数据库核心知识:从数据库原理、SQL四大语句(DDL/DML/DQL/DCL)到表设计、索引优化、事务机制与性能调优,涵盖WHERE/HAVING区别、多表JOIN、子查询、UNION等重点难点,配原理图解与实战代码,助你真正理解而非仅会写SQL。

数据是互联网时代的“石油”
想象一下这些场景:

用户注册时,你需要在几毫秒内检查用户名是否已存在,并保存用户信息

电商大促时,数千人同时下单,你需要保证不会出现“超卖”

运营需要统计上周销售额最高的商品,你需要从几百万条订单中快速汇总数据

这些场景的背后,都离不开数据库。

数据库是存储、管理和检索数据的系统,是所有应用程序的“数据心脏”。无论你是前端、后端还是全栈开发者,掌握数据库基础知识都是必备技能。

本文将从零开始,带你系统掌握关系型数据库的核心知识:SQL 语言、表设计、索引优化、事务原理、性能调优。每一部分都有详细的原理说明和代码示例,让你不仅会写 SQL,更理解数据库背后的工作原理。

一、数据库概述:先理解“是什么”
1.1 为什么需要数据库?
image.png
1.2 数据库的分类
image.png
1.3 关系型数据库的核心概念

数据库 (Database)
    └── 表 (Table)  → 类似 Excel 工作表
         ├── 列 (Column) → 字段,如:id, name, age
         ├── 行 (Row)    → 记录,如:1, 张三, 25
         ├── 主键 (Primary Key) → 唯一标识每一行
         └── 外键 (Foreign Key) → 关联其他表

1.4 主流数据库的选择
image.png
初级程序员推荐:先学 MySQL 或 PostgreSQL,因为:

开源免费,学习成本低

就业市场需求最大

学会了 SQL,换其他关系型数据库成本很低

二、SQL 基础:数据操作的核心语言

SQL(Structured Query Language)是与关系型数据库沟通的语言,分为四大类:
image.png
2.1 数据库与表的管理(DDL)

-- 1. 数据库操作
CREATE DATABASE mydb;                    -- 创建数据库
USE mydb;                                -- 切换到数据库
DROP DATABASE mydb;                      -- 删除数据库

-- 2. 创建表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,   -- 主键,自动增长
    username VARCHAR(50) NOT NULL UNIQUE, -- 不能为空,值唯一
    email VARCHAR(100) NOT NULL,
    age INT CHECK (age >= 0 AND age <= 150), -- 检查约束
    status TINYINT DEFAULT 1,            -- 默认值
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 3. 修改表结构
ALTER TABLE users ADD COLUMN phone VARCHAR(20);     -- 添加列
ALTER TABLE users MODIFY COLUMN age SMALLINT;       -- 修改列类型
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(20); -- 重命名列
ALTER TABLE users DROP COLUMN mobile;               -- 删除列
ALTER TABLE users RENAME TO user_accounts;          -- 重命名表

-- 4. 删除表
DROP TABLE users;
TRUNCATE TABLE users;  -- 清空表数据(保留结构)

2.2 插入、更新、删除(DML)

-- 1. 插入数据
-- 插入完整行
INSERT INTO users (username, email, age) VALUES ('zhangsan', 'zs@example.com', 25);

-- 插入多行
INSERT INTO users (username, email, age) VALUES 
    ('lisi', 'lisi@example.com', 30),
    ('wangwu', 'wangwu@example.com', 28);

-- 从其他表复制数据
INSERT INTO users_backup SELECT * FROM users;

-- 2. 更新数据
UPDATE users SET age = 26 WHERE username = 'zhangsan';
UPDATE users SET age = age + 1, updated_at = NOW() WHERE age < 18;

-- 3. 删除数据
DELETE FROM users WHERE username = 'zhangsan';
DELETE FROM users;  -- 删除所有行(逐行删除,慢,可回滚)
TRUNCATE users;     -- 清空表(直接释放空间,快,不可回滚)

2.3 数据查询(DQL)- 重中之重
查询是 SQL 中最常用、也最复杂的部分,下面从简单到复杂逐步学习。

基础查询

-- 最简单的查询
SELECT * FROM users;                    -- 所有列
SELECT username, email FROM users;      -- 指定列
SELECT 1+1 AS result;                   -- 计算表达式

-- 去重
SELECT DISTINCT age FROM users;

-- 限制结果数量
SELECT * FROM users LIMIT 10;
SELECT * FROM users LIMIT 20 OFFSET 10;  -- 分页:第11-30条

-- 排序
SELECT * FROM users ORDER BY age ASC;   -- 升序(默认)
SELECT * FROM users ORDER BY age DESC;  -- 降序
SELECT * FROM users ORDER BY age DESC, username ASC; -- 多列排序

条件查询(WHERE)

-- 比较运算符
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
SELECT * FROM users WHERE username IN ('zhangsan', 'lisi');
SELECT * FROM users WHERE email IS NULL;     -- 注意:不是 = NULL
SELECT * FROM users WHERE email IS NOT NULL;

-- 逻辑运算符
SELECT * FROM users WHERE age > 18 AND status = 1;
SELECT * FROM users WHERE age > 30 OR age < 18;

-- 模糊匹配(LIKE)
SELECT * FROM users WHERE username LIKE '张%';    -- 以"张"开头
SELECT * FROM users WHERE username LIKE '%三%';   -- 包含"三"
SELECT * FROM users WHERE email LIKE 'zhang_@%';  -- _ 匹配单个字符

聚合函数与分组(GROUP BY)

-- 聚合函数
SELECT COUNT(*) FROM users;               -- 总行数
SELECT COUNT(email) FROM users;           -- 非空邮件数
SELECT COUNT(DISTINCT age) FROM users;    -- 不同年龄的数量
SELECT AVG(age) FROM users;               -- 平均年龄
SELECT SUM(age) FROM users;               -- 年龄总和
SELECT MAX(age) FROM users;               -- 最大年龄
SELECT MIN(age) FROM users;               -- 最小年龄

-- 分组统计
SELECT age, COUNT(*) as count 
FROM users 
GROUP BY age;

-- 分组后筛选(HAVING)
SELECT age, COUNT(*) as count 
FROM users 
GROUP BY age 
HAVING COUNT(*) > 1;  -- 筛选出现次数大于1的年龄

WHERE vs HAVING 的区别:
image.png
多表查询(JOIN)
多表查询是 SQL 的核心难点,也是最常见的面试题。

-- 先创建示例表
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,
    product_name VARCHAR(100),
    amount DECIMAL(10,2),
    order_date DATE
);

-- 插入示例数据
INSERT INTO users (id, username) VALUES (1, '张三'), (2, '李四'), (3, '王五');
INSERT INTO orders (user_id, product_name, amount) VALUES 
    (1, '手机', 2999.00),
    (1, '耳机', 199.00),
    (2, '电脑', 5999.00),
    (2, '鼠标', 89.00);

不同类型的 JOIN

-- 1. INNER JOIN(内连接):只返回两表匹配的行
SELECT u.username, o.product_name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- 结果:张三(手机,耳机) 李四(电脑,鼠标) 
-- 王五没有订单,不显示

-- 2. LEFT JOIN(左连接):返回左表所有行
SELECT u.username, o.product_name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- 结果:张三(手机,耳机) 李四(电脑,鼠标) 王五(NULL,NULL)

-- 3. RIGHT JOIN(右连接):返回右表所有行
SELECT u.username, o.product_name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;

-- 4. 自连接(自身连接)
-- 示例:查找年龄相同的用户
SELECT a.username AS user1, b.username AS user2, a.age
FROM users a
INNER JOIN users b ON a.age = b.age AND a.id != b.id;

JOIN 类型图解:

INNER JOIN:          LEFT JOIN:           RIGHT JOIN:
    ┌─────┐              ┌─────┐               ┌─────┐
    │  交集 │            │ 左表 │               │ 右表 │
    └─────┘              │ ┌─┐ │               │ ┌─┐ │
                         │ │交集│               │ │交集│ │
                         │ └─┘ │               │ └─┘ │
                         └─────┘               └─────┘

子查询(Subquery)

-- 1. WHERE 子句中的子查询
-- 查找年龄大于平均年龄的用户
SELECT * FROM users 
WHERE age > (SELECT AVG(age) FROM users);

-- 2. FROM 子句中的子查询(派生表)
SELECT username, age 
FROM (SELECT * FROM users WHERE age >= 18) AS adult_users;

-- 3. SELECT 子句中的子查询(标量子查询)
SELECT username, 
       (SELECT COUNT(*) FROM orders WHERE user_id = users.id) AS order_count
FROM users;

-- 4. EXISTS 子查询
-- 查询有订单的用户
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);

-- 5. IN 子查询
SELECT * FROM users 
WHERE id IN (SELECT DISTINCT user_id FROM orders);

组合查询(UNION)

-- UNION:合并两个查询结果,自动去重
SELECT username FROM users WHERE age < 20
UNION
SELECT username FROM users WHERE age > 30;

-- UNION ALL:不去重,性能更好
SELECT user_id FROM orders WHERE amount > 1000
UNION ALL
SELECT user_id FROM orders WHERE amount < 100;

执行顺序(非常重要!)

-- 一个完整 SELECT 语句的执行顺序
SELECT DISTINCT col1, agg_func(col2)   -- 5. 选择列、去重
FROM table1                            -- 1. 确定数据来源
JOIN table2 ON ...                     -- 2. 连接表
WHERE condition1                       -- 3. 行级筛选(分组前)
GROUP BY col1                          -- 4. 分组
HAVING condition2                      -- 6. 组级筛选(分组后)
ORDER BY col1                          -- 7. 排序
LIMIT offset, count;                   -- 8. 限制行数

来源:
https://yyvgt.cn

相关文章
|
23天前
|
存储 人工智能 安全
意图共鸣科技:AI记忆链的盲存——你的记忆,只有你能打开
你和AI的对话,平台真能“看不见”吗?意图共鸣科技推出“盲存”技术:数据本地加密后上传,密钥仅用户持有,云端仅存密文。平台变“数据保管员”,无法访问明文,隐私由架构保障而非承诺。用户完全掌控记忆——可查、可导、可删,跨设备同步同样安全。
142 16
|
22天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
7423 18
|
23天前
|
JavaScript Android开发 数据安全/隐私保护
以cocos3.8.8开发的游戏为例商业实战项目举例cocos打包ios苹果安装包ipa完整详细教程-优雅草卓伊凡
本教程基于Cocos Creator 3.8.8,详解iOS IPA打包全流程:含环境配置(Xcode、Apple开发者账号)、构建面板设置(包名、屏幕方向、签名等)、Xcode工程配置、Archive归档及IPA导出,并附常见报错解决方案,理论+实操结合,助力开发者高效上架。
192 8
以cocos3.8.8开发的游戏为例商业实战项目举例cocos打包ios苹果安装包ipa完整详细教程-优雅草卓伊凡
|
1月前
|
分布式计算 MaxCompute iOS开发
TorchEasyRec 在 macOS 上的功能限制总结
本文总结tzrec在macOS上的功能限制:核心依赖(如torchrec、fbgemm-gpu、graphlearn等)无法安装;分布式训练、原生数据管线、Embedding模块、Triton/CUDA算子、TDM树模型等功能完全不可用;优化器与模型导出部分失效;单元测试大多因强依赖而失败。
165 15
|
1月前
|
应用服务中间件
手慢无!阿里云轻量服务器2026最新秒杀价:2核4G配置199元/年,200M带宽不限流
阿里云2026轻量服务器秒杀开启!轻量应用服务器官方页面:https://t.aliyun.com/U/PEdlFP 新用户专享:2核2G低至38元/年(9.9元/月限时抢),2核4G仅199元/年,4核8G/16G分别1159元、1599元/年。全系配200M峰值带宽+不限流量,性价比远超友商。手慢无!
|
17天前
|
人工智能 自然语言处理 安全
【新人快速上手使用】小白也能上手的 OpenClaw 2.6.6 安装教程(技术分享)
OpenClaw(小龙虾)是2026年热门开源「数字员工」,支持Windows一键部署(5分钟搞定),本地运行、零代码、全自动办公。无需配置环境,可整理文件、发邮件、浏览器自动化等,隐私安全,小白友好。
|
9天前
|
数据采集 自动驾驶 算法
8类道路交通车辆目标检测数据集(2600张)|YOLO训练数据集 智慧交通 自动驾驶 车流统计 车辆识别
本数据集含2600张真实道路图像,精细标注8类车辆(公交、重型/中型/牵引卡车、皮卡、轿车、两轮车、面包车),YOLO格式,覆盖城市/城郊多场景,支持智慧交通、自动驾驶、车流统计等任务,开箱即用。
145 10
|
5天前
|
JSON 前端开发 测试技术
Kimi-k2.6 流式回包乱序后,我这样接入 ​D​М‌X​Α‌РΙ
kimi-k2.6 不止于聊天,其核心价值在于“可执行交付”:统一支持代码生成、长时程任务、Agent协作、文档→技能复用及多格式输出,具备工程级组合能力。它契合企业对“单模型多工位”的刚需——在研发、内容中台等场景中,稳定闭环完成需求拆解、编码、文档整理等多步任务。真正落地需依托DMXAPI网关实现标准化API集成,解决Web路径的不确定性,让模型能力成为可度量、可审计、可持续的生产基础执行层。(239字)
|
18天前
|
JavaScript Java 关系型数据库
全栈(Java + Vue + MySQL)开发图书管理系统教程(一)
教程来源 https://yyvgt.cn 本教程带你从零打造全栈图书管理系统,涵盖Spring Boot+Vue3前后端分离开发、JWT认证、RBAC权限控制、MySQL数据库设计(含范式化/索引/软删除)及统一RESTful接口规范,深入原理与工程实践。
|
1月前
|
人工智能 安全 JavaScript
基于邮件入口的网络钓鱼攻击机理与智能防御体系研究
本文针对网络钓鱼这一首要网络攻击入口(占比超75%),构建融合URL、邮件头、文本语义、页面DOM与用户行为的五维智能检测模型,提供可工程化代码实现;并提出技术防护、认知提升、制度规范、应急响应四位一体的闭环防御体系,助力个人与机构精准识别、实时阻断钓鱼威胁。(239字)
104 15