第一章:MySQL | 数据库的管理和操作(基本介绍)
第二章:MySQL | 数据库的基本操作和表的基本操作
第三章:MySQL | 数据库的表的增删改查
CRUD : Create, Retrieve,Update,Delete
新增数据
查询数据
修改数据
删除数据
注释:在SQL中可以使用“–空格+描述”来表示注释说明
CRUD
即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。
语法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
案例:
insert into student valuse (1,'张三');
‘’
和“”
都可以表示字符串拉丁文
字符集,不能表示中文utf-8
create database test charset utf8;
utf8
正常保存数据是没事的,带上表情,就有可能出错了,而utf8mb4
是更完整的utf8insert into student (name,gender) values('张三','男');
此时:values
后面的内容就是和前面的()的内容匹配
select * from student;
insert into student values(2,'李四','男'),(3,'王五','男');
create table homework (id int ,creatTime datetime);
‘2023-02-17 21:25:00’
insert into homework values(1,'2023-02-17 21:25:00');
now()
insert into homework values(1,now());
全列查找(查找整个表的所有行,所有列)
select * from 表名
*
表示所有的列,这种特殊含义的符号,计算机中叫做【通配符】select *
操作,肯会非常危险select *
操作就很麻烦了,这个操作会瞬间吃满硬盘带宽和网络带宽,就可能导致其他程序无法使用硬盘或者使用网络那么怎么办呢?有办法吗?有的!
当你需要操作的时候,一定要拉上一个人和你一起操作O(∩_∩)O哈哈~
-- 指定列的顺序不需要按定义表的顺序来
select 列名,列名...from 表名;
select name,gender from student;
列
和列
之间的运算create table exam_result (id int,name varchar(20),chinese decimal(3,1),math decimal(3,1),english decimal(3,1));
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 name,math + 10 from exam_result;
这个结果都是在原有的分数上 + 10的
上述这样的查询,数据库服务器硬盘的数据,是否发生了改变?
如果我们再次查询math,此时的结果是 + 10之前的还是 + 10之后的呢?
我们再次操作一下~~
临时表
的形式展现出来我们还可以查看总成绩,那么怎么查看呢?接着往下看~~
select name,math + chinese + english from exam_result;
表达式查询
是让列和列之间进行运算而不是行和行之间这就引出了一个查询的时候指定别名~~
as
关键字来查询select name,math + chinese + english as total from exam_result;
as
可以省略,但是不建议~~distinct
关键字进指定列进行去重,把重复的行只保留一个select distinct math from exam_result;
使用了order by
子句,指定某些列进行排序~~,排序可能是升序,也可能是降序
order by 是可以根据多个列进行排序~~
比如说按照数学成绩进行升序排序
select name,math from exam_result order by math;
对于MySQL来说,如果一个sql没有指定order by此时查询的结果的顺序,是不可预期的
代码逻辑中,不能依赖这里的查询顺序的
刚刚是升序排序的,那么怎么降序排序呢?只需要在后面加上desc
就可以了
select * from exam_result order by math desc;
此处的desc
是descend
单词的缩写,不是describe
还可以使用asc
表示升序排序,但是省略不写默认就是升序
还可以指定多个列来排序,多个列之间使用,
来分割 ,这个列越靠前,就是越关键的排序依据~~
先按照第一列排序,如果第一列的值相同了,再按照第二列排序
select * from exam_result order by math desc,chinese desc;
在查询的时候指定筛选条件
比较运算符:
逻辑运算符:
select * from exam_result where english < 60;
where english < 60
相当于针对数据库的表进行遍历,取出每一行数据,把数据代入条件中,看条件是否符合真
,这个记录就保留,作为结果集的一部分select * from exam_result where chinese > english;
where english < 60
一样,都是取出每一行数据,把数据代入条件中,看条件是否符合select * from exam_result where chinese + english + math < 200;
select name,chinese+math+english from exam_result where chinese + english + math < 200;
as
的关键词~~select name,chinese + math + english as total from exam_result where total < 200;
注意:
此处的total别名不能作为where条件,和当前sql的执行顺序有关,当然,这也是mysql对于语法规定的一部分~~
select name,chinese + math + english as total from exam_result where chinese + math + english < 200;
select * from exam_result where chinese > 80 and english > 80;
select * from exam_result where chinese > 80 or english > 80;
where
中既存在and
有存在or
,那么它们的优先级是先执行and
后执行or
BETWEEN … AND …
select * from exam_result where chinese >= 80 and chinese <= 90;
select * from exam_result where chinese between 80 and 90;
select * from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
select * from exam_result where math in(58,59,98,99);
like
模糊匹配,不要求元素完全相同,只要满足一定的规则就可以了
like 功能比正则表达式简单的多,
只支持两个用法:
- 使用%代表任意0个字符或者N个字符
- 使用_代表任意1个字符
select * from exam_result where name like '孙%';
like '%孙'
查询结尾的like'%孙%'
查询包含孙的我们要想查询为空(null)的值,那么怎么查询吗?是下面这样吗?
select * from exam_result where chinese = null;
为什么会出现这样的情况?
false
针对这样的问题怎么解决呢?
<=>
,使用这个比较相等运算,就可以处理null的比较~select * from exam_result where chinese <=> null
select * from exam_result where chinese is null;
这里所用到的关键字是limit
select * from exam_result limit 3;
select * from exam_result limit 3 offset 3;
还有一种写法:limit 3 offset 6
等价于 limit 6,3
这种写法不太推荐,很容易混淆~~
limit 这个东西是可以和前面的那些查询搭配使用的~~
列如:查询总分前三名的同学的信息:
代码操作:
select name,chinese + english + math as total from exam_result order by total desc limit 3;
查询基础部分暂时告一段落~~
update 表名 set 列名 = 值... where 条件;
update exam_result set math = 80 where name = '孙悟空';
update exam_result set math = 60 ,chinese = 70 where name = '曹孟德';
select name, chinese + math + english as total from exam_result order by total desc;
update exam_result set math = math + 30 order by chinese + math + english asc limit 3;
update exam_result set math = math + 10 order by chinese + math + english asc limit 3;
update exam_result set chinese = chinese / 2;
show warnings;
delete删除记录(行)
delete from 表名 where 条件;
下面进行代码演示:
delete from exam_result where name like '孙%';
会的!!!
delete from exam_result;
所以delete操作也是非常危险的!!!
学习完上面的操作,那么增删改查都是什么呢?
insert into 表名...
delete from 表名...
update 表名...
select from 表名...
-- 单行插入
insert into 表(字段1, ..., 字段N) values (value1, ..., value N);
-- 多行插入
insert into 表(字段1, ..., 字段N) values
(value1, ...),
(value2, ...),
(value3, ...);
-- 全列查询
select * from 表
-- 指定列查询
select 字段1,字段2... from 表
-- 查询表达式字段
select 字段1+100,字段2+字段3 from 表
-- 别名
select 字段1 别名1, 字段2 别名2 from 表
-- 去重DISTINCT
select distinct 字段 from 表
-- 排序ORDER BY
select * from 表 order by 排序字段
-- 条件查询WHERE:
-- (1)比较运算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR
(8)NOT
select * from 表 where 条件
update 表 set 字段1=value1, 字段2=value2... where 条件
delete from 表 where 条件
好了,数据库的管理和操作【表的增删改查】初阶就到这里结束了,后面我们还有进阶,感谢大家的收看,觉得有用的话三连一下吧~~