数据库造神计划第五天---增删改查(CRUD)(1)

🔥个人主页: 寻星探路

🎬作者简介:Java研发方向学习者

📖个人专栏:《从青铜到王者,就差这讲数据结构!!!》、** 《JAVA(SE)----如此简单!!!》 、《数据库那些事!!!》**

⭐️人生格言:没有人生来就会编程,但我生来倔强!!!



目录

[一、Create 新增](#一、Create 新增)

1、语法

2、示例

2.1单行数据全列插入

2.2单行数据指定列插入

2.3多行数据指定列插入

[二、Retrieve 检索](#二、Retrieve 检索)

1、语法

2、示例

2.1构造数据

3、Select

3.1全列查询

3.2指定列查询

3.3查询字段为表达式

3.3.1常量表达式

3.3.2把所有学生的语文成绩加10分

3.3.3计算所有学生语文、数学和英语成绩的总分

3.4为查询结果指定别名

3.4.1语法

3.4.2示例

3.5结果去重查询

4、where条件查询

4.1语法

4.2比较运算符

4.3逻辑运算符

4.4示例

4.4.1基本查询

4.4.2AND和OR

4.4.3范围查询

4.4.4模糊查询

4.4.5NULL的查询


CURD是对数据库中的记录进⾏基本的增删改查操作:

• Create(创建)

• Retrieve(读取)

• Update(更新)

• Delete(删除)

作为Java后端开发,未来的主要工作之一就是CRUD

一、Create 新增

1、语法

sql 复制代码
INSERT [INTO] table_name
    [(column [, column] ...)]
VALUES 
    (value_list) [, (value_list)] ...

value_list: value, [, value] ...

2、示例

sql 复制代码
# 创建⼀个⽤于演⽰的表
create table users (
    id bigint,
    name varchar(20) comment '⽤户名'
);

2.1单行数据全列插入

value_list 中值的数量必须和定义表的列的数量及顺序⼀致

sql 复制代码
# 插入第一条记录
insert into users values (1, '张三');

# 插入第二条记录
insert into users values (2, '李四');

#注:

2.2单行数据指定列插入

value_list 中值的数量必须和指定列数量及顺序⼀致

sql 复制代码
# 指定了具体要插⼊的列
insert into users(id, name) values (3, '王五');

2.3多行数据指定列插入

在⼀条INSERT语句中也可以指定多个value_list,实现⼀次插入多行数据

sql 复制代码
# 每个value_list表⽰⼀⾏数据
insert into users(id, name) values (4, '赵六'), (5, '钱七');

二、Retrieve 检索

1、语法

sql 复制代码
SELECT
   [DISTINCT]
   select_expr [, select_expr] ...
   [FROM table_references]
   [WHERE where_condition]
   [GROUP BY {col_name | expr}, ...]
   [HAVING where_condition]
   [ORDER BY {col_name | expr } [ASC | DESC], ... ]
   [LIMIT {[offset,] row_count | row_count OFFSET offset}]

2、示例

2.1构造数据

sql 复制代码
#创建表结构
CREATE TABLE exam (
    id BIGINT,
    name VARCHAR(20) COMMENT '同学姓名',
    chinese float COMMENT '语⽂成绩',
    math float COMMENT '数学成绩',
    english float COMMENT '英语成绩'
);

#插⼊测试数据 
INSERT INTO exam (name, chinese, math, english) VALUES
    (1, '唐三藏', 67, 98, 56),
    (2, '孙悟空', 87, 78, 77),
    (3, '猪悟能', 88, 98, 90),
    (4, '曹孟德', 82, 84, 67),
    (5, '刘⽞德', 55, 85, 45),
    (6, '孙权', 70, 73, 78),
    (7, '宋公明', 75, 65, 30);

3、Select

3.1全列查询

查询所有记录

sql 复制代码
# 使⽤ * 可以查询表中所有列的值
select * from exam;

#注:上述属于数据库的危险操作!!!在公司中,会有很多的环境,同样的代码不同的环境运行的结果就可能不同,所以select * 在生产环境上执行很可能出现问题!!!

3.2指定列查询

查询所有⼈的编号、姓名和语⽂成绩

sql 复制代码
select id,name,chinese from exam;

在select后面的查询列表中指定希望查询的列,可以是一个也可以是多个,中间⽤逗号隔开指定列的顺序与表结构中的列的顺序无关

3.3查询字段为表达式

3.3.1常量表达式
sql 复制代码
# 表达式本⾝就是⼀个常数
select id,name,10 from exam;
sql 复制代码
# 也可以是常量的运算
select id,name,10+1 from exam;
3.3.2把所有学生的语文成绩加10分
sql 复制代码
# 表达式中包含⼀个字段
select id,name,chinese+10 from exam;
3.3.3计算所有学生语文、数学和英语成绩的总分
sql 复制代码
 # 表达式包含多个字段
select id, name, chinese + math + english  from exam;

3.4为查询结果指定别名

3.4.1语法
sql 复制代码
 SELECT column [AS] alias_name [, ...] FROM table_name;

AS 可以省略,别名如果包含空格必须用单引号包裹

3.4.2示例

为总分这⼀列指定别名

sql 复制代码
#为总分这⼀列指定别名
select id, name, chinese + math + english as 总分 from exam;

#注:

(1)不仅可以给表达式起别名,还可以给表起别名!!!

(2)起别名是为了增强代码的可读性(代码的可读性>代码的高效执行)

3.5结果去重查询

行与行之间去重(记录和记录之间去重)

(1)查询当前所有的数学成绩

sql 复制代码
# 通过观察有两条98的记录
select math from exam;

(2)在结果集中去除重复记录,可以使用DISTINCT

sql 复制代码
# 去重查询
select distinct math from exam;

#注:

(1)使用DISCTINCT去重时,只有查询列表中所有列的值都相同才会判定为重复

(2)查询时不加限制条件会返回表中所有结果,如果表中的数据量过大,会把服务器的资源消耗殆尽

(3)在生产环境不要使不加限制条件的查询

4、where条件查询

查询的时候,指定条件,符合条件的行被查询出来,不符合条件的就跳过~~

4.1语法

sql 复制代码
SELECT
 select_expr [, select_expr] ... [FROM table_references]
 WHERE where_condition

4.2比较运算符

#注:

(1)NULL可以参与运算,但是运算结果都是NULL

(2)(NULL==NULL=>NULL=>false)(NULL<=>NULL=>true)

(3)我们谈到区间,大多数时候都是"前闭后开",但是between and是"前闭后闭"!!!

4.3逻辑运算符

4.4示例

4.4.1基本查询

查询英语不及格的同学及英语成绩(<60)

sql 复制代码
select name, english from exam where english < 60;

条件查询执行过程:
1)遍历这个表的每一行数据~~
2)把这一行数据, 代入到条件中
3)如果条件成立(true),此时把这个行加入到结果集合中,如果条件不成立(false),这一行直接跳过
4)当完成所有的遍历过程之后,此时得到了结果集合,还需要根据 select 指定的列/表达式/别名/去重操作
5)再针对结果集合做进一步处理~~

