MySQL 基础与 SQL 语句笔记

Published 2025-06-21 00:00 Updated 2025-06-21 00:00 4081 words 21 min read ... Page views Handwritten Every word here was typed by me.

This post is not yet available in English. Showing the original.
整理数据库、关系型数据库、SQL 分类、表操作和 MySQL 常用语法。

这篇笔记记录 MySQL 入门阶段的核心概念和 SQL 基础语法。当前内容偏课堂摘录,后续精修时可以把 DDL、DML、DQL、DCL 分开整理。

1. 相关概念

  • 数据库:英文为 DataBase,简称 DB,它是存储和管理数据的仓库。

  • 数据库管理系统(DataBase Management System,简称 DBMS),是操作和管理数据库的大型软件。

将来我们只需要操作这个软件,就可以通过这个软件来操纵和管理数据库了。

  • SQL(Structured Query Language,简称 SQL):结构化查询语言,它是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。

1.1 关系型数据库(RDBMS)

概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。而所谓二维表,指的是由行和列组成的表,如下图:

二维表的优点:

  • 使用表存储数据,格式统一,便于维护
  • 使用 SQL 语言操作,标准统一,使用方便,可用于复杂查询

1.2 数据模型

介绍完了关系型数据库之后,接下来我们再来看一看在 Mysql 数据库当中到底是如何来存储数据的,也就是 Mysql 的数据模型。

MySQL 是关系型数据库,是基于二维表进行数据存储的,具体的结构图下:

  • 通过 MySQL 客户端连接数据库管理系统 DBMS,然后通过 DBMS 操作数据库。
  • 使用 MySQL 客户端,向数据库管理系统发送一条 SQL 语句,由数据库管理系统根据 SQL 语句指令去操作数据库中的表结构及数据。
  • 一个数据库服务器中可以创建多个数据库,一个数据库中也可以包含多张表,而一张表中又可以包含多行记录。

2. SQL 语句

SQL:结构化查询语言。一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。SQL 语句根据其功能被分为四大类:DDL、DML、DQL、DCL 。

分类全称说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

2.1 DDL 语句

2.1.1 表操作

学习完了 DDL 语句当中关于数据库的操作之后,接下来我们继续学习 DDL 语句当中关于表结构的操作。

关于表结构的操作也是包含四个部分:创建表、查询表、修改表、删除表。

2.1.1.1 创建
  • 语法:
    •   create table  表名(
                字段1  字段1类型 [约束]  [comment  字段1注释 ],
                字段2  字段2类型 [约束]  [comment  字段2注释 ],
                ......
                字段n  字段n类型 [约束]  [comment  字段n注释 ] 
        ) [ comment  表注释 ] ;
    • 注意: [ ] 中的内容为可选参数; 最后一个字段后面没有逗号

例:建表语句:

		create table tb_user (
		    id int comment 'ID,唯一标识',   # id是一行数据的唯一标识(不能重复)
		    username varchar(20) comment '用户名',
		    name varchar(10) comment '姓名',
		    age int comment '年龄',
		    gender char(1) comment '性别'
		) comment '用户表';
2.1.1.2 约束
  • 概念:所谓约束就是作用在表中字段上的规则,用于限制存储在表中的数据。
  • 作用:就是来保证数据库当中数据的正确性、有效性和完整性。(后面的学习会验证这些)
  • 在 MySQL 数据库当中,提供了以下 5 种约束:
约束描述关键字
非空约束限制该字段值不能为 nullnot null
唯一约束保证字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key
默认约束保存数据时,如果未指定该字段值,则采用默认值default
外键约束让两张表的数据建立连接,保证数据的一致性和完整性foreign key

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

主键自增:auto_increment

  • 每次插入新的行记录时,数据库自动生成 id 字段(主键)下的值
  • 具有 auto_increment 的数据列是一个正数序列开始增长(从 1 开始自增)
2.1.1.3 数据类型

在上面建表语句中,我们在指定字段的数据类型时,用到了 int 、varchar、char,那么在 MySQL 中除了以上的数据类型,还有哪些常见的数据类型呢? 接下来,我们就来详细介绍一下 MySQL 的数据类型。

MySQL 中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。

1). 数值类型

