MySQL数据库

一、MySQL数据库的基本使用
1.数据库
(1)数据库的介绍
数据库就是存储和管理数据的仓库,数据按照一定的格式进行存储,用户可以对数据库中的数据进行增加、删除、修改、查询等操作。
(2)数据库的分类
数据库分为两类:关系型数据库和非关系型数据库。
①关系型数据库:是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,类似于Excel文件中的表格,强调使用表格的方式存储数据。

  • 关系型数据库中的核心元素:
    数据行
    数据列
    数据表
    数据库(数据表的集合)
  • 常用的关系型数据库:
    Oracle
    Microsoft SQL Server
    MySQL
    SQLite

②非关系型数据库:又被称为NoSQL(Not Only SQL),意为不仅仅是SQL。对NoSQL最普遍的定义是“非关联型的”,强调Key-Value的方式存储数据。

  • 常见的非关系型数据库:
    MongoDB
    Redis

(3)数据库的作用
数据库就是存储和管理数据的一个仓库,是用来持久化存储和快速读取数据的。
(4)数据库的特点
①持久化存储
②读写速度极高
③保证数据的有效性

2.关系型数据库管理系统
(1)关系型数据库管理系统的介绍
数据库管理系统(Relational DataBase Management System,简称RDBMS)是为管理关系型数据库而设计的管理系统,如果想要使用关系型数据库就需要安装数据库管理系统,其实就是一个应用软件。
关系型数据库管理系统分为:

  • 关系型数据库服务端软件:主要负责管理不同的数据库,而每个数据库里面会有一系列数据文件,数据文件是用来存储数据的,其实数据库就是一系列数据文件的集合。
  • 关系型数据库客户端软件:主要负责和关系型数据库服务端软件进行通信,向服务端传输数据或从服务端读取数据。

说明:
①用户操作关系型数据库客户端,实现数据库相关操作。
②关系型数据库客户端借助网络使用SQL语言和关系型数据库服务端进行数据通信。
③关系型数据库服务端管理不同的数据库,每个数据库都有一系列数据文件,数据保存在数据文件里面,每个数据库可以理解为一个文件夹。
(2)SQL的介绍
SQL(Structured Query Language)是结构化查询语言,是一种用来操作RDBMS的数据库语言,也就是说通过SQL可以操作Oracle、SQL Server、MySQL、SQLite等关系型数据库。
SQL的作用是通信的桥梁,实现数据库客户端和数据库服务端之间的通信。
SQL语言主要分为:
①DQL:数据查询语言,用于对数据进行查询,比如select。
②DML:数据操作语言,对数据进行增加、删除、修改,比如insert、delete、update。
③TPL:事务处理语言,对事务进行处理,比如begin transaction、commit、rollback。
④DCL:数据控制语言,进行授权与权限回收,比如grant、revoke。
⑤DDL:数据定义语言,进行数据库、数据表的管理,比如create、drop。
说明:SQL语言不区分大小写。

3.MySQL数据库
(1)MySQL数据库的介绍
MySQL数据库是一个关系型数据库管理系统,在web应用方面,MySQL是最好的RDBMS(关系型数据库管理系统)应用软件。它是由瑞士MySQL AB公司开发,目前属于Oracle旗下产品,MySQL是最流行的关系型数据库管理系统中的一个。
MySQL的特点:
①MySQL是开源的,所以不需要支付额外的费用。
②MySQL支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
③MySQL使用标准的SQL数据语言形式。
④MySQL可以安装在不同的操作系统,并且提供多种编程语言的操作接口,这些编程语言包括C、C++、Python、Java、Ruby等。
(2)MySQL数据库的安装

  • MySQL数据库服务端软件的安装
  • MySQL数据库客户端软件的安装