查询语文成绩高于英语成绩的同学

sql 复制代码
select name, chinese, english from exam where chinese > english;

总分在200分以下的同学

sql 复制代码
select name, chinese + math + english as 总分 from exam where chinese + math + english < 200;
4.4.2AND和OR

查询语文成绩大于80分且英语成绩大于80分的同学

sql 复制代码
select * from exam where chinese > 80 and english > 80;

查询语文成绩大于80分或英语成绩大于80分的同学

sql 复制代码
select * from exam where chinese > 80 OR english > 80;

观察AND和OR的优先级

sql 复制代码
select * from exam where chinese > 80 or math > 70 and english > 70;
sql 复制代码
select * from exam where (chinese > 80 or math > 70) and english > 70;

由此可见,and优先级要更高一些,但是和前面一样,尽量加括号,不要去记优先级

4.4.3范围查询

语文成绩在[80,90]分的同学及语文成绩

sql 复制代码
# 使⽤BETWEEN AND 实现
select name, chinese from exam where chinese between 80 and 90;
# 使⽤ AND 实现
select name, chinese from exam where chinese >= 80 and chinese <= 90;

数学成绩是78或者79或者98或者99分的同学及数学成绩

sql 复制代码
# 使⽤IN实现
select name, math from exam where math in (78, 79, 98, 99);
# 使⽤OR实现
select name, math from exam where math = 78 or math = 79 or math = 98 or math = 99;

#注:

between and 描述的是连续的区间~~

in 描述的是离散的集合~~

4.4.4模糊查询

%:0个或者任意个任意字符

_:1 个任意字符

查询所有姓孙的同学

sql 复制代码
select * from exam where name like '孙%';

查询姓孙且姓名共有两个字同学

sql 复制代码
 select * from exam where name like '孙_';

#注:SQL 使用 like 进行模糊匹配, 通常是一个"低效操作"

SQL 的模糊匹配功能其实是非常弱的~~

编程圈子中,对于模糊匹配, 有一套成熟的解决方案,正则表达式~~

例:

4.4.5NULL的查询

构造数据

sql 复制代码
 # 写⼊⼀条数据,英语成绩为NULL
 insert into exam values (8, '张⻜', 27, 0, NULL);

查询英语成绩为NULL的记录

查询英语成绩不为NULL的记录

sql 复制代码
 # 使⽤is not null
select * from exam where english is not null;

NULL与其他值进⾏运算结果为NULL

sql 复制代码
 # 观察结果中的总分
select name, chinese + math + english as 总分 from exam;

#注:

(1)WHERE条件中可以使用表达式,但不能使用别名

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

(3)过滤NULL时不要使用等于号(=)与不等于号(!=,<>)

(4)NULL与任何值运算结果都为NULL

由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!

相关推荐
小虾米vivian2 小时前
达梦:将sql通过shell脚本的方式放在后台执行
服务器·数据库·sql
水无痕simon2 小时前
1. 数据库架构演变与分库分表介绍
数据库·数据库架构
专注代码七年3 小时前
查询 mysql中 所有的 非空记录字段
数据库·mysql
a.3023 小时前
OpenCV(cv2)学习笔记:从模板匹配入门到常用函数
数据库·ubuntu·ssh
大视码垛机3 小时前
速度与安全双突破:大视码垛机重构工业自动化新范式
大数据·数据库·人工智能·机器人·自动化·制造
向上的车轮4 小时前
如何用 Rust 重写 SQLite 数据库(二):是否有市场空间?
数据库·rust·sqlite
jc06204 小时前
4.2-中间件之MySQL
数据库·mysql
熊文豪4 小时前
KingbaseES读写分离集群架构解析
数据库·架构·kingbasees·金仓数据库·电科金仓