JavaWeb学习第六天-数据库-MySQL基础


前言

这是javaweb第六天的学习内容,主要在于复习MySQL数据库的使用,时间久了,知识遗忘的比较厉害,仅供个人学习使用,如果也对你有所帮助,小子深感荣幸。


一、SQL语句及其相关

带一句:MySQL数据库是一种关系型数据库,即是由多张互相连接的二维表组成的数据库。

1.SQL语句分类

分类全称说明
DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)
DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改
DQLData Query Language数据查询语言,用来查询数据库中表的记录
DCLData Control Language数据控制语言,用来创建数据库用户、控制数据库的访问权限

tips:MySQL数据库的SQL语句不区分大小写。

2.数据定义语言DDL

这里的DDL是从一个较为宏观的角度上去进行操作的,操作对象是数据库或者表的结构,而并非其中所存储的具体的数据。

2.1 操作数据库

常见操作:查询(数据库)、创建、使用、删除

2.1.1 查询数据库

查询所有数据库:

show databases;

查询当前正在使用的数据库:

select database();

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a70d9c02ab044088926aa03ebe597190.png如果当前没有正在使用某一个数据库,则会返回null(如果希望使用某个数据库的话,需要通过 “use 数据库名称”命令,见下文)

2.1.2 创建数据库
create database [if not exists] 数据库名;	//[]中的if not exists为可选项,若指令中给出则会先判断数据库是否存在,如果不存在创建成功,否则创建失败。

在这里插入图片描述这里我的系统中已经存在了一个名称为db01的数据库,通过控制台信息可以看到,我尝试再一次创建一个名称为db01数据库的操作,但是被驳回了。
tips:不管加不加if not exists,系统都不允许再创建一个名称已经存在的数据库,这个操作都会被驳回。添加后报的是警告,不添加报的是错误。

2.1.3 使用数据库
use 数据库名;	//或者是切换数据库,use操作指向的数据库就是select database()命令的结果。
2.1.4 删除数据库
drop database [if exists] 数据库名;	//同理创建,判断是否存在?存在则删除,否则驳回操作。

2.2 操作表


了解,大部分可以使用图形化工具操作

2.2.1 创建表
2.2.1.1 语法
create table  表名(
	字段1  字段1类型 [约束]  [comment  字段1注释 ],	//注释部分使用单引号括起来
	字段2  字段2类型 [约束]  [comment  字段2注释 ],
	......
	字段n  字段n类型 [约束]  [comment  字段n注释 ] 	//这里注意最后一个字段的定义部分后是没有逗号的
) [ comment  表注释 ] ;

//示例----------------------------------------------------
create table tb_user(
    id int comment 'ID',
    username varchar(20) comment '用户名',
    name varchar(10) comment '姓名',
    age int comment '年龄',
    gender char(1) comment '性别'
)comment '用户表'

在这里插入图片描述目标表创建成功。

2.2.1.2 约束

所谓约束其实就是指在表格中某个字段上所设置的规则,用于对存储在表格中该字段的数据做出限制。

约束描述关键字
非空约束限制该字段值不能为nullnot null
唯一约束保证字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key
默认约束保存数据时,如果未指定该字段值,则采用默认值default
外键约束让两张表的数据建立连接,保证数据的一致性和完整性foreign key

按照这些约束,给出使用示例(每个字段可以添加多个约束,且各个约束的定义之间无需使用符号连接)

create table tb_user (
    id int primary key comment 'ID', 	//主键,非空且唯一
    username varchar(20) not null unique comment '用户名',	//非空+唯一
    name varchar(10) not null comment '姓名',	//非空
    age int comment '年龄',	//无约束
    gender char(1) default '男' comment '性别'	//默认值为男
) comment '用户表';

tips:关键字:auto_increment (自动增长)
具有auto_increment关键字进行表示的字段是一个从1开始自增的序列,即首条记录的该字段值为1,没增加一条记录该字段的值便会自动加一。

//对id字段的定义进行修改
id int primary key auto_increment comment 'ID'

在这里插入图片描述
tips:被auto_increment标记的字段,在删除记录时并不会导致其他记录的该字段值减小,不要臆测哈

2.2.1.3 数据类型

在MySQL中,数据主要可以划分为三大类:数值类型,字符串类型和日期时间类型

以下为个人总结的一些在学习过程常见的数据类型,顺序依次对照三大类():

