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

news2024/11/18 23:25:36

目录

🚩数据库操作

🎈创建数据库

🎈使用数据库

🎈删除数据库

🚩数据类型

🚩表的操作

🎈创建表

🌈查看表结构

🎈删除表

❗练习(综合运用)

🖥️新增数据

📝单行数据 + 全列插入

📝多行数据 + 指定列插入

🖥️查询(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_goods
  default 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.coloradmin.cn/o/1505844.html

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

相关文章

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

三、实战篇 优惠券秒杀

源码仓库地址&#xff1a;gitgitee.com:chuangchuang-liu/hm-dingping.git 1、全局唯一ID 数据库默认自增的存在的问题&#xff1a; id增长规律明显受单表数据量的限制 场景一分析&#xff1a;id如果增长规律归于明显&#xff0c;容易被用户或者商业对手猜测出一些敏感信息&…

【JavaScript】JavaScript 变量 ① ( JavaScript 变量概念 | 变量声明 | 变量类型 | 变量初始化 | ES6 简介 )

文章目录 一、JavaScript 变量1、变量概念2、变量声明3、ES6 简介4、变量类型5、变量初始化 二、JavaScript 变量示例1、代码示例2、展示效果 一、JavaScript 变量 1、变量概念 JavaScript 变量 是用于 存储数据 的 容器 , 通过 变量名称 , 可以 获取 / 修改 变量 中的数据 ; …

C语言——函数指针——函数指针变量(详解)

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

VBA_NZ系列工具NZ02:VBA读取PDF使用说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

C#MQTT编程10--MQTT项目应用--工业数据上云

1、文章回顾 这个系列文章已经完成了9个内容&#xff0c;由浅入深地分析了MQTT协议的报文结构&#xff0c;并且通过一个有效的案例让伙伴们完全理解理论并应用到实际项目中&#xff0c;这节继续上马一个项目应用&#xff0c;作为本系列的结束&#xff0c;奉献给伙伴们&#x…

AOP切面编程,以及自定义注解实现切面

AOP切面编程 通知类型表达式重用表达式切面优先级使用注解开发&#xff0c;加上注解实现某些功能 简介 动态代理分为JDK动态代理和cglib动态代理当目标类有接口的情况使用JDK动态代理和cglib动态代理&#xff0c;没有接口时只能使用cglib动态代理JDK动态代理动态生成的代理类…

Autosar教程-Mcal教程-GPT配置教程

3.3GPT配置、生成 3.3.1 GPT配置所需要的元素 GPT实际上就是硬件定时器,需要配置的元素有: 1)定时器时钟:定时器要工作需要使能它的时钟源 2)定时器分步:时钟源进到定时器后可以通过分频后再给到定时器 定时器模块选择:MCU有多个定时器模块,需要决定使用哪个定时器模块作…

基于Yolo5模型的动态口罩佩戴识别安卓Android程序设计

禁止完全抄袭&#xff0c;引用注明出处。 下载地址 前排提醒&#xff1a;文件还没过CSDN审核&#xff0c;GitHub也没上传完毕&#xff0c;目前只有模型的.pt文件可以下载。我会尽快更新。 所使用.ptl文件 基于Yolo5的动态口罩佩戴识别模型的pt文件资源-CSDN文库 项目完整文…

使用 Docker 部署 Next Terminal 轻量级堡垒机

1&#xff09;Next Terminal 介绍 官网&#xff1a;https://next-terminal.typesafe.cn/ GitHub&#xff1a;https://github.com/dushixiang/next-terminal 想必经常玩服务器的都了解过 堡垒机&#xff0c;类似于跳板机&#xff0c;但与跳板机的侧重点不同。堡垒机的主要功能是…

python编程从入门到实践答案二

python编程从入门到实践 第五章 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff…

前端加密面面观:常见场景与方法解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

单链表(下)

我们在单链表&#xff08;上&#xff09;中了解了一些需要实现的函数&#xff0c;这一篇就让我们一起来实现。 1.创建新节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.计算节点个数 9.在指定位置之前插入数据 10.在指定位置之前插入数据 11.删除指定位置的节点 12.删除指…

RIPEMD算法:多功能哈希算法的瑰宝

title: RIPEMD算法&#xff1a;多功能哈希算法的瑰宝 date: 2024/3/10 17:31:17 updated: 2024/3/10 17:31:17 tags: RIPEMD起源算法优势安全风险对比SHA优于MD5应用领域工作原理 一、RIPEMD算法的起源与历程 RIPEMD&#xff08;RACE Integrity Primitives Evaluation Messag…

阿里云服务器多少钱一年?价格表新鲜出炉(2024)

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

维修家用美容射频美容仪

今天收到客户寄过来的一款家用射频美容仪。根据客户的反馈&#xff0c;插电开机没反应&#xff0c;经过排查&#xff0c;原来是12v-2A电源坏了。给客户更换一个新电源就可以了。

Mysql 死锁案例2-间隙锁与意向插入锁冲突

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10) 事务1事务2T1START …

【Linux】常用操作命令

目录 基本命令关机和重启帮助命令 用户管理命令添加用户&#xff1a;useradd 命令修改密码&#xff1a;passwd 命令查看登录用户&#xff1a;who 命令查看登录用户详细信息 :w切换用户 目录操作命令cdpwd命令目录查看 ls [-al] 目录操作【增&#xff0c;删&#xff0c;改&#…

Jenkins 部署 RuoYi

目录 1、项目介绍 2、部署若依 clone 源代码 导入数据库到 node-16 修改 RuoYi 配置文件 推送 RuoYi 项目至 Gitlab 3、配置 Jenkins 配置本地 Maven Jenkins 配置 Maven 新建 Maven 项目 编写构建后的脚本 Jenkins 构建后执行脚本 4、Jenkins 传递参数 设置项目部…

el-table 插入输入框并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…