MySQL数据库服务端软件的安装:
在Ubuntu中打开终端,输入命令:sudo apt-get install mysql-server
说明:
ps查看当前系统的进程
-a表示所有用户
-u标识显示用户名
-x表示显示所有的执行程序
sudo service mysql status查看MySQL服务状态
sudo service mysql stop停止MySQL服务
sudo service mysql start启动MySQL服务
sudo service mysql restart重启MySQL服务
MySQL配置文件路径为:/etc/mysql/mysql.conf.d/mysqld.cnf
主要配置信息说明:
①port表示端口号,默认为3306。
②bind-address表示服务器绑定的IP,默认为127.0.0.1。
③datadir表示数据库保存路径,默认为/var/lib/mysql。
④log_error表示错误日志,默认为/var/log/mysql/error/log。
MySQL数据库客户端软件的安装:
客户端是程序员或者dba使用的软件,通过socket方式与服务端程序通信。
常用的MySQL数据库客户端软件有:

  • 图形化界面客户端Navicat
  • 命令行客户端MySQL

图形化界面客户端Navicat的使用:
①可以到Navicat官网下载。
②将压缩文件拷贝到Ubuntu虚拟机中,放在桌面上,解压。
Navicat的使用说明:
tar zxvf navicat112_mysql_cs_x64.tar.gz
./start_navicat
试用过期的解决方法:
过期后,删除主目录下的.navicat64目录,继续再使用14天。
cd ~
rm -r navicat64
命令行客户端MySQL的安装:
在Ubuntu中打开终端,输入命令:sudo apt-get install mysql-client
MySQL命令的使用帮助:mysql --help
MySQL客户端的使用:
MySQL客户端连接MySQL服务端命令:mysql -uroot -p
说明:
-u表示MySQL服务端的用户名
-p表示MySQL服务端的密码
③quit或者exit或者ctrl+d表示退出

4.数据类型和约束
(1)数据类型
数据类型是指在创建链表的时候为表中字段指定数据类型,只有数据类型符合要求才能存储起来,使用数据类型的原则是:够用就行,尽量使用取值范围小的,而不用大的,这样可以更多地节省存储空间。
常用数据类型如下:
①整数:int
②小数:decimal
③字符串:varchar,char
④日期时间:date,time,datetime
⑤枚举类型:enurn
数据类型说明:
①decimal表示浮点数,例如decimal(5,2)表示共存5位数,小数占2位。
②char表示固定长度的字符串,例如char(3),如果填充’ab’时会补一个空格为’ab ‘,3表示字符数。
③varchar表示可变长度的字符串,例如varchar(3),填充’ab’时就会存储’ab’,3表示字符数。
④对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径。
⑤字符串text表示存储大文本,当字符串大于4000时推荐使用,比如技术博客。
(2)数据约束
约束是指数据在数据类型限定的基础上额外增加的要求。
常见的约束如下:
①主键primary key:物理上存储的顺序,MySQL建议所有表的主键字段都叫id,类型为int unsigned。
②非空not null:此字段不允许填写空值。
③唯一unique:此字段的值不允许重复。
④默认default:当不填写字段对应的值时会使用默认值,如果填写以填写的值为准。
⑤外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常。

5.图形化客户端Navicat
(1)Navicat的介绍
Navicat是一套快速、可靠并且价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux,可以用来对本机或者远程的MySQL、SQL Server、SQLite、Oracle等数据库进行管理及开发,专门为简化数据库的操作而设计。它的设计符合数据库管理员、开发人员及中小企业的需求。Navicat是一个数据库图形化客户端软件,可以用安全并且简单的方式对数据库进行操作。
(2)Navicat的使用
①和MySQL数据库服务端建立连接
②数据库的操作
③数据表的操作
④数据表中数据的操作

