初识SQL

SQL(Structured Query Language,结构化查询语言)是操作关系型数据库的标准语言 ,广泛应用于MySQL、Oracle、SQL Server、PostgreSQL等数据库系统,也是掌握MyBatis框架的基础知识。关系型数据库(RDBMS)采用二维表格结构的关系模型来存储数据。所谓操作关系型数据库,就是通过特定工具或编程语言对数据库中的表、记录等对象进行创建、查询、更新、删除等管理操作,实现数据的存储、检索和维护。作为声明式语言,SQL专注于数据的定义、查询、更新和管理。本文不涉及数据库工具的安装配置,相关内容读者可自行查阅。

一、核心概念

在写 SQL 之前,需要先明确 "数据库、表、字段" 的关系,这是理解 SQL 操作的前提,我们可用"厨房、货架、食材的关系"来类比。

概念 专业定义 通俗类比 实例(用户数据场景)
数据库(DB) 存储数据的 "仓库",是多个表的集合,每个数据库有独立的权限和资源。 厨房的 "冷藏库"(专门放食材) 创建mybatis数据库(存储 MyBatis 学习用的所有表)
表(Table) 数据库中存储数据的 "二维表格",每个表对应一个业务实体(如用户、商品),有固定的列(字段)和行(记录)。 冷藏库中的 "货架"(专门放一类食材) mybatis数据库中创建users表(存储用户数据)
字段(Column) 表中的 "列",定义数据的类型和含义,每个字段有唯一名称和数据类型(如整数、字符串)。 货架上的 "格子标签"(标明格子放什么) users表的uid(用户 ID,整数)、uname(用户名,字符串)、uage(年龄,整数)
记录(Row) 表中的 "行",是一条完整的数据,每个记录对应一个实体实例(如一个用户)。 货架格子里的 "食材"(具体的物品) users表中 "uid=1,uname = 张三,uage=20" 就是一条

二、常见数据类型

数据类型 作用 实例场景
INT 存储整数(如 ID、年龄、数量),可指定是否自增(AUTO_INCREMENT)。 uid INT PRIMARY KEY AUTO_INCREMENT(用户 ID 自增)
VARCHAR(n) 存储字符串(如姓名、地址、标题),n 表示最大长度(如 VARCHAR (20) 最多存 20 个字符)。 uname VARCHAR(20) NOT NULL(用户名非空,最多 20 字)
DATE 存储日期(格式:YYYY-MM-DD),如生日、订单日期。 birthday DATE(用户生日)
DATETIME 存储日期 + 时间(格式:YYYY-MM-DD HH:MM:SS),如登录时间、创建时间。 create_time DATETIME(用户注册时间)
DECIMAL(m,n) 存储小数(如价格、金额),m 表示总位数,n 表示小数位数。 price DECIMAL(10,2)(商品价格,最多 10 位,2 位小数)

重要规则:必须明确指定字段是否允许为空(NOT NULL)。例如:

  • 用户名(uname)必须设为NOT NULL,这是区分用户的必要字段;
  • 用户备注(remark)可保留为空(默认允许),因为并非所有用户都需要填写备注。

三、SQL 基础语法与操作

SQL 的核心操作可以概括为 "CRUD"(Create 新增、Read 查询、Update 修改、Delete 删除),这也是 MyBatis 映射文件中最常用的四种 SQL 类型。我们以 users 表为例进行说明,该表结构包含:uid(INT 类型,主键自增)、uname(VARCHAR(20),非空字段)和 uage(INT,非空字段)。接下来将详细讲解每种操作的语法和实际应用案例。

1. 准备工作:创建数据库和表

右键点击 "本地 MySQL"→ 选择 "新建数据库":

  1. 数据库名:eg
  2. 字符集:选择utf8mb4(支持所有中文和特殊字符,避免乱码);
  3. 排序规则:默认utf8mb4_general_ci
  4. 点击 "确定",eg数据库创建完成。

可视化工具的左侧导航栏是 "缓存显示",不是实时刷新的,需要手动刷新。

  1. 选中左侧导航栏中连接的 MySQL 实例;
  2. 右键点击该实例,选择 "刷新"(或按快捷键F5);
  3. 刷新后,在实例下的 "数据库" 目录中,就能看到 eg 数据库了。

