文章目录

  • 一、认识数据库
    • 1.什么是数据库
    • 2.数据库的特点及作用
    • 3.常见的数据库
    • 4.工具基本结构介绍
    • 5.认识一些基本常见命令
  • 二、win10系统安装mysql和图形工具
  • 三、Mac系统中安装MySQL数据库
    • 1.下载安装mysql
    • 2.启动mysql
    • 3.关闭mysql
    • 4.登录mysql
  • 四、MySQL的基本操作命令
    • 1.通过命令行连接MySQL
    • 2. 数据库操作
    • 3. 数据表操作
    • 4.数据操作 增删改查
  • 五、MySQL中的数据类型
    • 1.MySQL的数据类型
  • 六、MySQL中的类型约束和运算
    • 1.表的字段约束
    • 2.MySQL的运算符
    • 3.主键
  • 七、MySQL数据表操作详解
    • 1.数据库的操作
    • 2.数据表的操作
  • 八、MySQL数据库中的表引擎
    • 1.服务器处理客户端请求
    • 2.存储引擎
    • 3.MyISAM和InnoDB表引擎的区别
  • 九、MySQL中的字符集utf8
    • 1.了解一下字符集和乱码
    • 2.MySQL中的utf8和utf8mb4
  • 十、MySQL的DML操作数据的增删改
    • 1.添加数据
    • 2.修改数据
    • 3.删除数据
  • 十一、MySq查询语句-健硕数据select
  • 十二、MySQL数据查询-OrderBy排序
    • 1.排序数据 ORDER BY
    • 2.按多个列排序
  • 十三、MySQL数据查询之Where条件
    • 1.WHERE⼦句操作符
    • 2.组合WHERE⼦句
  • 十四、MySQL查询语句-Like与通配符
  • 十五、MysQL查询之字段的计算
  • 十六、MySQL查询之常用函数介绍
  • 十七、MySQL查询语句之聚集函数与GroupBy分组
    • 1.聚集函数的使用
    • 2.数据分组 GROUP BY与HAVING
    • 3.使⽤Group By进⾏分组时的注意点
    • 4.总结SELECT⼦句及其顺序
  • 十八、MySQL数据库数据的导入出
    • 1.数据导出
    • 2.数据导入
  • 十九、MySQL数据库权限管理

一、认识数据库

1.什么是数据库

数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库。专业的数据库是专门]对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方式对象数据进行管理更加的方便,快速,安全。

2.数据库的特点及作用

  • 对数据进行持久化的保存
  • 方便数据的存储和查询,速度快,安全,方便
  • 可以处理并发访问
  • 更加安全的权限管理访问机制

3.常见的数据库

4.工具基本结构介绍


5.认识一些基本常见命令




二、win10系统安装mysql和图形工具

Windows安装MySQL5.7.17

  1. 在MySQL官网 http://dev.mysql.com/downloads/mysql/ 上面下载ZIP安装包(第二个:Windows (x86, 64- bit), ZIP Archive)。

  2. 下载完成后解压,将其放到想要安装的目录下。 例如:D:\MySQL5.7\mysql-5.7.17-winx64

  3. 新建一个my.ini配置文件,原始的my-default.ini配置文件只是个模版,不要在里面改动。 my.ini的内容如下:
    [mysql] default-character-set=utf8
    [mysqld] port = 3306
    basedir=D:\MySQL5.7\mysql-5.7.17-winx64
    datadir=D:\MySQL5.7\mysql-5.7.17- winx64\data
    max_connections=200
    character-set-server=utf8
    default-storage-engine=INNODB
    explicit_defaults_for_timestamp=true

    选择一个编辑器打开,这里我用的是Notepad++,之后将上面的内容复制到my.ini文件中

  4. 在安装路径下新建一个空的data文件夹。

  5. 以管理员身份运行cmd,进入bin目录,执行 mysqld --initialize-insecure --user=mysql 命令。不进行这一 步,安装完成之后无法启动服务。

  6. 依然在管理员cmd窗口的bin目录下,执行 mysqld install 命令安装。完成后会提示安装成功。

  7. 依然在管理员cmd窗口的bin目录下,执行 net start mysql 命令启动MySQL服务。

  8. 修改环境变量,添加"D:\MySQL5.7\mysql-5.7.17-winx64\bin"。



  9. 在普通cmd窗口中,进入bin目录,执行 mysql -u root -p 命令,默认没有密码,回车进入。


三、Mac系统中安装MySQL数据库

1.下载安装mysql

brew install mysql@5.7

如果看到以下界⾯则表示已经下载安装成功

2.启动mysql

mysql.server start

3.关闭mysql

mysql.server stop

4.登录mysql

mysql -u root -p

四、MySQL的基本操作命令

使用方法:

  • 方式一: 通过在命令行敲命令来操作 ( 有助于命令的掌握)
  • 方式二: 通过图型界面工具,如 Navicat 等(在熟练掌握后再使用)
  • 方式三:通过编程语言(python,php,java,go…)执行mysql命令

SQL ( Structure query language ) 结构化查询语言
SQL语言分为4个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)

SQL语句中的快捷键:

  • \G 格式化输出(文本式,竖立显示)
  • \s 查看服务器端信息
  • \c 结束命令输入操作
  • \q 退出当前sql命令行模式
  • \h 查看帮助

1.通过命令行连接MySQL


数据库语法特点:

  1. SQL 语句可以换行, 要以分号结尾

  2. SQL 语句可以换行, 要以分号结尾

  3. 如果提示符为 '> 那么需要输入一个’回车

  4. 命令打错了换行后不能修改, 可以用 \c 取消

2. 数据库操作

  • 查看数据库 show databases;
  • 创建数据库 create database 库名 default charset=utf8;
  • 删除数据库 drop database 库名;
  • 打开数据库 use 库名;

3. 数据表操作

