前言
MySQL 是目前全球最流行、使用最广泛的开源关系型数据库,是后端开发、数据分析、运维、测试岗位的必备核心技能。小到个人博客,大到阿里、腾讯、字节等大厂核心业务,都在大量使用 MySQL。
一、MySQL 基础认知
1.数据库访问方式

2.什么是数据库?
数据库专业的来说,其实就是一种电子的仓库,是专门储存数据和管理数据的一种处所,用户可以对数据库中的数据进行新增、更新或者删除等操作。 举个例子,现在每一个人都有很多朋友和同学,为了方便联系,我们在通讯录,建立有关姓名和电话,这个通讯录就是数据库,有时候我们会修改某个电话号码。
3.数据库应用中的术语

4.数据库概念类型
数据库根据其特点和应用场景的不同,可以分为多种类型,主要包括关系型数据库和非关系型数据库两大类。
关系型数据库:
采用表格的形式来存储数据,数据以行和列的形式组织,表与表之间可以建立关联。常见的关系型数据库有MySQL、Oracle、SQL Server等。关系型数据库注重数据的一致性和完整性,适用于复杂的事务处理和需要严格数据结构的应用。
非关系型数据库:
不采用表格的形式来存储数据,而是采用键值对、文档、列族、图形等多种数据存储模型。非关系型数据库注重性能和灵活性,适用于高性能、大规模数据存储和分布式部署的场景。常见的非关系型数据库有MongoDB、Redis、Cassandra等。
二.MYSQL数据库操作
1.数据库构成
数据库服务器 → 数据库 → 数据表 → 字段 → 记录 → 数据

(1)数据库(Database)
- 一个独立数据仓库
- 用来统一管理多张相关数据表
- 一台 MySQL 服务器可以有多个数据库
(2)数据表(Table)
- 数据库里真正存数据的二维表格
- 结构和 Excel 表格一样:行 + 列
- 是数据库最基础存储单元
(3)字段 / 列(Column/Field)
- 表中每一列就是一个字段
- 代表数据的属性:id、姓名、年龄、性别、手机号
- 每个字段有:字段名、数据类型、约束
(4)记录 / 行(Row/Record)
- 表中每一行就是一条完整数据
- 一条记录对应一个实体信息,比如一个学生、一个用户
(5)数据(Data)
- 字段里实际存储的值
- 比如:张三、20、男、138xxxx
初始化安装mysql数据库后, 会默认创建4个系统数据库:


2.MySQL 数据类型
使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。

重点讲解以下三类:数值、日期/时间和字符串(字符)类型。
(1)整数类型
根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。
| 类型 | 大小 | 范围(有符号) |
| TINYINT | 1 Bytes | (-128,127) |
| SMALLINT | 2 Bytes | (-32 768,32 767) |
| MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) |
| INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) |
| BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) |
适用场景

