Java web学习记录(二)数据库的使用

news2024/10/7 8:31:31

学习Java web的前置条件就是数据库,只有学了数据库才能更好的处理网站应用产生的数据。

初识数据库

数据库(Database)顾名思义就是一个存储数据的仓库,通过它就可以直接查找到你想要的数据,举个简单的例子,你游戏账号的信息就是从数据库里面读取数据后再反应给你的。

了解数据库的作用后就可能有人会想:excel也可以存储数据啊,为什么不用我电脑自带的excel呢?那就不得不提数据库的另一个优点了:那就是数据的共享和巨大的存储空间。excel相当于一个移动硬盘,我如果使用了这个excel表格,拿别人就不能用了,而数据库就相当于一个网盘,支持多人的同时访问,并且存储空间更大。

那么数据库里面的数据是以怎么样的形式存储的呢?其实和excel差不多,也是一个又一个的二维表单,只不过数据库里面的这些表单可以相互联系。所以学习数据库应该弄清楚各表之间的关系和每一个表的结构

因为是自己学习用,所以这里使用的是MySQL。

建立数据库

既然每一个数据库里面都有很多的表,每一个表里面又有很多的属性和联系,那么建立之前就要明确自己想要建立一个什么样的表。举个例子:

  • 学生表:记录每个学生的学号、姓名、性别、导师编号。
  • 教师表:记录教师的教师号和名字。
  • 师生联系表:记录每个学生的导师。

其中加粗的代表唯一标记,不可以重复。这样就建立了一个数据库了。

student表单样式如下:
在这里插入图片描述
每一列代表这一列的属性,这一行代表的就是存储的数据了。

数据库的规范化

这部分摘抄知乎大佬的文章:数据库的规范化

  • 第一范式:消除组中的重复,也就是说列中是否存储了其他列中的信息(字段不可再分)
  • 第二范式:消除部分依赖列,也就是说是否有依赖于一部分主键的列(非主键字段完全依赖主键字段)
  • 第三范式:消除非依赖列,是否有依赖于非主键的列(消除传递依赖)

例如:学生信息( 学生ID,学生姓名,所在年级,性别,参加课程,课程ID,课程名称,课程描述,教师ID,教师姓名,教授课程)

该关系模式是非规范化的关系,冗余太大,需要转化为第一范式

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称,教师ID,教师姓名,课程描述)

从第一范式到第二范式,我们需要消除表中部分依赖主键的列,使得非主键字段完全依赖于主键字段。 在学生课程表中,许多列仅仅依赖于课程ID,而不依赖于学生ID,这个表的主键是学生ID+课程ID,因此把这个表分成两个表,第二范式如下:

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称)

课程表(课程ID,教师ID,教师名称,课程描述)

在课程表中,教师ID依赖于课程ID,教师名称又依赖于教师ID,有传递依赖,那么分解第三范式

学生表(学生ID,学生姓名,所在年级,性别)

学生课程表(学生ID,课程ID,课程名称)

课程表(课程ID,教师ID,课程描述)

教师表(教师ID,教师名称)

认识SQL语句

我们了解完数据库以后,就不得不面对一个问题:当请求的数据足够多的时候我们总不能再一个一个的手动建表,插入数据吧,所以这里就要学一个数据库的工具SQL语句,通过SQL语句我们可以很方便的建表,插入数据等操作。

  • SQL语句不区分大小写(关键字推荐使用大写),它支持多行,并且需要使用;进行结尾!
  • 可以用空格和缩进来来增强语句的可读性;

数据库定义语言

数据库操作

通过create database语句创建一个数据库

CREATE DATABASE 数据库名称

为了保障数据库的唯一性所以可以通过添加if not exists语句来判断是否存在

CREATE DATABASE IF NOT EXISTS 数据库名称

删除数据库:drop database

DROP DATABASE IF EXISTS 数据库名称

也可以将数据库的编码格式修改为utf-8

ALTER DATABASE 数据库名称 CHARACTER SET utf8

数据库类型

