MySQL增删改查、函数、事物、索引及设计规范详解

一、MySQL

1、认识MySQL

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,增加了速度,提高了灵活性。

1.1、为什么学习数据库
  1. 岗位需求
  2. 大数据时代,得数据者得天下
  3. 存取数据
  4. 数据库是所有软件体系中最核心的存在
1.2、数据库分类

关系型数据库(SQL)

  • MySQL、Oracle、SQL Server、DB2、SQLlite
  • 通过表和表之间,行和列之间的关系进行数据的存储,表与表之间之间的联系通过键(主键)来完成

非关系型数据库(NoSQL,Not Only)

  • Redis,MongDB
  • 非关系型数据库, 对象存储,通过对象的自身的属性来决定。
1.3、MySQL简介

MySQL是一个关系型数据库管理系统

原来是瑞典MySQL AB 公司的产品,后被Oracle 收购。MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件 之一,是开源的数据库软件, 体积小、速度快、总体拥有成本低,适用于中小型网站、或者大型网站(集群)

官网下载地址:https://dev.mysql.com/downloads/mysql/

1.4、MySQL安装

安装建议:

  1. 尽量不要使用exe文件进行安装,因为会涉及注册表
  2. 尽量使用压缩包进行安装,容易卸载

安装教程

转自@狂神说:https://www.cnblogs.com/hellokuangshen/p/10242958.html

安装步骤

  1. 解压压缩包至电脑安装目录下

  2. 配置环境变量

  3. 新建mysql 配置文件 my.ini

    [mysqld] # 目录要换成自己的 
    basedir=D:\Environment\mysql-5.7.19\ datadir=D:\Environment\mysql-5.7.19\data\ port=3306 
    skip-grant-tables
    
  4. 启动管理员模式下的CMD,运行所有的命令

  5. 安装mysql服务

  6. 初始化数据库文件

  7. 启动mysql,进去修改密码

  8. 进入mysql 通过命令行 (-p后面不要加空格),修改密码 (sql语句后面要加分号)

  9. 注掉 ini 中的跳过密码

  10. 重启mysql,连接测试,如果连接成功就OK了

1.5、连接数据库

使用命令行连接

mysql -uroot -p123456 --连接数据库
update mysql.user set authentication_string=password('******') where user='root' and Host = 'localhost'; -- 修改用户密码
flush privileges;   -- 刷新权限

-- 所有的语句都使用;结尾 
show databases;  -- 查看所有的数据库
mysql> use school  -- 切换数据库 use 数据库名 

show tables; -- 查看数据库中所有的表 
describe student; -- 显示数据库中所有的表的信息
create database westos; -- 创建一个数据库
exit;  --退出连接

-- 单行注释
/* 多行注释 */

使用可视化工具

直接使用鼠标操作

2、操作数据库

操作数据库 —> 操作数据库中的表—> 操作数据库中表的数据

MySQL中关键字不区分大小写

2.1、操作数据库(了解)
  1. 创建数据库

    CREATE DATABASE [IF NOT EXISTS] westos;
  2. 删除数据库

    DROP DATABASE [IF EXISTS] westos1;
  3. 使用数据库

    -- tab 键的上面,如果你的表名或者字段名是一个特殊字符,就需要带 ``
    USE `school`
  4. 查看数据库

    SHOW DATABASES -- 查看所有的数据库
2.2、数据库的列类型

数值

  • tinyint 十分小的数据 1个字节
  • smallint 较小的数据 2个字节
  • mediumint 中等大小的数据 3个字节
  • int 标准的整数 4个字节 (常用)
  • bigint 较大的数据 8个字节
  • float 浮点数 4个字节
  • double 浮点数 8个字节 (有计算精度问题)
  • decimal 字符串形式的浮点数 金融计算的时候,一般是使用decimal

字符串

  • char 字符串固定大小的 0~255
  • varchar 可变字符串 0~65535 (常用)
  • tinytext 微型文本 2^8 - 1
  • text 文本串 2^16 -1 保存大文本

时间日期

java.util.Date包下

  • date YYYY-MM-DD 日期格式
  • time HH:mm:ss 时间格式
  • datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
  • timestamp 时间戳, 1970.1.1 到现在的毫秒数,较为常用
  • year 年份表示

null

  • 没有值,未知,注意不要使用NULL进行运算,结果为NULL
2.3、数据库的字段属性(重点)

Unsigned :

  • 无符号的整数,声明了该列不能声明为负数

zerofill:

  • 0填充的,不足的位数,使用0来填充, int(3) , 5 — 005

自增:

  • 通常理解为自增,自动在上一条记录的基础上 + 1(默认)
  • 通常用来设计唯一的主键 index,必须是整数类型
  • 可以自定义设计主键自增的起始值和步长

非空 NUll not null

  • 假设设置为 not null ,如果不给它赋值,就会报错!
  • NUll ,如果不填写值,默认就是null!

默认:

  • 设置默认的值! sex,默认值 为 男,如果不指定该列的值,则会有默认的值!

拓展

