MySQL 从入门到精通:基础概念与操作指南
文章目录
- 一、mysql 介绍
- 1. 什么是数据库
- 2. 关系型数据库
- 3. 非关系型数据库
- 4. mysql 概述和历史
- 二、数据库,表和列的基本概念
- 1. 数据库的概念和用途
- 2. mysql 数据库服务器、数据库和表的关系
- 3. 数据库的创建和删除
- 4. 使用数据库
- 5. 表创建
- 6. 表修改
- 7. 表删除
- 三、数据类型和约束
- 1. 常见的数据类型
- 数值类型
- 字符串类型
- 日期和时间类型
- 2. 常见的约束
- 3. 约束使用示例
- 四、基本查询
- 1. where 子句的使用
- 2. order by 使用
- 3. group by 和 having 子句使用
- 4. limit 和 offset 子句的使用
一、mysql 介绍
1. 什么是数据库
数据库如同一个有序的数据仓库,与普通的数据存储方式不同,它依据特定的数据结构来组织数据,使得数据呈现出条理化的状态。
数据库和普通文件系统存在显著区别。普通文件系统中的数据往往缺乏特定结构,查找数据时如同在杂乱无章的仓库中翻找物品,效率低下。而数据库由于拥有数据结构,能快速定位和查找对应的数据,就像在井然有序且有索引目录的仓库中找东西,速度大幅提升。
我们常提及的 mysql 数据库,实际上指的是 mysql 数据库管理系统,它是一款软件,承担着数据库服务的重要职责。
依据数据结构的差异,数据库可分为关系型数据库和非关系型数据库。
2. 关系型数据库
关系型数据库是基于关系模型构建的数据库。关系模型涵盖一对一、一对多、多对多等关系模式,其数据存储格式以行列构成的二维表格为基础。因此,一个关系型数据库就是由众多二维表之间的关联所形成的数据集合。
关系型数据库在存储具有明显关系模型的数据方面表现出色,例如:
- 一位老师可能对应多个学生,这是典型的 “多对多” 关系,如在学校的教学管理系统中,数学老师可能教授多个班级的众多学生。
- 一本书可能有多个作者共同创作,呈现 “一对多” 关系,像一些专业领域的大型工具书,往往由多位专家联合编写。
- 一个人对应唯一的一个身份证号码,这属于 “一对一” 关系,在身份信息管理系统中,每个人的身份证号码是独一无二的标识。
3. 非关系型数据库
由于关系型数据库在某些场景下可能显得过于庞大和复杂,于是 “非关系型数据” 应运而生,用于指代其他类型的数据库。非关系型数据库的常见模型包括:
- 列模型:该模型以列作为数据记录的基本单位,与关系型数据库以行为记录单位不同。例如,在一些时间序列数据的存储场景中,列模型数据库能高效地按时间序列的不同属性列进行数据存储和查询。
- 键值对模型:数据以一个个键值对的形式存储,比如 name:lisi,在简单的配置信息存储中,常采用这种模型,通过键快速获取对应的值。
- 文档类模型:将数据以一个个文档的形式进行存储,类似于键值对,但文档结构更为复杂和灵活。像一些内容管理系统中,文章等内容就可以以文档形式存储在文档类模型数据库中。
常见的非关系型数据库有 hbase、mongodb、redis、cassandra 等。hbase 常用于海量数据的存储和实时查询,适用于大数据场景;mongodb 以其灵活的文档存储结构,在处理复杂数据结构的应用中广泛使用,如社交媒体平台的用户数据存储;redis 则因其出色的内存缓存性能,常被用于提高应用的读写速度,如电商网站的商品信息缓存;cassandra 在分布式存储和高可用性方面表现突出,适合大规模分布式系统的数据存储。
4. mysql 概述和历史
mysql 是一款开源的关系型数据库管理系统,最初由瑞典 mysql ab 公司的 michael widenius 和 david axmark 于 1995 年精心创建。它凭借速度快、可靠性高、灵活性强以及易用性好等诸多优点,在 web 应用程序开发以及其他对数据管理可靠性要求极高的应用场景中得到了广泛应用。
2008 年,mysql ab 公司被 sun microsystems 成功收购,随后在 2010 年,oracle corporation 又收购了 sun microsystems,mysql 也随之归属于 oracle 旗下。尽管经历了多次收购,在 oracle 的管理下,mysql 依然保持着活跃的开发态势,拥有庞大且活跃的用户群体,如今已成为最受欢迎的开源数据库之一,在 web 开发、企业级应用等众多领域发挥着关键作用。
mysql 具备出色的跨平台特性,支持多种操作系统,包括 windows、linux、unix 和 macos 等。同时,它对多种编程语言也提供了良好的支持,如 c、c++、java、perl、python 和 php 等。其架构设计极具扩展性和可定制性,开发人员能够根据自身应用的具体需求进行灵活定制和扩展。此外,mysql 支持多种存储引擎,不同的存储引擎适用于不同的应用场景,开发人员可以根据实际需求选择最契合的引擎,以优化数据库性能。例如,innodb 引擎适合处理大量事务,支持行级锁,能有效提高并发性能,常用于电商订单处理等对事务完整性要求高的场景;myisam 引擎则在查询性能上表现出色,不支持事务和行级锁,适用于以读操作居多的场景,如新闻资讯网站的文章存储。
二、数据库,表和列的基本概念
1. 数据库的概念和用途
数据库是一个有组织的数据集合,存储在计算机上以便于管理和访问。其主要用途包括:
- 数据存储和管理:帮助组织和存储大量的数据,包括结构化数据(如表格)和非结构化数据(如文本、图片和视频等)。
- 数据访问:提供高效的数据访问方式,包括查询、过滤、排序等操作,方便用户检索所需的数据。
- 数据共享:多个用户可以同时访问数据库中的数据,实现数据的共享和协作。
- 数据安全性:提供安全性控制,包括访问控制和数据加密等,保护数据的机密性和完整性。
- 数据备份和恢复:提供备份和恢复功能,确保数据的可靠性和完整性。
- 数据分析和挖掘:提供高级数据分析和挖掘功能,包括统计分析、数据挖掘和机器学习等,帮助用户从数据中获得更多价值。
2. mysql 数据库服务器、数据库和表的关系
- 数据库使用步骤:登录 mysql => 创建数据库 => 切换到指定数据库 => 创建表 => 使用表
- 关系:数据库服务器 => 数据库 => 表,从左到右为一对多的关系。
3. 数据库的创建和删除
- 创建数据库:
create database [if not exists] db_name
,可通过default charset
指定数据库采用的字符集。 - 显示数据库语句:
show databases
- 显示数据库创建语句:
show create database db_name
- 数据库删除语句:
drop database [if exists] db_name
4. 使用数据库
- 切换数据库:
use db_name;
- 查看当前使用的数据库:
select database();
5. 表创建
要创建一个新的表,需要使用 sql 中的 create table 语句,并指定表名、列名和数据类型等信息。基本语法示例:
create table [if not exists] students(id varchar(255) primary key,name varchar(255) not null,age int,gender varchar(255),clazz varchar(255)
);
- primary key 关键字用于定义列为主键,也可以使用多列来定义主键,列间以逗号分隔。
- 若不想字段为 null,可以设置字段的属性为 not null,操作数据表时如果输入该字段的数据为 null,就会报错。
- 加载本地数据:
load data local infile 'students.txt' into table students fields terminated by ',' ;
6. 表修改
使用 alter table 语句可以追加、修改或删除列,具体语法如下:
- 增加列:
alter table students add length float;
- 修改列类型、属性:
alter table students modify length int not null;
- 修改表的名称:
rename table students to student;
- 修改列的名称:
alter table student change id sid varchar(255);
- 修改表的字符集:
alter table student character set utf8;
- 删除列:
alter table students drop length;
7. 表删除
要删除表,使用 sql 中的 drop table 语句,并指定要删除的表名:drop table [if not exists ] students;
三、数据类型和约束
1. 常见的数据类型
- 数值类型:int、bigint、float、double,decimal 等。
- 字符串类型:char、varchar、text 等。
- 日期和时间类型:date、datetime、timestamp 等。
- 二进制类型:blob、longblob、varbinary 等。
- 枚举类型:enum。
- 集合类型:set。
数值类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
tinyint | 1 bytes | (-128,127) | (0,255) | 小整数值 |
smallint | 2 bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
mediumint | 3 bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
int 或 integer | 4 bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
bigint | 8 bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
float | 4 bytes | (-3.402 823 466 e+38,-1.175 494 351 e-38),0,(1.175 494 351 e-38,3.402 823 466 351 e+38) | 0,(1.175 494 351 e-38,3.402 823 466 e+38) | 单精度浮点数值 |
double | 8 bytes | (-1.797 693 134 862 315 7 e+308,-2.225 073 858 507 201 4 e-308),0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308) | 0,(2.225 073 858 507 201 4 e-308,1.797 693 134 862 315 7 e+308) | 双精度浮点数值 |
decimal | 对 decimal (m,d) ,如果 m>d,为 m+2 否则为 d+2 | 依赖于 m 和 d 的值 | 依赖于 m 和 d 的值 | 小数值 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
char | 0-255 bytes | 定长字符串 |
varchar | 0-65535 bytes | 变长字符串 |
tinyblob | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
tinytext | 0-255 bytes | 短文本字符串 |
blob | 0-65 535 bytes | 二进制形式的长文本数据 |
text | 0-65 535 bytes | 长文本数据 |
mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
longtext | 0-4 294 967 295 bytes | 极大文本数据 |
字符串类型主要有 varchar 和 char,utf-8 编码下一个汉字占 3 个字节,gbk 编码下一个汉字占 2 个字节。
日期和时间类型
类型 | 大小(bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
date | 3 | 1000-01-01/9999-12-31 | yyyy-mm-dd | 日期值 |
time | 3 | ‘-838:59:59’/‘838:59:59’ | hh:mm:ss | 时间值或持续时间 |
year | 1 | 1901/2155 | yyyy | 年份值 |
datetime | 8 | ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ | yyyy-mm-dd hh:mm:ss | 混合日期和时间值 |
timestamp | 4 | ‘1970-01-01 00:00:01’ utc 到 ‘2038-01-19 03:14:07’ utc | yyyy-mm-dd hh:mm:ss | 混合日期和时间值,时间戳 |
2. 常见的约束
- 主键约束(primary key):用于唯一标识表中的每一行数据,通常使用整数类型的列。
- 唯一约束(unique):保证列中的所有值都是唯一的,可以包含空值。
- 外键约束(foreign key):用于定义列与其他表的关系,保证引用完整性。
- 非空约束(not null):确保列中不包含空值。
- 默认值约束(default ):在插入新行时,如果没有指定列的值,则使用默认值。
- 检查约束(check):用于确保列中的值满足特定的条件,可以使用各种表达式和运算符来定义。
3. 约束使用示例
create table users (id int primary key,name varchar(50) not null,email varchar(100) unique,password varchar(100) not null,created_at datetime default current_timestamp,updated_at timestamp default current_timestamp on update current_timestamp,age int check(age >= 18),address text,role enum('admin', 'user') default 'user'
);
- primary key 使用:primary key 是一列或一组列,其值唯一标识表中的每一行。一个表只能有一个 primary key。
create table employees (id int primary key,name varchar(50),age int
);
- auto_increment 使用:auto_increment 是 mysql 特有的属性,允许一个整数列自动增长,每次插入新行时自动递增。
create table users (id int primary key auto_increment,name varchar(50)
);
- unique 使用:确保列中的值唯一。
create table students (student_id int primary key,name varchar(50) not null,email varchar(100) unique
);
- foreign key 使用:定义列与其他表的关系,保证引用完整性。
create table products (product_id int primary key,product_name varchar(50) not null,price decimal(8, 2) not null
);create table orders (order_id int primary key,order_date date not null,product_id int,foreign key (product_id) references products(product_id)
);
四、基本查询
1. where 子句的使用
where 子句用于筛选数据,可指定一个或多个条件限制从数据库中检索的数据行。基本语法:
select * from table_name
where some_column = some_value;
- 比较运算符:=(等于)、<(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、<> 或!=(不等于)。
- 逻辑运算符:and、or 和 not,用于组合多个条件。示例:
select * from students where sex = ‘男’ and age > 23;
- 模糊搜索:使用 like 运算符。示例:
select * from students where clazz = ‘文科%’
,返回名字以 “文科” 开头的所有学生。 - in:
select * from students where clazz in ('文科一班','文科二班','文科三班');
,返回名字在指定列表中的学生。 - between and:
select * from students where age between 22 and 24;
,返回年龄在 22 到 24 之间的学生。
2. order by 使用
order by
子句用于对查询结果按照一个或多个列进行排序。它接受一个或多个列名或表达式作为参数,并可指定每个列的排序方式(升序或降序)。
语法如下:
select column1, column2, ...
from table_name
order by column1 [asc | desc], column2 [asc | desc], ...
其中,asc
表示升序(默认排序方式),desc
表示降序。
例如,要按照学生的年龄升序排列,可使用以下语句:
select * from students order by age asc;
若要先按年龄降序,再按姓名升序排列,可写为:
select * from students order by age desc, name asc;
3. group by 和 having 子句使用
-
group by 子句:用于将查询结果按照一个或多个列进行分组,并对每个组进行聚合计算(如
count
、sum
、avg
等)。语法如下:
select column1, column2, ..., aggregate_function(column_name) from table_name group by column1, column2, ...
例如,要按班级分组统计每个班级的学生人数,可使用:
select clazz, count(id) as student_count from students group by clazz;
-
having 子句:用于对分组后的结果进行过滤,只返回符合条件的分组。它接受一个或多个聚合函数作为参数,并可指定每个函数的过滤条件。
语法如下:
select column1, column2, ..., aggregate_function(column_name) from table_name group by column1, column2, ... having condition;
例如,要筛选出学生人数大于 30 的班级,可使用:
select clazz, count(id) as student_count from students group by clazz having student_count > 30;
4. limit 和 offset 子句的使用
-
limit:用于限制查询结果集的行数。
语法如下:
select column1, column2, ... from table_name limit number;
其中,
number
是想要返回的行数。例如,查询学生表中前 10 条数据:
select * from students limit 10;
-
offset:用于指定查询结果集的偏移量,即从结果集的第几条记录开始返回。通常与
limit
配合使用。语法如下:
select column1, column2, ... from table_name limit number offset offset;
其中,
number
是想要返回的行数,offset
是从查询结果集的起始位置偏移的行数(起始位置为 0)。例如,查询学生表中从第 11 条记录开始的 10 条数据:
select * from students limit 10 offset 10;
ents limit 10;
- **offset**:用于指定查询结果集的偏移量,即从结果集的第几条记录开始返回。通常与`limit`配合使用。语法如下:```sql
select column1, column2, ...
from table_name
limit number offset offset;
其中,number
是想要返回的行数,offset
是从查询结果集的起始位置偏移的行数(起始位置为 0)。
例如,查询学生表中从第 11 条记录开始的 10 条数据:
select * from students limit 10 offset 10;