类型大小有符号(SIGNED)范围无符号(UNSIGNED)范围描述
TINYINT1byte(-128,127)(0,255)小整数值
INT/INTEGER4bytes(-2147483648,2147483647)(0,4294967295)大整数值
FLOAT4bytes(-3.402823466 E+38,3.402823466351 E+38)0 和 (1.175494351 E-38,3.402823466 E+38)单精度浮点数值
DOUBLE8bytes(-1.7976931348623157 E+308,1.7976931348623157 E+308)0 和 (2.2250738585072014 E-308,1.7976931348623157 E+308)双精度浮点数值
DECIMAL依赖于M(精度)和D(标度)的值依赖于M(精度)和D(标度)的值小数值(精确定点数)

关于DECIMAL类型使用:

decimal是MySQL中存在的精准数据类型,语法格式“DECIMAL(M,D)”。

M是数字的最大数(精度),其范围为“1~65”,默认值是10;
D是小数点右侧数字的数目(标度),其范围是“0~30”,但不得超过M。

类型说明 取值范围(MySQL < 3.23) 取值范围(MySQL >= 3.23)

DECIMAL(4,1) -9.999.9 -999.99999.9

DECIMAL(5,1) -99.9999.9 -9999.999999.9

DECIMAL(6,1) -999.99999.9 -99999.9999999.9

DECIMAL(6,2) -99.99999.99 -9999.9999999.99

DECIMAL(6,3) -9.99999.999 -999.9999999.999

DECIMAL类型使用部分转载自博客链接:https://blog.csdn.net/weixin_46334815/article/details/126994575

类型大小描述
CHAR0-255 bytes定长字符串(需要指定长度)
VARCHAR0-65535 bytes变长字符串(需要指定长度)
类型大小范围格式描述
DATE31000-01-01 至 9999-12-31YYYY-MM-DD日期值
TIME3-838:59:59 至 838:59:59HH:MM:SS时间值或持续时间
DATETIME81000-01-01 00:00:00 至 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
2.2.2 查询表

查询当前数据库所有表

show tables;

查看指定表结构

desc 表名;

查询指定表的建表语句

show create table 表名;
2.2.3 修改表

添加字段

alter table 表名 add  字段名  类型(长度)  [comment 注释]  [约束];

修改数据类型

alter table 表名 modify  字段名  新数据类型(长度);

alter table 表名 change  旧字段名  新字段名  类型(长度)  [comment 注释]  [约束];

删除字段

alter table 表名 drop 字段名;

修改表名

rename table 表名 to  新表名;
2.2.4 删除表
drop  table [ if exists ]  表名;

3.数据库操作语言DML(重点)


DML主要用于对数据库表中的记录进行增删改操作,在Web开发三层结构中的Dao层,需要使用DML对数据库进行相应的操作从而获取数据返回Service层。

3.1 添加数据-insert

//向指定字段添加数据
insert into 表名 (字段名1,字段名2,...values (1,2,...);
//向全部字段添加数据,其实就是插入一条记录
insert into 表名 values values (1,2,...);
//批量添加多条记录
insert into 表名 values (1,2,...),(1,2,...),...;

3.2 修改数据-update

update 表名 set 字段名1 =1 , 字段名2 =2 , .... [where 条件] ;
//如果不加where条件,则会将表中所有记录的对应字段值全部修改

3.3 删除数据-delete

delete from 表名 [where 条件];
//没有where则会直接删除整张表中的数据

4.数据库查询语言-DQL(重点)


在实际开发中,Dao层对数据库的操作实际上基本都是和查询语句一起执行的,即先查询到目标记录,然后再对目标记录进行字段值的修改。

4.1 SQL语句的通用结构
SELECT
	字段列表
FROM
	表名列表
//条件查询
WHERE
	条件列表
//分组查询
GROUP  BY
	分组字段列表
HAVING
	分组后条件列表
//排序查询
ORDER BY
	排序字段列表
//分页查询
LIMIT
	分页参数
4.2 基本查询
//查询多个字段
select 字段1, 字段2, 字段3 from  表名;
//查询所有字段
select *  from  表名;
//设置别名	
//如果别名中含有特殊字符需要使用''或者""包涵。
//(查询结果将会以别名作为字段名进行展示)
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ]  from  表名;
//去除查询结果中的重复数据(对表数据并不会造成影响)
select distinct 字段1,字段2,... from 表名;
4.3 条件查询
select 字段列表 from 表名 where 条件列表;
比较运算符功能
>大于
>=大于等于
<小于
<=小于等于
=等于
<> 或 !=不等于
between … and …在某个范围之内(含最小、最大值)
in(…)在in之后的列表中的值,多选一
like 占位符模糊匹配(_匹配单个字符, %匹配任意数量个字符)
is null是null

逻辑运算符主要和比较运算符一起使用从而形成更加复杂的查询条件

逻辑运算符功能
and 或 &&并且 (多个条件同时成立)
or 或 ||或者 (多个条件任意一个成立)
not 或 !非 , 不是
4.4 聚合函数

