MySQL 基础SQL知识总结

MySQL 基础SQL知识总结

一、MySQL 数据库基础

(一)数据库类型

MySQL 属于关系型数据库(RDBMS),核心是建立在关系模型基础上,由多张相互关联的二维表组成数据存储结构,表与表之间可通过关联字段建立逻辑关系。

(二)核心特点

  1. 存储规范:使用表结构存储数据,字段格式统一,数据组织有序,便于后期维护和修改。
  2. 操作统一:通过 SQL(结构化查询语言)实现数据操作,语法标准通用,学习成本低、使用便捷。

二、SQL 通用语法

  1. 书写规则
    • SQL 语句可单行或多行书写,必须以分号(;) 结尾;
    • 可通过空格、缩进优化语句结构,提升可读性(如关键字换行、字段对齐)。
  2. 大小写规则:MySQL 中 SQL 语句不区分大小写(如 SELECT 与 select 功能一致),但建议关键字使用大写(如 CREATEWHERE),字段 / 表名使用小写,避免混淆。
  3. 注释方式
    • 单行注释:-- 注释内容(注意 “--” 后需加空格)或 # 注释内容(MySQL 特有);
    • 多行注释:/* 注释内容 */,支持跨多行标注(如说明复杂逻辑的作用)。

三、DDL(数据定义语言)—— 数据库与表结构操作

DDL 用于定义数据库、表的结构,核心操作包括 “数据库操作” 和 “表操作”,不涉及表中具体数据。

(一)数据库操作

操作需求 SQL 语句格式 说明
查询所有数据库 SHOW DATABASES; 列出 MySQL 服务器中所有已创建的数据库名称。
查询当前使用的数据库 SELECT DATABASE(); 查看当前会话正在操作的数据库。
创建数据库 CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则]; IF NOT EXISTS 避免数据库已存在时报错;DEFAULT CHARSET 可指定默认字符集(如 utf8mb4 支持表情)。
使用数据库 USE 数据库名; 操作表前必须先切换到目标数据库(如 USE student_db;)。
删除数据库 DROP DATABASE [IF EXISTS] 数据库名; IF NOT EXISTS 避免删除不存在的数据库时报错;删除后数据不可恢复,需谨慎操作。

(二)表操作

1. 查询表信息
操作需求 SQL 语句 说明
查询当前数据库所有表 SHOW TABLES; 列出当前数据库中所有表名。
查询表结构 DESC 表名; 显示表的字段名、数据类型、是否为空、默认值、主键等结构信息。
查询建表语句 SHOW CREATE TABLE 表名; 查看表的完整创建语句(含表注释、字符集、存储引擎等细节,便于复制表结构)。
2. 创建表
基本语法
CREATE TABLE 表名(
    字段1 字段1类型 [***MENT 字段1注释],
    字段2 字段2类型 [***MENT 字段2注释],
    ...
    字段n 字段n类型 [***MENT 字段n注释]
)[ ***MENT 表注释 ]; -- 表的整体功能说明
示例

创建 “学生表(student)”,包含学号、姓名、年龄字段:

CREATE TABLE student(
    id INT ***MENT '学号',
    name VARCHAR(50) ***MENT '姓名',
    age TINYINT ***MENT '年龄'
)[ ***MENT '学生基本信息表' ];
3. 修改表
操作需求 SQL 语句格式 示例
添加字段 ALTER TABLE 表名 ADD 字段名 类型(长度) [***MENT 注释] [约束]; 给 student 表加 “性别” 字段:ALTER TABLE student ADD gender CHAR(1) ***MENT '性别(男/女)';
删除字段 ALTER TABLE 表名 DROP 字段名; 删除 student 表的 “年龄” 字段:ALTER TABLE student DROP age;
修改表名 ALTER TABLE 表名 RENAME TO 新表名; 将 student 表改名为 stu:ALTER TABLE student RENAME TO stu;
4. 删除表
操作需求 SQL 语句 说明
删除指定表 DROP TABLE [IF EXISTS] 表名; IF EXISTS 避免表不存在时报错,删除后表结构和数据均消失。
清空表数据并保留结构 TRUNCATE TABLE 表名; 快速清空表中所有数据(不可恢复),执行效率高于 DELETE,且保留表结构。