右键点击 eg 数据库→ 选择 "新建查询",打开 SQL 编辑窗口;

先执行以下 SQL,创建后续操作所需的 "仓库" 和 "货架",这是所有实操的前提:

sql 复制代码
-- 1. 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS eg;

-- 2. 使用该数据库(相当于"打开冷藏库")
USE eg;

-- 3. 创建users表(相当于"在冷藏库中放一个用户货架")
CREATE TABLE IF NOT EXISTS users (
    uid INT PRIMARY KEY AUTO_INCREMENT,  -- 主键(唯一标识一条记录),自增
    uname VARCHAR(20) NOT NULL,          -- 用户名,非空
    uage INT NOT NULL                    -- 年龄,非空
);

选中所有 SQL,点击工具栏 "运行"(或按 Ctrl+R),下方提示 "执行成功";

刷新 eg 数据库下的 "表",就能看到 users 表。

2. 新增(Create):向表中插入数据

作用:往表中添加一条或多条新记录(如新增一个用户)。

格式如下:

sql 复制代码
INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...);
-- 说明:1. 字段顺序需与值顺序一致;2. 字符串和日期值需用单引号包裹;3. 自增字段(如uid)可省略不写,数据库会自动生成

实例:

sql 复制代码
-- 新增1个用户(uid自增,不用写)
INSERT INTO users(uname, uage) VALUES('张三', 20);

-- 新增多个用户(用逗号分隔多个VALUES)
INSERT INTO users(uname, uage) VALUES('李四', 18), ('王五', 22);

注:ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;的作用是修改users表的字符集为utf8mb4,并设置排序规则为utf8mb4_general_ci,让表能支持中文存储。uid 为7 8 9是因为手动删除了前六个数据。

3. 查询(Read):从表中获取数据

从表中筛选、获取需要的数据(如查所有用户、查年龄大于 20 的用户),是 SQL 中最常用、最灵活的操作。

语法:

sql 复制代码
SELECT 字段1, 字段2, ... FROM 表名 WHERE 条件;
-- 说明:1. 用"*"表示查询所有字段;2. WHERE后接筛选条件(可选,不写则查所有记录);3. 可加ORDER BY排序(可选)

(1)查询所有记录

sql 复制代码
-- 查询users表所有字段的所有记录
SELECT * FROM users;

结果:查询 users 表中所有用户的用户ID(uid)、用户名(uname)和年龄(uage)信息。

(2)查询指定字段

sql 复制代码
-- 只查询用户名和年龄,不查uid
SELECT uname, uage FROM users;

结果:返回的记录只有 uname 和 uage 两列,减少数据传输量。

(3)带条件查询(核心)

用 WHERE 指定筛选条件,支持 "等于(=)、大于(>)、小于(<)、不等于(!=)、模糊查询(LIKE)" 等条件:

sql 复制代码
-- 1. 查uid=7的用户(精准查询,常用)
SELECT * FROM users WHERE uid = 7;  -- 结果:只返回张三的记录

-- 2. 查年龄大于18的用户
SELECT * FROM users WHERE uage > 18;  -- 结果:返回张三(20)、王五(22)的记录

-- 3. 查用户名包含"李"的用户(模糊查询,%表示任意字符)
SELECT * FROM users WHERE uname LIKE '%李%';  -- 结果:返回李四的记录

以第二条语句为例:

(4)排序查询

使用 ORDER BY 字段名 [ASC|DESC] 进行排序:ASC 表示升序排列(默认方式,如年龄从小到大);DESC 表示降序排列(如年龄从大到小)。

sql 复制代码
-- 按年龄升序查询所有用户(年轻的在前)
SELECT * FROM users ORDER BY uage ASC;
4. 修改(Update):更新表中已有数据

作用:修改表中符合条件的记录(如将张三的年龄改为 21)。

语法

sql 复制代码
UPDATE 表名 SET 字段1=新值1, 字段2=新值2, ... WHERE 条件;
-- 关键警告:必须加WHERE条件!否则会修改表中所有记录(如没加条件会把所有用户的年龄都改成21)

