【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(用…

【基础算法】二分模板及常见题型

整数二分 模板 模板来自于AcWing&#xff1a; int[] nums new int[n];// 模板1: // l mid // mid l r 1 >> 1; int l 0, r n - 1; // [0, n - 1] while (l < r) {int mid l r 1 >> 1;if (check(mid)) l mid;else r mid - 1; }// 模板2: // r …

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

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

JWT令牌技术

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

JVM优化Java代码的秘密:深入解析JVM的内部工作机制

JVM优化Java代码的秘密&#xff1a;深入解析JVM的内部工作机制 当我们谈论Java性能优化时&#xff0c;JVM&#xff08;Java虚拟机&#xff09;的优化策略是无法回避的话题。JVM是Java应用的运行环境&#xff0c;它负责将Java字节码转换为可在特定操作系统和硬件上运行的机器码…

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 一…

linux系统docker的使用命令

docker命令 命令镜像操作镜像查找镜像拉取查看镜像制作过程推送镜像查看镜像修改名字查看镜像的详细信息删除镜像查看镜像所占空间 容器操作运行容器查看容器查看容器详细信息删除容器启动容器停止容器重启容器暂停容器激活容器杀死容器进入容器查看容器的日志复制文件重命名容…

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…

[嵌入式系统-38]:龙芯1B 开发学习套件 -8-启动过程详解

目录 一、启动程序的入口 二、初始化硬件浮点单元fpu 三、全局指针 四、设置系统栈 五、设置内存 六、设置Cache 七、配置协处理器 八、初始化TLB 一、启动程序的入口 FRAME(_start, sp, 0, ra)&#xff1a;这一行是一个汇编宏&#xff0c;用于创建一个函数框架。_star…

递归搜索回溯相关的题目解析和练习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;其主要原…

测试Tomcat是否安装成功

bin目录下有一个文件&#xff1a;startup.batxxx.bat文件是windows操作系统专用的&#xff0c;bat文件是批处理文件&#xff0c;这种文件可以编写大量的Windows的dos命令&#xff0c;然后执行bat文件就相当于批量的执行dos命令start.sh这个文件在Windows当中无法执行&#xff0…

分割模型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}}"…