Mysql学习——sql语言以及常见数据库
字数 3153 2025-10-29 23:25:25
MySQL与SQL语言全面学习指南
第一部分:数据库基础概念
1.1 什么是数据库?
- 数据库(DataBase,DB):长期存储在计算机内、有组织的、可共享的大量数据的集合。它是一个数据存储的“仓库”。
- 数据库管理系统(DBMS):操作和管理数据库的大型软件,用于建立、使用和维护数据库。MySQL就是一种DBMS。
- 关系型数据库(RDBMS):建立在关系模型基础上的数据库。它由多张相互连接的二维表(Table)组成。
- 特点:
- 使用表存储数据,格式统一,便于维护。
- 使用标准的SQL语言进行操作,简单易用,可以进行非常复杂的查询。
- 数据完整性高,支持事务(ACID特性)。
- 特点:
1.2 什么是SQL?
- SQL(Structured Query Language):结构化查询语言,是用于操作关系型数据库的编程语言。
- 特点:
- 是一种标准化的语言,几乎所有关系型数据库(如MySQL, Oracle, SQL Server, PostgreSQL)都支持。
- 通过简单的英语关键字(如
SELECT,INSERT,UPDATE)来执行复杂的数据库操作。
- SQL分类:根据其功能,主要分为三类(文章中提到了两类,此处补充完整):
- DDL(Data Definition Language,数据定义语言):用于定义和修改数据库对象(如数据库、表、索引)。例如:
CREATE,ALTER,DROP。 - DML(Data Manipulation Language,数据操作语言):用于对表中的数据进行增、删、改。例如:
INSERT,UPDATE,DELETE。 - DQL(Data Query Language,数据查询语言):用于查询表中的数据。虽然只有一个关键字
SELECT,但它是SQL中最核心、最复杂的部分。 - DCL(Data Control Language,数据控制语言):用于控制数据库的访问权限。例如:
GRANT,REVOKE。
- DDL(Data Definition Language,数据定义语言):用于定义和修改数据库对象(如数据库、表、索引)。例如:
1.3 MySQL的数据模型
- 在MySQL中,创建一个数据库,本质上是在服务器的某个目录(如
mysql/data/)下创建一个同名的文件夹。 - 在数据库中创建表,则是在该数据库文件夹下创建对应的文件(如
.frm表结构文件,.ibd数据文件等)。
第二部分:MySQL安装与连接
2.1 MySQL安装
- 官方下载地址:
https://downloads.mysql.com/archives/community/(此处链接指向历史版本存档,适合寻找特定版本)。 - 安装后重要步骤:将MySQL的
bin目录(如C:\Program Files\MySQL\MySQL Server 8.0\bin)添加到系统的环境变量(PATH) 中。这样可以在任何命令行窗口直接使用mysql等命令。
2.2 连接MySQL服务器
- 命令格式:
mysql [-h 主机IP地址] [-P 端口号] -u 用户名 -p - 参数解释:
-h:指定要连接的MySQL服务器的主机名或IP地址。如果连接本机(localhost),可以省略此参数。-P:指定MySQL服务的端口号,默认为3306。如果使用默认端口,可以省略此参数。-u:指定连接数据库的用户名,例如-u root。-p:表示需要输入密码。为了安全,密码不在命令中直接写出,回车后会提示你输入。
- 示例:
- 连接本机的MySQL:
mysql -u root -p - 连接远程服务器的MySQL:
mysql -h 192.168.1.100 -P 3306 -u root -p
- 连接本机的MySQL:
2.3 数据库管理工具
- 除了命令行,强烈推荐使用图形化界面(GUI)工具来管理数据库,它们更直观、高效。
- 常见工具:
- MySQL Workbench(官方工具)
- Navicat(商业软件,功能强大)
- DBeaver(免费开源,支持多种数据库)
- phpMyAdmin(Web版,常用于虚拟主机环境)
第三部分:SQL语句详解
3.1 DDL - 数据定义语言
1. 数据库操作
-- 1. 查询所有数据库
SHOW DATABASES;
-- 2. 查询当前正在使用的数据库
SELECT DATABASE();
-- 3. 创建数据库
-- [if not exists] 判断数据库是否已存在,避免报错。
-- [default charset utf8mb4] 设置数据库的默认字符集,推荐使用utf8mb4以支持存储Emoji等4字节字符。
CREATE DATABASE [IF NOT EXISTS] database_name [DEFAULT CHARSET utf8mb4];
-- 示例:创建一个名为`myblog`的数据库
CREATE DATABASE IF NOT EXISTS myblog DEFAULT CHARSET utf8mb4;
-- 4. 删除数据库
DROP DATABASE [IF EXISTS] database_name;
-- 5. 使用/切换数据库
USE database_name;
注意:DATABASE 和 SCHEMA 在MySQL中可以互换使用,例如 SHOW DATABASES; 等价于 SHOW SCHEMAS;。
2. 表操作
-
创建表语法:
CREATE TABLE table_name ( 字段1 字段类型 [约束] [COMMENT '字段注释'], 字段2 字段类型 [约束] [COMMENT '字段注释'], ... ) [COMMENT '表注释']; -
示例(根据文章片段扩展):
CREATE TABLE user ( id INT COMMENT '用户ID, 主键', -- 文章中原有字段 username VARCHAR(50) COMMENT '用户名', -- 文章中原有字段 age INT COMMENT '用户年龄', -- 文章中原有字段 email VARCHAR(100), created_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 默认值为当前时间 ) COMMENT '用户信息表'; -
常见字段类型:
- 整数类型:
INT,BIGINT,TINYINT - 小数类型:
DECIMAL(M, D)(如DECIMAL(5,2)表示总位数5,小数点后2位),FLOAT,DOUBLE - 字符串类型:
CHAR(n):定长字符串,性能高,适合长度固定的字段(如身份证号)。VARCHAR(n):变长字符串,节省空间,适合长度变化的字段(如用户名、地址)。n代表最大字符数。TEXT:长文本数据。
- 日期时间类型:
DATE(日期),TIME(时间),DATETIME(日期时间),TIMESTAMP(时间戳,范围较小但有时区特性)。
- 整数类型:
-
常见约束:
- 主键约束(PRIMARY KEY):唯一标识一条记录,不允许为空。
id INT PRIMARY KEY。 - 唯一约束(UNIQUE):保证该字段的值唯一,可以为空。
email VARCHAR(100) UNIQUE。 - 非空约束(NOT NULL):该字段的值不能为空。
username VARCHAR(50) NOT NULL。 - 默认值(DEFAULT):如果插入数据时未指定该字段的值,则使用默认值。
status TINYINT DEFAULT 1。 - 外键约束(FOREIGN KEY):建立表与表之间的关联(文章未提及,但非常重要)。
- 主键约束(PRIMARY KEY):唯一标识一条记录,不允许为空。
-
其他DDL语句:
-- 查询当前数据库的所有表 SHOW TABLES; -- 查询表结构 DESC table_name; -- 查询建表语句 SHOW CREATE TABLE table_name; -- 添加字段 ALTER TABLE table_name ADD column_name column_type [约束]; -- 修改字段类型 ALTER TABLE table_name MODIFY column_name new_column_type; -- 修改字段名和类型 ALTER TABLE table_name CHANGE old_column_name new_column_name new_column_type; -- 删除字段 ALTER TABLE table_name DROP column_name; -- 删除表 DROP TABLE [IF EXISTS] table_name;
3.2 DML - 数据操作语言
1. 添加数据(INSERT)
-- 向指定列插入数据(推荐)
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
-- 向所有列插入数据(值的顺序必须与表结构字段顺序完全一致)
INSERT INTO table_name VALUES (value1, value2, value3, ...);
-- 批量插入
INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4), ...;
-- 示例:向user表插入数据
INSERT INTO user (id, username, age, email) VALUES (1, '张三', 25, 'zhangsan@example.com');
2. 更新数据(UPDATE)
-- 更新数据,WHERE条件指定要更新哪些行。如果不加WHERE,会更新整张表!务必小心。
UPDATE table_name SET column1 = value1, column2 = value2, ... [WHERE condition];
-- 示例:将id为1的用户的年龄改为26
UPDATE user SET age = 26 WHERE id = 1;
3. 删除数据(DELETE)
-- 删除数据,WHERE条件指定要删除哪些行。如果不加WHERE,会清空整张表!务必小心。
DELETE FROM table_name [WHERE condition];
-- 示例:删除用户名为'张三'的记录
DELETE FROM user WHERE username = '张三';
3.3 DQL - 数据查询语言(核心)
基础语法结构:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数;
1. 基础查询(SELECT ... FROM ...)
-- 查询多个字段
SELECT column1, column2, ... FROM table_name;
-- 查询所有字段(在开发中慎用,可能导致性能问题)
SELECT * FROM table_name;
-- 设置字段别名(AS可以省略)
SELECT column1 AS alias_name FROM table_name;
SELECT column1 alias_name FROM table_name;
-- 去除重复记录(DISTINCT)
SELECT DISTINCT column1 FROM table_name;
2. 条件查询(WHERE)
-- 语法
SELECT 字段列表 FROM table_name WHERE 条件列表;
-- 常用条件运算符:
-- >, >=, <, <=, =, <> 或 != (不等于)
SELECT * FROM user WHERE age > 18;
-- BETWEEN ... AND ... (在某个范围之内,闭区间)
SELECT * FROM user WHERE age BETWEEN 20 AND 30;
-- IN(...) (在in之后的列表中的值,多选一)
SELECT * FROM user WHERE age IN(18, 22, 25);
-- LIKE 占位符 (模糊匹配,_匹配单个字符,%匹配任意个字符)
SELECT * FROM user WHERE username LIKE '张%'; -- 查询姓张的用户
-- IS NULL / IS NOT NULL (判断是否为NULL)
SELECT * FROM user WHERE email IS NULL;
-- AND 或 && (并且)
-- OR 或 || (或者)
-- NOT 或 ! (非)
SELECT * FROM user WHERE age > 18 AND age < 30;
3. 聚合函数
将一列数据作为一个整体,进行纵向计算。
COUNT():统计数量。MAX():最大值。MIN():最小值。AVG():平均值。SUM():求和。
-- 语法:SELECT 聚合函数(字段列表) FROM 表名;
-- 注意:NULL值不参与所有聚合函数运算。
-- 示例:统计用户总数
SELECT COUNT(*) FROM user;
-- 统计有邮箱的用户数量
SELECT COUNT(email) FROM user;
-- 查询最大年龄
SELECT MAX(age) FROM user;
4. 分组查询(GROUP BY)
将查询结果按一个或多个字段进行分组,字段值相同的为一组。通常与聚合函数一起使用。
-- 语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
-- 示例:根据性别分组,统计男女人数
SELECT gender, COUNT(*) FROM user GROUP BY gender;
-- 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的地址
-- WHERE在分组前进行过滤,不满足WHERE条件的不参与分组。
-- HAVING在分组后对结果进行过滤。
SELECT work_address, COUNT(*) address_count
FROM employee
WHERE age < 45
GROUP BY work_address
HAVING address_count >= 3;
5. 排序查询(ORDER BY)
-- 语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
-- 排序方式:ASC(升序,默认),DESC(降序)
-- 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
-- 示例:根据年龄升序排序,年龄相同再根据入职时间降序排序
SELECT * FROM employee ORDER BY age ASC, entrydate DESC;
6. 分页查询(LIMIT)
-- 语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
-- 起始索引从0开始,起始索引 = (查询页码 - 1) * 每页显示记录数。
-- 如果查询的是第一页数据,起始索引可以省略,简写为 LIMIT 查询记录数。
-- 示例:查询第1页数据,每页显示10条记录
SELECT * FROM user LIMIT 0, 10;
-- 等价于
SELECT * FROM user LIMIT 10;
-- 查询第2页数据,每页10条(起始索引 = (2-1)*10 = 10)
SELECT * FROM user LIMIT 10, 10;
第四部分:安全警告与最佳实践
- 生产环境操作:在执行
UPDATE和DELETE语句时,务必先写WHERE条件,并在执行前最好先用SELECT语句验证条件是否正确,以防误操作导致数据丢失。 - 密码安全:连接数据库时,使用
-p参数并在提示后输入密码,避免在命令中明文书写密码(如-p123456)。 - 字符集选择:创建数据库和表时,建议使用
utf8mb4字符集,以完全兼容UTF-8,支持存储所有Unicode字符,包括Emoji表情。 - SQL注入:文章标签提到了
# SQL注入,这是一个至关重要的安全概念。永远不要直接将用户输入拼接到SQL语句中,而应使用参数化查询(Prepared Statements) 来从根本上防止SQL注入攻击。
这份文档涵盖了从数据库基础概念到SQL核心语法的完整学习路径。要真正掌握MySQL,建议您在安装好MySQL环境后,按照文档中的示例进行大量的实践练习。