在此之前所提到的查询操作都是以行或者记录为单位进行查询的,但是使用聚合函数进行查询是以列或者字段作为单位来进行操作的,聚合函数会对一列的数据值进行计算,然后返回一个结果值。
select 聚合函数(字段列表) from 表名;

tips: 聚合函数会忽略空值,对null值不做统计。

常用聚合函数功能
count统计数量
max最大值
min最小值
avg平均值
sum求和
4.5 分组查询

分组:按照某一列或者某几列,把相同的数据进行合并输出。
  1. 分组其实就是按列进行分类(指定列下相同的数据归为一类),然后可以对分类完的数据进行合并计算。
  2. 分组查询通常会使用聚合函数进行计算。
select  字段列表  from  表名  [where 条件]  group by 分组字段名  [having 分组后过滤条件];
//执行顺序:where > group by > having
//tips:分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义(因为分组字段各个组件是相同的)
4.6 排序查询
select  字段列表  
from   表名   
[where  条件列表] 
[group by  分组字段 ] 
order  by  字段1  排序方式1 , 字段2  排序方式2;	//排序方式分为:ASC:升序(默认),DESC:降序
//order by给入给入字段的排序优先级由由前向后依次降低。
4.7 分页查询
select  字段列表  from   表名  limit  起始索引, 查询记录数 ;
//从其实索引开始,向后展示对应条数索引

在SQL语句中可以加入if或者case语句来进行操作,操作形式需要注意,和java有所区别。

-- if(条件表达式, true取值 , false取值)
select if(gender=1,'男性员工','女性员工') AS 性别, count(*) AS 人数
from tb_emp
group by gender;

-------------------------------------------------------------------

-- case 表达式 when 值1 then 结果1  when 值2  then  结果2 ...  else  result  end
select (case job
             when 1 then '班主任'	//按照job字段进行分组,如果字段值为1则显示班主任
             when 2 then '讲师'
             when 3 then '学工主管'
             when 4 then '教研主管'
             else '未分配职位'
        end) AS 职位 ,
       count(*) AS 人数
from tb_emp
group by job;

二、数据库的多表设计


在实际的业务开发中,各个业务之间项目关联,所以各个表结构之间也会存在关联,主要分为三种
  1. 一对多
  2. 多对多
  3. 一对一

1.一对多

所谓一对多的表间关系,其实是指A表中的多条记录中的某个字段对应B表中的主键字段。例如,A表是学生表(表中含有一个班级字段),B表是班级表(主键是班级字段)。每个学生记录中都会包含一个班级字段值,而班级表中的每一个班级字段值在学生表中都可能会对应多条记录。

对于“一对多”中的“一”所在表我们称为父表,“多”所在表我们称为子表。一般对于这种关系会经常使用外键(Foreign Key)的方式来进行设置,在子表中设置外键(“多”的一方),这样就实现了父表和子表之间的一种关联关系,例如我希望删除父表中的某条记录,会首先查询子表中是否存在相应的关联记录,如果存在,则父表中的删除操作会被驳回。

//sql语句可以简单了解一下,一般会使用图形化界面进行操作

-- 创建表时指定
create table 表名(
	字段名    数据类型,
	...
	[constraint]   [外键名称]  foreign  key (外键字段名)   references   主表 (主表列名)	
);


-- 建完表后,添加外键
alter table  表名  add constraint  外键名称  foreign key(外键字段名) references 主表(主表列名);

上述这种实实在在存在于数据库层面的外键关系,我们称为物理外键

物理外键和逻辑外键:

  • 物理外键

    • 概念:使用foreign key定义外键关联另外一张表。
    • 缺点:
      • 影响增、删、改的效率(需要检查外键关系)。
      • 仅用于单节点数据库,不适用与分布式、集群场景。
      • 容易引发数据库的死锁问题,消耗性能。
  • 逻辑外键

    • 概念:在业务层逻辑中,解决外键关联。
    • 通过逻辑外键,就可以很方便的解决上述问题。

在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范中,会明确指出禁止使用物理外键 foreign key

2.一对一

可以看作为一种特殊的一对多,所以在处理方法上只需选中一张表然后添加上与另一张表的外键联系即可。但由于是一对一关系,所以父表中的主键字段应该还添加上unique约束,避免该字段出现多个重复值。

3.多对多

解决方法一般是创建一张中间表。中间表至少包涵两个外键,分别关联两方主键。(当然,多对多关系和一对一关系中的这种外键也应该尽可能的使用逻辑外键来进行实现)
在这里插入图片描述

总结

本文主要记录了MySQL入门的基础操作等知识,主要用于个人学习,如果存在错误还请大佬指正,小子拜谢。共勉。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值