(2)浮点数类型和定点数类型
在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。
| 类型 | 大小 | 范围(有符号) |
| 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) |
| 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) |
| DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 |
平常用的float,double 在SQL中也有,形式为float(M,D)、和double(M,D) M表示有效数字,D表示小数点后几位表示,不过一般用decimal(M,D)表示精确数值。
(3)字符串类型
在MySQL中常用CHAR 和 VARCHAR 表示字符串。当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1。
| 类型 | 大小 | 用途 |
| 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 | 极大文本数据 |
CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。VARCHAR(M) 定义时, 必须指定 长度M,否则报错。
(4)日期与时间类型
MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。
| 类型 | 大小( 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/1/1 0:00:00、2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
3.数据库操作
一个关系型数据库,一般以表的形式显示:

(1)连接数据库
mysql [-h 主机名 -P 端口号] -u 用户名 -p 密码
(2)数据库操作
创建数据库
create database 数据库名称;
删除数据库
drop database 数据库名;
选择数据库
use 数据库名;
显示MySQL管理的所有数据库
SHOW DATABASES;
查看当前打开的数据库
SELECT DATABASE();
(3)数据表操作
CREATE TABLE 表名 (属性名 数据类型 完整性约束条件,
属性名 数据类型 完整性约束条件,
属性名 数据类型 );
MySQL命令终止符为分号 ;
创建数据表
CREATE TABLE table_name (column_name column_type);
修改表名
Alter table 旧表名 rename 新表名;
删除表
DROP TABLE table_name ;
delete from table_name where field1=new-value;
查看表结构
两种方法:
DESC table_name;
show columns from table_name;
查看备注信息,显示数据表的属性,属性类型,主键信息,是否为NULL,默认值等其他信息。
show full columns from table_name;
显示数据表的详细索引信息,包括primary key(主键)。
show index from table_name;
tables:表名;
Non_unique:索引能否重复;
Key_name:索引的名称;
Seq_in_index:索引中的序列号,从一开始;
Column_name:列名称;
Collation:列以什么方式存储在索引中。'A'(升序) 或NULL(无分类); Cardinality:索引总唯一的数目的估计值;
Sub_part:如果列只是被部分地编入索引,则为被编入索引地字符地数目。如果整列被编入索引,则为NULL;
Packed:指示关键字如何被压缩。如果没有被压缩,则为NULL; NULL:如果列中含有NULL,则含有YES。如果没有,则该列含有NO;
Index_type:用过地索引方法;
Comment:多种拼注。
(4)修改字段
修改字段的数据类型
Alter table 表名 modify 属性名 数据类型;
修改字段名
Alter table 表名 change 旧属性名 新属性名 新数据类型;
增加字段
Alter table 表名 add 属性名 数据类型 [完整性约束条件];
alter table 表名 add foreign key (user_id) references 主表表名 (字段名);
删除字段
Alter table 表名 drop 属性名;
(5)字段约束
| 约束条件 | 说明 |
| PRIMARY KEY | 标识该属性为该表的主键 |
| FOREIGN KEY | 标识该属性为该表的外键 |
| NOT NULL | 标识该属性不能为空 |
| UNIQUE | 标识该属性的值是唯一的 |
| AUTO_INCREMENT | 标识该属性的值自动增加 |
| DEFAULT | 为该属性设置默认值 |
主键约束(PRIMARY KEY)
- 每张表只能存在一个主键
- 主键的作用主要用于保证记录的唯一性
- 主键约束默认添加非空约束(NOT NULL)
- 主键值必须唯一
单字段主键: 字段名 数据类型 primary key (默认值)
多字段联合主键: 字段名 数据类型 primary key (字段1,字段2…)
自增约束(AUTO_INCREMENT)
- 自增约束必须配合主键使用
- 默认情况下,起始值为1,每次的增加量为1
外键约束(FOREIGN KEY)
- 值必须为指向的表的主键值。
- 外键约束主要用于实现一对一,一对多,多对多关系
constraint 外键名 foreign key(字段名1)references 主表名(主列1)
- 主表(父表):主键所在
- 从表(子表):外键所在
父表和子表必须使用相同的存储引擎。
外键和参考列的数据类型必须相同。
外键列和参考列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引。
唯一约束(UNIQUE)
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为空值(NULL)
- 每张表可以有多个唯一约束
非空约束(NOT NULL)
- 字段默认为可以为NULL,非空约束的字段不能为NULL
默认约束(DEFAULT)
- 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
无符号约束(UNSIGNED)
- 通过UNSIGNED修饰的整型数只能保存正数
(6)插入语句
insert into table_name(field1, field2,...fieldN) values (value1, value2,...valueN);
可以通过这个,查看数据表数据:
select * from 表名;
(7)update更新
update table_name set field1=new-value1, field2=new-value2;
案例:数据库基础练习题(题目)
在命令行中完成以下操作,写出对应的SQL语句(不需要执行结果):
mysql -u root -p
一、数据库操作
创建一个名为 mydb 的数据库。
create database mydb;
查看所有数据库。
show databases;
使用 mydb 数据库。
use mydb
查看当前使用的数据库。
select database();
二、创建表
创建班级表 classes,包含:
class_id(整数,主键)
class_name(变长字符串20,非空,唯一)
teacher(变长字符串20,默认值 'TBD')
create table classes(
-> class_id int primary key,
-> class_name varchar(20) not null unique,
-> teacher varchar(20) default'TBD' );
创建学生表 students,包含:
stu_id(整数,主键)
name(变长字符串20,非空)
gender(固定长度字符串1,默认值 '男')
score(定点数,总位数5,小数2位)
class_id(整数)
create table students(
-> stu_id int primary key,
-> name varchar(20) not null,
-> gender char(1) default'男',
-> score decimal(5,2),
-> class_id int );
三、查看表结构
查看 students 表的结构。
desc students;
show columns from students;
查看 students 表的详细列信息(包括注释)。
show full columns from students;
查看 students 表的索引信息。
show index from students;
四、修改表结构
为 students 表增加一个字段 phone,类型 CHAR(11)。
alter table students add phone char(11);
将 students 表中的 gender 字段类型改为 VARCHAR(2)。
alter table students modify gender varchar(2);
将 students 表中的 phone 字段改名为 mobile(类型不变)。
alter table students change phone mobile char(11);
删除 students 表中的 birth_date 字段(假设已存在)。
alter table students drop birth_date;
将 students 表名改为 stu_info(最后可以改回来)。
alter table students rename stu_info;
五、插入数据
向 classes 表插入以下三行数据:
(1, '软件技术1班', '王老师')
(2, '大数据2班', '李老师')
(3, '人工智能3班', '张老师')
insert into classes values(1,'软件技术1班','王老师'),(2,'大数据2班','李老师'),(3,'人工智能3班','张老师');
向 students 表插入以下五行数据:
(101, '张三丰', '男', 485.5, 1)
(102, '李思思', '女', 492.0, 1)
(103, '王祖贤', '女', 478.0, 2)
(104, '赵子龙', '男', 505.0, 3)
(105, '孙尚香', '女', 467.5, 2)
insert into students(stu_id,name,gender,score,class_id) values(101,'张三丰','男',485.5,1),(102,'李思思','女',492.0,1),(103,'王祖贤','女',478.0,2),(104,'赵子龙','男',505.0,3),(105,'孙尚香','女',467.5,2);
六、查询验证
查询 students 表中的所有数据。
select * from students;
查询 classes 表中的所有数据。
select * from classes;


5647

被折叠的 条评论
为什么被折叠?