6.命令行客户端MySQL的使用
(1)登录和退出数据库
登录数据库:
输入命令:mysql -uroot -p
-u后面是登录的用户名
-p后面是登录密码,如果不正确,回车之后会提示输入密码
登录成功后,输入如下命令查看效果:
select now();显示当前时间
quit/exit/ctrl+d退出数据库
(2)数据库操作的SQL语句
show databases;查看所有的数据库
create database 数据库名 charset=utf8;创建数据库
use 数据库名使用数据库
select database();查看所有的数据库
drop database 数据库名;删除数据库
(3)表结构操作的SQL语句
①查看当前数据库中所有表
show tables;
②创建表
create table students(
id int unsigned primary key auto_increment not null,
name valchar(20) not null,
age tinyint unsigned deafult 0,
height decimal(5,2),
gender enum('男','女','中性','保密')
);
说明:
create table 表名(
字段名称 字段类型 可选的约束条件,
column1 datatype contrai
...
);
③修改表-添加字段
alter table 表名 add 列名 类型 约束;
例如:alter table students add birthday datetime;
④修改表-修改字段类型
alter table 表名 modify 列名 类型 约束;
例如:alter table students modify birthday date not null;
说明:modify只能修改字段类型或约束,不能修改字段名。
⑤修改表-修改字段名和字段类型
alter table 表名 change 原名 新名 类型及约束;
例如:alter table students change birthday birth datetime not null;
说明:change既能对字段重命名又能修改字段类型还能修改约束。
⑥修改表-删除字段
alter table 表名 drop 列名;
例如:alter table students drop birthday;
⑦查看创表SQL语句
show create table 表名;
例如:show create table students;
⑧查看创库SQL语句
show create database 数据库名;
例如:show create database mytest;
⑨删除表
drop table 表名;
例如:drop table students;
(4)表数据操作的SQL语句
①查询数据

  • 查询所有列
    select * from 表名;
  • 查询指定列
    select 列1,列2,... from 表名;
    例如:select id,name from students;

②添加数据

  • 全列插入:值的顺序与表中字段顺序完全对应
    insert into 表名 values(...);
    例如:insert into students values(0,'xx',default,default,'男');
  • 部分列插入:值的顺序与给出列的顺序对应
    insert into 表名(列1,...) values(值1,...);
    例如:insert into students(name,age) values('王二小,15');
  • 全列多行插入
    insert into 表名 values(...),(...)...;
    例如:insert into students values(0,'张飞','55','1.75','男'),(0,'关羽','58','1.85','男');
  • 部分列多行插入
    insert into 表名(列1,...) values(值1,...),值(1,...)...;
    例如:insert into students(name,height) values('刘备','1.75'),('曹操','1.6');

说明:

  • 主键列是自动增长,但是在全列插入时需要占位,通常用空值(0/null/deafult)。
  • 在全列插入时,如果字段列有默认值可以使用deafult占位,插入后的数据就是之前设置的默认值。

③修改数据
update 表名 set 列1=值1,列2=值2... where 条件;
例如:update students set age=18, gender='女' where id=6;
④删除数据
delete from 表名 where 条件;
例如:delete from students where id=5;
上面的删除操作称之为物理删除,一旦删除就不容易修复,我们可以使用逻辑删除的方式来解决这个问题。
添加逻辑删除字段,0表示未删除,1表示已删除
alter table students add isdelete bit deafult 0;
逻辑删除数据
update students set isdelete=1 where id=5;
说明:逻辑删除本质上是修改操作。

7.as和distinct关键字
(1)as关键字
在使用SQL语句显示结果的时候,在屏幕上显示的字段往往不具备良好的可读性,此时可以使用as给字段起一个别名。
①使用as给字段起别名
select id as 序号, name as 名字, gender as 性别 from students;
②使用as给表起别名

  • 如果是单表查询,可以省略表名
    select id, name, gender from students;
  • 表名.字段名
    select students.id, students.name, students.gender from students;
  • 通过as给表起别名
    select s.id,s.name, s.gender from students as s;

(2)distinct关键字
distinct可以去除重复数据行。
select distinct 列1,... from 表名;
例如:select distinct name, gender from students;