数据库管理系统中, 可以有很多库, 每个数据库中可以包括多张数据表

  • 查看表: show tables;

  • 创建表: create table 表名(字段名1 类型,字段名2 类型)engine=innodb default charset=utf8;

  • 创建表: 如果表不存在,则创建, 如果存在就不执行这条命令
    create table if not exists 表名(字段1 类型,字段2 类型);

  • 删除表: drop table 表名;

  • 表结构: desc 表名;

  • 查看建表语句:show create table users;


    插入内容:

    删除表:

4.数据操作 增删改查

插入

  • insert into 表名(字段1,字段2,字段3) values(值1,值2,值3);
  • insert into 表名(字段1,字段2,字段3) values(a值1,a值2,a值3),(b值1,b值2,b值3);

    查询
  • select * from 表名;
  • select 字段1,字段2,字段3 from 表名;
  • select * from 表名 where 字段=某个值;
    修改
  • update 表名 set 字段=某个值 where 条件;
  • update 表名 set 字段1=值1,字段2=值2 where 条件;
  • update 表名 set 字段=字段+值 where 条件;
    删除
  • delete from 表名 where 字段=某个值;
    退出MySQL
  • exit; 或者 quit;
    查询

    修改

    删除

五、MySQL中的数据类型

1.MySQL的数据类型

  • 数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则
  • 数据类型限制存储在数据列列中的数据。例如,数值数据类型列只能接受数值类型的的数据
  • 在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能。
  • 更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。
  • 数据类型:整型、浮点型、字符串、日期等
  1. 字符串数据类型
    最常用的数据类型是串数据类型。它们存储串,如名字、地址、电 话号码、邮政编码等。
    不管使用何种形式的串数据类型,串值都必须括在引号内
    有两种基本的串类型,分别为定长串和变长串
  • 定长串:char
    接受长度固定的字符串,其长度是在创建表时指定的。
    定长列不允许存储多于指定长度字符的数据。
    指定长度后,就会分配固定的存储空间用于存放数据

char(7) 不管实际插入多少字符,它都会占用7个字符位置

  • 变长串 varchar
    存储可变长度的字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过7 个字符。

注意

既然变长数据类型这样灵活,为什么还要使用定长数据类型?
回答:因为性能,MySQL处理定长列远比处理变长列快得多。

  • Text 变长文本类型存储
  1. 数值类型
    数值数据类型存储数值。MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越 大,所需存储空间越多。
    与字符串不一样,数值不应该括在引号内。

decimal(5, 2) 表示数值总共5位, 小数占2位
tinyint 1字节(8位) 0-255。-128,127
int 4字节。 -21亿,21亿。0-42亿
MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)

有符号或无符号
所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号

  • 有符号数值列可以存储正或负的数值
  • 无符号数值列只能存储正数。
  • 默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字
  1. 日期和时间类型
    MySQL使用专门的数据类型来存储日期和时间值

datetime 8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

  1. 二进制数据类型
    二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等

六、MySQL中的类型约束和运算

1.表的字段约束

  • unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以)
  • 字段类型后面加括号限制宽度
    – char(5). varchar(7) 在字符类型后面加限制 表示 字符串的长度
    – int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
    – int(4) unsigned zerofill只有当给int类型设置有前导零时,设置int的宽度才有意义。
  • not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
  • default 设置默认值
  • primary key 主键不能为空,且唯一.一般和自动递增一起配合使用。
  • auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
  • unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度

2.MySQL的运算符

  • 算术运算符: +、 -、 *、 /、 %
  • 比较运算符: =、 >、 <、 >=、 <=、!=
  • 数据库特有的比较: in、not in、is null、is not null、like、between、and
  • 逻辑运算符: and、or、not
  • like: 支持特殊符号%和_ ;

其中%表示任意数量的任意字符,_表示任意一位字符

3.主键

  1. 表中每一行都应该有可以唯一标识自己的一列,用于记录两条记录不能重复,任意两行都不具有相同的主键值
  2. 应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主 键,以便于以后的数据操纵和管理

要求

  • 记录一旦插入到表中,主键最好不要再修改
  • 不允许NULL
  • 不在主键列中使用可能会更改的值。

(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)

  • 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键 重复,也不用自己预先生成主键
  • 可以使用多个列作为联合主键,但联合主键并不常用。使用多列作为主键时,所有列值的组合必须是唯一的

七、MySQL数据表操作详解

  • 数据库的操作
    –数据库创建
    –数据库删除
  • 数据表的操作
    –数据表的创建
    –数据表的修改 (表结构)
    –数据表的删除

1.数据库的操作

  1. 数据库的创建
# 链接mysql数据库后,进入mysql后可以操作数据
# 1. 创建库
create database if not exists tlxy default charset=utf8;
-- 1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建
-- 2. 创建 tlxy 数据库,并设置字符集为utf8
-- 3. 无特殊情况都要求字符集为utf8或者utf8mb4的字符编码
  1. 查看所有库
# 1. 查看所有库
show databases;
  1. 打开库/进入库/选择库
# use 库名
use tlxy
  1. 删除库
# 删除库,那么库中的所有数据都将在磁盘中删除。
drop database 库名

2.数据表的操作

  1. 创建表

语法格式:
create table 表名(字段名,类型,【字段约束】,……);

实例:

# 以下创建一个 users 的表
create table users(-- 创建ID字段,为正整数,不允许为空 主键,自动递增id int unsigned not null primary key auto_increment,-- 创建 存储 名字的字段,为字符串类型,最大长度 5个字符,不允许为空username varchar(5) not null,-- 创建存储 密码 的字段,固定长度 32位字符, 不允许为空password char(32) not null,-- 创建 年龄 字段,不允许为空,默认值为 20age tinyint not null default 20
)engine=innodb default charset=utf8;# 查看表结构
desc users;#查看建表语句
show create table users;

