【Java.mysql】——增删查改(CRUD)之 增查(CR) 附加数据库基础知识

目录

🚩数据库操作

🎈创建数据库

🎈使用数据库

🎈删除数据库

🚩数据类型

🚩表的操作

🎈创建表

🌈查看表结构

🎈删除表

❗练习(综合运用)

🖥️新增数据

📝单行数据 + 全列插入

📝多行数据 + 指定列插入

🖥️查询(Retrieve)

📝全列查询

📝指定列查询

📝查询字段为表达式

📝别名

📝去重:DISTINCT

📝排序:ORDER BY

📝条件查询:WHERE

✅select条件查询执行顺序


这是准备工作,数据库是大小写不区分的,所以我建议是大家都写小写,可读性好。

🚩数据库操作

🎈创建数据库

创建数据库的语法就是 

 create database zyficl;

我们也可以加上 if not exists 代表的意思是 如果你现在创建的数据库存在那么就不添加,反之添加。 (如果你所创建的数据库已经存在,但是你没有添加if not exists,那么就会报错)

所以我们以后可以加上上面一段,那样就不会报错了


说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则
是:utf8_ general_ ci,MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是使用utf8mb4,建议大家都使用utf8mb4
设置字符集 
CHARACTER SET 字符集;

所以最完美的写法就是:

 create database if not exists do_test character set utf8mb4;

🎈使用数据库

因为我们再进入命令行中的时候,默认是系统的数据库,我们一般都不在系统默认的数据库下进行数据的增删查改,而是在自己所建的数据库中对数据管理,所以我们就要 进入自己的数据库中,这时候我们就用到下面的语句:

use 数据库名;

🎈删除数据库

drop database [if exists] db_name;

上面增加数据库用到if not exists表示是否不存在 ,现在删除数据库需要用到if exists表示是否存在。

数据库删除以后,内部看不到对应的数据库,里边的表和数据全部被删除,所以要慎重删除。

🚩数据类型

我们下面会根据题目来针对性的对一些数据类型进行描述,我们现在利用主要的几个类型

INT:整型
比如 年龄,商品编号,身份证号等等这些是int类型。
DECIMAL(M, D):浮点数类型
钱价格这个基本上都是精确到小数位,比如99.9 
这里的decimal中的俩个参数分别是 M表示长度 D是代表小数点位数。比如99.9 M是3 D是1,长度是3,小数点位数是1.像100.0,100,1.25,都是不合法的。
VARCHAR(SIZE):字符串类型
并不说是size大小的,而是如果你达到size大小的时候 是可变的。
CHAR(SIZE):字符类型
是不可变长的
TIMESTAMP:日期类型

DATETIME:日期类型

后面再插入数据的时候会详细说明。


🚩表的操作

需要操作数据库中的表时,我们需要先使用数据库。

use 数据库名;

🎈创建表

可以使用comment增加字段说明

CREATE TABLE table_name (field1 datatype,  字段 类型field2 datatype,  字段 类型field3 datatype   字段 类型
);

我们创建一个学生表里面包含的字段 (姓名,年龄,密码,性别,身高,体重,生日,留言)

🌈查看表结构


🎈删除表

-- 删除 stu_test 表
drop table stu_test;
-- 如果存在 stu_test 表,则删除 stu_test 表
drop table if exists stu_test;

❗练习(综合运用)

商品 goods( 商品编号 goods_id ,商品名 goods_name, 单价 unitprice, 商品类别 category,
应商 provider)
1.创建数据库 并且设置编码 utf8mb4
 create database if not exists test_goodsdefault character set utf8mb4;

2.选择数据库

 use test_goods;
3.创建goods表并添加字段
商品 goods( 商品编号 goods_id ,商品名 goods_name, 单价 unitprice, 商品类别 category,
应商 provider)
create table if not exists goods(goods_id int comment'商品编号',goods_name varchar(32) comment'商品名称',unitprice int comment'单价.单位分',category varchar(12) comment'商品分类',provider varchar(64) comment'供应商名称');
对于钱最好的设定类型是int,因为 0.5元相当于 50分. 

🖥️新增数据

个数,类型要和表结构匹配。

现在创建一个学生表

drop table if exists student;
create table student(id int,sn int comment'学号',name varchar(20) comment'姓名',qq_mail varchar(20) comment'qq邮箱') default character set utf8;

📝单行数据 + 全列插入

insert into 表名 values(值,值,值....);
插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
insert into student values(100,10000,"唐三藏",NULL);insert into student values(101,10001,"孙悟空","1111");

📝多行数据 + 指定列插入