8.where条件查询
(1)where条件查询的介绍
使用where条件查询可以对表中的数据进行筛选,条件成立的记录会出现在结果表中。
where语句支持的运算符:
①比较运算符
②逻辑运算符
③模糊查询
④范围查询
⑤空判断
where条件查询语法格式如下:
select * from 表名 where 条件;
例如:select * from students where id = 1;
(2)比较运算符查询
①等于:=
②大于:>
③大于等于:>=
④小于:<
⑤小于等于:<=
⑥不等于:!=或<>
(3)逻辑运算符查询
①and
②or
③not
例1:查询编号大于3的女同学:
select * from students where id > 3 and gender='女';
例2:查询编号小于4或没被删除的同学:
select * from students where id < 4 or is_del=0;
例3:查询年龄不在10岁到15岁之间的同学:
select * from students where not (age >= 10 and age <= 15);
说明:多个条件判断想要作为一个整体,可以结合’()’。
(4)模糊查询
①like是模糊查询关键字
②%表示任意多个字符
③_表示任意一个字符
例1:查询姓黄的学生:
select * from students where name like '黄%';
例2:查询姓黄并且名只有一个字的学生:
select * from students where name like '黄_';
例3:查询姓黄或叫靖的学生:
select * from students where name like '黄%' or name like '%靖';
(5)范围查询
①between…and…表示在一个连续的范围内查询
②in表示在一个非连续的范围内查询
例1:查询编号为3到8的学生:
select * from students where id between 3 and 8;
例2:查询编号不是3到8的学生:
select * from students where not (id between 3 and 8);
例3:查询编号是3、5、7的学生:
select *from students where id in (3,5,7);
(6)空判断查询
①判断为空使用:is null
②判断非空使用:is not null
例:查询没有填写身高的学生
select * from students where height is null;

9.排序
排序查询语法:
select * from 表名 order by 列1 asc/desc [,列2 asc /desc ...];
说明:
①先按照列1进行排序,如果列1的值相同,则按照列2进行排序,以此类推。
②asc从小到大排序,即升序。
③desc从大到小排序,即降序。
④默认按照列值从小到大排序。
例1:查询未删除的男生信息,按学号降序排列;
select * from students where is_del = 0 and gender = 1 order by id desc;
例2:显示所有的学生信息,先按年龄从大到小排序,当年龄相同时按照身高从高到矮排序。
select * from students order by age desc, height desc;

10.分页查询
(1)分页查询的介绍
当我们在京东购物,浏览商品列表的时候,由于数据特别多,一页显示不完,就需要一页一页的显示,这就是分页查询。
(2)分页查询的语法
select * from 表名 limit start, count;
说明:
①limit是分页查询关键字。
②start表示开始行索引,默认是0。
③count表示查询条数。
例1:查询前3行男生信息:
select * from students where gender='男' limit 0,3;
简写为:
select * from students where gender='男' limit 3;
(3)分页查询案例
已知每页显示m条数据,求第n页显示的数据。
查询学生表,获取第n页数据的SQL语句:
select * from students limit (n-1)*m, m;

二、MySQL数据库的条件查询

1.聚合函数
(1)聚合函数的介绍
聚合函数又叫做组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by)来使用,用于统计和计算分组数据。
常用的聚合函数:
count(col)求指定列的总行数
max(col)求指定列的最大值
min(col)求指定列的最小值
sum(col)求指定列的和
avg(col)求指定列的平均值
(2)求总行数
返回非null数据的总行数:
select count(height) from students;
返回总行数,包括null值记录:
select count(*) from students;
(3)求最大值
查询女生编号的最大值
select max(id) from students where gender='女';
(4)求平均值
求学生的平均身高,聚合函数不统计null值,平均身高有误:
select avg(height) from students;
求学生的平均身高,包括身高为null的:
select avg(ifnull(height,0)) from students;
说明:ifnull函数表示判断指定字段的值是否为null,如果为空则使用自定义的值。
(5)聚合函数的特点
聚合函数默认忽略字段为null的记录,要想列值为null的记录也参与计算,则要使用ifnull函数对null值做替换。