(三)MySQL 核心数据类型

MySQL 数据类型按用途分为三类,需根据业务场景选择(如金额用 DECIMAL,文本用 VARCHAR):

1. 数值类型(存储整数、小数)
类型 占用空间 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述
TINYINT 1 byte (-128, 127) (0, 255) 小整数值(如性别、状态:0 = 女,1 = 男)
SMALLINT 2 bytes (-32768, 32767) (0, 65535) 较小整数值(如班级人数)
MEDIUMINT 3 bytes (-8388608, 8388607) (0, 16777215) 中等整数值(如区域编码)
INT/INTEGER 4 bytes (-2147483648, 2147483647) (0, 4294967295) 常用整数值(如学号、用户 ID)
BIGINT 8 bytes (-2^63, 2^63-1) (0, 2^64-1) 极大整数值(如大表 ID、订单号)
FLOAT 4 bytes (-3.4E+38, 3.4E+38) 0 和 (1.2E-38, 3.4E+38) 单精度浮点数(精度低,如近似测量值)
DOUBLE 8 bytes (-1.8E+308, 1.8E+308) 0 和 (2.2E-308, 1.8E+308) 双精度浮点数(精度较高,如温度、体重)
DECIMAL 依赖 M/D 依赖 M(精度)和 D(标度) 依赖 M(精度)和 D(标度) 定点数(精准存储小数,如金额:DECIMAL(10,2) 表示最大 99999999.99)
2. 字符串类型(存储文本、二进制数据)
类型 占用空间 描述
CHAR 0-255 bytes 定长字符串(长度固定,如手机号、身份证号:CHAR(11) 存储手机号)
VARCHAR 0-65535 bytes 变长字符串(长度随内容变化,如姓名、地址:VARCHAR(50) 存储姓名)
TINYBLOB 0-255 bytes 小型二进制数据(如小图标、缩略图)
TINYTEXT 0-255 bytes 短文本(如简短备注、标签)
BLOB 0-65535 bytes 二进制长数据(如图片、小型文件)
TEXT 0-65535 bytes 长文本(如文章内容、详细描述)
MEDIUMBLOB 0-16777215 bytes 中等二进制数据(如高清图片、中型文件)
MEDIUMTEXT 0-16777215 bytes 中等长度文本(如长文章、系统日志)
LONGBLOB 0-4294967295 bytes 极大二进制数据(如大型文件、视频片段)
LONGTEXT 0-4294967295 bytes 极大长度文本(如超长日志、文档)
3. 日期时间类型(存储时间相关信息)
类型 占用空间 取值范围 格式 描述
DATE 3 bytes 1000-01-01 至 9999-12-31 YYYY-MM-DD 仅存储日期(如生日、注册日期)
TIME 3 bytes -838:59:59 至 838:59:59 HH:MM:SS 仅存储时间或持续时间(如打卡时间、任务时长)
YEAR 1 byte 1901 至 2155 YYYY 仅存储年份(如毕业年份、产品生产年份)
DATETIME 8 bytes 1000-01-01 00:00:00 至 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期 + 时间(如订单创建时间、交易时间)
TIMESTAMP 4 bytes 1970-01-01 00:00:01 至 2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 时间戳(自动关联时区,如数据更新时间,插入 / 更新时可自动填充)

四、DML(数据操作语言)—— 表数据增删改

DML 用于操作表中的具体数据,核心是 “添加、修改、删除”,不改变表结构。

(一)添加数据(INSERT)