insert into 表名(列名,列名....)values(值,值.....);

只给某指定的列进行插入数据。其实就是增加行元素。

insert into student(id,sn,name)values(102,20001,"曹孟德"),(103,20002,"孙仲谋");

补充:

在MySQL中,你可以使用DATETIME数据类型来表示日期和时间。DATETIME类型以'YYYY-MM-DD HH:MM:SS'的格式存储日期和时间。

以下是如何在MySQL中使用DATETIME类型的示例:

CREATE TABLE example_table ( id INT AUTO_INCREMENT PRIMARY KEY, event_datetime DATETIME );

在这个示例中,我们创建了一个名为example_table的表,其中包含一个名为event_datetime的DATETIME类型列。

你可以使用INSERT语句向表中插入日期时间值,如下所示:

INSERT INTO example_table (event_datetime) VALUES ('2024-03-09 15:30:00');

你也可以使用DATETIME函数来获取当前日期时间

INSERT INTO example_table (event_datetime) VALUES (NOW());

在检索数据时,DATETIME值将以'YYYY-MM-DD HH:MM:SS'的格式返回。


🖥️查询(Retrieve)

📝全列查询

select*from 表名; //行和列都查询出来

这就是我们刚刚插入的数据。
我们新建一个表更加直观的用于下面的案例: -- 创建考试成绩表
create table if not exists exam_result(id int,name varchar(20),chinese decimal(3,1),math decimal(3,1),english decimal(3,1))default character set utf8;
-- 插入测试数据
INSERT INTO exam_result (id,name, chinese, math, english) VALUES(1,'唐三藏', 67, 98, 56),(2,'孙悟空', 87.5, 78, 77),(3,'猪悟能', 88, 98.5, 90),(4,'曹孟德', 82, 84, 67),(5,'刘玄德', 55.5, 85, 45),(6,'孙权', 70, 73, 78.5),(7,'宋公明', 75, 65, 30);

📝指定列查询

指定列的顺序不需要按定义表的顺序来
select 列名,列名,列名 from 表名;
select id,name,english from exam_result;

我指定要查找姓名,英语成绩,id号从成绩表中:


📝查询字段为表达式

查询每个学生语文数学英语的总成绩:

select name,chinese+english+math from exam_result;

-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;

补充:

SELECT id, name, english + 10 FROM exam_result;

mysql是一个“客户端服务器”结构程度。我们看到上面的结果后,我们得出一个结论:把这一列所有的行带入到表达式中,参与运算,操作不会修改数据库服务器上原始的数据,最终只是临时结果做计算,服务器读出来的时候,返回客户端,以临时表的形式(只出现一次i)


📝别名

为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称,语法
select 列名 as 别名 from 表名;
select name,math+english+chinese as total from exam_result;


📝去重:DISTINCT

我增加一个和唐三藏一样的数学成绩的陈陈,然后我要去重相同的数学成绩

一列:

我们看到最后的98.0和第一个98.0删除了,最后只保留一个。

俩列:

如果是俩列必须是俩者都相同才能去重,如果俩者都相同只保留一个操作。不相同删除不了。

我现在插入一个姓名"陈陈”,数学成绩是98.0的

insert into exam_result (name,math) values ("陈陈",98.0);

此时我来去重:此时就剩下一个了。


📝排序:ORDER BY

明确排序规则:以行排列 但是比较的是列与列之间。

  • a.针对哪个列进行比较
  • b.升序(asc),降序(desc),默认是asc
select 列名 from 表名 order by 列名 (asc/desc/不写);

1. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序 

sql不加order by 此时查询结果数据顺序,是不确定/无序 的,因为我们在自己机器上做的是一些简单的操作,顺序没变,但是如果进行一些更复杂的操作,就不一定了。(意思就是如果我们查看全列表数据,因为我们插入的数据都是简单的,所以每次查看到的时候发现都是一样的排序,但是如果我们操作的复杂,那么会导致每次查看数据的时候就不一定是还是和之前一次是一样的。

我们不能依赖顺序,尤其在代码中,不能依靠上述顺序展开逻辑,因为数据库没有承诺你这个数据库是有序的。所以在后来我们运用了复杂的操作,每次操作展示的顺序是不同的,是不确定。


2. NULL 数据排序,视为比任何值都小,升序(src)出现在最上面,降序(desc)出现在最下面

3.使用表达式及别名排序

4. 可以对多个字段进行排序,排序优先级随书写顺序


📝条件查询:WHERE

会指定具体的条件,按照条件针对数据进行筛选。

sql中没有==,使用=表示比较相等。
NULL+98+NULL => NULL<200 => NULL =>false
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=> 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!= , <>不等于
BETWEEN a0 AND a1  范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, ...) 如果是 option 中的任意一个,返回 TRUE(1)
IS NULL 是 NULL
IS NOT NULL  不是 NULL
LIKE 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