2.分组查询
(1)分组查询介绍
分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组。
分组查询的基本语法格式:
group by 列名 [having 条件表达式] [with rollup]
说明:
①列名:是指按照指定字段的值进行分组。
②having 条件表达式:用来过滤分组后的数据。
③with group:在所有记录的最后加上一条记录,显示select查询时聚合函数的统计和计算结果。
(2)group by的使用
group by可用于单个字段分组,也可用于多个字段分组。
根据gender字段来分组:
select gender from students group by gender;
根据name和gender来分组:
select name, gender from students group by name,gender;
(3)group by+group_concat()的使用
group_concat(字段名):统计每个分组指定字段的信息集合,每个信息之间使用逗号进行分割。
根据gender字段进行分组,查询gender字段和分组的name字段信息。
select gender,group_concat(name) from students group by gender;
(4)group by+聚合函数的使用
统计不同性别的人的平均年龄:
select gender, avg(age) from students group by gender;
统计不同性别的人的个数:
select gender, count(*) from students group by gender;
(5)group by+having的使用
having的作用和where类似,都是用来过滤信息的,但having是过滤分组数据的,只能用于group by。
根据gender字段进行分组,统计分组条数大于2的:
select gender, count(*) from students group by gender having count(*) > 2;
(6)group by+with rollup的使用
with rollup的作用:在最后记录后面新增一行,显示select查询时聚合函数的统计和计算结果。
根据gender字段进行分组,汇总人数:
select gender, count(*) from students group by gender with rollup;

3.连接查询-内连接
(1)连接查询的介绍
连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成。
连接查询可以分为:
①内连接查询
②左连接查询
③右连接查询
④自连接查询
(2)内连接查询
查询两个表中符合条件的共有记录,即交集。
内连接查询语法格式:
select 字段 from 表1 inner join 表2 on 表1.字段1 = 表2.字段2;
说明:
inner join就是内连接查询关键字。
on就是连接查询条件。
例:使用内连接查询学生表与班级表:
select * from students as s inner join classes as c on s.cls_id = c.id;

4.连接查询-左连接
以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在则使用null填充。
左连接查询语法格式:
select 字段 from 表1 left join 表2 on 表1.字段1 = 表2.字段2;
说明:
left join就是左连接查询关键字。
on就是连接查询条件。
③表1是左表,表2是右表。
例:使用左连接查询学生表与班级表:
select * from students as s left join classes as c on s.cls_id=c.id;

5.连接查询-右连接
以右表为主根据条件查询左表数据,如果根据条件查询左表数据不存在则使用null填充。
右连接查询语法格式:
select 字段 from 表1 right join 表2 on 表1.字段1=表2.字段2;
说明:
right join就是右连接查询关键字。
on就是连接查询条件。
③表1是左表,表2是右表。
例:使用右连接查询学生表与班级表:
select * from students as s right join classes as c on s.cls_id = c.id;

6.连接查询-自连接
自连接查询:左表和右表是同一个表,根据连接查询条件查询两个表中的数据。
创建areas表:
create table areas(
id varchar(30) not null primary key,
title varchar(30),
pid varchar(30)
);
执行sql文件给areas表导入数据:
source areas.sql;
说明:自连接查询必须对表起别名。
小结:
①自连接查询就是把一张表模拟成左右两张表,然后进行连表查询。
②自连接就是一种特殊的连接方式,连接的表还是本身这张表。

7.子查询
(1)子查询的介绍
在一个select语句中,嵌入了另外一个select语句,那么被嵌入的select语句称之为子查询语句,外部那个select语句则成为主查询。
主查询和子查询的关系:
①子查询是嵌入到主查询中。
②子查询是辅助主查询的,要么充当条件,要么充当数据源。
③子查询是可以独立存在的语句,是一条完整的select语句。
(2)子查询的使用
例1:查询大于平均年龄的学生:
select * from students where age > (select avg(age) from students);
例2:查询有学生在的所有班级:
select name from classes where id in (select cls_id from students where cls_id is not null);
例3:查询年龄最大,身高最高的学生:
select from students where (age,height)=(select max(age),max(height) from students);
小结:子查询是一个完整的SQL语句,子查询被嵌入到一对小括号里面。

8.数据库设计之三范式
(1)数据库设计之三范式的介绍
范式:对设计数据库提出的一些规范,目前有迹可循的共有8种范式,一般遵守3范式即可。
①第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
②第二范式(2NF):满足1NF,另外包含两部分内容,一是表必须有一个主键,二是非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分。
③第三范式(3NF):满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,既不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况。
(2)第一范式的介绍
在这里插入图片描述
(3)第二范式的介绍
在这里插入图片描述
(4)第三范式的介绍
在这里插入图片描述
(5)E-R模型的介绍
E-R模型即实体-关系模型,E-R模型就是描述数据库存储数据的结构模型。
E-R模型的使用场景:
①对于大型公司项目,我们需要根据产品经理的设计,先使用建模工具如:power designer、db designer等这些软件来画出实体-关系模型(E-R模型)。
②然后根据三范式设计数据库中的表结构。
说明:
①E-R模型由实体、属性、实体之间的关系构成,主要用来描述数据库中结构。
②开发流程是先画出E-R模型,然后根据三范式设计数据库中的表结构。