二进制数据类型包括 Binary、Varbinary 和 Image

  • Binary[(n)] 是 n 位固定的二进制数据。
  • Varbinary[(n)] 是 n 位变长度的二进制数据。

字符数据类型

  • char(n)表示建立一个定长为n的字符串。
  • Varchar 长度不固定,但不能超过n。

用于存储数字的基本数据类型

  • int用于存储一般的整数,范围在 (-2147483648,2147483647)
  • smallint用于存储小的整数,范围在 (-32768,32767)
  • bigint用于存储大型整数,范围在 (-9,223,372,036,854,775,808,9,223,372,036,854,775,807)
  • float用于存储单精度小数
  • double用于存储双精度的小数

用于存储时间的类型

  • data 存储日期
  • time 存储时间
  • year 存储年

操作表

创建格式

CREATE TABLE 表名(
	列名 数据类型,
	列名 数据类型,
	...
);

举例:

CREATE TABLE student(
	sid INT,
	name VARCHAR(255),
	sex VARCHAR(20)
);

查看表结构

DESC 表名;

删除表

DROP TABLE 表名;

修改表:截取自:史上最全SQL基础知识总结(理论+举例)

  • 添加列:给 stu 表添加 classname 列
    ALTER TABLE stu ADD (classname varchar(100));

  • 修改列的数据类型:修改 stu 表的 gender 列类型为 CHAR(2)
    ALTER TABLE stu MODIFY gender CHAR(2);

  • 修改列名:修改 stu 表的 gender 列名为
    sex ALTER TABLE stu change gender sex CHAR(2);

  • 删除列:删除 stu 表的 classname 列
    ALTER TABLE stu DROP classname;

  • 修改表名称:修改 stu 表名称为 student
    ALTER TABLE stu RENAME TO student;

数据库操作语言(DML)

插入数据

使用insert into来为数据库插入一条数据

INSERT INTO 表名 VALUES (数值, 数值, 数值);

上述语句不可以省略某一列,必须把每一列的数值都写上,但这太麻烦了,所以我们可以通过指定列名向指定列表添加数据

INSERT INTO 表名 (列名) VALUES (数值);

我们也可以一次性向数据库中插入多条数据:

INSERT INTO 表名(列名1, 列名2) VALUES(1,2), (1,2), (1,2)
修改数据

通过语句 updata ... set ...来修改表的数据

UPDATE 表名 SET 修改内容 where 约束语句;

比如要把student表中,sid等于1的学生的名字改成小明

UPDATE student SET name='小明' where sid=1;

也可通过逗号进行多项修改

UPDATE student SET name = '小明', sex = '男' where sid = 1;
删除数据

通过delete来删除表中的内容

DELETE FROM 表名

通过上述语句可以删除表中的所有数据,表的属于不变,那要怎么删除指定的行呢,可以通过where添加条件

DELETE FROM 表名 where sid=1;

这样就可以删除学生sid等于1的那一行了,但是添加的条件最好是用主键,不然可能会因为数据重复,造成错误。

数据库查询语句(DQL)

单表查询

单表查询是最简单的一种查询,我们只需要在一张表中去查找数据即可,通过使用select语句来进行单表查询:

-- 指定查询某一列数据
SELECT 列名[,列名] FROM 表名
-- 会以别名显示此列
SELECT 列名 别名 FROM 表名
-- 查询所有的列数据
SELECT * FROM 表名
-- 只查询不重复的值
SELECT DISTINCT 列名 FROM 表名

也可以通过where语句添加查询条件

SELECT * FROM 表名 WHERE 条件
常用插叙条件
  • 一般的比较运算符,包括=、>、<、>=、<=、!=等。
  • 是否在集合中:in、not in
  • 字符模糊匹配:like,not like
  • 多重条件连接查询:and、or、not
排序查询

使用ASC表示升序排序,使用DESC表示降序排序,默认为升序。

查询所有学生记录,按学号升序排序

SELECT * FROM studnet order by sid ASC;

查询所有学生记录,按年龄降序排序,年龄相同按学号排序