类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1byte(-128,127)(0,255)小整数值
SMALLINT2bytes(-32768,32767)(0,65535)大整数值
MEDIUMINT3bytes(-8388608,8388607)(0,16777215)大整数值
INT/INTEGER4bytes(-2147483648,2147483647)(0,4294967295)大整数值
BIGINT8bytes(-263,263-1)(0,2^64-1)极大整数值
FLOAT4bytes(-3.402823466 E+38,3.402823466351 E+38)0 和 (1.175494351 E-38,3.402823466 E+38)单精度浮点数值
DOUBLE8bytes(-1.7976931348623157 E+308,1.7976931348623157 E+308)0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308)双精度浮点数值
DECIMAL依赖于 M(精度)和 D(标度)的值依赖于 M(精度)和 D(标度)的值小数值(精确定点数)

2). 字符串类型

类型大小描述
CHAR0-255 bytes定长字符串(需要指定长度)
VARCHAR0-65535 bytes变长字符串(需要指定长度)
TINYBLOB0-255 bytes不超过 255 个字符的二进制数据
TINYTEXT0-255 bytes短文本字符串
BLOB0-65 535 bytes二进制形式的长文本数据
TEXT0-65 535 bytes长文本数据
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据
LONGTEXT0-4 294 967 295 bytes极大文本数据

char 与 varchar 都可以描述字符串,char 是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而 varchar 是变长字符串,指定的长度为最大占用长度 。相对来说,char 的性能会更高些。

3). 日期时间类型

类型大小范围格式描述
DATE31000-01-01 至 9999-12-31YYYY-MM-DD日期值
TIME3-838:59
至 838:59
HH:MM
时间值或持续时间
YEAR11901 至 2155YYYY年份值
DATETIME81000-01-01 00:00
至 9999-12-31 23:59
YYYY-MM-DD HH:MM
混合日期和时间值
TIMESTAMP41970-01-01 00:00
至 2038-01-19 03:14
YYYY-MM-DD HH:MM
混合日期和时间值,时间戳

关于表 结构 的查看、修改、删除操作,工作中一般都是直接基于图形化界面操作。

  • 修改数据库表结构的具体语法:

添加字段

-- 添加字段
alter table 表名 add  字段名  类型(长度)  [comment 注释]  [约束];

-- 比如: 为tb_emp表添加字段qq,字段类型为 varchar(11)
alter table tb_emp add  qq  varchar(11) comment 'QQ号码';

2.2 DML 语句

DML 英文全称是 Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

  • 添加数据(INSERT)
  • 修改数据(UPDATE)
  • 删除数据(DELETE)

2.2.1 增加(insert)

2.2.1.1 语法(增加)
  • 向指定字段添加数据
insert into 表名 (字段名1, 字段名2) values (值1, 值2);
  • 全部字段添加数据
insert into 表名 values (值1, 值2, ...);
  • 批量添加数据(指定字段)
insert into 表名 (字段名1, 字段名2) values (值1, 值2), (值1, 值2);
  • 批量添加数据(全部字段)
insert into 表名 values (值1, 值2, ...), (值1, 值2, ...);
2.2.1.2 案例演示(增加)
  • 案例 1:向 emp 表的 username, name, gender, phone, create_time, update_time 字段插入数据
-- 因为设计表时create_time, update_time两个字段不能为NULL,所以也做为要插入的字段
insert into emp(username, name, gender, phone, create_time, update_time)
values ('wuji', '张无忌', 1, '13309091231', now(), now());

2.2.2 修改(update)

2.2.2.1 语法(修改)
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;
2.2.2.2 案例演示(修改)
update emp set name='张三', update_time=now() where id=1;

2.2.3 删除(delete)

2.2.3.1 语法(删除)
delete from 表名  [where  条件] ;
2.2.3.2 案例演示(删除)
delete from emp where id = 1;

2.3 DQL 语句

2.3.1 介绍

DQL 英文全称是 Data Query Language(数据查询语言),用来查询数据库表中的记录。

查询关键字:SELECT

查询操作是所有 SQL 语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是要远高于增删改操作的。当我们打开某个网站或 APP 所看到的展示信息,都是通过从数据库中查询得到的,而在这个查询过程中,还会涉及到条件、排序、分页等操作。

2.3.2 语法,语法结构如下

SELECT
        字段列表
FROM
        表名列表
WHERE
        条件列表
GROUP  BY
        分组字段列表
HAVING
        分组后条件列表
ORDER BY
        排序字段列表
LIMIT
        分页参数

我们今天会将上面的完整语法拆分为以下几个部分学习:

  • 基本查询(不带任何条件)
  • 条件查询(where)
  • 分组查询(group by)
  • 排序查询(order by)
  • 分页查询(limit)

2.3.3 基本查询,不带任何的查询条件

语法如下:

  • 查询多个字段