9.外键SQL语句的编写
(1)外键约束作用
外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性。
(2)对于已经存在的字段添加外键约束
alter table students add foreign key(cls_id) references classes(id);为cls_id字段添加外键约束
(3)在创建数据表时设置外键约束
创建学校表:
create table school(
id int not null primary key auto_increment,
name valchar(10)
);
创建老师表:
create table school(
id int not null primary key auto_increment,
name valchar(10),
s_id not null,
foreign key(s_id) references school(id)
);
(4)删除外键约束
需要先获取外键约束条件,该名称系统会自动生成,可以通过查看表创建语句来获取名称:
show create table teacher;
获取名称之后就可以根据名称来删除外键约束:
alter table teacher drop foreign key 外键名;
小结:
①添加外键约束:alter table 从表 add foreign key(外键字段) references 主表(主键字段);
②删除外键约束:alter table 表名 drop foreign key 外键名;

三、MySQL数据库的高级使用

1.将查询结果插入到其他表中
(1)思考:只有一个目前goods表,我们想要增加一个商品分类信息,只通过goods表无法完成商品分类的添加,那么如何实现添加商品分类信息的操作?
答案:
①创建一个商品分类表,把goods表中的商品分类信息添加到表中。
②将goods表中的分类名称更改为商品分类表中对应的分类id。
(2)创建商品分类表
create table good_cates(
id int not null primary key auto_increment,
name varchar(50) not null
);
(3)把goods表中的商品分类添加到商品分类表
查询goods表中的分类信息:
select cate_name from goods group by cate_name;
将查询结果添加到good_cates表中:
insert into select good_cates(name) select cate_name from goods group by cate_name;
添加移动设备分类信息:
insert into good_cates(name) values('移动设备');
说明:insert into ... select ...表示把查询结果插入到指定表中,即表复制。

2.使用连接更新表中某个字段数据
将goods表中的分类名称更改成商品分类表中对应的分类id
查看goods表中的商品分类名称对应的商品分类id:
select * from goods inner join good_cates on goods.cate_name = good.cate_name;
把该语句中from后的语句理解为一张虚表:
update goods g inner join good_cates gc on g.cate_name = gc.name set g.cate_name = gc.id;

3.创建表并给某个字段添加数据
(1)思考:假设我们想要添加一个品牌,比如双飞燕这个品牌信息,只通过goods表无法完成品牌信息的添加,那么如何实现添加品牌信息的操作?
答案:
①创建一个品牌表,把goods表中的品牌信息添加到表中。
②将goods表中的品牌名称更改为品牌表中对应的品牌id。
(2)创建品牌表
查询品牌信息:
select brand_name from goods group by brand_name;
通过create table ... select来创建数据表并同时插入数据,创建商品分类表时需要对brand_name用as起别名,否则name字段就没有值。
create table good_brands(
id int unsigned primary key auto_increment,
name varchar(40) not null ) select brand_name as name from goods by brand_name;
说明:create table ... select 列名 ...表时创建表并插入数据。
(3)更新goods表中的品牌信息
将goods表中的品牌名称更改成品牌表中对应的品牌id:
update goods as g inner join good_brands gb on g.brand_name = gb.name set g.brand_name =gb.id;

4.修改goods表结构
目前我们已经把goods表中的商品分类和品牌信息已经更改成了商品分类id和品牌id,接下来需要把cate_name和brand_name字段分别改成cate_id和brand_id字段,类型都改成int类型。
查看表结构:
desc goods;
通过alter table语句修改表结构:
alter table goods change cate_name cate_id int not null, change brand_name brand_id int not null;
说明:alter table可以同时修改多个字段信息,多个修改字段之间用逗号隔开。

