Mysql数据库——第一阶段
文章目录
- 一、数据库基础概念
- 二、MySQL 核心概念
- 1. 数据库(Database)
- 2. 表(Table)
- 3. 字段(Column)
- 4. 记录(Row)
- 5. 主键(Primary Key)
- 6.常用数据类型汇总表
- 三、MySQL 基本操作
- 1. 数据库操作
- 2. 表操作
- 四、MySQL 增删改查(CRUD)操作
- 1. 新增数据(Create)
- 2. 查询数据(Read)
- 3. 更新数据(Update)
- 4. 删除数据(Delete)
- 五、多表查询
- 1. 多表查询的基础:表间关系
- 2. 多表查询的核心语法:JOIN 关键字
- 3.多表查询的进阶操作
- 4.多表查询的注意事项
- 六、第二阶段用到的mysql知识点梳理:
- (一)sql注释区别
- (二)数据库元信息
在数字化时代,数据已成为核心资产,而数据库则是管理这些数据的 “仓库”。无论是网站后台、移动应用还是企业系统,都离不开数据库的支持。本文将带你走进数据库世界,重点以最流行的 MySQL 为例,讲解基础知识点及核心操作。
一、数据库基础概念
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它就像一个电子化的文件柜,允许用户对数据进行新增、查询、更新、删除等操作。
数据库的类型
目前主流数据库可分为两类:
- 关系型数据库:采用表格(二维表)结构存储数据,通过主键关联不同表,代表有 MySQL、Oracle、SQL Server 等。
- 非关系型数据库:不采用表格结构,数据存储形式灵活,代表有 MongoDB(文档型)、Redis(键值型)等。
为什么选择 MySQL?
MySQL 是一款开源的关系型数据库管理系统(RDBMS),具有以下优势:
- 开源免费,成本低
- 性能稳定,处理速度快
- 跨平台,支持 Windows、Linux 等系统
- 社区活跃,文档丰富
- 兼容性好,支持多种编程语言
下载地址
二、MySQL 核心概念
1. 数据库(Database)
数据库是表的集合,一个 MySQL 服务器可以管理多个数据库。例如:一个电商系统可能包含user(用户库)、order(订单库)等多个数据库。
2. 表(Table)
表是数据库中存储数据的基本单位,由行和列组成,类似 Excel 表格。例如:users表可存储用户信息。
3. 字段(Column)
表中的列称为字段,每个字段代表数据的一个属性。例如:users表可能包含id、name、age等字段。
4. 记录(Row)
表中的行称为记录,每条记录代表一个具体的数据条目。例如:users表中id=1,name=“张三”,age=25就是一条记录。
5. 主键(Primary Key)
用于唯一标识表中每条记录的字段,通常为id字段,值不可重复且不能为空。
6.常用数据类型汇总表
类型分类 | 数据类型 | 长度/字节 | 主要特点 | 适用场景 |
---|---|---|---|---|
整数类型 | TINYINT | 1字节 | 范围:-128127(有符号);0255(无符号) | 状态标记、性别(1/2)等 |
INT | 4字节 | 范围:-2147483648~2147483647(有符号) | 常用ID、数量统计等 | |
BIGINT | 8字节 | 范围:-9e18~9e18(有符号) | 大整数、订单号、大数据量计数 | |
小数类型 | DECIMAL(M,D) | 可变 | M为总位数,D为小数位数,精确计算 | 金额、价格等需精确的值 |
FLOAT | 4字节 | 单精度浮点数,精度约6-7位 | 非精确科学计算 | |
DOUBLE | 8字节 | 双精度浮点数,精度约15-17位 | 高精度科学计算 | |
字符串类型 | CHAR(N) | 0-255字符 | 固定长度,查询效率高 | 手机号、身份证号等固定长度字符串 |
VARCHAR(N) | 0-65535字符 | 可变长度,节省空间 | 用户名、地址等长度不固定的字符串 | |
TEXT | 0-65535字符 | 存储长文本,不计入行长度限制 | 文章内容、评论等 | |
日期时间类型 | DATE | 3字节 | 格式:YYYY-MM-DD,仅存储日期 | 生日、注册日期等 |
DATETIME | 8字节 | 格式:YYYY-MM-DD HH:MM:SS,不受时区影响 | 订单时间、发布时间等 | |
TIMESTAMP | 4字节 | 格式:YYYY-MM-DD HH:MM:SS,受时区影响,可自动更新 | 最后登录时间、数据更新时间 | |
特殊类型 | BOOLEAN | 1字节 | 本质为TINYINT(1),存储0(假)/1(真) | 逻辑判断(启用/禁用、是/否) |
ENUM | - | 从预定义列表中选择一个值 | 性别(男/女)、状态(待审核/已通过)等 | |
JSON | - | 存储JSON格式数据,支持嵌套结构 | 配置信息、半结构化数据 |
三、MySQL 基本操作
以下操作假设你已安装 MySQL 并通过客户端(如 MySQL Command Line、Navicat 等)连接到服务器。
1. 数据库操作
创建数据库
-- 创建名为testdb的数据库,指定字符集为utf8mb4(支持中文)
CREATE DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
查看所有数据库
SHOW DATABASES;
使用数据库
USE testdb; -- 切换到testdb数据库
删除数据库
DROP DATABASE testdb; -- 谨慎操作!会删除整个数据库及其中所有数据
2. 表操作
创建表
以创建users表为例:
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键name VARCHAR(50) NOT NULL, -- 用户名,非空age INT, -- 年龄,可空email VARCHAR(100) UNIQUE, -- 邮箱,唯一值created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间
);
查看所有表
SHOW TABLES;
查看表结构
DESCRIBE users; -- 或简写为 DESC users
删除表
DROP TABLE users; -- 谨慎操作!会删除表及所有数据
四、MySQL 增删改查(CRUD)操作
CRUD 是数据库操作的四大核心:Create(新增)、Read(查询)、Update(更新)、Delete(删除)。
1. 新增数据(Create)
使用INSERT语句插入数据:
-- 插入完整字段数据
INSERT INTO users (name, age, email)
VALUES ('张三', 25, 'zhangsan@example.com');-- 插入部分字段(其他字段使用默认值)
INSERT INTO users (name, email)
VALUES ('李四', 'lisi@example.com');-- 批量插入
INSERT INTO users (name, age, email)
VALUES ('王五', 30, 'wangwu@example.com'),('赵六', 28, 'zhaoliu@example.com');
2. 查询数据(Read)
使用SELECT语句查询数据,这是最常用也最复杂的操作:
查询所有数据
SELECT * FROM users; -- *表示查询所有字段
查询指定字段
SELECT name, age FROM users; -- 只查询name和age字段
带条件查询
-- 查询年龄大于25的用户
SELECT * FROM users WHERE age > 25;-- 查询name为"张三"且age=25的用户
SELECT * FROM users WHERE name = '张三' AND age = 25;
排序查询
-- 按年龄升序排列(默认ASC)
SELECT * FROM users ORDER BY age;-- 按年龄降序排列
SELECT * FROM users ORDER BY age DESC;
限制查询结果
-- 只查询前2条记录
SELECT * FROM users LIMIT 2;-- 从第2条开始(索引从0开始),查询3条记录
SELECT * FROM users LIMIT 1, 3;
3. 更新数据(Update)
使用UPDATE语句更新数据,务必加WHERE条件,否则会更新所有记录:
-- 将id=1的用户年龄改为26
UPDATE users
SET age = 26
WHERE id = 1;-- 同时更新多个字段
UPDATE users
SET age = 27, email = 'new_zhangsan@example.com'
WHERE id = 1;
4. 删除数据(Delete)
使用DELETE语句删除数据,同样需要谨慎使用WHERE条件:
-- 删除id=4的用户
DELETE FROM users WHERE id = 4;-- 删除年龄小于18的用户
DELETE FROM users WHERE age < 18;
注意:DELETE语句会删除记录但保留表结构,若要清空表且重置自增 ID,可使用TRUNCATE TABLE users;
五、多表查询
在实际数据库应用中,数据往往分散在多个表中(如用户表、订单表、商品表),多表查询正是通过表间关联关系,将分散的数据整合起来的核心操作。下面以 MySQL 为例,介绍多表查询的核心概念和常用操作。
1. 多表查询的基础:表间关系
多表查询的前提是表之间存在关联关系,通常通过外键(Foreign Key) 实现:
- 一对一:如users表(用户基本信息)与user_profiles表(用户详细资料),一个用户对应一条详细资料。
- 一对多:如users表与orders表,一个用户可有多条订单(orders表中用user_id关联users表的id)。
- 多对多:如students表与courses表,通过中间表student_courses(含student_id和course_id)关联。
2. 多表查询的核心语法:JOIN 关键字
多表查询主要通过JOIN关键字实现,根据关联逻辑不同,分为以下几类:
1. 内连接(INNER JOIN)
只返回两表中关联条件匹配的记录(即 “交集”)。
语法:
SELECT 字段列表
FROM 表1
INNER JOIN 表2
ON 表1.关联字段 = 表2.关联字段;
示例:查询用户及其订单信息(只显示有订单的用户)
SELECT u.id AS 用户ID,u.name AS 用户名,o.order_no AS 订单号,o.create_time AS 下单时间
FROM users u -- 别名u
INNER JOIN orders o -- 别名o
ON u.id = o.user_id; -- 关联条件:用户ID=订单的用户ID
2. 左连接(LEFT JOIN)
返回左表所有记录,以及右表中与左表匹配的记录;右表无匹配时,显示NULL。
语法:
SELECT 字段列表
FROM 左表
LEFT JOIN 右表
ON 左表.关联字段 = 右表.关联字段;
示例:查询所有用户及其订单(包括无订单的用户)
SELECT u.id AS 用户ID,u.name AS 用户名,o.order_no AS 订单号
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;
3. 右连接(RIGHT JOIN)
返回右表所有记录,以及左表中与右表匹配的记录;左表无匹配时,显示NULL。
语法:
SELECT 字段列表
FROM 左表
RIGHT JOIN 右表
ON 左表.关联字段 = 右表.关联字段;
示例:查询所有订单及对应用户(包括订单关联用户不存在的情况,如异常订单)
SELECT o.order_no AS 订单号,u.name AS 用户名
FROM users u
RIGHT JOIN orders o
ON u.id = o.user_id;
4. 全连接(FULL JOIN)
返回左右两表所有记录,匹配的记录合并,不匹配的部分用NULL填充。
注意:MySQL 不直接支持FULL JOIN,可通过UNION组合左连接和右连接实现。
示例:
-- 左连接结果 + 右连接中左表无匹配的记录
SELECT u.id, o.order_no
FROM users u LEFT JOIN orders o ON u.id = o.user_id
UNION
SELECT u.id, o.order_no
FROM users u RIGHT JOIN orders o ON u.id = o.user_id;
3.多表查询的进阶操作
1. 多表连接(3 张及以上表)
通过连续JOIN
关联多张表,核心是明确每张表的关联字段。
示例:查询订单、用户及商品信息(3 表关联)
SELECT u.name AS 用户名,o.order_no AS 订单号,p.name AS 商品名,od.quantity AS 购买数量
FROM orders o
INNER JOIN users u ON o.user_id = u.id -- 订单关联用户
INNER JOIN order_details od ON o.id = od.order_id -- 订单关联订单项
INNER JOIN products p ON od.product_id = p.id; -- 订单项关联商品
2. 带条件的多表查询
在JOIN
后通过WHERE
添加过滤条件,或在JOIN
时通过ON
细化关联条件。
示例:查询 2023 年下单的用户及订单
SELECT u.name, o.order_no
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.create_time BETWEEN '2023-01-01' AND '2023-12-31';
3. 结合聚合函数的多表查询
通过GROUP BY
和聚合函数(COUNT/SUM等)统计关联数据。
示例:统计每个用户的订单总数
SELECT u.id AS 用户ID,u.name AS 用户名,COUNT(o.id) AS 订单总数 -- 统计订单数量
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name; -- 按用户分组
4.多表查询的注意事项
- 使用表别名:通过AS给表起短别名(如users u),简化代码。
- 避免笛卡尔积:若忘记写ON关联条件,会返回两表所有记录的组合(数据量 = 表 1 行数 × 表 2 行数),需特别注意。
- 明确字段归属:当多表有同名字段(如id),必须通过 “表名。字段名” 指定(如u.id)。
- 优先用内连接:内连接性能通常优于外连接,非必要时避免全连接。
- 索引优化:关联字段(如外键user_id)建议建立索引,提升查询速度。
六、第二阶段用到的mysql知识点梳理:
(一)sql注释区别
符号 | 类型 | 适用数据库 | 关键特点 | 注入中常见用途 |
---|---|---|---|---|
/**/ | 多行注释 | 几乎所有数据库 | 可跨多行,需用/* 和*/ 包裹 | 替代空格、拆分关键字 |
-- | 单行注释 | 所有主流数据库 | 仅单行有效,-- 后必须跟空格 | 截断 SQL 语句,注释后续内容 |
# | 单行注释 | MySQL 等(非通用) | 仅单行有效,# 后无需空格 | 截断 SQL 语句(MySQL 环境) |
(二)数据库元信息
元数据类别 | 主要存储表 | 核心字段 | 作用说明 | 示例查询 |
---|---|---|---|---|
数据库信息 | schemata | SCHEMA_NAME | 数据库名称(如业务库、系统库) | sql SELECT SCHEMA_NAME FROM information_schema.schemata; (查询所有数据库名) |
DEFAULT_CHARACTER_SET_NAME | 数据库默认字符集(如utf8mb4 ) | sql SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM information_schema.schemata WHERE SCHEMA_NAME = 'jrlt'; (查询jrlt 库的字符集) | ||
表信息 | tables | TABLE_NAME | 表名(如用户表、订单表) | sql SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema = 'jrlt'; (查询jrlt 库的所有表) |
ENGINE | 表的存储引擎(如InnoDB ) | sql SELECT TABLE_NAME, ENGINE FROM information_schema.tables WHERE table_schema = 'jrlt'; (查询jrlt 库所有表的存储引擎) | ||
CREATE_TIME | 表的创建时间 | sql SELECT TABLE_NAME, CREATE_TIME FROM information_schema.tables WHERE table_schema = 'jrlt' ORDER BY CREATE_TIME DESC; (按创建时间倒序显示表) | ||
字段信息 | columns | COLUMN_NAME | 字段名(如id 、username ) | sql SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = 'jrlt' AND table_name = 'users'; (查询jrlt.users 表的所有字段) |
DATA_TYPE /COLUMN_TYPE | 字段数据类型(如int 、varchar(50) ) | sql SELECT COLUMN_NAME, COLUMN_TYPE FROM information_schema.columns WHERE table_schema = 'jrlt' AND table_name = 'users'; (查询字段名和完整类型) | ||
IS_NULLABLE /COLUMN_KEY | 是否允许为 NULL、是否为主键 / 唯一键 | sql SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_KEY FROM information_schema.columns WHERE table_schema = 'jrlt' AND table_name = 'users'; (查询字段约束) | ||
索引信息 | statistics | INDEX_NAME /COLUMN_NAME | 索引名、包含的字段 | sql SELECT INDEX_NAME, COLUMN_NAME FROM information_schema.statistics WHERE table_schema = 'jrlt' AND table_name = 'users'; (查询users 表的所有索引及字段) |
NON_UNIQUE | 是否为非唯一索引(0 = 唯一,1 = 非唯一) | sql SELECT INDEX_NAME, NON_UNIQUE FROM information_schema.statistics WHERE table_schema = 'jrlt' AND table_name = 'users'; (查询索引是否唯一) | ||
视图信息 | views | VIEW_DEFINITION | 视图的定义 SQL 语句 | sql SELECT TABLE_NAME, VIEW_DEFINITION FROM information_schema.views WHERE table_schema = 'jrlt'; (查询jrlt 库所有视图的定义) |
权限信息 | user_privileges | GRANTEE /PRIVILEGE_TYPE | 被授权用户、权限类型(如SELECT 、DELETE ) | sql SELECT GRANTEE, PRIVILEGE_TYPE FROM information_schema.user_privileges WHERE GRANTEE LIKE '%root%'; (查询root 用户的权限) |