Java复习打卡day47
Mac系统中安装mysql数据库
使用Mac中的Homebrew直接下载mysql:
大家可以直接在终端terminal里输入如下指令:
brew install mysql@5.7
便可下载。
如果看到以下的界面则表示下载成功:
在按照上面的指示,将划红线的代码都执行一遍。
安装完成之后,对数据库的操作:
1.启动数据库
mysql.server start
2.关闭数据库
mysql.server stop
3.登录数据库
mysql -u root -p
MySql基础操作
使用方法:
方式一:在命令行敲命令来操作(有助于快速熟悉命令)
方式二:通过图形界面工具,如Navicat等(在熟练掌握之再使用)
方式三:通过编程语言(Java,php,python,go···)执行mysql指令
SQL(structure query language)结构化查询语言
SQL语言分为四个部分:DDL(定义)、DML(操纵)、DQL(查询)、DCL(控制)
Mysql语句中的快捷键:
\G格式化输出(文本式,竖立显示)
\c结束命令输入操作
\h查看帮助
\s查看服务器端信息
\q退出当前sql命令行(通常为退出sql)
操作数据库的步骤:
连接、打开库、操作、关闭退出
1.通过命令行连接Mysql数据库
-h 服务器地址
-u 登陆账号
-p 回车后输入密码
-P (大写)端口号
数据库语法的特点:
1)SQL语句可以换行,用分号结尾
2)命令不区分大小写,函数名和关键字建议使用大写
3)如果提示符为'>,那么你要输入一个'回车
4)命令行打错换行后不能修改,可以使用\c取消执行这段代码
2.数据库操作
查看数据库show databases;
创建数据库create database 数据库名 default charset=utf8;
删除数据库drop database 数据库名;
打开数据库use 数据库名;
3.数据表操作
数据库管理系统中可以有很多库,每个库中也可以有很多个数据表
查看表show tables;
创建表create table 表名(字段名一 类型,字段名二 类型)engine=innodb default charset=utf8;
创建表:如果不存在就创建,如果存在就不执行:
create table if not exists 表名(字段一 类型,字段二 类型,……)engine=innodb default charset=utf8;
CREATE TABLE if not exists `students` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(4) NOT NULL,
`age` tinyint(4) DEFAULT NULL,
`sex` enum('男','女') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
删除表drop table 表名;
表结构desc 表名;
查看建表语句show create table 表名;
4.数据表操作 增删改查
插入
insert into 表名(字段一,字段二,字段三) values (值一,值二,值三);
insert into 表名((字段一,字段二,字段三) values (a值一,a值二,a值三),(b值一,b值二,b值三);
删除
delete from 表名 where 条件;
修改
update 表名 set 字段=值 where 条件;
update 表名 set 字段1=值1,字段二=值2 where 条件;
update 表名 set 字段=字段+值 where 条件;
查询
select * from 表名
select 字段一,字段二,字段三 from 表名;
select * from 表名 where 条件;
5.退出SQL
exit;或者quit;
Mysql中的数据类型
数据类型是定义列中可以存储什么类型的数据以及该类型实际怎样存储的基本规则。
在设计表示应当非常注重存储的数据类型。使用错误的数据类型会严重的影响应用程序的功能和性能。
更改包含数据的列不是一件小事(这样可能会导致数据丢失)
数据库中常用的数据类型有四类:
字符串、整形、浮点型、日期。
1.字符串类型
最常用的数据类型是串数据类型。他们存储串,如名字,邮政编码,电话,地址等。
不管串是什么,串的内容都必须在引号内。
有两种基本的船类型,分别是定长串和不定长串。
- 定长串 char
1.接受长度一定的串,他的长度是在创建表的时候指定的;
2.指定长度之后存储时就会分配固定长度的空间。
注:char(7)无论存储的字符串多大,占据的空间都是7。
- 不定长串 varchar
存储可变长度的字符串。如:varchar(7)如果实际插入4个字符,那么只占4个字符,当然字符的长度不能超过7。
注意:既然varchar几乎将char的功能都涵盖了,为什么还要char呢?
答:应为数据库在处理定长的字符串比处理不定长的字符串更快。
- 变长文本类型存储 Text
2.数值类型
- decimal(5,2)表示数值总共5位,小数占2位
- int 0~42亿。-21亿~21亿
- tinyint 0~255。-128~127
- float 浮点型
由于Mysql中没有专门存储数据的类型,通常用decimal(8,2)表示
有符号和无符号
任意数值类型(除了Boolean和Bit)都能被定义为有符号或无符号。
1) 定义为有符号的列可以存储正或负的值;
2) 定义为无符号的列只能存储正的值;
3) 默认数值类型都是有符号的。当你确定自己定义的数据只需要正数时,可以在数据类型乾加上关键字:unsigned。
注意:如果将邮政编码01234设定为数值类型时,得到的结果将是1234。这时就要使用字符串存储。
思考一下,手机号码应该用什么数据类型存储呢?
3.日期和时间类型
Mysql使用专门的数据类型存储时间和日期:
datetime 1000-01-01 00:00:00~9999-12-31 23:59:59
4.二进制数据类型
二进制数据类型可以存储任意类型数据(甚至包括二进制信息),如图像,多媒体,字处理文档等
Mysql中的字段约束和运算符
字段约束:
- unsigned无符号(用于数值类型,表示正数,不写可以表示正数和负数都可)
- 字段类型后面加上括号限制宽度
1)char(4) varchar(7)在字符数据类型后加上括号,表示限制字符的长度
2)int(4)没有意义。默认无符号的int(11)有符号的int(10)
3)int(4) unsigned zerofill 只有给int设置前置导零是,设置int的宽度才有效
- not null 字段不能为空,在设置字段的值时,如果字段赋值为NULL就会报错
- default 设置默认值
- primary key 主键不能为空,并且唯一,通常和自动递增一起使用
- auto_increment 自动递增,通常和主键一起使用,表现为数值加一。
- unique 唯一索引(数据不能重复,如:用户名),可以增加查询速度,但是会降低插入和更新的速度
运算符:
- 算术运算符:+、-、*、/、%
- 比较运算符:=、>、<、>=、<=、!=
- 数据库特有的比较运算符:in, not in, is null, is not null, like, between, and
- 逻辑运算符:and, or, not
- like:支持特殊运算符%和_;
主键:
1.表中每一行都必须有可以唯一标识自己的列,用于记录两条数据的不重复性,任意两行都具有不同的主键值。
2.总要设置主键列,但并不是总能用到主键值。每一个数据库设计者都应该为自己设计的每一个表格设置一列主键值,方便后期数据查询。
要求:
- 记录一旦插入到表中,主键最好不要再更改;
- 主键不能为NULL
- 不在主键列中使用可能更改的值。(例如,如果一个名字作为主键来表示某个供应商,当该供应商合并或改用其他名字的时候,必须更改这个主键。)
- 自增数据类型:数据库会在插入一条数据的时候,自动为每一条记录分配一个自增整数,这样我们就不用担心主键重复,也不用预先设置主键值。
- 可以使用多个列作为联合主键,但是联合主键并不常用。联合主键要保证列值的组合必须是唯一的。
Mysql数据库中的表引擎和字符集utf8
1.服务器处理用户的请求
其实不论客户和服务器之间采取什么方式取得联系,最后实现的效果都是:客户端进程向服务器进程发送请求(MySQL语句),服务器进程处理之后向客户端进程发送一段文本(处理结果)。那服务器对客户端进程的请求做什么处理,才能产生最后的结果呢?客户端可以向服务器发出增删改查各类请求,下面我们将以较为复杂的查询请求向大家展示大致的过程:
虽然查询缓存优势能提升系统性能,但是也不得不为这块缓存的维护产生费用,从Mysql5.7.20开始不推荐使用查询缓存的方式,到了Mysql8.0删除了这部分内容。
2.存储引擎
Mysql 将数据的存储和提取都封装到了一个叫做存储引擎的模块中。我们知道,表示有一行一行的数据组成的,但这只是一个逻辑上的表示,如理上如何表示记录,如何将表中的数据读取出来,如何保操作写入具体的物理存储器上,这都是表引擎要做的事。
为了实现不同的功能,Mysql提供了不同的表引擎,不同的表引擎管理的表内部的数据存储结构可能不同,所采取的数据存取算法也可能不同。
存储引擎以前叫作表处理器,它的功能就是根据上级提供的指令,对数据进行提取或写入的操作。
为了方便管理人们把连接管理、查询缓存、语法解析、查询优化这些不涉及真实数据的功能划分为Mysql server模
块,把真实存取数据的功能划分为存储引擎的模块。各种不同的存储引擎向上边的Mysql server提供统一的调用接
口(也就是存储引擎的API),包含了十几个函数,像“读取索引第一条内容”“读取索引下一条内容”“插入记录”等
等。
所以Mysql server在进行完查询优化之后,只要再调用底层存储引擎的API实现对数据的存储和提取在返回给客户端
即可。
Mysql支持很多存储引擎:
3.MyISAM和InnoDB表引擎的区别
- 事务支持
MyISAM不支持,InnoDB支持
注意:事务指的是访问定更新表中数据的执行单元,事务操作中,要么都执行,要么都不执行。
- 存储结构
MyISAM:存储成三个文件
1).frm存储表结构
2).MYD文件存储数据
3).MYI文件存储索引
InnoDB:分成两个文件存储
1).frm存储表结构
2).idb存储文件数据和索引(或者是多个.idb文件,也可以是独立表空间文件)
- 表锁差异
MyISAM:只支持表级锁。用户在操作myisam是,select、delete、update、insert都会给表自动加锁。如果
如果加锁以后的表满足insert并发的条件,那么可以在表的末尾添加上数据。InnoDB:支持事务和行级锁。这
这是InnoDB最大的特色。行级锁极大地提高了多用户并发操作的新功能。但是InnoDB的行锁只在where的主键
是有效的,非主键的where都会锁全表的。
- 表主键
MyISAM:允许没有任何主键和索引的表的存在,索引都是保存行的地址。InnoDB:如果没有设置主键或者
非空唯一的索引,就会生成一个六字节的主键(用户不可见 ),数据是索引的一部分。,附加索引保存的是主
键的值。InnoDB的主键的范围更大,最大时MyISAM的两倍。
- 表的具体行数
MyISAM:保存有表的具体行数,如果使用select count() from table;会直接返回这个值。InnoDB:没有保存
表的总行数,如果使用select count() from table;就会进行遍历。这会消耗很大。但是在加了where之后,两
种查询方法的处理方式都是一样的。
- CURD操作
MyISAM:执行大量的select操作,建议使用MyISAM引擎。InnoDB:执行大量的update、insert操作时,建
议使用InnoDB引擎。delete从性能上看,InnoDB更好,但是其在删除时不会创建一个新的表,而是一行一行
的在原表的基础上一行一行删除。在InnoDB上要删除保存有大量数据的表时建议使用truncate table这个
命令。
- 外键
MyISAM:不支持;InnoDB:支持。
- 查询效率
MyISA相对简单,所以在效率上要优于InnoDB,小型查询上可以使用MyISAM。
但是推荐使用InnoDB,因为InnoDB自身有很多优点,在很多并发的情况下,相信InnoDB的表现一定会优于
MyISAM。
- 应用场景
MyISAM管非事物表。它提供高效的存储和搜索,以及全文检索能力。如果应用中要用到大量的select操作,
使用MyISAM的好处就跟大了。InnoDB由于事务处理应用程序,包括ACID事务支持。如果操作中需要大量使用
到update、insert操作,使用InnoDB这样能大幅提高多用户并发操作的优势。现在默认使用InnoDB。
4.了解一下字符集和乱码
我们知道在计算机中只能存储二进制,那么这样存储字符呢?当然是建立二进制和字符之间的映射了,建立这个关
系最起吗要搞清楚两件事:
1)要把哪些字符映射成二进制?
也就是界定清楚字符的范围。
2)怎么映射?
将一个字符转变成二进制的过程也叫做编码;将一个二进制转变成字符的过程也叫做解码。
人们抽象出一个字符集的概念来描述某个字符范围的编码规则:
常见的字符集有:
1)ASCII码:最早的字符集,收录了128个常见的字符。
2)ISO 8859-1:收录了256个字符,在ASCII码的基础上又增加了128个西欧字符。
3)GB2312字符集:收录了汉字以及拉丁字母、希腊字母、日文平假名片假名字母、俄语西里尔字母,其中收录
了汉字6763个。
4)GBK:在GB2312的基础上进行的扩充。
5)Unicode字符集:收录地球上所有能想到的字符。utf8是这个字符集中的一个编码方式,即使用1~4个字节编
码一个字符。
5.Mysql中的utf8和utf8mb4
我们上面说到的utf8使用1~4个字节来编码一个字符。但是有些字符只需要1~3个字符就能编码完成了,使用最大
编码空间可能会影响应用程序的性能。因此,设计Mysql大叔就偷偷地定义了两个概念:
- utf8mb3:阉割过的utf8字符集,只使用1~3个字节来编码字符。
- utf8mb4:正宗的utf8字符集,使用1~4个字节来编码字符。
注意:在Mysql中utf8就是utf8mb3的别名,所以在Mysql中utf8指的就是使用1~3个字节编码字符。
Mysql中支持很多种字符集,使用下面的代码来查看字符集:
show charset;
Mysql中的DML操作–数据的增删改
首先在数据库列表中创建一个操作库users
create database users default charset=utf8;
然后进入这个库:
use users;
接着在这个库中创建一个表student:
create table if not exists student(
id int not null primary key auto_increment,
name varchar(4) not null,
age tinyint default null,
sex enum('男','女') default null
)engine=innodb default charset=utf8;
此时,大家便可以开始对刚刚创建的表进行DML操作了。
1.字段的添加:
- 标准添加
insert into student(id,name,age,sex) values(1,'张三',17,'男');
- 指定添加
insert into student(name,sex) values ('小丽','女');
- 不指定添加
insert into student values (null,'李四',18,'男')
- 批量添加
insert into student values
(null, '李花',27,'女'),
(null,'张强',23,'男'),
(null,'阿志',21,'男'),
(null,'小美',19,'女');
2.字段的删除:
--删除student 中id=100的数据
delete from student where id=100;
--删除student 中id在10~20之间的数
delete from student where id>=10 and id<=20;
--删除student 中id在10~20之间的数(等同于上面的写法)
delete from student where id between 10 and 20;
--删除student 中id大于200的数据
delete from student where id > 200;
3.字段的修改:
--将id=2的age改为18,name改为小莉
update student set age=18,name='小莉' where id=2;
--将id为1或3的age改为19
update student set age=19 where id=1 or id=3;--等价于下面的方法
update student set age=19 where id in(1,3);
Mysql数据查询–健硕数据select.mp4
语法规则:
select 字段|* from 表名
[where 搜索条件]
[group by 分组字段[having 分组条件]]
[order by 排序字段 排序规则]
[limit 分页参数]
Mysql基础查询
#查询表格中所有列,所有数据
select * from student;
#查询表格中指定字段列的数据
select name,age from student;
where条件查询
1.where后可以接任意条件;
2.可以使用and 和 or来实现制定一个或多个条件;
3.where也可以应用在update、delete后面的条件子句中;
4.where类似于程序语言中的if,根据字段值来实现对数据的过滤。
示例:
#查询student中age>22的数据
select * from student where age > 22;
#查询student中name='阿志'的数据
select * from student where name='阿志';
#查询student中age在21~23之间的数据
select *from student where age >= 21 and age <= 23;--等价于下面的代码
select * from student where age between 21 and 23;
#查询student中age不在21~23之间的数据
select * from student where age <21 or age >23;--等价于下面的代码
select * from student where age not between 21 and 23;
#查询student中age不在21~23之间的女生信息
select * from student where age not between 21 and 23 and sex='女';
Mysql数据查询–OrderBy排序
我们在mysql中使用select进行查询时,结果是根据数据在底层文件中的排序显示的。
因此,首先不要依赖默认排序。然后在需要排序时,使用order by排序。
ASC 升序,默认
desc 降序
order by应用示例:
#按照年龄升序排列,asc 默认就是,因此可不写
select * from student order by age;
#按照年龄升序排列,desc
select * from student order by age desc;
#也可以按照多个字段进行排序
select * from student order by age desc,id desc;
#先是按照age降序排列,age相同的情况下
#id降序排列
最后,文章篇幅有点长,可能会出现瑕疵,见谅。