5.事务
(1)事务的介绍
事务就是用户定义的一系列执行SQL语句的操作,这些操作要么完全地执行,要么完全地都不执行,它是一个不可分割的工作执行单元。
事务的使用场景:
在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,要想解决这个问题就需要通过事务来完成。
(2)事务的四大特性
①原子性
②一致性
③隔离性
④持久性

  • 原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
  • 一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,即使在转账过程中系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存在数据库中)。
  • 隔离性:通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另一个账户汇总程序开始运行,则其看到支票账户的余额并没有被减去200美元)。
  • 持久性:一旦事务提交,则其所做的修改会永久保存到数据库中。

说明:事务能够保证数据的完整性和一致性,让用户的操作更加安全。
(3)事务的使用
在使用事务之前,先要确保表的存储引擎是InnoDB类型,只有这个类型才可以使用事务,MySQL数据库中表的存储引擎默认是InnoDB类型。
表的存储引擎说明:
表的存储引擎就是提供存储数据的一种机制,不同表的存储引擎提供不同的存储机制。
查看MySQL数据库支持的表的存储引擎:
show engines;
说明:
①常用的表的存储引擎是InnoDB和MyISAM。
②InnoDB是支持事务的。
③MyISAM不支持事务,优势是访问速度快,对事务没有要求或者以select、insert为主的都可以使用该存储引擎来创建表。
开启事务:
begin;或者start transaction;
说明:
①开启事务后执行修改命令,变更数据会保存到MySQL服务端的缓存文件中,而不维护到物理表中。
②MySQL数据库默认采用自动提交(autocommit)模式,如果没有显示的开启一个事务,那么每条sql语句都会被当做一个事务执行提交的操作。
③当设置autocommit = 0就是取消了自动提交事务模式,直到显示的执行commit和rollback表示该事物结束。
④set autocommit = 0表示取消自动提交事务模式,需要手动执行commit完成事务的提交。
提交事务:commit;
将本地缓存文件中的数据提交到物理表中,完成数据的更新。
回滚事务:rollback;
放弃本地缓存文件中的缓存数据,表示回到开始事务的状态。

6.索引
(1)索引的介绍
索引在MySQL中也叫作"键",它是一个特殊的文件,保存着数据表里所有记录的位置信息。通俗来讲,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
应用场景:
当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。
(2)索引的使用
查看表中已有索引:
show index from 表名;
说明:主键列会自动创建索引。
索引的创建:

  • 创建索引的语法格式:
    alter table 表名 add index 索引名[可选](列名,...);
  • 给name字段添加索引:
    alter table classes add index my_name (name);

说明:索引名不指定,默认使用字段名。
索引的删除:

  • 删除索引的语法格式:
    alter table 表名 drop index 索引名;
  • 如果不知道索引名,可以查看创表SQL语句:
    show create table classes;
    alter table classes drop index my_name;

(3)联合索引
联合索引又叫作复合索引,即一个索引覆盖表中的两个或多个字段,一般用在多个字段一起查询的时候。
创建teacher表:
create table teacher(
id int not null primary key auto_increment,
name varchar(10),
age int);
创建联合索引:
alter table teacher add index (name,age);
联合索引的好处:
减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。
(4)联合索引的最左原则
在使用联合索引的时候,我们要遵守一个最左原则,即index(name,age)支持name、name和age组合查询,而不单独支持age查询,因为没有用到创建的联合索引。
说明:在使用联合索引查询数据的时候一定要保证联合索引的最左侧字段出现在查询条件里面,否则联合索引失效。
(5)MySQL中索引的优缺点及使用原则
优点:加快了数据的查询速度
缺点:创建索引会耗费时间、占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加。
使用原则:
①通过优缺点对比,不是索引越多越好,而是需要合理的使用。
②对经常更新的表就避免对其进行过多索引的创建,对经常用于查询的字段应该创建索引。
③数据量小的表最好不要使用索引,因为数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就不能达到优化效果。
④在一个字段上相同值比较多时不要建立索引,比如在学生表的性别字段上只有男、女两个不同值。相反的,在一个字段上不同值比较多时可建立索引。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值