数据库造神计划第五天---增删改查(CRUD)(1)
🔥个人主页:寻星探路
🎬作者简介:Java研发方向学习者
📖个人专栏:《从青铜到王者,就差这讲数据结构!!!》、 《JAVA(SE)----如此简单!!!》、《数据库那些事!!!》
⭐️人生格言:没有人生来就会编程,但我生来倔强!!!
目录
一、Create 新增
1、语法
2、示例
2.1单行数据全列插入
2.2单行数据指定列插入
2.3多行数据指定列插入
二、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、语法
INSERT [INTO] table_name[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...value_list: value, [, value] ...
2、示例
# 创建⼀个⽤于演⽰的表
create table users (id bigint,name varchar(20) comment '⽤户名'
);
2.1单行数据全列插入
value_list 中值的数量必须和定义表的列的数量及顺序⼀致
# 插入第一条记录
insert into users values (1, '张三');# 插入第二条记录
insert into users values (2, '李四');
#注:
2.2单行数据指定列插入
value_list 中值的数量必须和指定列数量及顺序⼀致
# 指定了具体要插⼊的列
insert into users(id, name) values (3, '王五');
2.3多行数据指定列插入
在⼀条INSERT语句中也可以指定多个value_list,实现⼀次插入多行数据
# 每个value_list表⽰⼀⾏数据
insert into users(id, name) values (4, '赵六'), (5, '钱七');
二、Retrieve 检索
1、语法
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构造数据
#创建表结构
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全列查询
查询所有记录
# 使⽤ * 可以查询表中所有列的值
select * from exam;
#注:上述属于数据库的危险操作!!!在公司中,会有很多的环境,同样的代码不同的环境运行的结果就可能不同,所以select * 在生产环境上执行很可能出现问题!!!
3.2指定列查询
查询所有⼈的编号、姓名和语⽂成绩
select id,name,chinese from exam;
在select后面的查询列表中指定希望查询的列,可以是一个也可以是多个,中间⽤逗号隔开指定列的顺序与表结构中的列的顺序无关
3.3查询字段为表达式
3.3.1常量表达式
# 表达式本⾝就是⼀个常数
select id,name,10 from exam;
# 也可以是常量的运算
select id,name,10+1 from exam;
3.3.2把所有学生的语文成绩加10分
# 表达式中包含⼀个字段
select id,name,chinese+10 from exam;
3.3.3计算所有学生语文、数学和英语成绩的总分
# 表达式包含多个字段
select id, name, chinese + math + english from exam;
3.4为查询结果指定别名
3.4.1语法
SELECT column [AS] alias_name [, ...] FROM table_name;
AS 可以省略,别名如果包含空格必须用单引号包裹
3.4.2示例
为总分这⼀列指定别名
#为总分这⼀列指定别名
select id, name, chinese + math + english as 总分 from exam;
#注:
(1)不仅可以给表达式起别名,还可以给表起别名!!!
(2)起别名是为了增强代码的可读性(代码的可读性>代码的高效执行)
3.5结果去重查询
行与行之间去重(记录和记录之间去重)
(1)查询当前所有的数学成绩
# 通过观察有两条98的记录
select math from exam;
(2)在结果集中去除重复记录,可以使用DISTINCT
# 去重查询
select distinct math from exam;
#注:
(1)使用DISCTINCT去重时,只有查询列表中所有列的值都相同才会判定为重复
(2)查询时不加限制条件会返回表中所有结果,如果表中的数据量过大,会把服务器的资源消耗殆尽
(3)在生产环境不要使不加限制条件的查询
4、where条件查询
查询的时候,指定条件,符合条件的行被查询出来,不符合条件的就跳过~~
4.1语法
SELECTselect_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)
select name, english from exam where english < 60;
条件查询执行过程:
1)遍历这个表的每一行数据~~
2)把这一行数据, 代入到条件中
3)如果条件成立(true),此时把这个行加入到结果集合中,如果条件不成立(false),这一行直接跳过
4)当完成所有的遍历过程之后,此时得到了结果集合,还需要根据 select 指定的列/表达式/别名/去重操作
5)再针对结果集合做进一步处理~~
查询语文成绩高于英语成绩的同学
select name, chinese, english from exam where chinese > english;
总分在200分以下的同学
select name, chinese + math + english as 总分 from exam where chinese + math + english < 200;
4.4.2AND和OR
查询语文成绩大于80分且英语成绩大于80分的同学
select * from exam where chinese > 80 and english > 80;
查询语文成绩大于80分或英语成绩大于80分的同学
select * from exam where chinese > 80 OR english > 80;
观察AND和OR的优先级
select * from exam where chinese > 80 or math > 70 and english > 70;
select * from exam where (chinese > 80 or math > 70) and english > 70;
由此可见,and优先级要更高一些,但是和前面一样,尽量加括号,不要去记优先级
4.4.3范围查询
语文成绩在[80,90]分的同学及语文成绩
# 使⽤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分的同学及数学成绩
# 使⽤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 个任意字符
查询所有姓孙的同学
select * from exam where name like '孙%';
查询姓孙且姓名共有两个字同学
select * from exam where name like '孙_';
#注:SQL 使用 like 进行模糊匹配, 通常是一个"低效操作"
SQL 的模糊匹配功能其实是非常弱的~~
编程圈子中,对于模糊匹配, 有一套成熟的解决方案,正则表达式~~
例:
4.4.5NULL的查询
构造数据
# 写⼊⼀条数据,英语成绩为NULLinsert into exam values (8, '张⻜', 27, 0, NULL);
查询英语成绩为NULL的记录
查询英语成绩不为NULL的记录
# 使⽤is not null
select * from exam where english is not null;
NULL与其他值进⾏运算结果为NULL
# 观察结果中的总分
select name, chinese + math + english as 总分 from exam;
#注:
(1)WHERE条件中可以使用表达式,但不能使用别名
(2)AND的优先级高于OR,在同时使用时,建议使用小括号()包裹优先执行的部分
(3)过滤NULL时不要使用等于号(=)与不等于号(!=,<>)
(4)NULL与任何值运算结果都为NULL
由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!