示例:

sql 复制代码
-- 将uid=7的用户(张三)的年龄改为21
UPDATE users SET uage = 21 WHERE uid = 7;

-- 同时修改用户名和年龄(将uid=8的用户改为"李小四",年龄19)
UPDATE users SET uname = '李小四', uage = 19 WHERE uid = 8;
5. 删除(Delete):删除表中记录

作用:删除表中符合条件的记录(如删除 uid=9 的用户)。

语法:

sql 复制代码
DELETE FROM 表名 WHERE 条件;
-- 关键警告:1. 必须加WHERE条件!否则会删除表中所有记录(清空表);2. 删除后数据无法恢复,需谨慎操作

示例:

sql 复制代码
-- 删除uid=9的用户(王五)
DELETE FROM users WHERE uid = 9;

补充:如果需要 "清空表并重置自增字段"(如删除所有用户,且让下一个新增用户的 uid 从 1 开始),可用 TRUNCATE:

sql 复制代码
TRUNCATE TABLE users;  -- 清空users表,uid重置为1(注意:这是删除表中所有记录,无法恢复)

四、SQL 基础核心规范

SQL 规范旨在提高代码的可读性、可维护性和性能。以下是一些核心规范,读者可简要了解。

命名规范

  • 表名、字段名使用小写字母,单词间用下划线分隔,例如 user_info
  • 避免使用 SQL 关键字作为表名或字段名,如 ordergroup
  • 主键通常命名为 id,外键命名为 关联表名_id,如 user_id

语法规范

  • 关键字使用大写,例如 SELECTFROMWHERE

  • 缩进和对齐保持一致,子句换行书写:

    sql 复制代码
    SELECT 
        id, 
        user_name, 
        email
    FROM 
        user_info
    WHERE 
        status = 'active'
  • 避免使用 SELECT *,明确列出所需字段。

索引规范

  • 为频繁查询的字段创建索引,尤其是主键和外键。
  • 避免过度索引,索引会降低写入性能。
  • 复合索引遵循最左前缀原则。

事务规范

  • 事务尽量简短,避免长时间占用锁资源。
  • 明确提交或回滚事务,避免隐式提交。
  • 使用 BEGIN TRANSACTIONCOMMITROLLBACK 控制事务边界。

性能优化

  • 使用 EXPLAIN 分析查询执行计划。
  • 避免在 WHERE 子句中使用函数或计算,会导致索引失效。
  • 分页查询使用 LIMITOFFSET,大数据量时考虑游标分页。

安全规范

  • 使用参数化查询或预处理语句防止 SQL 注入。
  • 避免动态拼接 SQL,必要时严格过滤输入。
  • 限制数据库用户权限,遵循最小权限原则。

注释规范

  • 复杂查询添加注释说明逻辑。

  • 表结构注释使用 COMMENT 关键字:

    sql 复制代码
    CREATE TABLE user_info (
        id INT PRIMARY KEY COMMENT '用户ID',
        user_name VARCHAR(50) COMMENT '用户名'
    );

遵循这些规范可以显著提升 SQL 代码的质量和效率。

在后续 MyBatis 学习中,我们将涉及"多表查询"内容。下一篇文章将详细介绍 SQL 进阶知识------多表关联与约束。

相关推荐
g***72702 小时前
从MySQL迁移到PostgreSQL的完整指南
数据库·mysql·postgresql
冷雨夜中漫步2 小时前
Maven BOM(Bill of Materials)使用指南与常见错误
java·数据库·maven
hanyi_qwe2 小时前
Mysql主从复制与读写分离测试
数据库·mysql
梁bk2 小时前
Redis 通信协议(RESP)
数据库·redis·缓存
思成不止于此2 小时前
MySQL 约束详解:保证数据完整性的核心机制
数据库·笔记·学习·mysql
理想三旬3 小时前
数据定义:模式、表、索引
数据库
c***87193 小时前
讲解进阶之路:模块、包和异常处理-上篇
数据库·redis·哈希算法
!chen3 小时前
Oracle分区表+本地索引 核心优化方案
数据库·oracle
叽里咕噜怪3 小时前
MySQL-读写分离实验
数据库·mysql