1.基本查询:
-- 查询英语不及格的同学及英语成绩 ( < 60 )
SELECT name, english FROM exam_result WHERE english < 60;

-- 查询语文成绩好于英语成绩的同学
SELECT name, chinese, english FROM exam_result WHERE chinese > english

--查询总分在 200 分以下的同学
select name,chinese+english+math from exam_result where chinese+english+math<200;

 

如果我们用as别名 

会报错,所以我们要注意: WHERE条件可以使用表达式,但不能使用别名。

✅select条件查询执行顺序

  • 1.遍历表中的每个记录
  • 2.当前记录值带入条件,根据条件进行筛选 where
  • 3.如果这个记录条件成立,就要保留,进行表达式计算
  • 4.如果有order by所以都执行完之后,在进行排序(所以上面的order by可以定义别名)

所以where可以使用表达式,但是不能使用别名。

2.AND与OR:
and是且(俩个都得成立才成立)
or是或(其实一个成立就成立)
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select name,chinese,english from exam_result where chinese>80 and english>80;

-- 查询语文成绩大于80分,或英语成绩大于80分的同学(其中一个满足即可)

-- 查询语文成绩大于80分,或数学成绩大于70,并且英语成绩大于70 的同学(意思就是语文和数学成绩其中一个满足即可,但是英语成绩必须大于70)

我们不用记and优先级大于or,我们只需要将or操作打上括号即可。

 AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分


 3.范围查询between..and (闭区间)

        ​​​​​​​In()

---查询语文成绩在 [80, 90] 分的同学及语文成绩 闭区间
select name,chinese from exam_result where chinese between 80 and 90;

 select name,chinese from exam_result where chinese>=80 and chinese<=90;


In()相当于随机抽取学生,而不是一个范围

-- 查询数学成绩是 98 或者 65 或者 84 的同学及数学成绩

select name,math from exam_result where math in(98,65,84);


使用 OR 也可以实现
SELECT name, math FROM exam_result WHERE math = 58 OR math = 65 OR math
= 98 ;

4.模糊查询:LIKE
-- % 匹配任意多个(包括 0 个)字符 
我要找名字里包含孙的人

孙开头  select name from exam_result where name like "孙%";

孙结尾  select name from exam_result where name like "%孙";

包含孙 select name from exam_result where name like "%孙%";

-- _ 匹配严格的一个任意字符
我要找名字姓孙俩个字名字的人


5.NULL 的查询:IS [NOT] NULL

查询 english成绩 已知的同学姓名

查询 english成绩 未知的同学姓名


5.分页查询:LIMIT
-- 起始下标为 0
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

按id进行分页,每页三条记录,分别显示1,2,3页

接下来就是从下标3开始

 接下来就是从下标3开始

此时为空。因为表中只有9行。 


自信大方,机会总是留给有准备的人的。

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

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

相关文章

微信小程序提示确认框

如图所示&#xff0c;如何弹出微信小程序自带默认弹框&#xff1f; 代码如下&#xff1a; wx.showModal({ title: 确认, content: 确定要删除吗&#xff1f;, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用…

STM32CubeIDE基础学习-STM32CubeIDE软件程序仿真调试

STM32CubeIDE基础学习-STM32CubeIDE软件程序仿真调试 前言 一般编写完程序后都会进行编译&#xff0c;看结果是否有存在语法错误&#xff0c;确认没有语法错误之后再进行代码的下载观察硬件执行是否和软件编程预期的结果一致&#xff0c;如果发现硬件执行达不到预期现象&#…

JWT令牌技术

写在前面 我以为&#xff0c;最美的日子&#xff0c;当是晨起侍花&#xff0c;闲来煮茶&#xff0c;阳光下打盹&#xff0c;细雨中漫步&#xff0c;夜灯下读书&#xff0c;在这清浅时光里&#xff0c;一半烟火&#xff0c;一半诗意&#xff0c;任窗外花开花落&#xff0c;云来云…

no main manifest attribute,in xxx.jar(关于Spring项目,无法在云服务器上运行jar包的解决方法)

目录 问题详情 解决方法 问题详情 项目可以打包正常&#xff0c;但是云服务器上无法运行&#xff0c;报错&#xff1a;no main manifest attribute&#xff0c;in xxx.jar 解决方法 1.查看pom.xml配置文件&#xff0c;检查以下代码&#xff0c;没有则加上&#xff1a; <…

