目录
实际开发中的CRUD工程师:
![](https://i-blog.csdnimg.cn/blog_migrate/2ab523f80ec7742691c70191fc315e5f.png)
我们创建了一个学生表,带有三个属性: id , 姓名 , 性别
增
增加表的内容的操作我们通过 insert
1.单行数据 + 全列插入
-- 插入两条记录, value_list 数量必须和定义表的列的数量及顺序一致INSERT INTO student VALUES ( 100 , 10000 , ' 唐三藏 ' , NULL );INSERT INTO student VALUES ( 101 , 10001 , ' 孙悟空 ' , '11111' );
2.多行数据 + 指定列插入
-- 插入两条记录, value_list 数量必须和指定列数量及顺序一致INSERT INTO student (id, sn, name) VALUES( 102 , 20001 , ' 曹孟德 ' ),( 103 , 20002 , ' 孙仲谋 ' );
在 student 后面 指定要添加的列
在 values 后面 可以添加多行数据,用逗号隔开
删
-- 删除数学成绩为 null 的同学的信息delete from exam_scores where math is null;
-- 删除整张表delete from exam_scores;
把数学成绩为null的数据删除:
查
1.全列查询
相当于查询全部数据
学习阶段数据库各种表的容量不大,可以用这个
实际开发中,数据量可以高达上亿个数量级,要慎用:
1.一下子要传输的数据量太大,会占满硬盘的读取,影响其他软件的运行
2.会影响到索引的使用
2.指定列查询
-- 指定列的顺序不需要按定义表的顺序来SELECT id, name, english FROM exam_result;
总的学生表如第一个表
在指定列查询时 我先填了gender再填name,此时下图的显示就是gender在前,name在后
3.表达式查询
先创建一张考试成绩表,并插入数据
decimal数据括号前一位表示长度,后一位表示小数点后的位数
表达式查询,是指在查询过程中,还可以做一些简单的运算( 这个是进行列和列之间的运算)
比如可以在查询的时候,让查询的math成绩都在原来的基础上 加10分:
需要注意,查询操作不会改变硬盘上原来的数据,因此再查一遍还是原来的成绩
也可以查询总成绩,让math ,chinese,english相加即可得到总成绩:
4.别名
查询的时候指定别名,以便更容易理解含义
列名 as 别名
如上图的总成绩,chinese+math+english的列名太冗长了 也不好看,改为下图以总分为别名
5.去重查询
select distinct 列名 from 表名;
针对指定列进行去重,把重复的行只保留一个
如果指定多个列,则要求这些列的值都相同,才视为重复
6.查询结果排序
升序: select math from exam_scores order by math asc; asc 可省略
降序: select math from exam_scores order by math desc;
对多个列进行排序,以第一个列为主要排序,后面的为次要排序,在主要排序中行的值相同的情况下,进行次要排序
select 想查询的列名 from 表名 order by english desc,chinese desc; 以逗号分隔即可
7.条件查询
select 列名, ... from 表名 where 条件;
在查询的时候指定筛选条件,符合条件的数据留下,不符合的pass
需要先描述条件,MySQL通过 where + 条件 来表示条件
比较运算符:
逻辑运算符:
-
基本查询
如图,查询语文成绩少于80分的同学
查询 两列比较的结果
如图,查询英语成绩 好于 语文成绩的同学:
要注意where 之后不能使用别名
如图,假如我们要查询总分 直接 where total < 275 会报错
-
and 与 or
-- 查询语文成绩大于 80 分,且英语成绩大于 80 分的同学SELECT * FROM exam_result WHERE chinese > 80 and english > 80;-- 查询语文成绩大于 80 分,或英语成绩大于 80 分的同学SELECT * FROM exam_result WHERE chinese > 80 or english > 80 ;-- and 的优先级高于 or , 不建议记这些 , 无脑加括号就行SELECT * FROM exam_result WHERE (chinese > 80 or math> 70 ) and english > 70 ;
-
范围查询
between....and..... 约定一个前闭后闭的区间
in 查询是否有符合括号内数据的值
-
模糊查询
-- % 匹配任意多个(包括 0 个)字符SELECT name FROM exam_result WHERE name LIKE '% 孙 %' ; -- 匹配名字包含航的' 孙 %' ; -- 匹配名字 航 开头的'% 孙 ' ; -- 匹配名字 航 结尾的
-- _ 匹配严格的一个任意字符SELECT name FROM exam_result WHERE name LIKE ' 孙 _' ; -- 匹配到孙权
-
null的查询
查询值为null 的行
select * from exam_scores where math is null;
select * from exam_scores where math <=> null;
判断值是否为null 不能直接用等号
8.分页查询
分页查询
-- 起始下标为 0-- 从 0 开始,筛选 n 条结果SELECT ... FROM table_name [ WHERE ...] [ ORDER BY ...] LIMIT n;-- 从 s 开始,筛选 n 条结果 关键字为offsetSELECT ... FROM table_name [ WHERE ...] [ ORDER BY ...] LIMIT n OFFSET s;
查询前三条结果:
从下标为5的行 开始查询,查询3条结果
小测试:
查询总分前三名的同学:
1.计算每个同学的总成绩(表达式)
2.对总成绩进行降序排序 (order by)
3.查询前三名结果 (limit)
改
修改数据操作,通过关键字 update
-- 将小强同学的数学成绩变更为 70 分,语文成绩变更为 70 分UPDATE exam_result SET math = 60 , chinese = 70 WHERE name = ' 小强 ' ;