创建表的基本原则:

  • 表明和字段名 尽可能的符合命名规范,并且最好能够‘见名之意’
  • 表中数据必须有唯一标识,即主键定义。无特殊情况,主键都为数字并自增即可
  • 表中字段所对应的类型设置合理,并限制合理长度
  • 表引擎推荐使用innodb,并无特殊情况都要求为utf8或者utf8mb4的字符编码
  1. 修改表结构

语法格式:alter table 表名 action (更改的选项)

添加字段

# 语法:alter table 表名 add 添加的字段信息
-- 在 users 表中 追加 一个 num 字段
alter table users add num int not null;-- 在指定字段后面追加字段 在 users 表中 age字段后面 添加一个 email 字段
alter table users add email varchar(50) after age;-- 在指定字段后面追加字段,在 users 表中 age字段后面 添加一个 phone
alter table users add phone char(11) not null after age;-- 在表的最前面添加一个字段
alter table users add aa int first;

删除字段

# 删除字段 alter table 表名 drop 被删除的字段名
alter table users drop aa;

修改字段

语法格式: alter table 表名 change|modify 被修改的字段信息
change: 可以修改字段名,
modify: 不能修改字段名。# 修改表中的 num 字段 类型,使用 modify 不修改表名
alter table users modify num tinyint not null default 12;# 修改表中的 num 字段 为 int并且字段名为 nn
alter table users change num mm int;# 注意:一般情况下,无特殊要求,不要轻易修改表结构
  1. 修改表名

语法:alter table 原表名 rename as 新表名

  1. 更改表中的自增的值
# 在常规情况下,auto_increment 默认从1开始继续递增
alter table users auto_increment = 1000;
  1. 修改表引擎
# 推荐在定义表时,表引擎为 innodb。
# 通过查看建表语句获取当前的表引擎
mysql> show create table users\G;
*************************** 1. row ***************************Table: users
Create Table: CREATE TABLE `users` (PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)# 直接查看当前表状态信息
mysql> show table status from tlxy where name = 'users'\G;
*************************** 1. row ***************************Name: usersEngine: InnoDB# 修改表引擎语句
alter table users engine = 'myisam';
  1. 删除表
drop table 表名

八、MySQL数据库中的表引擎

1.服务器处理客户端请求

其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:**客户端进程向服务器进程发送 一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。**那服务器进程对客户 端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们 这里以比较复杂的查询请求为例来画个图展示一下大致的过程:

虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓 存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不 推荐使用查询缓存,并在MySQL 8.0中删除。

2.存储引擎

MySQL 服务器把数据的存储和提取操作都封装到了一个叫 存储引擎 的模块里。我们知道 是由一行一行的记录 组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存 储器上,这都是 存储引擎 负责的事情。为了实现不同的功能, MySQL 提供了各式各样的 存储引擎 ,不同 存储引 擎 管理的表具体的存储结构可能不同,采用的存取算法也可能不同。

存储引擎以前叫做 表处理器 ,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操 作。

为了管理方便,人们把 连接管理 、 查询缓存 、 语法解析 、 查询优化 这些并不涉及真实数据存储的功能划分为 MySQL server 的功能,把真实存取数据的功能划分为 存储引擎 的功能。各种不同的存储引擎向上边的 MySQL server 层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、“读取 索引下一条内容”、"插入记录"等等。

所以在 MySQL server 完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返 回给客户端就好了。

MySQL 支持非常多种存储引擎:

存储引擎 描述
ARCHIVE 用于数据存档(行被插入后不能再修改)
BLACKHOLE 丢弃写操作,读操作会返回空内容
CSV 在存储数据时,以逗号分隔各个数据项
FEDERATED 用来访问远程表
InnoDB 具备外键支持功能的事务存储引擎
MEMORY 置于内存的表
MERGE 用来管理多个MyISAM表构成的表集合
MyISAM 主要的非事务处理存储引擎
NDB MySQL集群专用存储引擎

3.MyISAM和InnoDB表引擎的区别

  1. 事务支持
    MyISAM不支持事务,而InnoDB支持。

事物:访问并更新数据库中数据的执行单元。事物操作中,要么都执行要么都不执行

  1. 存储结构
    MyISAM:每个MyISAM在磁盘上存储成三个文件。
  • .frm文件存储表结构。
  • .MYD文件存储数据。
  • .MYI文件存储索引。
    InnoDB:主要分为两种文件进行存储
  • .frm 存储表结构
  • .ibd 存储数据和索引 (也可能是多个.ibd文件,或者是独立的表空间文件)
  1. 表锁差异
    MyISAM只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如 果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
    InnoDB支持事务和行级锁,是 innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有 效的,非主键的WHERE都会锁全表的。

  2. 表主键
    MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
    InnoDB:如果没有设定主键或者非空唯 一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。 InnoDB的主键范围更大,最大是MyISAM的2倍。

  3. 表的具体行数
    MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
    InnoDB:没有保存表的总行数 (只能遍历),如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后, myisam和innodb处理的方式都一样。

  4. CURD操作
    MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
    InnoDB:如果你的数据执行大量的INSERT或 UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table 时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用 truncate table这个命令。

  5. 外键
    MyISAM:不支持
    InnoDB:支持

  6. 查询效率
    MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
    推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视 图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。
    另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优 势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

  7. MyISAM和InnoDB两者的应用场景
    MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那 么MyISAM是更好的选择。
    InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要 执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用 InnoDB。

九、MySQL中的字符集utf8

1.了解一下字符集和乱码

字符集简介
我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了, 建立这个关系最起码要搞清楚两件事儿:

  1. 你要把哪些字符映射成二进制数据?
    也就是界定清楚字符范围。
  2. 怎么映射?
    将一个字符映射成一个二进制数据的过程也叫做 编码 ,将一个二进制数据映射到一个字符的过程叫做 解 码

人们抽象出一个 字符集 的概念来描述某个字符范围的编码规则

我们看一下一些常用字符集的情况:

  • ASCII 字符集
    共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所 以可以使用1个字节来进行编码,我们看一些字符的编码方式:

‘L’ -> 01001100(十六进制:0x4C,十进制:76)
‘M’ -> 01001101(十六进制:0x4D,十进制:77)

  • ISO 8859-1 字符集
    共收录256个字符,是在 ASCII 字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以 使用1个字节来进行编码。这个字符集也有一个别名 latin1 。
  • GB2312 字符集
    收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个, 其他文字符号682个。同时这种字符集又兼容 ASCII 字符集,所以在编码方式上显得有些奇怪:
    –如果该字符在 ASCII 字符集中,则采用1字节编码。
    –否则采用2字节编码。
    这种表示一个字符需要的字节数可能不同的编码方式称为 变长编码方式 。比方说字符串 ‘爱u’ ,其 中 ‘爱’ 需要用2个字节进行编码,编码后的十六进制表示为 0xCED2 , ‘u’ 需要用1个字节进行编码,编码后 的十六进制表示为 0x75 ,所以拼合起来就是 0xCED275 。

小贴士: 我们怎么区分某个字节代表一个单独的字符还是代表某个字符的一部分呢?别忘了 ASCII 字 符集只收录128个字符,使用0~127就可以表示全部字符,所以如果某个字节是在0~127之内的,就意 味着一个字节代表一个单独的字符,否则就是两个字节代表一个单独的字符。

  • GBK 字符集
    GBK 字符集只是在收录字符范围上对 GB2312 字符集作了扩充,编码方式上兼容 GB2312 。
  • utf8 字符集
    收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容 ASCII 字符集,采用变长编码方式,编 码一个字符需要使用1~4个字节,比方说这样:

‘L’ -> 01001100(十六进制:0x4C)
‘啊’ -> 111001011001010110001010(十六进制:0xE5958A)

小贴士: 其实准确的说,utf8只是Unicode字符集的一种编码方案,Unicode字符集可以采用utf8、 utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个 字符,utf32使用4个字节编码一个字符。更详细的Unicode和其编码方案的知识不是本书的重点,大家 上网查查哈~ MySQL中并不区分字符集和编码方案的概念,所以后边唠叨的时候把utf8、utf16、utf32 都当作一种字符集对待。

对于同一个字符,不同字符集也可能有不同的编码方式。比如对于汉字 ‘我’ 来说, ASCII 字符集中根本没有收录 这个字符, utf8 和 gb2312 字符集对汉字 我 的编码方式如下:

utf8编码:111001101000100010010001 (3个字节,十六进制表示是:0xE68891)
gb2312编码:1100111011010010 (2个字节,十六进制表示是:0xCED2)

2.MySQL中的utf8和utf8mb4

我们上边说 utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示 了。而在 MySQL 中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计 MySQL 的大叔偷偷的定义了两个概念:

  • utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
  • utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

有一点需要大家十分的注意,在 MySQL 中 utf8 是 utf8mb3 的别名,所以之后在 MySQL 中提到 utf8 就意味着使用 1~3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使 用 utf8mb4 。

字符集的查看

MySQL 支持好多好多种字符集,查看当前 MySQL 中支持的字符集可以用下边这个语句:

show charset;

十、MySQL的DML操作数据的增删改

数据的DML操作:添加数据,修改数据,删除数据

1.添加数据

格式: insert into 表名[(字段列表)] values(值列表…);

--标准添加(指定所有字段,给定所有的值)
mysql> insert into stu(id,name,age,sex,classid) values(1,'zhangsan',20,'m','lamp138');
Query OK, 1 row affected (0.13 sec)mysql>
--指定部分字段添加值
mysql> insert into stu(name,classid) value('lisi','lamp138');
Query OK, 1 row affected (0.11 sec)-- 不指定字段添加值
mysql> insert into stu value(null,'wangwu',21,'w','lamp138');
Query OK, 1 row affected (0.22 sec)-- 批量添加值
mysql> insert into stu values-> (null,'zhaoliu',25,'w','lamp94'),-> (null,'uu01',26,'m','lamp94'),-> (null,'uu02',28,'w','lamp92'),-> (null,'qq02',24,'m','lamp92'),-> (null,'uu03',32,'m','lamp138'),-> (null,'qq03',23,'w','lamp94'),-> (null,'aa',19,'m','lamp138');
Query OK, 7 rows affected (0.27 sec)
Records: 7 Duplicates: 0 Warnings: 0

2.修改数据

格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n… where 条件

-- 将id为11的age改为35,sex改为m值
mysql> update stu set age=35,sex='m' where id=11;
Query OK, 1 row affected (0.16 sec)
Rows matched: 1 Changed: 1 Warnings: 0-- 将id值为12和14的数据值sex改为m,classid改为lamp92
mysql> update stu set sex='m',classid='lamp92' where id=12 or id=14 --等价于下面
mysql> update stu set sex='m',classid='lamp92' where id in(12,14);
Query OK, 2 rows affected (0.09 sec)Rows matched: 2 Changed: 2 Warnings: 0

3.删除数据

格式:delete from 表名 [where 条件]

-- 删除stu表中id值为100的数据
mysql> delete from stu where id=100;
Query OK, 0 rows affected (0.00 sec)-- 删除stu表中id值为20到30的数据
mysql> delete from stu where id>=20 and id<=30;
Query OK, 0 rows affected (0.00 sec)-- 删除stu表中id值为20到30的数据(等级于上面写法)
mysql> delete from stu where id between 20 and 30;
Query OK, 0 rows affected (0.00 sec)-- 删除stu表中id值大于200的数据
mysql> delete from stu where id>200;
Query OK, 0 rows affected (0.00 sec)

十一、MySq查询语句-健硕数据select

SQL示例:

-- 创建表
CREATE TABLE `stu` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL,`email` char(50) NOT NULL,`phone` char(11) NOT NULL,`age` tinyint(4) NOT NULL,`sex` char(1) DEFAULT NULL,`class_id` int(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;-- 添加数据
insert into stu values
(null,'张三','zhangsan@qq.com','13701104321',21,'男',1),
(null,'李四','lisi@qq.com','13701104322',22,'男',1),
(null,'王五','wangwu@qq.com','13701104323',20,'⼥',1),
(null,'赵六','zhaoliu@qq.com','13701104324',19,'男',1),
(null,'⽥七','tianqi@qq.com','13701104325',23,'⼥',1),
(null,'王五六','wangwuliu@qq.com','13701104326',23,'⼥',1),
(null,'熊⼤','xiongda@qq.com','13701104327',25,'男',2),
(null,'熊⼆','xionger@qq.com','13701104328',22,'男',2),
(null,'⼀⼀','yiyi@qq.com','13701104329',19,'⼥',2),
(null,'呀呀','yaya@qq.com','13701104320',22,'男',2);-- 查看表数据
select * from stu;

检索数据select

  1. 检索单个列
select name from stu

如果没有明确排序查询结果(下⼀章介绍),则返回的数据的顺序没有特殊意义。
返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数⽬的⾏,就是正常的。

  1. 检索多个列
select id,name,age,sex from stu

在选择多个列时,⼀定要在列名之间加上逗号,但最后⼀个列名后不加。
如果在最后⼀个列名后加了逗号,将出现错误。

  1. 检索所有列
select * from stu

使⽤通配符 ⼀般,除⾮你确实需要表中的每个列,否则最好别使⽤*通配符。
虽然使⽤通配符可能会使你⾃⼰省事,不⽤明确列出所需列,但检索不需要的列通常会降低检索和应⽤程序的性能。
使⽤通配符有⼀个⼤优点。由于不明确指定列名(因为星号检索每个列),所以能检索出名字未知的列。

  1. 检索不同的⾏ DISTINCT
select distinct classid from stu

DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值
DISTINCT关键字应⽤于所有列⽽不仅是前置它的列。
如果给出SELECT DISTINCT vend_id, prod_price,除⾮指定的两个列都不同,否则所有⾏都将被检索出来

  1. 限制结果 LIMIT
select * from stu limit 3,4

LIMIT 3, 4的含义是从⾏3开始的4⾏.(跳过前3⾏,取4⾏)
替代语法 LIMIT 4 OFFSET 3意为从⾏3开始取4⾏,就像LIMIT 3, 4⼀样。

  1. 使⽤完全限定的表名
select name from stu
select stu.name from stu
select stu.name from chuange.stu

十二、MySQL数据查询-OrderBy排序

1.排序数据 ORDER BY

select * from stu order by age

默认查询出的数据,并不是随机排序的,如果没有指定排序,数据⼀般将以它在底层表中出现的顺序显示
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义
通常,ORDER BY⼦句中使⽤的列将是为显示所选择的列。
但是,实际上并不⼀定要这样,⽤⾮检索的列排序数据是完全合法的。

2.按多个列排序

select * from stu order by classid,age

在需要对多列数据进⾏排序时,使⽤逗号分隔列名,并会按照前后顺序依次对⽐排序。
order by 的排序默认升序,可以使⽤DESC设置降序排列。

select * from stu order by classid,age DESC

以上语句就是先对classid进⾏升序排序,然后在结果中对age进⾏降序排序

注意

ORDER BY⼦句的位置 在给出ORDER BY⼦句时,应该保证它位于FROM⼦句之后。
如果使⽤LIMIT,它必须位于ORDER BY之后。使⽤⼦句的次序不对将产⽣错误消息。

十三、MySQL数据查询之Where条件

数据库表⼀般包含⼤量的数据,很少需要检索表中所有⾏。
通常只会根据特定操作或报告的需要提取表数据的⼦集。
只检索所需数据需要指定搜索条件(search criteria),搜索条件也称为过滤条件(filter condition)。 在SELECT语句中,数据根据WHERE⼦句中指定的搜索条件进⾏过滤。

select name from stu where age = 22

在同时使⽤ORDER BY和WHERE⼦句时,应该让ORDER BY位于WHERE之后,否则将会产⽣错误

1.WHERE⼦句操作符

操作符 说明
= 等于
<> != 不等于
< ⼩于
<= ⼩于等于
> ⼤于
>= ⼤于等于
BETWEEN … and… 指定两个值之间
IS NULL 空值

2.组合WHERE⼦句

MySQL允许给出多个WHERE⼦句。
这些⼦句可以两种⽅式使⽤:以AND⼦句的⽅式或OR⼦句的⽅式使⽤。也称为逻辑操作符。

select name from stu where age = 22 and sex = 'm'

AND ⽤在WHERE⼦句中的关键字,⽤来指示检索满⾜所有给定条件的⾏

select name from stu where age = 22 or sex = 'm'

OR ⽤来表示检索匹配任⼀给定条件的⾏

AND与OR

WHERE可包含任意数⽬的AND和OR操作符。允许两者结合以进⾏复杂和⾼级的过滤。
但是,组合AND和OR带来了⼀个有趣的问题。

例如:我需要在数据库中查询出1期或2期的学员,并且要求是⼥⽣

select name from stu where class_id=1 or class_id =2 and sex='m'

以上语句不会按照预期检索出正确的数据,问题出在哪⾥?
原因在于计算的次序。SQL在处理OR操作符前,优先处理AND操作符。
当SQL看到上述WHERE⼦句时,它理解是 1期班级的所有⼥⽣,或者2期的所有学员,⽽不分性别。换句话说,由于AND在计算次序中优先级更⾼,操作符被错误地组合了。

因此想要解决就需要提升优先级,使⽤圆括号明确地分组相应的操作符

select name from stu where (class_id=1 or class_id =2) and sex='m'

因为圆括号具有较AND或OR操作符⾼的计算次序,数据库⾸先过滤圆括号内的OR条件。
这时,SQL语句变成了获取1期或2期的学员并且要求是⼥⽣

IN与NOT

IN操作符⽤来指定条件范围,范围中的每个条件都可以进⾏匹配。

select name from stu where class_id in (1,2)

IN WHERE⼦句中⽤来指定要匹配值的清单的关键字,功能与OR相当

为什么要使⽤IN操作符?其优点具体如下:

  • 在使⽤⻓的合法选项清单时,IN操作符的语法更清楚且更直观。
  • 在使⽤IN时,计算的次序更容易管理(因为使⽤的操作符更少)。
  • IN操作符⼀般⽐OR操作符清单执⾏更快。
  • IN的最⼤优点是可以包含其他SELECT语句,使得能够更动态地建⽴WHERE⼦句。

NOT WHERE⼦句中⽤来否定后跟条件的关键字

select name from stu where class_id not in (1,2)

为什么使⽤NOT?对于简单的WHERE⼦句,使⽤NOT确实没有什么优势。
但在更复杂的⼦句中,NOT是⾮常有⽤的。
例如,在与IN操作符联合使⽤时,NOT使找出与条件列表不匹配的⾏⾮常简单。

十四、MySQL查询语句-Like与通配符

前⾯介绍的所有操作符都是针对已知值进⾏过滤的。
但是,这种过滤⽅法并不是任何时候都好⽤。
例如,怎样搜索姓名中包含⽂本a的所有⽤户?⽤简单的⽐较操作符肯定不⾏,必须使⽤通配符。
为在搜索⼦句中使⽤通配符,必须使⽤LIKE操作符。
LIKE指示MySQL,后跟的搜索模式利⽤通配符匹配⽽不是直接相等匹配进⾏⽐较。

  • 百分号(%)通配符 在搜索串中,%表示任何字符出现任意次数
select name from stu where name like 'a%'
select name from stu where name like '%a'
select name from stu where name like '%a%'
  • 下划线(_)通配符 下划线的⽤途与%⼀样,但下划线只匹配单个字符⽽不是多个字符
  • 使⽤通配符的技巧

正如所⻅,MySQL的通配符很有⽤。
但这种功能是有代价的:通配符搜索的处理⼀般要⽐前⾯讨论的其他搜索所花时间更⻓。
这⾥给出⼀些使⽤通配符要记住的技巧

  1. 不要过度使⽤通配符。如果其他操作符能达到相同的⽬的,应该使⽤其他操作符。
  2. 在确实需要使⽤通配符时,除⾮绝对有必要,否则不要把它们⽤在搜索模式的开始处。
  3. 把通配符置于搜索模式的开始处,搜索起来是最慢的。
  4. 仔细注意通配符的位置。如果放错地⽅,可能不会返回想要的数据
  • 了解下MySQL的正则 REGEXP

所有种类的程序设计语⾔、⽂本编辑器、操作系统等都⽀持正则表达式

select name from stu where name regexp '[0-5]abc'

十五、MysQL查询之字段的计算

存储在数据库表中的数据⼀般不是应⽤程序所需要的格式。下⾯举⼏个例⼦

  • 如果想在⼀个字段中既显示⽤户名,⼜显示班级号,但这两个信息⼀般包含在不同的表列中。
  • 同时姓名、⼿机号和地址存储在不同的列中(应该这样),但快递单打印程序却需要把它们作为⼀个恰当格式的字段检索出来。
  • 列数据是⼤⼩写混合的,但报表程序需要把所有数据按⼤写表示出来。
  • 物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(⽤价格乘以数量即可)。为打印发票,需要物品的总价格。
  • 需要根据表数据进⾏总数、平均数计算或其他计算。

计算字段并不实际存在于数据库表中。计算字段是运⾏时在SELECT语句内创建的

拼接 Concat

stu表包含⽤户名和⼿机号码信息。假如要⽣成⼀个学⽣报表,需要在学⽣的名字中按照name(phone)这样的格式列出。
解决办法是把两个列拼接起来。在MySQL的SELECT语句中,可使⽤Concat()函数来拼接两个列。

select concat(name,'(',phone')') from stu

使⽤别名 AS

SELECT语句拼接字段可以完成。但此新计算列的名字是什么呢?实际上它没有名字,它只是⼀个值。
如果仅在SQL查询⼯具中查看⼀下结果,这样没有什么不好。
但是,⼀个未命名的列不能⽤于客户机应⽤中,因为客户机没有办法引⽤它。
为了解决这个问题,SQL⽀持列别名。别名(alias)是⼀个字段或值的替换名。别名⽤AS关键字赋予。

select concat(name,'(',phone')') from stu as name_phone from stu

计算

在mysql中可以对列中的字段进⾏计算,使⽤基本算术操作符,此外,圆括号可⽤来区分优先顺序。

运算符 说明
+
-
*
/

SELECT提供了测试和试验函数与计算的⼀个很好的办法。
虽然SELECT通常⽤来从表中检索数据,但可以省略FROM⼦句以便简单地访问和处理表达式。
例如,SELECT 3*2;将返回6,SELECT Trim(‘abc’);将返回abc,⽽SELECT Now()利⽤Now()函数返回当前⽇期和时间。
通过这些例⼦,可以明⽩如何根据需要使⽤SELECT进⾏试验。

十六、MySQL查询之常用函数介绍

与其他⼤多数计算机语⾔⼀样,SQL⽀持利⽤函数来处理数据。
函数⼀般是在数据上执⾏的,它给数据的转换和处理提供了⽅便。

⽂本处理函数

函数 说明
Left() 返回串左边的字符
Length() 返回串的⻓度
Locate() 找出串的⼀个⼦串
Lower() 将串转换为⼩写
LTrim() 去掉串左边的空格
Right() 返回串右边的字符
RTrim() 去掉串右边的空格
SubString() 返回⼦串的字符 **
Upper() 将串转换为⼤写
Concat 拼接字符串. **

⽇期和时间处理函数

函数 说明
AddTime() 增加⼀个时间(时、分等)
CurDate() 返回当前⽇期 **
CurTime() 返回当前时间 **
Date() 返回⽇期时间的⽇期部分
DateDi"() 计算两个⽇期之差. **
Date_Add() ⾼度灵活的⽇期运算函数
Date_Format() 返回⼀个格式化的⽇期或时间串
Day() 返回⼀个⽇期的天数部分
DayOfWeek() 对于⼀个⽇期,返回对应的星期⼏
Hour() 返回⼀个时间的⼩时部分
Minute() 返回⼀个时间的分钟部分
Month() 返回⼀个⽇期的⽉份部分
Now() 返回当前⽇期和时间. **
Second() 返回⼀个时间的秒部分
Time() 返回⼀个⽇期时间的时间部分
Year() 返回⼀个⽇期的年份部分

数值处理函数

函 数 说 明
Abs() 返回⼀个数的绝对值
Cos() 返回⼀个⻆度的余弦
Exp() 返回⼀个数的指数值
Mod() 返回除操作的余数
Pi() 返回圆周率
Rand() 返回⼀个随机数. **
Sin() 返回⼀个⻆度的正弦
Sqrt() 返回⼀个数的平⽅根
Tan() 返回⼀个⻆度的正切

十七、MySQL查询语句之聚集函数与GroupBy分组

1.聚集函数的使用

我们经常需要汇总数据⽽不⽤把它们实际检索出来,为此MySQL提供了专⻔的函数。
使⽤这些函数,MySQL查询可⽤于检索数据,以便分析和报表⽣成

  • 确定表中⾏数(或者满⾜某个条件或包含某个特定值的⾏数)。
  • 获得表中⾏组的和。
  • 找出表列(或所有⾏或某些特定的⾏)的最⼤值、最⼩值和平均值。

上述例⼦都需要对表中数据(⽽不是实际数据本身)汇总。
因此,返回实际表数据是对时间和处理资源的⼀种浪费

函数 说明
COUNT() 返回某列的⾏数
MAX() 返回某列的最⼤值
MIN() 返回某列的最⼩值
SUM() 返回某列值之和
AVG() 返回某列的平均值

注意

在使⽤count时,如果指定列名,则指定列的值为空的⾏被忽略,但如果COUNT()函数中⽤的是星号
(*),则不忽略

2.数据分组 GROUP BY与HAVING

GROUP BY

SQL聚集函数可⽤来汇总数据。这使我们能够对⾏进⾏计数,计算和与平均数,获得最⼤和最⼩值,⽽不⽤检索所有数据。
⽬前为⽌的所有计算都是在表的所有数据或匹配特定的WHERE⼦句的数据上进⾏的。

例如我们需要获取某个班级的学员⼈数:

select count(*) as nums from stu where class_id = 2

但如果要返回每个班级的⼈数怎么办?

此时就需要使⽤分组了,分组允许把数据分为多个逻辑组,以便能对每个组进⾏聚集计算。

select class_id,count(*) as nums from stu group by class_id

那么如果需要返回⼈数少于5⼈的班级怎么办?
或返回班级⼈数⼤于5⼈的班级怎么办?

HAVING

除了能⽤GROUP BY分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。
例如,需要获取班级⼈数⼩于等于5⼈的班级。
事实上,⽬前为⽌所学过的所有类型的WHERE⼦句都可以⽤HAVING来替代。
唯⼀的差别是WHERE过滤⾏,⽽HAVING过滤分组。

select class_id,count(*) as nums from stu group by class_id;select class_id,count(*) as nums from stu group by class_id having nums >= 5;

3.使⽤Group By进⾏分组时的注意点

在使⽤group by进⾏分组时,按照标准的SQL模式,需要把select查询中的所有列(除了聚集函数外)全部都列在group by后⾯

mysql> select class_id,count(*) as nums from stu group by class_id;
+----------+------+
| class_id | nums |
+----------+------+
|    1     |  7   |
|    2     |  5   |
+----------+------+
2 rows in set (0.00 sec)
-- 在select⾥⾯有 class_id,class_name, 但是group by 后⾯只有 class_id,那么语法错误。mysql> select class_id,class_name,count(*) as nums from stu group by class_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and
contains nonaggregated column 'chuange.stu.class_name' which is not functionally
dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by-- 正确的语句,应该是,把select中所以列都作为分组条件
mysql> select class_id,class_name,count(*) as nums from stu group by
class_id,class_name;
+----------+------------+------+
| class_id | class_name | nums |
+----------+------------+------+
| 1        | 1班        | 7    |
| 2        | 2班        | 5    |
+----------+------------+------+2 rows in set (0.00 sec)

4.总结SELECT⼦句及其顺序

⼦句 说明 是否必须
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使⽤
WHERE ⾏级过滤
GROUP BY 分组说明 仅在按组计算聚集时使⽤
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的⾏数

十八、MySQL数据库数据的导入出

1.数据导出

  1. 数据库数据导出
# 不要进入mysql,然后输入以下命令 导出某个库中的数据
mysqldump -u root -p tlxy > ~/Desktop/code/tlxy.sql

导出一个库中所有数据,会形成一个建表和添加语句组成的sql文件
之后可以用这个sql文件到别的库,或着本机中创建或回复这些数据

  1. 将数据库中的表导出
# 不要进入mysql,然后输入以下命令 导出某个库中指定的表的数据
mysqldump -u root -p tlxy tts > ~/Desktop/code/tlxy-tts.sql

2.数据导入

把导出的sql文件数据导入到mysql数据库中

# 在新的数据库中 导入备份的数据,导入导出的sql文件
mysql -u root -p ops < ./tlxy.sql# 把导出的表sql 导入数据库
mysql -u root -p ops < ./tlxy-tts.sql

十九、MySQL数据库权限管理

mysql中的root用户是数据库中权限最高的用户,千万不要用在项目中。
可以给不同的用户,或者项目,创建不同的mysql用户,并适当的授权,完成数据库的相关操作。
这样就一定程度上保证了数据库的安全。

创建用户的语法格式:

grant 授权的操作 on 授权的库.授权的表 to 账户@登录地址 identified by ‘密码’;

示例:

# 在mysql中 创建一个 zhangsan 用户,授权可以对tlxy这个库中的所有表 进行 添加和查询 的权限
grant select,insert on tlxy.* to zhangsan@'%' identified by '123456';# 用户 lisi,密码 123456 可以对tlxy库中的所有表有 所有操作权限
grant all on tlxy.* to lisi@'%' identified by '123456';# 删除用户
drop user 'lisi'@'%';

第六章 (数据库)第2节 数据库基础相关推荐

  1. 软考-架构师-第三章-数据库系统 第七节 数据库设计(读书笔记)

    版权声明 主要针对希赛出版的架构师考试教程<系统架构设计师教程(第4版)>,作者"希赛教育软考学院".完成相关的读书笔记以便后期自查,仅供个人学习使用,不得用于任何商业 ...

  2. 物流信息管理系统MySQL设计_案例分析第六章:物流管理系统的数据库设计(六个基本步骤)案例分析...

    物流管理信息系统的数据库设计 (案例分析) 系统名称:物流管理信息系统(数据库管理系统) 一.需求分析 需求分析是整个数据库设计过程的基础,要收集数据库所有用户的信息内容和处理要求,并加以规格化和分析 ...

  3. 第六章 程序数据集散地:数据库

    1.上机练习 1.上机练习1  (新建数据库) 2.选择题 1.C          2.D          3.A          4.B          5.D          6.A  ...

  4. 第一行代码 第六章 数据储存方案 - LitePal数据库存储

    LitePal – 一款开源的Android数据库框架. 它采用对象关系映射的模式(ORM),将开发中常用的数据库功能进行封装,使得不用编写SQL语句就可以完成各种建表和增删改查的操作. 在项目中使用 ...

  5. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法局限性 二:迪杰斯特拉(dijkstra)算法基本思想 三:迪杰斯特拉(dijkstra)算法代码实现 四:迪杰斯特拉(dijkstra)算法代码视频演示 五:迪杰斯特拉(di ...

  6. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)

    文章目录 一:动态规划基本思想 二:弗洛伊德(Floyd)算法基本思想 三:弗洛伊德(Floyd)算法代码实现 四:弗洛伊德(Floyd)算法代码视频演示 五:弗洛伊德(Floyd)算法代码答题规范 ...

  7. (王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法基本思想 二:BFS算法代码 三:反思 最短路径shortestpath):主要有以下两类最短路径问题 单源最短路径问题:一个顶点到其他顶点最短路径 迪杰斯特拉算法(dijks ...

  8. (王道408考研数据结构)第六章图-第四节1:最小生成树之普利姆算法(思想、代码、演示、答题规范)

    文章目录 一:普利姆(Prim)算法算法思想 二:普利姆(Prim)算法注意点 三:普利姆(Prim)算法代码实现 四:普利姆(Prim)算法代码视频演示 五:普利姆(Prim)算法动画演示 六:普利 ...

  9. (王道408考研数据结构)第六章图-第四节7:关键路径(最早发生时间、最迟发生时间)

    文章目录 一:关键路径基本概念 (1)AOE网 (2)AOV网和AOE网的对比 (3)关键路径 二:手动求解关键路径 (1)每个事件(即顶点)的最早发生时间和最迟发生时间 (2)每个活动(即边)的最早 ...

  10. (王道408考研数据结构)第六章图-第四节6:拓扑排序(AOV网、代码、排序规则)

    文章目录 一:拓扑排序基本概念 (1)AOV网 (2)拓扑序列 二:拓扑排序 (1)拓扑排序 (2)拓扑排序规则 三:拓扑排序代码实现 (1)准备工作 (2)代码 (3)代码分析 一:拓扑排序基本概念 ...

最新文章

  1. 看初中生如何高薪就业
  2. 【狼】unity3d point light 个数限制更改
  3. android布局1
  4. Qt文档阅读笔记-Qt工作笔记-QThread解析与实例(主线程发送信号给子线程)
  5. SAP License:药店ERP系统如何实施
  6. Android现学现用第十一天
  7. 大数据在企业中的运用
  8. 【leetcode❤python】Intersection of Two Arrays
  9. android签名打包v1和v2的区别
  10. 华为证书有效期是多久?证书要到期了怎么办?
  11. oracle12c生命周期,Oracle 12c 新特性之: ILM 数据生命周期管理
  12. 【python】OCR
  13. 阿里云服务器的公网ipv6地址申请与配置
  14. 计算机组成原理第二章笔记---计算机进化与性能
  15. 基于verilog的数字频率计数器
  16. 如何解决传统工厂能耗痛点
  17. Google谷歌拼音输入法
  18. 图像跟踪(1) CSK
  19. 【厚积薄发系列】C++项目总结10—C++模板在实际项目常用场景之一
  20. 阿里云服务器ECS的用途有哪些?

热门文章

  1. Win10 桌面图标字体怎么单独换成深色,设置白色壁纸后图标字体看不见
  2. [NOIP2009]靶形数独
  3. 斯坦福NLP名课带学详解 | CS224n 第20讲 - NLP与深度学习的未来(NLP通关指南·完结)
  4. 软件 黑苹果盒盖不休眠_如何设置mac盖上盖子不休眠
  5. js中,转义单双引号
  6. 企业如何选择合适、实用的crm软件?
  7. 接受诺顿诚意表示不是件容易的事
  8. 资源搜索,推荐3个比网盘搜索质量度高的平台和技巧!
  9. Kerberos 简介——教你做个好人
  10. oracle rac v3500_OEL6.X IBM v3500存储多路径配置