1. 语法分类
操作场景 SQL 语句格式 示例
给指定字段添加数据 INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...); 给 student 表添加一条数据:INSERT INTO student(id, name) VALUES(1, '张三');
给所有字段添加数据 INSERT INTO 表名 VALUES(值1, 值2, ...); 给 student 表(id, name, gender)添加数据:INSERT INTO student VALUES(2, '李四', '男');
批量添加数据 INSERT INTO 表名(字段1, ...) VALUES(值1, ...), (值1, ...), ...; 批量添加 2 条数据:INSERT INTO student(id, name) VALUES(3, '王五'), (4, '赵六');
2. 注意事项
  • 字段值需与字段类型匹配(如 INT 类型不能填字符串);
  • 字符串、日期类型需用单引号(') 包裹(如 '2024-01-01''张三')。

(二)修改数据(UPDATE)

1. 基本语法
UPDATE 表名 SET 字段1=值1, 字段2=值2, ... [WHERE 条件];
2. 示例
  • 修改 student 表中 id=1 的姓名为 “张三三”:
UPDATE student SET name='张三三' WHERE id=1;
  • 同时修改姓名和性别:
UPDATE student SET name='李四四', gender='女' WHERE id=2;
3. 注意事项
  • 必须加 WHERE 条件(否则会修改表中所有数据,造成数据污染);
  • 若需清空某个字段值,可设为 NULL(需字段允许为空,如 UPDATE student SET age=NULL WHERE id=1;)。

(三)删除数据(DELETE)

1. 基本语法
DELETE FROM 表名 [WHERE 条件];
2. 示例
  • 删除 student 表中 id=3 的数据:
DELETE FROM student WHERE id=3;
  • 删除性别为 “女” 的数据:
DELETE FROM student WHERE gender='女';
3. 注意事项
  • 必须加 WHERE 条件(否则会删除表中所有数据,不可恢复);
  • DELETE 只能删除整行数据,不能单独删除某一列的值(需用 UPDATE 实现)。

五、DQL(数据查询语言)—— 表数据查询

DQL 是 SQL 中最常用的部分,用于从表中查询指定数据,支持条件、排序、分组、分页等复杂逻辑。

(一)完整语法结构

SELECT 字段列表          -- 1. 确定要查询的字段(如 * 表示所有字段)
FROM 表名列表            -- 2. 确定查询的表(单表/多表)
WHERE 条件列表           -- 3. 过滤行数据(查询前过滤)
GROUP BY 分组字段列表    -- 4. 按指定字段分组
HAVING 分组后条件列表    -- 5. 过滤分组结果(分组后过滤)
ORDER BY 排序字段列表    -- 6. 按指定字段排序
LIMIT 分页参数           -- 7. 限制查询结果条数(分页)

(二)核心查询功能

1. 基础查询(查询指定字段)
  • 查询所有字段:
SELECT * FROM 表名;(如 SELECT * FROM student;);
  • 查询指定字段:
SELECT 字段1, 字段2, ... FROM 表名;(如 SELECT id, name FROM student;)。
2. 条件查询(加 WHERE 过滤)
常用条件运算符
运算符类型 具体符号 / 关键字 功能描述 示例
比较运算符 >>=<<= 大于、大于等于、小于、小于等于 WHERE age > 18(年龄大于 18)
=(等于)、<> 或 !=(不等于) 等于、不等于 WHERE gender = '男'(性别为男)
BETWEEN ... AND ... 在指定范围内(含边界) WHERE age BETWEEN 18 AND 25(年龄 18-25 岁)
IN(...) 在列表中选择(多选一) WHERE id IN(1,2,3)(id 为 1、2、3)
LIKE 占位符 模糊匹配(_ 匹配 1 个字符,% 匹配任意个字符) WHERE name LIKE '张%'(姓张的所有姓名)
IS NULL/IS NOT NULL 判断是否为空 WHERE age IS NULL(年龄为空)
逻辑运算符 AND 或 && (并且)多个条件同时成立 WHERE age > 18 AND gender = '男'(18 岁以上男性)
OR 或 || (或者)多个条件任意一个成立 WHERE age < 18 OR gender = '女'(18 岁以下或女性)
NOT 或 ! (非)取反条件 WHERE NOT age > 18(年龄不大于 18)
示例

查询 student 表中年龄 18-22 岁、姓名含 “李” 的学生:

SELECT id, name, age FROM student WHERE age BETWEEN 18 AND 22 AND name LIKE '%李%';
3. 聚合函数(纵向计算数据)

聚合函数将一列数据作为整体计算,NULL 值不参与运算

函数名 功能 示例
COUNT 统计非 NULL 值的数量 SELECT COUNT(id) FROM student;(统计学生总数)
MAX 求列的最大值 SELECT MAX(age) FROM student;(求最大年龄)
MIN 求列的最小值 SELECT MIN(age) FROM student;(求最小年龄)
AVG 求列的平均值 SELECT AVG(age) FROM student;(求平均年龄)
SUM 求列的总和 SELECT SUM(age) FROM student;(求年龄总和)
4. 排序查询(ORDER BY
基本语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
  • 排序方式:ASC(升序,默认,如从小到大)、DESC(降序,如从大到小);
  • 多字段排序:先按字段 1 排序,字段 1 值相同时,再按字段 2 排序。
示例

查询 student 表,按年龄降序排序,年龄相同时按 id 升序排序:

SELECT * FROM student ORDER BY age DESC, id ASC;
5. 分页查询(LIMIT
基本语法(MySQL 特有)
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 每页条数;
  • 起始索引:从 0 开始(第 1 页起始索引为 0,第 2 页为 “每页条数”,以此类推);
  • 公式:起始索引 = (页码 - 1) * 每页条数
示例

查询 student 表,每页显示 10 条数据,查询第 2 页:

SELECT * FROM student LIMIT 10, 10; -- 起始索引 10,每页 10 条

(三)DQL 执行顺序

编写顺序 ≠ 执行顺序,实际执行流程如下(需理解以优化查询效率):

  1. FROM:确定查询的表;
  2. WHERE:过滤行数据(先过滤,再后续操作,减少数据量);
  3. GROUP BY:按字段分组;
  4. HAVING:过滤分组结果(对分组后的数据二次过滤);
  5. SELECT:提取指定字段;
  6. ORDER BY:对结果排序;
  7. LIMIT:限制结果条数(最后执行,减少数据传输量)。

六、DCL(数据控制语言)—— 用户与权限管理

DCL 主要用于管理 MySQL 用户和权限,通常由 DBA(数据库管理员)操作,开发人员使用较少。

(一)用户管理

操作需求 SQL 语句格式 示例
查询所有用户 USE mysql; SELECT * FROM user; 切换到 mysql 系统库,查询 user 表(存储所有用户信息)。
创建用户 CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 创建用户 test,允许所有主机访问,密码 123456CREATE USER 'test'@'%' IDENTIFIED BY '123456';
修改用户密码 ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'; 修改 test 用户密码为 654321ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '654321';
删除用户 DROP USER '用户名'@'主机名'; 删除 test 用户:DROP USER 'test'@'%';
说明
  • 主机名:% 表示允许所有主机访问,localhost 仅允许本地访问,192.168.1.% 允许指定网段访问;
  • mysql_native_password:MySQL 常用的密码加密方式,确保兼容性。

(二)权限控制

1. 常用权限(部分)
  • 数据权限:SELECT(查询)、INSERT(添加)、UPDATE(修改)、DELETE(删除);
  • 结构权限:CREATE(创建)、ALTER(修改)、DROP(删除);
  • 全权限:ALL(所有权限)。
2. 权限操作语法
操作需求 SQL 语句格式 示例
查询用户权限 SHOW GRANTS FOR '用户名'@'主机名'; 查询 test 用户权限:SHOW GRANTS FOR 'test'@'%';
授予权限 GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; 授予 test 用户 student_db 库所有表的查询、添加权限:GRANT SELECT, INSERT ON student_db.* TO 'test'@'%';
撤销权限 REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; 撤销 test 用户的添加权限:REVOKE INSERT ON student_db.* FROM 'test'@'%';
说明
  • 权限列表:多个权限用逗号分隔(如 SELECT, INSERT);
  • 通配符:数据库名.* 表示该库所有表,*.* 表示所有库所有表(谨慎授予)。
转载请说明出处内容投诉
CSS教程网 » MySQL 基础SQL知识总结

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买