B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】

导语&#xff1a; 详解B树与跳表的结构及区别&#xff0c;描述B树与跳表新增数据的过程&#xff0c;解释MySQL与Redis选择对应结构的原因。 mysql数据表里直接遍历这一行行数据&#xff0c;性能就是O(n)&#xff0c;比较慢。为了加速查询&#xff0c;使用了B树来做索引&#x…

HTML5 Web Worker之性能优化

描述 由于 JavaScript 是单线程的&#xff0c;当执行比较耗时的任务时&#xff0c;就会阻塞主线程并导致页面无法响应&#xff0c;这就是 Web Workers 发挥作用的地方。它允许在一个单独的线程&#xff08;称为工作线程&#xff09;中执行耗时的任务。这使得 JavaScript 代码可…

第三周组会——动态多目标优化算法

首先对上周写的DF测试函数进行了优化和增加 DF4 pf: DF5测试函数PF DF6 遇到的问题,在算法问题的参数taut(变化频率)默认是10数字变小时就算是9,算法会跟不上收敛 新读的文献 A Novel Dynamic Multiobjective Optimization Algorithm With Hierarchical Response System 一…

1.2_3 TCP/IP参考模型

文章目录 1.2_3 TCP/IP参考模型&#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型&#xff08;二&#xff09;5层参考模型&#xff08;三&#xff09;5层参考模型的数据封装与解封装 1.2_3 TCP/IP参考模型 &#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型 TCP/I…

【理解指针(1)】

理解指针&#xff08;1&#xff09; 1什么是内存2指针变量和地址21 取地址操作符&#xff08;&&#xff09;22 指针变量23 解引用操作符&#xff08;*&#xff09;24 指针变量的大小 3指针变量的意义31指针的解引用32 指针加减整数33 void* 指针 4. const 修饰指针41 const…

递归搜索回溯相关的题目解析和练习2

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;下面的题目用的方法和前面几篇的方法是一样的&#xff0c;写起来是比较困难的&#xff0c;加油 字母大小写全排列 https://leetcode.cn/problems/letter-case-permutation/ 解析 代码 class Solution {vector<string&g…

【Docker】容器的概念

容器技术&#xff1a;容器技术是基于虚拟化技术的&#xff0c;它使应用程序从一个计算机环境快速可靠地转移到另一个计算机环境中&#xff0c;可以说是一个新型地虚拟化技术。 一、docker容器 Docker:是一个开源地容器引擎Docker 是一种轻量级的容器化技术&#xff0c;其主要原…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…

三维不同坐标系下点位姿态旋转平移变换

文章目录 前言正文计算方法思路Python实现总结前言 本文主要说明以下几种场景3D变换的应用: 3D相机坐标系下长方体物体,有本身坐标系,沿该物体长边方向移动一段距离,并绕长边轴正旋转方向转90度,求解当前物体中心点在相机坐标系下的位置和姿态多关节机器人末端沿工具坐标…

STM32 利用FlashDB库实现在线扇区数据管理不丢失

STM32 利用FlashDB库实现在线扇区数据管理不丢失 &#x1f4cd;FalshDB地址:https://gitee.com/Armink/FlashDB ✨STM32没有片内EEPROM这样的存储区&#xff0c;虽然有备份寄存器&#xff0c;仅可以实现对少量数据的频繁存储&#xff0c;但是依赖备份电源&#xff08;BAT引脚&a…

美国签证|附面签相关事项√

小伙伴最近都忙着办签证吧&#xff01;但是需要注意的是&#xff0c;美国的签证跟其他任何国家的签证不同&#xff0c;并不是办理了就一定拿得到&#xff0c;据说概率是50%左右。所以办理美国签证&#xff0c;不要太着急啦&#xff01;先来了解一下美国签证的相片该怎么拍叭 ✅…

RocketMQ的事务消息流程

什么是事务消息&#xff1f; 事务消息是一种在发送方和接收方之间保证消息传递的一致性和可靠性的消息传递机制。在消息发送过程中&#xff0c;生产者可以将消息发送到消息队列&#xff0c;但不会立即被消费者接收和处理。相反&#xff0c;消息会先进入一种“准备”状态&#x…

用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦

突发奇想&#xff0c;想用chatgpt写一篇论文&#xff0c;并看看查重率&#xff0c;结果很惊艳&#xff0c;说明是确实可行的&#xff0c;请看下图。 下面是完整的文字内容。 InSAR (Interferometric Synthetic Aperture Radar) 地质灾害监测技术是一种基于合成孔径雷达…