/* 
每一个表,都必须存在以下五个字段!做项目用的,表示一个记录存在意义!

id  主键 
`version`   乐观锁 
is_delete   伪删除 
gmt_create  创建时间 
gmt_update  修改时间
*/

2.4、创建数据库表

-- 目标 : 创建一个school数据库 
-- 创建学生表(列,字段)  使用SQL 创建 
-- 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住 址,email

-- 注意点,使用英文 () , 表的名称 和 字段 尽量使用  `` 括起来 
-- AUTO_INCREMENT 自增 
-- 字符串使用单引号括起来! 
-- 所有的语句使用都好隔开
-- PRIMARY KEY 主键,一般一个表只有一个唯一的主键! 
CREATE TABLE IF NOT EXISTS `student` (   
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',   
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',   
    `pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密码', 
    `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',   
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',   
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',   
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',   
    PRIMARY KEY(`id`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 格式
CREATE TABLE [IF NOT EXISTS] `表名`(
    '字段名' 列类型 [属性] [索引] [注释],   
    '字段名' 列类型 [属性] [索引] [注释],    
    ......   
    '字段名' 列类型 [属性] [索引] [注释] 
)[表类型][字符集设置][注释]

常用命令

SHOW CREATE DATABASE school -- 查看创建数据库的语句 
SHOW CREATE TABLE student -- 查看student数据表的定义语句 
DESC student -- 显示表的结构
2.5、数据表的类型

搜索引擎

  • INNODB 默认使用
  • MYISAM 早些年使用的
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间的大小较小较大,约为前者的两倍

两者之间的选择

  • MYISAM 节约空间,速度较快
  • INNODB 安全性高,事务的处理,多表多用户操作

在物理空间的存储

  • 所有的数据库文件都存在 data 目录下,一个文件夹就对应一个数据库 本质还是文件的存储

MySQL引擎在物理文件上的区别

  • InnoDB 在数据库表中只有一个 *.frm 文件, 以及上级目录下的 ibdata1 文件
  • MYISAM 对应文件
    • *.frm 表结构的定义文件
    • *.MYD 数据文件 (data)
    • *.MYI 索引文件(index

设置数据库表的字符集编码

CHARSET=utf8

MySQL默认的编码是Latin1,不支持中文,也可以在my.ini文件中配置

character-set-server=utf8

2.6、修改删除表

修改

-- 修改表名 : ALTER TABLE 旧表名 RENAME AS 新表名 
ALTER TABLE teacher RENAME AS teacher1 
-- 增加表的字段 :  ALTER TABLE 表名 ADD 字段名 列属性 
ALTER TABLE teacher1 ADD age INT(11)

-- 修改表的字段 (重命名,修改约束!) 
-- ALTER TABLE 表名 MODIFY 字段名 列属性[] 
ALTER TABLE teacher1 MODIFY age VARCHAR(11)  -- 修改约束 
-- ALTER TABLE 表名 CHANGE 旧名字  新名字  列属性[] 
ALTER TABLE teacher1 CHANGE age age1 INT(1)  -- 字段重命名

-- 删除表的字段: ALTER TABLE 表名 DROP 字段名 
ALTER TABLE teacher1 DROP age1

删除

-- 删除表(如果表存在再删除) 
DROP TABLE IF EXISTS teacher1

所有的创建与删除操作都加上判断语句,以免出错

3、MySQL数据管理

3.1、外键(了解)

方式一

在创建表的时候,增加约束,比较麻烦、复杂

CREATE TABLE `grade`(  
    `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id', 
    `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称', 
    PRIMARY KEY (`gradeid`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 学生表的 gradeid 字段 要去引用年级表的 gradeid 
-- 定义外键key 
-- 给这个外键添加约束 (执行引用)  references 引用

CREATE TABLE IF NOT EXISTS `student` (   
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',   
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',   
    `pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密码', 
    `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',   
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',   
    `gradeid` INT(10) NOT NULL COMMENT '学生的年级',   
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',   
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',   
    PRIMARY KEY(`id`),   
    KEY `FK_gradeid` (`gradeid`),   
    CONSTRAINT `FK_gradeid`
    FOREIGN KEY (`gradeid`) 
    REFERENCES `grade`(`gradeid`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

删除有外键关系的表的时候,必须要先删除引用别人的表 ,再删除被引用的表

方式二

创建表成功后,添加外键约束

CREATE TABLE `grade`(  
    `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id', 
    `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',  
    PRIMARY KEY (`gradeid`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 学生表的 gradeid 字段 要去引用年级表的 gradeid 
-- 定义外键key 
-- 给这个外键添加约束 (执行引用)  references 引用 
CREATE TABLE IF NOT EXISTS `student` (   
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',   
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',   
    `pwd` VARCHAR(20)NOT NULL DEFAULT '123456' COMMENT '密码', 
    `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',   
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `gradeid` INT(10) NOT NULL COMMENT '学生的年级',   
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',   
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',   
    PRIMARY KEY(`id`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建表的时候没有外键关系 
ALTER TABLE `student` 
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
-- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 那个表(哪个字段)

以上的操作都是物理外键,数据库级别的外键,不建议使用,避免数据库过多造成困扰

3.2、DML语言(全部记住)

数据库意义:数据存储,数据管理

DML 语言: 数据操作语言

  • Insert 插入
  • update 更新
  • delete 删除
3.3、插入

insert

语法:insert into 表名([字段名1,字段2,字段3])values(‘值1’),(‘值2’),(‘值3’,…)

-- 插入语句(添加) 
-- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3',....) 
INSERT INTO `grade`(`gradename`) VALUES('大四')

-- 由于主键自增我们可以省略 (如果不写表的字段,他就会一一匹配) 
INSERT INTO `grade` VALUES('大三')

-- 一般写插入语句,一定要数据和字段一一对应
-- 插入多个字段 
INSERT INTO `grade`(`gradename`) 
VALUES('大二'),('大一');

INSERT INTO `student`(`name`) VALUES ('张三');
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('张三','aaaaaa','男');
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('李四','aaaaaa','男'),('王五','aaaaaa','男');

注意

  1. 字段与字段之间使用逗号隔开
  2. 字段可以省略,但是值的顺序一定要与字段的顺序一一对应
3.4、修改

update

语法: UPDATE 表名 set colnum_name = value,[colnum_name = value,…] where [条件]

-- 修改学员名字,带了简介 
UPDATE `student` SET `name`='张三' WHERE id = 1;

-- 不指定条件的情况下,会改动所有表中数据 
UPDATE `student` SET `name`='长江7号';

-- 修改多个属性,逗号隔开 
UPDATE `student` SET `name`='张三',`email`='1234567890@qq.com' WHERE id = 1;

-- 语法: 
-- UPDATE 表名 set colnum_name = value,[colnum_name = value,....] where [条 件]

条件:where子句,布尔值或一个结果为布尔值的表达式

操作符含义范围结果
=等于5=6false
<>或!=不等于5<>6true
>
<
>=
<=
between…and…在某个范围内5 between 2 and 7true
and5>1 and 1>2false
or5>1 or 1>2true

多个条件

-- 通过多个条件定位数据
UPDATE `student` SET `name`='长江7号' WHERE `name`='张三' AND sex='男'

注意:

  • colnum_name 是数据库的列,尽量带上``
  • 筛选的条件,如果没有指定,则会修改所有的列
  • value是一个具体的值,也可以是一个变量
  • 多个设置的属性之间,使用英文逗号隔开
3.5、删除

delete

语法:delete from 表名 [where 条件]

-- 删除数据 (避免这样写,会全部删除) 
DELETE FROM `student`
-- 删除指定数据 
DELETE FROM `student`WHERE id = 1;

truncate

完全清空一个数据库表,表的结构与索引约束不会变

--清空 student 表 
TRUNCATE `student`

delete与truncate区别

  • 相同点:都能删除数据,都不会删除表结构
  • 不同:
    • TRUNCATE 重新设置 自增列 计数器会归零
    • TRUNCATE 不会影响事务
-- 测试delete 和 TRUNCATE 区别 
CREATE TABLE `test`( 
    `id` INT(4) NOT NULL AUTO_INCREMENT,  
    `coll` VARCHAR(20) NOT NULL,  
    PRIMARY KEY (`id`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `test`(`coll`) VALUES('1'),('2'),('3')

DELETE FROM `test` -- 不会影响自增

TRUNCATE TABLE `test` -- 自增会归零

了解即可: DELETE删除的问题 ,重启数据库,现象

  • InnoDB 自增列会重1开始 (存在内存当中的,断电即失)
  • MyISAM 继续从上一个自增量开始 (存在文件中的,不会丢失

4、DQL查询数据(最重点)

4.1、DQL

(Data Query LANGUAGE : 数据查询语言)

  • 所有的查询操作都用 Select
  • 简单、复杂的查询都能做
  • 数据库中最核心的语言,使用频率最高的语句

select 语法

select [ALL | distinct]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
from table_name [as table_alias]
	[left | right | inner join table_name2]--联合查询
	[where ....] --指定条件的查询
	[group by ...]--指定查询结果按照那几个字段分类
	[having]--过滤分组的记录必须满足的次要条件
	[group by ...]--指定查询记录按一个或多个条件排序
	[limit {[offset,]row_Count | row_countOFFSET offset}];--指定查询的记录从哪条到哪条
	--[]中是可选项,{}中是必选项
4.2、指定查询字段

语法:SELECT 字段,… FROM 表

-- 查询全部的学生   SELECT 字段 FROM 表 
SELECT * FROM student

-- 查询指定字段 
SELECT `StudentNo`,`StudentName` FROM student

-- 别名,给结果起一个名字  AS  可以给字段起别名,也可以给表起别名 
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS s

-- 函数  Concat(a,b) 
SELECT CONCAT('姓名:',StudentName) AS 新名字 FROM student--将'姓名:'与具体学生姓名拼接起来

distinct去重

去除SELECT 查询出来的结果中重复的数据,重复的数据只显示一条

-- 查询一下有哪些同学参加了考试,成绩 
SELECT * FROM result  -- 查询全部的考试成绩 
SELECT `StudentNo` FROM result -- 查询有哪些同学参加了考试 
SELECT DISTINCT `StudentNo` FROM result -- 发现重复数据,去重

数据库的列

语法:select 表达式 from 表

数据库中的表达式: 文本值,列,Null,函数,计算表达式,系统变量….

SELECT VERSION()  -- 查询系统版本 (函数) 
SELECT 100*3-1 AS 计算结果  -- 用来计算  (表达式) 
SELECT @@auto_increment_increment -- 查询自增的步长  (变量)

-- 学员考试成绩 + 1分查看 
SELECT `StudentNo`,`StudentResult`+1 AS '提分后' FROM result
4.3、where条件子句

检索数据中符合条件的值,搜索的条件可以由一个或多个的表达式组成,结果为布尔值

逻辑运算符

运算符语法描述
and 或 &&a and b 或 a&&b逻辑与,两个都为真,结果为真
or 或||a or b 或 a||b逻辑或,其中一个为真,则结果为真
Not 或!not a 或 !a逻辑非, 真为假,假为真!

尽量使用英文字母

SELECT studentNo,`StudentResult` FROM result

-- 查询考试成绩在 95~100 分之间 
SELECT studentNo,`StudentResult` FROM result WHERE StudentResult>=95 AND StudentResult<=100

-- and   && 
SELECT studentNo,`StudentResult` FROM result WHERE StudentResult>=95 && StudentResult<=100

-- 模糊查询(区间) 
SELECT studentNo,`StudentResult` FROM result WHERE StudentResult BETWEEN 95 AND 100

-- 除了1000号学生之外的同学的成绩 
SELECT studentNo,`StudentResult` FROM result WHERE studentNo!=1000;

-- !=   not 
SELECT studentNo,`StudentResult` FROM result WHERE NOT studentNo = 1000

模糊查询,比较运算符

运算符语法描述
IS NULLa is null如果操作符为 NUll, 结果为真
IS NOT NULLa is not null如果操作符不为 null,结果为真
BETWEENa between b and c若a 在 b 和c 之间,则结果为真
Likea like bSQL 匹配,如果a匹配b,则结果为真
Ina in (a1,a2,a3….)假设a在a1,或者a2…. 其中的某一个值中,结果为真
-- 查询姓刘的同学 
-- like结合  %(代表0到任意个字符)   _(一个字符) 
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE StudentName LIKE '刘%'

-- 查询姓刘的同学,名字后面只有一个字的 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentName LIKE '刘_'

-- 查询姓刘的同学,名字后面只有两个字的 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentName LIKE '刘__'

-- 查询名字中间有嘉字的同学 %嘉% 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentName LIKE '%嘉%'

-- ====== in (具体的一个或者多个值) ===== 
-- 查询 1001,1002,1003号学员 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE StudentNo IN (1001,1002,1003);

-- 查询在'安徽','河南洛阳'的学生 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `Address` IN ('安徽','河南洛阳');

-- ==== null  not null====
-- 查询地址为空的学生 null  '' 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE address=''  OR address IS NULL

-- 查询有出生日期的同学   不为空 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `BornDate` IS NOT NULL

-- 查询没有出生日期的同学   为空 
SELECT `StudentNo`,`StudentName` FROM `student` WHERE `BornDate` IS NULL

4.4、联表查询

join对比

在这里插入图片描述

-- ============== 联表查询 join ==============
-- 查询参加了考试的同学(学号,姓名,科目编号,分数) 
SELECT * FROM student 
SELECT * FROM result

/* 思路
1. 分析需求,分析查询的字段来自哪些表,(连接查询) 
2. 确定使用哪种连接查询? 7种 
确定交叉点(这两个表中哪个数据是相同的) 
判断的条件 : 学生表的中 studentNo = 成绩表 studentNo 
*/

SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student AS s 
INNER JOIN result AS r 
ON s.studentNO = r.studentNO

-- Right Join 
SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student s 
RIGHT JOIN result r 
ON s.studentNO = r.studentNO

-- Left Join 
SELECT s.studentNO,studentName,SubjectNo,StudentResult
FROM student s 
LEFT JOIN result r 
ON s.studentNO = r.studentNO
操作描述
Inner join如果表中至少有一个匹配,就返回行
left join会从左表中返回所有的值,即使右表中没有匹配
right join会从右表中返回所有的值,即使左表中没有匹配
-- ============== 联表查询 join ==============

-- join (连接的表) on(判断的条件) 连接查询
-- where    等值查询

SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student AS s 
INNER JOIN result AS r 
WHERE s.studentNO = r.studentNO

-- Right Join 
SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student s 
RIGHT JOIN result r 
ON s.studentNO = r.studentNO

-- Left Join 
SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student s 
LEFT JOIN result r 
ON s.studentNO = r.studentNO

-- 查询缺考的同学 
SELECT s.studentNO,studentName,SubjectNo,StudentResult 
FROM student s 
LEFT JOIN result r 
ON s.studentNO = r.studentNO 
WHERE StudentResult IS NULL

-- 思考题(查询了参加考试的同学信息: 学号,学生姓名,科目名,分数) 
/* 思路
1. 分析需求,分析查询的字段来自哪些表, student、result、subject(连接查询) 
2. 确定使用哪种连接查询? 7种 
确定交叉点(这两个表中哪个数据是相同的) 
判断的条件 : 学生表的中 studentNo = 成绩表 studentNo 
*/
SELECT s.studentNo,studentName,SubjectName,`StudentResult` 
FROM student s 
RIGHT JOIN result r 
ON r.studentNo = s.studentNo 
INNER JOIN `subject` sub 
ON r.SubjectNo = sub.SubjectNo

-- 我要查询哪些数据 select ... 
-- 从那几个表中查 FROM 表  XXX Join 连接的表  on  交叉条件 
-- 假设存在一种多张表查询,慢慢来,先查询两张表然后再慢慢增加
-- From  a  left join b -- From  a  right join b

自连接(了解)

自己和自己连接,核心:一张表拆为两张一样的表即可

CREATE TABLE `category` ( 
    `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id', 
    `pid` INT(10) NOT NULL COMMENT '父id', 
    `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字', 
    PRIMARY KEY (`categoryid`) 
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) 
VALUES('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'), 
('5','1','美术设计'),
('6','3','web开发'), 
('7','5','ps技术'), 

('8','2','办公信息');
-- 查询父子信息: 把一张表看为两个一模一样的表 
SELECT a.`categoryName` AS '父栏目',b.`categoryName` AS '子栏目' 
FROM `category` AS a,`category` AS b
WHERE a.`categoryid` = b.`pid`

-- 查询学员所属的年级 (学号,学生的姓名,年级名称) 
SELECT studentNo,studentName,`GradeName` 
FROM student s 
INNER JOIN `grade` g 
ON s.`GradeID` = g.`GradeID`

-- 查询科目所属的年级 (科目名称,年级名称) 
SELECT `SubjectName`,`GradeName` 
FROM `subject` sub 
INNER JOIN `grade` g 
ON sub.`GradeID` = g.`GradeID`

-- 查询了参加 数据库结构-1 考试的同学信息: 学号,学生姓名,科目名,分数 
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` 
FROM student s 
INNER JOIN `result` r 
ON s.StudentNo = r.StudentNo 
INNER JOIN `subject` sub 
ON r.`SubjectNo` = sub.`SubjectNo` 
WHERE subjectName = '数据库结构-1'

4.5、分页与排序

排序

-- 排序 : 升序 ASC , 降序DESC 
-- ORDER BY 通过那个字段排序,怎么排
-- 查询的结果根据 成绩降序 排序 
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` 
FROM student s INNER 
JOIN `result` r 
ON s.StudentNo = r.StudentNo 
INNER JOIN `subject` sub 
ON r.`SubjectNo` = sub.`SubjectNo` 
WHERE subjectName = '数据库结构-1' 
ORDER BY StudentResult ASC

分页

语法: limit 起始值,页面的大小

-- 为什么要分页? 
-- 缓解数据库压力,给人的体验更好, 瀑布流
-- 分页,每页只显示五条数据
-- 语法: limit 起始值,页面的大小   
-- 网页应用 : 当前,总的页数,页面的大小 
-- LIMIT 0,5    1~5 
-- LIMIT 1,5    2~6 
-- Limit 6,5     
SELECT s.`StudentNo`,`StudentName`,`SubjectName`,`StudentResult` 
FROM student s 
INNER JOIN `result` r 
ON s.StudentNo = r.StudentNo 
INNER JOIN `subject` sub 
ON r.`SubjectNo` = sub.`SubjectNo` 
WHERE subjectName = '数据库结构-1' 
ORDER BY StudentResult ASC 
LIMIT 5,5

-- 第一页  limit 0,5      (1-1)*5 
-- 第二页  limit 5,5       (2-1)*5 
-- 第三页  limit 10,5      (3-1)*5 
-- 第N页   limit 0,5       (n-1)* pageSize,pageSize 
-- 【pageSize:页面大小】 
-- 【(n-1)* pageSize:起始值】 
-- 【n :当前页 】
-- 【数据总数/页面大小 = 总页数】

4.6、子查询

本质:在where语句中嵌套一个子查询语句

-- ================ where =================

-- 1、查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),降序排列
-- 方式一: 使用连接查询 
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult` 
FROM `result` r 
INNER JOIN `subject` sub 
ON r.SubjectNo = sub.SubjectNo 
WHERE SubjectName = '数据库结构-1' 
ORDER BY StudentResult DESC

-- 方式二: 使用子查询(由里及外)
-- 查询所有数据库结构-1 的学生学号 
SELECT `StudentNo`,`SubjectNo`,`StudentResult` 
FROM `result` 
WHERE SubjectNo = (      
    SELECT SubjectNo FROM `subject`       
    WHERE SubjectName = '数据库结构-1' 
)
ORDER BY StudentResult DESC

-- 查询课程为 高等数学-2 且分数不小于 80 的同学的学号和姓名
SELECT s.StudentNo,StudentName 
FROM student s 
INNER JOIN result r 
ON s.StudentNo = r.StudentNo 
INNER JOIN `subject` sub 
ON r.`SubjectNo` = sub.`SubjectNo` 
WHERE `SubjectName` = '高等数学-2' AND StudentResult>=80

-- 分数不小于80分的学生的学号和姓名 
SELECT DISTINCT s.`StudentNo`,`StudentName`
FROM student s 
INNER JOIN result r 
ON r.StudentNo = s.StudentNo 
WHERE `StudentResult`>=80

-- 在这个基础上增加一个科目, 高等数学-2 
-- 查询 高等数学-2 的编号 
SELECT DISTINCT s.`StudentNo`,`StudentName` 
FROM student s 
INNER JOIN result r
ON r.StudentNo = s.StudentNo 
WHERE `StudentResult`>=80 AND `SubjectNo` = (  
    SELECT SubjectNo FROM `subject`   
    WHERE `SubjectName` = '高等数学-2'
)

-- 在改造 (由里及外) 
SELECT StudentNo,StudentName FROM student WHERE StudentNo IN ( 
    SELECT StudentNo FROM result WHERE StudentResult>80 AND SubjectNo = (  
        SELECT SubjectNo FROM `subject` WHERE `SubjectName` = '高等数学-2' 
    ) 
)
4.7、分组和过滤
-- 查询不同课程的平均分,高分,低分,平均分大于80 
-- 核心: (根据不同的课程分组) 
SELECT SubjectName, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分 
FROM result r 
INNER JOIN `subject` sub 
ON r.`SubjectNo` = sub.`SubjectNo` 
GROUP BY r.SubjectNo -- 通过什么字段来分组 
HAVING 平均分>80

4.8、select小结

select [ALL | distinct]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
from table_name [as table_alias]
	[left | right | inner join table_name2]--联合查询
	[where ....] --指定条件的查询
	[group by ...]--指定查询结果按照那几个字段分类
	[having]--过滤分组的记录必须满足的次要条件
	[group by ...]--指定查询记录按一个或多个条件排序
	[limit {[offset,]row_Count | row_countOFFSET offset}];--指定查询的记录从哪条到哪条
	--[]中是可选项,{}中是必选项

5、MySQL函数

官网:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html

5.1、常用函数

-- ==================== 常用函数 =============================

-- 数学运算 
SELECT ABS(-8)  -- 绝对值 
SELECT CEILING(9.4) -- 向上取整 
SELECT FLOOR(9.4)  -- 向下取整 
SELECT RAND() -- 返回一个 0~1 之间的随机数 
SELECT SIGN(10)   -- 判断一个数的符号   0-0   负数返回-1,正数返回 1

-- 字符串函数 
SELECT CHAR_LENGTH('即使再小的帆也能远航') -- 字符串长度 
SELECT CONCAT('你','好','世界') -- 拼接字符串 
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱') -- 查询,从某个位置开始替换某个长度 
SELECT LOWER('ZhangSan') -- 小写字母 
SELECT UPPER('ZhangSan') -- 大写字母 
SELECT INSTR('ZhangSan','h') -- 返回第一次出现的子串的索引 
SELECT REPLACE('坚持就能成功','坚持','努力') -- 替换出现的指定字符串 
SELECT SUBSTR('坚持就能成功',4,6) -- 返回指定的子字符串 (源字符串,截取的位置,截 取的长度) 
SELECT REVERSE('清晨我上马') -- 反转

-- 查询姓 周的同学,名字 邹 
SELECT REPLACE(studentname,'周','邹') FROM student WHERE studentname LIKE '周%'

-- 时间和日期函数 (记住) 
SELECT CURRENT_DATE() -- 获取当前日期 
SELECT CURDATE() -- 获取当前日期 
SELECT NOW() -- 获取当前的时间 
SELECT LOCALTIME() -- 本地时间 
SELECT SYSDATE() -- 系统时间

SELECT YEAR(NOW()) 
SELECT MONTH(NOW()) 
SELECT DAY(NOW()) 
SELECT HOUR(NOW()) 
SELECT MINUTE(NOW()) 
SELECT SECOND(NOW())

-- 系统 
SELECT SYSTEM_USER() 
SELECT USER() 
SELECT VERSION()
5.2、聚合函数
函数名称描述
count()计数
sum()求和
avg()平均数
max()最大值
min()最小值
-- =========== 聚合函数 =============== 
-- 都能够统计 表中的数据 ( 想查询一个表中有多少个记录,就使用这个count() )
SELECT COUNT(`BornDate`) FROM student; -- Count(字段),会忽略所有的 null 值 
SELECT COUNT(*) FROM student;  -- Count(*),不会忽略 null 值, 本质 计算行数 
SELECT COUNT(1) FROM result;   -- Count(1),不会忽略忽略所有的 null 值 本质 计算 行数

SELECT SUM(`StudentResult`) AS 总和 FROM result 
SELECT AVG(`StudentResult`) AS 平均分 FROM result 
SELECT MAX(`StudentResult`) AS 最高分 FROM result 
SELECT MIN(`StudentResult`) AS 最低分 FROM result
5.3、MD5加密(扩展)

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。简单来说就是用来对数据进行加密的算法

-- =========测试MD5 加密=======

CREATE TABLE `testmd5`(  
    `id` INT(4) NOT NULL, 
    `name` VARCHAR(20) NOT NULL,   
    `pwd` VARCHAR(50) NOT NULL,  
    PRIMARY KEY(`id`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 明文密码 
INSERT INTO testmd5 VALUES(1,'zhangsan','123456'),(2,'lisi','123456'), 
(3,'wangwu','123456')

-- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1

UPDATE testmd5 SET pwd=MD5(pwd)  -- 加密全部的密码

-- 插入的时候加密 
INSERT INTO testmd5 VALUES(4,'xiaoming',MD5('123456'))

-- 如何校验:将用户传递进来的密码,进行md5加密,然后比对加密后的值 
SELECT * FROM testmd5 WHERE `name`='xiaoming' AND pwd=MD5('123456')

6、事务

一组事物(SQL语句)要么都成功,要么都失败。例如银行转账

事务原则:原子性、一致性、隔离性、持久性

  1. 原子性:要么都成功,要么都失败
  2. 一致性:事务前后的数据完整性一致
  3. 持久性:一旦提交就会初九滑倒数据库中
  4. 隔离性:多个并发事务之间相互隔离,互不影响

隔离所导致的问题

  1. 脏读:指一个事务读取了另一个事务未提交的数据
  2. 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
  3. 虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

执行事务

-- ==================== 事务 =========================

-- mysql 是默认开启事务自动提交的 
SET autocommit = 0 /* 关闭 */ 
SET autocommit = 1 /* 开启(默认的) */

-- 手动处理事务 
SET autocommit = 0 -- 关闭自动提交

-- 事务开启 
START TRANSACTION  -- 标记一个事务的开始,从这个之后的 sql 都在同一个事务内

INSERT xx 
INSERT xx

-- 提交: 持久化 (成功!) 
COMMIT 
-- 回滚: 回到的原来的样子 (失败!) 
ROLLBACK

-- 事务结束 
SET autocommit = 1 -- 开启自动提交

-- 了解 
SAVEPOINT 保存点名 -- 设置一个事务的保存点 
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点 
RELEASE SAVEPOINT 保存点名 -- 撤销保存点

模拟场景

-- 转账 
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci 
USE shop

CREATE TABLE `account`(  
    `id` INT(3) NOT NULL AUTO_INCREMENT,  
    `name` VARCHAR(30) NOT NULL,  
    `money` DECIMAL(9,2) NOT NULL, 
    PRIMARY KEY (`id`) 
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account(`name`,`money`) 
VALUES ('A',2000.00),('B',10000.00)

-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务 (一组事务)

UPDATE account SET money=money-500 WHERE `name` = 'A' -- A减500 
UPDATE account SET money=money+500 WHERE `name` = 'B' -- A加500

COMMIT; -- 提交事务,就被持久化了! 
ROLLBACK;  -- 回滚

SET autocommit = 1; -- 恢复默认值

7、索引

是帮助MySQL高效获取数据的数据结构,可以有效的提高数据读取效率,提取句子主干,就可以得到

7.1、索引分类

在一个表中,主键索引只有一个,唯一索引可以有多个

  • 主键索引 (PRIMARY KEY )
    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引 (UNIQUE KEY)
    • 避免重复的列出现,唯一索引可以重复,多个列都可以标识位 唯一索引
  • 常规索引 (KEY/INDEX)
    • 默认的, index。key 关键字来设置
  • 全文索引 (FullText)
    • 在特定的数据库引擎下才有,MyISAM 快速定位数据

基础语法

-- 索引的使用 
-- 1、在创建表的时候给字段增加索引 
-- 2、创建完毕后,增加索引

-- 显示所有的索引信息 
SHOW INDEX FROM student

-- 增加一个全文索引 (索引名)  列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);

-- EXPLAIN 分析sql执行的状况 
EXPLAIN SELECT * FROM student; -- 非全文索引

EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('刘');

7.2、测试索引

CREATE TABLE `app_user` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称',  
    `email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',  
    `phone` VARCHAR(20) DEFAULT '' COMMENT '手机号', 
    `gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男;1:女)',  
    `password` VARCHAR(100) NOT NULL COMMENT '密码', 
    `age` TINYINT(4) DEFAULT '0' COMMENT '年龄', 
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,  
    `update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'

-- 插入100万数据  55.176 sec
DELIMITER $$  -- 写函数之前必须要写,标志 
CREATE FUNCTION mock_data() 
RETURNS INT 
BEGIN  
	DECLARE num INT DEFAULT 1000000; 
    DECLARE i INT DEFAULT 0;   
    WHILE i<num DO     
    	INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES(CONCAT('用 户',i),'24736743@qq.com',CONCAT('18',FLOOR(RAND()*((999999999100000000)+100000000))),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));     
    	SET i = i+1;  
      END WHILE;   
      RETURN i; 
END;
SELECT mock_data();


SELECT * FROM app_user WHERE `name` = '用户9999'; --  0.993 sec
SELECT * FROM app_user WHERE `name` = '用户9999'; --  1.098 sec
SELECT * FROM app_user WHERE `name` = '用户9999'; --  0.788 sec

EXPLAIN SELECT * FROM app_user WHERE `name` = '用户9999';

SELECT * FROM student

-- id _ 表名 _ 字段名 
-- CREATE INDEX 索引名 on 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`);

SELECT * FROM app_user WHERE `name` = '用户9999'; -- 0.001 sec 
SELECT * FROM app_user WHERE `name` = '用户9999'; 
EXPLAIN SELECT * FROM app_user WHERE `name` = '用户9999';

索引在数据量大的时候效果十分明显

7.3、索引原则

  • 索引不是越多越好
  • 不要对进程变动数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

索引的数据结构

Hash 类型的索引
Btree : InnoDB 的默认数据结构~

阅读:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

8、权限管理与备份

8.1、用户管理

使用SQL语句

用户表:mysql.user

本质就是对这张表中的数据进行增删改查

-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码'
CREATE USER admin IDENTIFIED BY '123456'

-- 修改密码 (修改当前用户密码) 
SET PASSWORD = PASSWORD('123456')

-- 修改密码 (修改指定用户密码) 
SET PASSWORD FOR kuangshen = PASSWORD('123456')

-- 重命名 RENAME USER 原来名字 TO 新的名字 
RENAME USER admin TO admin2

-- 用户授权 ALL PRIVILEGES 全部的权限 , 库.表 
-- ALL PRIVILEGES 除了给别人授权,其他都能够干   
GRANT ALL PRIVILEGES ON *.* TO admin2

-- 查询权限 
SHOW GRANTS FOR admin2   -- 查看指定用户的权限 
SHOW GRANTS FOR root@localhost  

-- ROOT用户权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION

-- 撤销权限 REVOKE 哪些权限, 在哪个库撤销,给谁撤销 
REVOKE  ALL PRIVILEGES ON *.* FROM admin2

-- 删除用户 
DROP USER admin2
8.2、MySQL备份

备份的作用

  • 保证数据不丢失
  • 便于数据转移

备份的方式

  • 拷贝物理文件
  • 使用SQL语句导出
# mysqldump -h 主机  -u 用户名 -p 密码  数据库  表名  > 物理磁盘位置/文件名 
mysqldump -hlocalhost -uroot -p123456 school student >D:/a.sql

# mysqldump -h 主机  -u 用户名 -p 密码  数据库  表1 表2 表3 > 物理磁盘位置/文件 名 
mysqldump -hlocalhost -uroot -p123456 school student >D:/b.sql

# mysqldump -h 主机  -u 用户名 -p 密码  数据库> 物理磁盘位置/文件名 
mysqldump -hlocalhost -uroot -p123456 school >D:/c.sql

# 导入
# 登录的情况下,切换到指定的数据库
# source 备份文件 
source d:/a.sql

mysql -u用户名 -p密码 库名< 备份文件

9、数据库设计规范

9.1、为什么设计

当数据库比较复杂的时候,我们就需要设计

糟糕的数据库设计:

  • 数据冗余,浪费空间
  • 数据库插入和删除都会麻烦、异常 【屏蔽使用物理外键】
  • 程序的性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计:

  • 分析需求:分析业务和需要处理的数据库的需求
  • 概要设计:设计关系图 E-R 图

设计数据库的步骤:(个人博客)

  • 收集信息,分析需求
    • 用户表(用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表 (文章分类,谁创建的)
    • 文章表 (文章的信息)
    • 评论表
    • 友链表 (友链信息)
    • 自定义表 (系统信息,某个关键的字,或者一些主字段) key : value
    • 说说表 (发表心情 … id… content….create_time)
  • 标识实体 (把需求落地到每个字段)
  • 标识实体 之间的关系
    • 创建分类:user –> category
    • 关注:user –>user
    • 友链:links
    • 评论:user-user-blog
9.2、三大范式

为什么需要三大范式

  • 信息重复
  • 更新异常
  • 插入异常
    • 无法正常显示信息
  • 删除异常
    • 丢失有效的信息

三大范式(了解)

  1. 第一范式(1NF)

    原子性 : 保证每一列不可再分

  2. 第二范式(2NF)

    前提:满足第一范式

    每张表只描述一件事情

  3. 第三范式(3NF)

    前提:满足第一范式 和 第二范式

    第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

规范性与性能的问题

关联查询的表不得超过三张

  • 考虑商业化的需求和目标,(成本,用户体验!) 数据库的性能更加重要
  • 在规范性能的问题的时候,需要适当的考虑一下 规范性
  • 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
  • 故意增加一些计算列 (从大数据量降低为小数据量的查询:索引)
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值