今日内容
零、 复习昨日
一、MySQL
一、引言
1.1 现有的数据存储方式有哪些?
Java程序存储数据(变量、对象、数组、集合),数据保存在内存中,属于瞬时状态存储。
文件(File)存储数据,保存在硬盘上,属于持久状态存储。
1.2 以上存储方式存在哪些缺点?
没有数据类型的区分。
存储数据量级较小。
没有访问安全限制。
没有备份、恢复机制。
二、数据库
2.1 概念
数据库是“按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、有共享的、统一管理的数据集合。
2.2 数据库的分类
- 网状结构数据库:美国通用电气公司IDS(Integrated Data Store),以节点形式存储和访问。
- 层次结构数据库:IBM公司IMS(Information Management System)定向有序的树状结构实现存储和访问。
- 关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。
- 非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。
三、数据库管理系统
3.1 概念
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
RDBMS 关系数据库管理系统(Relational DataBase Management System,RDBMS)
3.2 常见数据库管理系统
- Oracle:被认为是业界目前比较成功的关系型数据库管理系统。Oracle数据库可以运行在UNIX、Windows等主流操作系统平台,完全支持所有的工业标准,并获得最高级别的ISO标准安全性认证。
- DB2:IBM公司的产品,DB2数据库系统采用多进程多线索体系结构,其功能足以满足大中公司的需要,并可灵活地服务于中小型电子商务解决方案。
- SQL Server:Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。
- SQLLite:应用在手机端的数据库。
四、MySQL
4.1 简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS(Relational Database Management System,关系数据库管理系统) 应用软件之一。
4.2 访问与下载
官方网站:https://www.mysql.com/
下载地址:https://dev.mysql.com/downloads/mysql/
版本选择 |
---|
下载页面 |
---|
4.3 安装
两种安装方案,详见安装文档
4.4 使用
- 启动mysql
- 命令net start mysql
- 任务管理器启动(ctrl+shift+esc)
- 登录mysql
- mysql -uroot -pxxxxx
- 退出mysql
- exit
五、SQL语言
SQL(Structured Query Language)结构化查询语言,用于存取数据、更新、查询和管理关系数据库系统的程序设计语言。
SQL语言有标准,ISO定制了SQL99标准
- 经验:通常执行对数据库的“增删改查”,简称C(Create)R(Read)U(Update)D(Delete)。
- DDL(Data Definition Language) 数据
定义
语言,定义数据库,表,列等 - DML(Data Manipulation Language) 数据
操作
语言,操作内部数据(增,删除,修改) - DQL(Data Query Language) 数据
查询
语言,对数据的查询 - DCL(Data Control Language) 数据
控制
语言,定义数据的访问控制和安全
六、DDL
mysql是RDBMS: 是关系型数据库管理系统,它管理很多个数据库
库: 一个项目一个数据库,数据库内有很多表
表: 一个分类一个表,表内有很多列
列:一个列代表一个特性(属性/字段)
行:一行代表一个具体实例
6.1 数据库操作
查看MySQL中所有数据库
mysql> SHOW DATABASES; #显示当前MySQL中包含的所有数据库
数据库名称 | 描述 |
---|---|
information_schema | 信息数据库,其中保存着关于所有数据库的信息(元数据)。 元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。 |
mysql | 核心数据库,主要负责存储数据库的用户、权限设置、关键字等, 以及需要使用的控制和管理信息,不可以删除。 |
performance_schema | 性能优化的数据库,MySQL 5.5版本中新增的一个性能优化的引擎。 |
sys | 系统数据库,MySQL5.7版本中新增的可以快速的了解元数据信息的系统库 便于发现数据库的多样信息,解决性能瓶颈问题。 |
创建自定义数据库
mysql> CREATE DATABASE mydb1; #创建mydb数据库
mysql> CREATE DATABASE mydb2 CHARACTER SET gbk; #创建数据库并设置编码格式为gbk
mysql> CREATE DATABASE IF NOT EXISTS mydb4; #如果mydb4数据库不存在,则创建;如果存在,则不创建。
查看数据库创建信息
mysql> SHOW CREATE DATABASE mydb2; #查看创建数据库时的基本信息
修改数据库
mysql> ALTER DATABASE mydb2 CHARACTER SET gbk; #修改数据库的字符集
ps: 数据库一旦创建不能修改名字,只能修改编码格式,但是我们在安装mysql时已经确定了数据格式为UTF-8,所以不需要动!!
删除数据库
mysql> DROP DATABASE mydb1; #删除数据库mydb1
查看当前所使用的数据库
mysql> select database(); #查看当前使用的数据库
使用数据库
mysql> USE mydb1; #使用mydb1数据库
6.2 数据表操作
查询当前库下的所有表
mysql> show tables;
创建数据表[重点]
CREATE TABLE 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
…
列名 数据类型 [约束] //最后一列的末尾不加逗号
)[charset=utf8] //可根据需要指定表的字符编码集
列名 | 数据类型 | 说明 |
---|---|---|
subject_id | INT | 课程编号 |
subject_name | VARCHAR(20) | 课程名称 |
subject_hours | INT | 课程时长 |
#依据上述表格创建数据表,并向表中插入 3 条测试语句
CREATE TABLE subject(
subject_id INT,
subject_name VARCHAR(20),
subject_hours INT
)charset=utf8;
mysql> -- 创建表
mysql> -- 创建学生表(stu),列: id 数字类型,name 字符串类型,score 浮点型 ,birthday 日期类型
mysql> create table stu( -- 创建表
-> id int, -- id是列名,int是数据类型,长度是11,默认可以不写
-> name varchar(20), -- name是列名,varchar是可变长字符类型
-> sex char(1), -- sex性别,char定长字符串
-> score double(10,2),-- score 是列名,double浮点型,10是总长度,2其中小数点个数
-> birthday date -- birthday是列名,date是日期类型,不需要长度
-> );
id | name | sex | score | birthday |
---|
数据类型 | 解释 | 长度 |
---|---|---|
int | 整形 | 11,固定,可以省略 |
double | 浮点型 | (x,y) 总长x位,其中包含y位小数 |
char | 定长字符 | 0-255,声明(10)的字符,即使字符不够,也会占用10位 |
varchar | 可变长字符 | 0-255,声明(10)的字符,会根据实际存储缩放 |
date | 日期 | 没有长度 |
datatime | 日期时间 | 没有长度 |
timestamp | 时间戳 | 没有长度 |
查看表结构
# 查看表结构
desc stu;
向现有表中添加列
#在课程表基础上添加gradeId 列
ALTER TABLE subject ADD gradeId int;
删除表中的列
#删除课程表中 gradeId 列
ALTER TABLE subject DROP gradeId;
- 注意:删除列时,每次只能删除一列
修改列名
#修改课程表中 subjectHours 列为 classHours
ALTER TABLE subject CHANGE subjectHours classHours int ;
- 注意:修改列名时,在给定列新名称时,要指定列的类型和约束
修改表名
#修改课程表的subject 为 sub
ALTER TABLE subject rename sub;
删除学生表
#删除学生表
DROP TABLE subject;
-- 库操作
create database 名字;
show databases;
drop database 名字;
alter database 名字 xxxx
-- 表操作
show tables;
create table 名字 (列名 数据类型,列名 数据类型,...)
alter table 名字 xxx
drop table 名字
-- 以上命令,熟悉即可
-- 最重要的是 创建表 语句
七、客户端工具
7.1 Navicate
Navicat是一套快速、可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。
7.2 SQLyog
MySQL可能是世界上最流行的开源数据库引擎,但是使用基于文本的工具和配置文件可能很难进行管理。SQLyog提供了完整的图形界面,即使初学者也可以轻松使用MySQL的强大功能。其拥有广泛的预定义工具和查询、友好的视觉界面、类似 Excel 的查询结果编辑界面等优点。
idea中可以安装插件操作数据库
Intelij公司 DataGrip
dbeaver工具
7.2.1 连接mysql
7.2.2 创建数据库
7.2.3 使用数据库,查看表
选中数据库和表展开即可
7.2.4 创建表
7.2.5 删除表
7.2.6 编写sql语句
八、DML[重点]
DML 数据操作语言,其实对表中的数据进行
- 增
- 删
- 改
8.1 插入
插入,就是向数据库表中插入数据,语法
insert into 表名 (字段1,字段2,...) values (值1,值2,...); insert into 表名 values (值1,值2,...);
-- 注释
# 注释
/*
* 多行注释
*/
CREATE TABLE `stu` (
`sid` int(11) DEFAULT NULL,
`sname` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`score` double(5,2) DEFAULT NULL,
`birthday` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ========= 插入 ===============
/*
语法:
insert into 表名 (列名1,列名2,...) values (值1,值2,...);
注意事项:
1. 字符串和日期使用单引号
2. 如果插入全部字段,字段可以省略直接写值,但是值要跟原表的个数,顺序,类型一致
*/
-- 插入学生表全部字段
insert into stu (sid,sname,age,score,birthday)
values (1,'小王',18,98.2,'2000-05-05');
-- 如果插入全部字段,可以简写为不写列直接写值
insert into stu values (2,'小李',19,88.2,'2001-05-05');
-- 可以指定插入某些列
insert into stu (sid,sname) values(3,'小黑');
-- 插入的列顺序没有必要和原表一致
insert into stu(age,sid,score) values (20,4,88.2);
8.2 更新
语法
update 表名 set 字段 = 值 [, 字段2 = 值2, ... ] [where 字段 = 值]; -- [, 字段2 = 值2, ... ] 是指,可选的,可以同时修改多个列的值 -- [where 字段 = 值] 是指,可选的,加上是指过滤,只更新符合条件的数据 -- 不加,就是更新全表数据, 不推荐!!
/*
语法:
update 表名 set 字段=值,字段2=值2,... [where 字段 = 值]
建议是加上where语句,否则会更新全表全部数据
*/
-- 更新小黑年龄为21
update stu set age = 21 where sname = '小黑';
-- 更新学号为4的学生姓名为詹姆斯,年龄39
update stu set sname = '詹姆斯',age = 39 where sid = 4;
-- 修改学号为1的学生加1岁
update stu set age = age + 1 where sid = 1;
-- 如果不加where更新全表[慎用]
update stu set birthday = '2023-05-06';
8.3 删除
语法
delete from 表名; -- 删除全表数据 delete from 表名 where 字段 = 值; -- 只删除符合条件的数据
/*
语法:
delete from 表名 [where 字段 = 值];
建议是加上where语句,按条件删除,否则删除全表
-------------------------------------------------
工作中其实很多时候我们看到的删除不是真的删除...
实际开发中一般是在表中定义一个状态state字段
state=1 正常
state=2 注销
在查询的时候只查询正常信息,删除时其实是执行的更新
*/
-- 删除id为5的学员信息
delete from stu where sid = 5;
-- 删除全表数据
delete from stu;
-- 删除全表数据
truncate table stu;
8.4 delete和truncate的区别[面试问]
-- 删除全部[慎用]
delete from stu;
-- 删除全表
truncate table stu;
delete | truncate | |
---|---|---|
语句类型 | DML | DDL |
原理 | 逐条删除数据 | 删除表结构和数据,重建表 |
空间 | 删除数据在内存中有删除后碎片 | 很干净,没有空间碎片 |
效率 | 慢 | 快 |
恢复 | 可以恢复 | 数据不能恢复 |
自增 | 不影响自增顺序 | 影响,从1开始 |
九、约束
约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新
约束设置的语法,大部分是
create table 表名( 字段 数据类型(长度) 约束, 字段 数据类型(长度) 约束 );
9.1 数据类型
其实数据类型也是一种约束,例如设置id列为int类型,那就不能乱给id设置字符串或者日期等数据
9.2 主键约束
主键(
primary key
)约束非常重要,以后开发中基本上每张表都要有主键约束,作用是设置了主键约束的列,有以下效果
- 不能为空
- 不能重复
一般主键是给id设置的
设置主键方式有三种:
- 在建表时给列直接指定
- 在建表语句的最后指定某一列是主键
- 给以建好的表修改设置主键
- 图形化操作
-- =============== 主键约束 ===============
-- 主键约束: 该列数据不能为空,不能重复
-- 方案1: 建表时给定主键
create table tb_1(
id int primary key, -- 建表时设置id为主键
age int
);
insert into tb_1 (age) value (18); -- 报错,主键不能为空
insert into tb_1 (id) value (1);
insert into tb_1 (id) value (1); -- 报错,主键不能重复
-- 方案2: 建表时,在最后设置主键
create table tb_2(
id int,
age int,
primary key(id)
);
insert into tb_2 (age) value (18); -- 报错,主键不能为空
insert into tb_2 (id) value (1);
insert into tb_2 (id) value (1); -- 报错,主键不能重复
-- 这种设置主键的方式,一般适合用于设置联合主键
create table tb_3(
id int,
age int,
primary key(id,age) -- id和age是联合主键
);
insert into tb_3 (age) value (18); -- 报错,主键id不能为空
insert into tb_3 (id) value (1); -- 报错,主键age不能为空
insert into tb_3 (id,age) value (1,18); -- 可以
insert into tb_3 (id,age) value (2,18); -- 可以
insert into tb_3 (id,age) value (2,19); -- 可以
insert into tb_3 (id,age) value (1,18); -- 报错,联合主键重复
-- 方案3: 建表后再修改添加主键
create table tb_4(
id int,
age int
);
insert into tb_4 (age) value (18);
insert into tb_4 (id) value (1);
-- 修改表,添加主键
alter table tb_4 add primary key(id);
-- 方案4:图形操作
insert into tb_5 (age) value (18);
insert into tb_5 (id) value (1);
9.3 自增约束
自增(
auto_increment
)约束,主要是配合主键使用,防止主键为空,重复
-- =============== 主键自增约束 ===============
create table tb_6(
id int primary key auto_increment,
age int
);
insert into tb_6 (age) value (18);-- 没有给主键赋值,会从1开始递增
insert into tb_6 (age) value (18);-- 每次递增1
insert into tb_6 (id,age) value (4,18);-- 虽然有递增,也可以自己指定
insert into tb_6 (age) value (18);-- 在上一行数据基础上递增1
delete from tb_6 where id = 5; -- 删除数据不影响递增
insert into tb_6 (age) value (18);
9.4 唯一约束
唯一(
unique
)约束,设置了唯一约束的列,的值不能重复
-- ================= 唯一约束 ================
create table t5(
id int,
name varchar(20) unique -- 唯一约束
);
insert into t5(name) values('aa');
-- 报错,name列的值重复, Duplicate entry 'aa' for key 'name'
insert into t5(name) values('aa');
9.5 非空约束
非空(
not null
)约束,设置了非空约束的列的值不能为空
-- ================= 非空约束 ================
create table t6(
id int,
name varchar(20) not null -- 非空约束
);
-- name不能没有值
insert into t6 (id) values (1);
-- 给name赋值
insert into t6 (id,name) values (1,'aaa');
-- 只是不能为空,可以重复
insert into t6 (id,name) values (2,'aaa');
9.6 默认值
默认值(
default
),给列设置默认值约束后,如果该列在插入数据时没有给值,就自动赋值默认值
-- =============== 默认值约束 ===============
-- 默认的默认值是null
-- 也可以主动设置默认值
create table tb_9 (
id int,
name varchar(10) default '肖王巴',
age int default 1,
birthday date default '1970-01-01'
)
insert into tb_9 (id) values (1);-- 其他列没设置值,就会用默认值替代
insert into tb_9 (id,name,age,birthday)
values (2,'小李',18,'2020-01-01');-- 给定有值,就不使用默认值
9.7 外键约束[了解]
外键,是多表之间接的一种关联关系的一种限制.
语法
constraint 外键名 foreign key (当前表中的列名) references 表(主键);
设计订单表和商品表,订单表的数据要关联商品表数据
-- 商品表
create table tb_goods(
gid int primary key,
gname varchar(20),
descr varchar(20)
);
-- 订单表 (订单表关联了商品表)
create table tb_order(
oid int primary key,
order_time datetime,
gid int,
-- 设置外键
constraint fk_order_goods foreign key(gid) references tb_goods(gid)
);
/*
被引用的表称为父表 parent , tb_goods
引用别人的表称为子表 child , tb_order
*/
-- 给父表随便插入数据
insert into tb_goods values (2,'键盘','敲代码没有bug');
-- 给子表随便插入数据不行!! 这个数据得是父表中有的才行
insert into tb_order values (1,'2022-11-11',1);
-- 子表可以删除数据
delete from tb_order where oid = 1;
-- 父表被引用的数据不能删除
delete from tb_goods where gid = 2;
delete from tb_goods where gid = 1;
- RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录, 则不允许删除父表中的记录;
- NO ACTION:同 RESTRICT,也是首先先检查外键;
- CASCADE:父表 delete、update 的时候,子表会 delete、update 掉关联记录;
- SET NULL:父表 delete、update 的时候,子表会将关联记录的外键字段所在 列设为 null,所以注意在设计子表时外键不能设为 not null;
9.8 练习
自己创建表,设计字段,把所有约束都试一遍
宠物(pet)表
id 整型 主键自增
昵称 字符串 唯一
体重 浮点型 不能为空
性别 默认值 公
create table pet(
id int primary key auto_increment,
nick varchar(10) unique,
weight double(10,2) not null,
sex char(1) default '公'
);
插入,更新测试
insert into pet (nick,weight) values ('小黑',5.2);
十、DQL
DQL 主要指查询语句,有查询单表数据,也有查多表数据表,今天主要学习
单表
查询
- 基本查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合查询
- 去重查询
- 分组查询
- 限制查询
1.1 数据准备
将发的stu.sql导入到MySql中
1.2 基本查询
select 字段1,字段2,… from 表名;
查询返回的是一张
虚拟表
,查询对原表数据没有任何影响,默认查询的全表数据
-- 基本查询
-- 查询所有列
select sid,sname,age,sex,score,cid groupLeaderId from stu;
-- 查询所有列,在测试,练习时可以使用*代替
select * from stu;
-- 查询指定 列
select sid,sname,sex from stu;
-- 年龄+1
select age+1 from stu;
算数运算符 | 描述 |
---|---|
+ | 两列做加法运算 |
- | 两列做减法运算 |
* | 两列做乘法运算 |
/ | 两列做除法运算 |
注意:%是占位符,而非模运算符。
1.3 条件查询
条件查询就是在基础查询基础上,再给sql设置条件,只查询
部分符合条件
的数据
条件语句 : select 字段1,字段2,… from 表名
where 字段 条件 值
;
条件运算符
- =
>
- <
>=
- <=
- !=
- and
- or
- in
- not in
- between…and
-- ============== 条件查询 ==============
-- 查询学号为1001的学生信息
select * from stu where sid = 1001;
-- 查询学生成绩大于60的学生id 姓名,成绩
select sid,sname,score from stu where score > 60;
-- 查询学生性别为女,并且年龄小于50的记录
select * from stu where sex = '女' and age < 50;
-- 查询学生学号为1001,或者姓名为李四的记录
select * from stu where sid = 1001 or sname = '李四';
-- 查询学号为1001,1002,1003的记录
select * from stu where sid = 1001 or sid = 1002 or sid = 1003;
select * from stu where sid in (1001,1002,1003);
select * from stu where sid >= 1001 and sid <= 1003;
-- 查询学号不是1001,1002,1003的记录
select * from stu where sid not in (1001,1002,1003);
select * from stu where sid != 1001 and sid != 1002 and sid != 1003;
-- 查询学生年龄在20到40之间的学生记录
select * from stu where age >= 20 and age <= 40;
select * from stu where age between 20 and 40;
-- 查询性别非男的学生记录
select * from stu where sex != '男';
select * from stu where sex = '女';
-- 查询性别为null的学生记录
update stu set sex = null where sid = 1009;
-- 查询是不能=null运算
-- select * from stu where sex = null;
select * from stu where sex is null;
-- 查询性别不为null的学生记录
select * from stu where sex is not null;