SELECT * FROM student ORDER BY age DESC, sid ASC;

聚集函数

聚集函数一般用作统计,包括:

  • count([distinct]*)统计所有的行数(distinct表示去重再统计,下同)
  • count([distinct]列名)统计某列的值总和
  • sum([distinct]列名)求一列的和(注意必须是数字类型的)
  • avg([distinct]列名)求一列的平均值(注意必须是数字类型)
  • max([distinct]列名)求一列的最大值
  • min([distinct]列名)求一列的最小值

查询所有学生的年龄的平均值:

SELECT AVG(age) FROM student;

分组和分页查询

通过使用group by来对查询结果进行分组,它需要结合聚合函数一起使用:

SELECT 聚合函数 FROM 表名 WHERE 条件 GROUP BY 列名

查询以性别分组,每一组的人数:

SELECT sex, COUNT(*) FROM student GROUP BY sex;

结果如下:
在这里插入图片描述
使用where语句来添加条件
查询每个部门的部门编号以及每个部门工资大于 1500 的人数:

SELECT deptno ,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

也可以使用having语句添加限制条件
查询工资总和大于 9000 的部门编号以及工资和:

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

我们发现having和where都可以添加条件,那这两个有什么不同呢?我先来分析一下where,where是在筛选完满足条件的数据后才会将数据送到聚集函数中,而having是先调用完聚集函数再去筛选,也就是说where是针对原有的数据来进行的,而having是针对被集聚函数处理完以后的数据。

我们可以通过limit进行分页:

SELECT * FROM 表名 LIMIT 起始位置,数量

多表查询

自身连接查询:

自身连接,就是将自己和自己进行笛卡尔积计算,得到结果,但是由于表名相同,因此要先起一个别名:

SELECT * FROM 表名 别名1, 表名 别名2
外连接查询

使用inner join进行连接只会显示交集的部分:
在这里插入图片描述
通过使用left join进行左连接,不仅会返回两个表满足条件的交集部分,也会返回左边表中的全部数据,而在右表中缺失的数据会使用null来代替,右连接right join同理
在这里插入图片描述

嵌套查询

我们可以将查询的结果作为另一个查询的条件,比如:

SELECT * FROM 表名 WHERE 列名 = (SELECT 列名 FROM 表名 WHERE 条件);

where 后面依旧是一个条件,括号里面的查询语句可以理解成一个for循环,通过for循环查找出来的东西去进行where判断。
比如查找和小方性别相同的学生:

SELECT * FROM student WHERE sex = (SELECT sex FROM student WHERE name='小方'); 

数据库控制语言(DCL)

一个庞大的数据库不可能只有一个管理员,我们需要多个管理员来一起进行管理。

创建用户
CREATE USER ‘用户名’@地址 IDENTIFIED BY '密码';

我们可以通过@来限制用户登录的登录IP地址,%表示匹配所有的IP地址,默认使用的就是任意IP地址。localhost就是代表本地地址。

用户授权
GRANT 权限 1,, 权限 n ON 数据库.* TO ‘用户名’@地址;
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON student.* TO user1@localhost;
删除用户
DROP USER ‘user1’@localhost;

视图

前面我们创建的表单都是实体表,那么除了实体表肯定也有虚拟表,也就是视图。
视图本身是一个不含任何数据的虚拟表,数据库中存放视图的定义,而不存放视图对应的数据。也就是说视图的唯一作用就是将数据展现在你的眼前。而为什么要建立视图呢,而不去用SELCT操作呢,原因也很简单就是简化操作。我们在建立一个视图以后就不需要重复调用SELECT语句了,直接调用视图就可以。
我们可以通过create view来创建视图

CREATE VIEW 视图名称 as 子查询语句 [WITH CHECK OPTION];

通过drop来删除一个视图:

DROP VIEW 视图名称

索引

在数据量变得非常庞大时,通过创建索引,能够大大提高我们的查询效率,就像Hash表一样,它能够快速地定位元素存放的位置,我们可以通过下面的命令创建索引:

-- 创建索引
CREATE INDEX 索引名称 ON 表名 (列名)
-- 查看表中的索引
show INDEX FROM student

我们也可以通过下面的命令删除一个索引:

drop index 索引名称 on 表名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IPSEC实验(IPSECVPN点到点,DSVPN,IPSECVPN旁挂)

目录一、复现实验1、防火墙的IPSECVPN点到点实验-1,拓扑图的搭建-2&#xff0c;配置IP,开通ping,并且设置策略-3&#xff0c;在网络中的IPSEC进行配置第一阶段&#xff1a;发出的UDP500流量第二阶段 发出的ESP流量二台防火墙建立策略禁用其它策略&#xff0c;在IPSEC上配置策略…

系统应满足的性能指标计算及系统性能衡量

根据运营数据计算系统应该满足的性能指标 计算正常业务操作&#xff08;稳定性测试&#xff09;的并发量 计算峰值业务操作&#xff08;压力测试&#xff09;的并发量 如何进行并发数计算&#xff08;稳定性测试和压力测试&#xff09; 使用阶梯线程组自定义模拟用户数量。 …

前端开发工具-Visual Studio Code-插件下载-迁移到新电脑

背景 前端使用的开发工具一般是Visual Studio Code&#xff0c;很多辅助功能&#xff0c;比如字体高亮、单词拼写检查、预览图片等需要安装插件。但是插件在原来的电脑&#xff0c;不想下载或者自己是新人&#xff0c;想迁移同事的插件&#xff0c;或者新电脑没有外网。 以下…

手把手教学在windows系统上将pytorch模型转为onnx,再转为ncnn的全过程

前言 最近呢&#xff0c;在忙一个项目&#xff0c;需要将pytorch训练的模型部署在移动端。然后遇到也遇到了一些坑&#xff0c;简单的记录一下整个过程&#xff0c;转换的模型就使用经典的分类网络模型mobilenet_v2。 将pytorch模型转换为onnx模型 环境准备 这个步骤比较简…

U+平台和华为软开平台怎么拉取远程项目作为新项目

这是根据聊天记录改的帖子&#xff0c;这样应该算得上是一篇技术博客了吧&#xff0c;又完成一个指标【狗头】 用idea作为开发工具 首先连接校园网&#xff0c;然后进入U网址http://10.5.1.21:30080/student/group 从这进去 修改https密码&#xff0c;选择修改&#xff0c;不…

Ubuntu20.04 安装QGIS

qgis的git&#xff1a; GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址&#xff1a;https://plugins.qgis.org/plugins/ 1.Prerequisi…

前 K 个高频元素(力扣刷题代码随想录刷题)

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路&#xff1a; 要统计元素出现频率对频率排序找出前K个高频元素首先统计元素出现的频率&#xff0c;这一类的问题可以使用map来进行统计。 然后是对频率…

商汤科技推出“日日新SenseNova”,大模型体系赋能人工智能新未来

2023年4月10日&#xff0c;商汤科技SenseTime技术交流日活动在上海举行&#xff0c;分享了以“大模型大算力”推进AGI&#xff08;通用人工智能&#xff09;发展的战略布局&#xff0c;并公布了商汤在该战略下的“日日新SenseNova”大模型体系。 公开信息显示&#xff0c;商汤科…

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

兄弟们天天看基础看腻了吧 今天来分享一下如何使用Python突破某网游游戏JS加密限制&#xff0c;进行逆向解密&#xff0c;实现自动登录。 逆向目标 目标&#xff1a;某 7 网游登录主页&#xff1a;aHR0cHM6Ly93d3cuMzcuY29tLw接口&#xff1a;aHR0cHM6Ly9teS4zNy5jb20vYXBpL…

面试了上百位性能测试后,我发现了一个令人不安的事实...

在企业中负责技术招聘的同学&#xff0c;肯定都有一个苦恼&#xff0c;那就是招一个合适的测试太难了&#xff01;若要问起招哪种类型的测试最难时&#xff0c;相信很多人都会说出“性能测试”这个答案。 每当发布一个性能测试岗位&#xff0c;不一会就能收到上百份简历&#…