select 字段1, 字段2, 字段3 from  表名;
  • 查询所有字段(通配符)
select *  from  表名;
  • 设置别名
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ]  from  表名;
  • 去除重复记录
select distinct 字段列表 from  表名;

案例演示:

  • 案例 1:查询指定字段 name,entry_date 并返回
select name,entry_date from emp;

* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)

2.3.4 条件查询

select  字段列表  from   表名   where   条件列表 ; -- 条件列表:意味着可以有多个条件

学习条件查询就是学习条件的构建方式,而在 SQL 语句当中构造条件的运算符分为两类:

  • 比较运算符
  • 逻辑运算符

常用的比较运算符如下:

比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
between ... and ...在某个范围之内(含最小、最大值)
in(...)在 in 之后的列表中的值,多选一
like 占位符模糊匹配(_匹配单个字符, %匹配任意个字符)
is null是 null

常用的逻辑运算符如下:

逻辑运算符功能
and 或 &&并且 (多个条件同时成立)
or 或 ||或者 (多个条件任意一个成立)
not 或 !非 , 不是
  • 案例 1:查询 姓名 为 '杨逍' 的员工
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where name = '杨逍'; -- 字符串使用''或""包含
  • 案例 2:查询 薪资小于等于 5000 的员工信息
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
where salary <=5000;

注意:查询为 NULL 的数据时,不能使用 = null 或 !=null 。得使用 is null 或 is not null。

之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)

常用聚合函数:

函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和

注意 : 聚合函数会忽略空值,对 NULL 值不作为统计。

  • count :按照列去统计有多少行数据。
    • 在根据指定的列统计的时候,如果这一列中有 null 的行,该行不会被统计在其中。
  • sum :计算指定列的数值和,如果不是数值类型,那么计算结果为 0
  • max :计算指定列的最大值
  • min :计算指定列的最小值
  • avg :计算指定列的平均值

案例演示:

  • 案例 1:统计该企业员工数量
-- count(字段)
select count(id) from emp;-- 结果:30
select count(job) from emp;-- 结果:29 (聚合函数对NULL值不做计算)

-- count(常量)
select count(0) from emp;
select count('A') from emp;

-- count(*)  推荐此写法(MySQL底层进行了优化)
select count(*) from emp;

2.3.5 分组查询 按照某一列或者某几列,把相同的数据进行合并输出

- plainplain分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
- 分组查询通常会使用聚合函数进行计算。

语法:

select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];

案例演示:

  • 案例 1:根据性别分组 , 统计男性和女性员工的数量
select gender, count(*)
from emp
group by gender; -- 按照gender字段进行分组(gender字段下相同的数据归为一组)

注意事项:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序:where > 聚合函数 > having

where 与 having 区别(面试题)

  • 执行时机不同:where 是分组之前进行过滤,不满足 where 条件,不参与分组;而 having 是分组之后对结果进行过滤。
  • 判断条件不同:where 不能对聚合函数进行判断,而 having 可以。

2.3.6 排序查询开发中是非常常见的一个操作,有升序排序,也有降序排序

语法:

select  字段列表  
from   表名   
[where  条件列表] 
[group by  分组字段 ] 
order  by  字段1  排序方式1 , 字段2  排序方式2 … ;
  • 排序方式:
    • ASC :升序(默认值)
    • DESC:降序

案例演示:

  • 案例 1:根据入职时间, 对员工进行升序排序
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by entry_date ASC; -- 按照entrydate字段下的数据进行升序排序

select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
order by  entry_date; -- 默认就是ASC(升序)

注意事项:如果是升序, 可以不指定排序方式 ASC

2.3.7 分页查询业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作

分页查询语法:

select  字段列表  from  表名  limit  起始索引, 查询记录数 ;
  • 案例 1:从起始索引 0 开始查询员工数据, 每页展示 5 条记录
select id, username, password, name, gender, phone, salary, job, image, entry_date, create_time, update_time
from emp
limit 0 , 5; -- 从索引0开始,向后取5条记录

注意事项:

  1. 起始索引从 0 开始。 计算公式 :起始索引 = (查询页码 - 1)* 每页显示记录数
  2. 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL 中是 LIMIT
  3. 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 条数

小结

MySQL 入门可以先按“概念、表结构、SQL 分类、查询与分页”来理解。等基础语句熟悉后,再继续整理索引、事务和性能相关内容。

Written by Handwritten

If you enjoyed this, leave a comment~

... Page views
© 2025 - 2026 youki
Powered by theme astro-koharu · Inspired by Shoka
Loading...