【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.hqwc.cn/news/526108.html

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

相关文章

腾讯面经学习笔记

&#x1f496; 前言 &#x1f469;‍&#x1f3eb; 参考地址 &#x1f496; 操作系统 1. 进程和线程的区别 本质区别 进程是操作系统资源分配的基本单位线程是任务调度和执行的基本单位 开销方面 每个进程都有独立的代码和数据空间&#xff08;程序上下文&#xff09;&#…

Matlab|【EI复现】电动汽车集群并网的分布式鲁棒优化调度模型

目录 1 内容简介 2 关键知识点 2.1 三类电动汽车模型 3 程序结果 4 下载链接 1 内容简介 电动汽车的数据模型种类繁多&#xff0c;但是用到比较高阶数学方法的并不多&#xff0c;本次分享的程序是下图所示的文章。 采用分布鲁棒优化模型&#xff0c;用到鲁棒对等转换&…

初识Python(helloworld、海洋距离单位换算、打印名片、文本进度条、判断水仙花数)

一、Python3的安装&#xff0c;IDLE的使用&#xff1a;使用print函数输出”hello world”&#xff1b; 二、 PyCharm的安装与使用&#xff1a;创建”hello_world.py”文件并使用print函数输出”hello world” 三、海洋单位距离换算 要求&#xff1a;运行代码&#xff0c;控制台…

德国史托斯 KARL STORZ tricam SLII telecam SLII SCBI thermoflator xenen 300 维修

德国史托斯 KARL STORZ tricam SLII telecam SLII SCBI thermoflator xenen 300 维修

空间复杂度的OJ练习——轮转数组

旋转数组OJ链接&#xff1a;https://leetcode-cn.com/problems/rotate-array/ 题目&#xff1a; 思路&#xff1a; 通过题目我们可以知道这是一个无序数组&#xff0c;只需要将数组中的数按给定条件重新排列&#xff0c;因此我们可以想到以下几种方法&#xff1a; 1.暴力求解法…

docker-compose这下会用了吗?

概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置的选项(例如&#xff1a;CMD, EXPOSE, V…

arduino安装索尼spresense开发库

arduino安装索尼spresense开发库 一.库安装二.库文件下载1.直接下载2.git下载1.git加速下载2.git下载加速3.将文件导入arduino 一.库安装 打开arduino点击文件->首选项 将以下链接添加进附加开发板管理器网址 https://github.com/sonydevworld/spresense-arduino-compatib…

思科网络中如何配置标准ACL协议

一、什么是标准ACL协议&#xff1f;有什么作用及配置方法&#xff1f; &#xff08;1&#xff09;标准ACL&#xff08;Access Control List&#xff09;协议是一种用于控制网络设备上数据流进出的协议。标准ACL基于源IP地址来过滤数据流&#xff0c;可以允许或拒绝特定IP地址范…

Java17 --- springCloud之LoadBalancer

目录 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom 1.3、80服务controller层&#xff1a; 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom <!--loadbalancer-->&…

Python学习之基础语法

一、HelloWorld 二、Python基础语法 2.1 字面量 定义&#xff1a;在代码中&#xff0c;被写下来的固定的值&#xff0c;称之为字面量。 常用的6种值的类型 字符串 Python中&#xff0c;字符串需要用双引号包围&#xff1b; 被双引号包围的都是字符串 666 13.14 "黑马…

记一次项目所学(中间件等)-动态提醒功能(RocketMQ)

记一次项目所学(中间件等&#xff09;–动态提醒功能&#xff08;RocketMQ&#xff09; 订阅发布模式与观察者模式 RocketMQ&#xff1a;纯java编写的开源消息中间件 高性能低延迟分布式事务 Redis : 高性能缓存工具&#xff0c;数据存储在内存中&#xff0c;读写速度非常快 …

解释区块链技术的应用场景、优势及经典案例

目录 1.区块链应用场景 2.区块链优势 3.区块链经典案例 区块链技术是一种分布式账本技术&#xff0c;它通过加密和安全验证机制&#xff0c;允许网络中的多个参与者之间进行可信的、不可篡改的交易和数据的记录与传输。区块链技术的应用场景广泛&#xff0c;其优势也十分显著…