商会协会入会资源需求活动小程序开发

商会协会入会资源需求活动小程序开发 功能列表&#xff1a; 用户注册&#xff1a;用户可以通过小程序注册账号并加入商会协会。会员管理&#xff1a;可以管理会员的基本信息&#xff0c;包括个人信息、公司信息、会员资格等级等。同时&#xff0c;管理者可以根据会员等级制定…

JavaSE抽象类和接口

文章目录JavaSE抽象类和接口一、抽象类1、抽象类概念2、抽象类特性二、接口1、接口概念2、接口特性3、多接口4、接口之间的继承5、常用接口使用6、抽象类和接口的区别三、Object类JavaSE抽象类和接口 一、抽象类 1、抽象类概念 一个类中没有包含足够的信息来描绘一个具体的对…

最长公共子序列(动态规划)

Time Limit: 1 Sec Memory Limit: 128 Mb Description 求两个序列的最每组测试样例都为一行&#xff0c;两组字符串&#xff0c;每组不超过1000&#xff0c;用空格隔开。求最长公共子序列&#xff0c;都为小写字母。Input 每组测试样例都为一行&#xff0c;两组字符…

PHP快速入门03-面向对象编程

文章目录前言面向对象编程关于PHP的面向对象编程类的默认方法和属性面向对象编程示例总结前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 面向对象编程 关于PHP的面向对象编程 PHP的面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP…

OK-3399-C ADB烧录

ADB烧写 一、OK3399用户资料工具目录附带了ADB工具的资料包路径&#xff1a; 二、将其解压在C:\User目录 三、将设备通过type-c线download口与电脑相连接&#xff0c;打开命令行&#xff0c;进入解压的目录&#xff0c;查看adb是否安装成功&#xff1a; 四、安装成功后&#x…

gpt4all保姆级使用教程! 不用联网! 本地就能跑的GPT

原文&#xff1a;gpt4all保姆级使用教程! 不用联网! 本地就能跑的GPT 什么是gpt4all gpt4all是在大量干净数据上训练的一个开源聊天机器人的生态系统。它不用科学上网&#xff01;甚至可以不联网&#xff01;本地就能用&#xff0c;像这样↓&#xff1a; 如何使用&#xff…

【针对项目在线OJ系统的测试】:Junit+Selenium

目录 一、背景介绍&#xff1a; 二、导入的依赖&#xff1a; 三、测试模块1&#xff1a;index页面的测试 测试点1&#xff1a;测试"我的OJ系统这4个字是否存在" 测试点2&#xff1a;测试"题目列表"这4个字是否存在 测试点3&#xff1a;测试"编号…

设计模式(十二)之装饰器模式

文章目录什么是装饰器模式例子&#xff1a;总结什么是装饰器模式 现在有一块蛋糕&#xff0c;涂上奶油就变成了奶油蛋糕&#xff0c;如果加上草莓就是草莓奶油蛋糕&#xff0c;再加上蜡烛就变成了生日蛋糕。 程序中的对象与蛋糕十分相似。将对象类比成蛋糕&#xff0c;不断的加…

Faster-RCNN代码解读6:主要文件解读-中

Faster-RCNN代码解读6&#xff1a;主要文件解读-中 前言 ​ 因为最近打算尝试一下Faster-RCNN的复现&#xff0c;不要多想&#xff0c;我还没有厉害到可以一个人复现所有代码。所以&#xff0c;是参考别人的代码&#xff0c;进行自己的解读。 ​ 代码来自于B站的UP主&#xff…

Qt音视频开发36-超时检测和自动重连的设计

一、前言 如果网络环境正常设备正常&#xff0c;视频监控系统一般都是按照正常运行下去&#xff0c;不会出现什么问题&#xff0c;但是实际情况会很不同&#xff0c;奇奇怪怪七七八八的问题都会出现&#xff0c;就比如网络出了问题都有很多情况&#xff08;交换机故障、网线故…