前言
一. 新增
1. 全列插入
2. 指定列插入
3. 效率问题
二. 查询(Retrieve)
1. 全列查询(整表查询)
2. 指定列查询
3. 指定字段表达式运算查询
4. 将表达式或字段指定别名查询
5. 去重查询
6. 排序查询
7. 条件查询
8. 分页查询
三. 修改(Update)
四. 删除(Delete)
开启MySQL新的篇章——介绍MySQL中表的增删查改操作(CRUD)。
我们这里先创建一张学生表来演示对表的相关操作.
-- 创建一张学生表
create table student
(
id int,
sn int, -- 学号
name varchar(20), -- 姓名
mail varchar(20) -- qq邮箱
);
mysql中通过insert
关键字来插入(新增)记录.
语法:
insert into 表名 values(对应列的实参列表); -- 一次插入一行
insert into 表名 values(对应列的实参列表), (对应列的实参列表).... -- 一次插入多行
注意:
values 后面( )中的内容, 个数和类型要和表的结构匹配.
示例:
-- 单行插入
insert into student values(101, 10001, '喜羊羊', '12345');
-- 多行插入
insert into student values
(102, 10002, '美羊羊', '23456'),
(103, 10003, '懒羊羊', '34567'),
(104, 10004, '沸羊羊', '45678');
插入结果:
有关日期数据的插入, 尽量使用datetime
, 日期的插入格式为 : yyyy-mm-dd hh:mm:ss
, 其中now()能够获取当前日期。
语法:
insert into 表名 (需要插入的列) values(对应列的实参列表); -- 一次插入一行
insert into 表名 (需要插入的列)values(对应列的实参列表), (), ().... -- 一次插入多行
注意:
示例:
-- 单行插入
insert into student (id, name) values(105, '暖羊羊');
--多行插入
insert into student (id, name) values
(106, '慢羊羊'), (107, '灰太狼'), (108, '红太狼');
插入结果:
在mysql当中, 多条记录逐次插入的效率是要低于一次把多条纪录一起插入的.
具体受如下方面的影响:
补充:内存和外存的区别.
mysql中通过select
关键字来完成查询操作.
语法:
select * from 表名;
注意:
示例:
select * from student;
select * from times;
查询结果:
注意: 这里查询结果所显示的表是服务器端数据库返回给客户端的一个临时表,使用查询操作不会对服务器中的数据造成影响, 该临时表在客户端打印后就销毁了.
语法:
select 列名, 列名, ... from 表名;
示例:
查询学生表中的姓名和邮箱,
select name, mail form 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 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, '潇洒哥', null, 75, 65);
语法:
select 字段或表达式, 字段或表达式... from 表名;
注意:
这里的表达式运算是同一行中不同列之间的运算, 是不可以跨行进行运算的.
示例:
查询将语文成绩和数学成绩在原来的基础上减少10分的结果,
select * from exam_result;
select name, chinese-10, math-10 from exam_result;
查询结果:
上面的查询结果中显示的表头是一个表达式, 但如果这一个表达式很长时就不适合作为表头显示了, mysql中支持在查询时给表达式起一个别名, 让查询结果直接显示别名, 查询结果更加直观.
语法:
select 列名或表达式 as 别名, ... from 表名;
注意:
上面的as
可以省略, 但是不建议省略, 省略以后代码的可读性变差, 而且容易出错;
示例:
查询成绩表中每个人的总成绩和平均成绩.
select name, chinese+math+english as total,
(chinese+math+english)/4 as average from exam_result;
查询结果:
注意 :
mysql支持对列的去重查询, 重复的数据只会输出一个, 用关键字distinct
来表示去重.
语法:
select distinct 列名 from 表名;
注意:
示例:
先插入三个人的成绩, 使三人的英语成绩相同, 然后对英语成绩进行去重查询.
insert into exam_result values
(8, '灰太郎', 55, 65, 88),
(9, '红太狼', 85.5, 78, 88),
(10, '小白狼', 78, 88, 88);
select english from exam_result;
select distinct english from exam_result;
查询结果:
看查询结果英语成绩中有三个88, 最后只显示输出了一个88, 达到了去重效果.
将要查寻的数据排序得到临时表输出, 排序相关的关键字order by
.
语法:
select 列名, ... from 表名 order by 列名(要排序的列) asc(或者desc), ...;
注意:
示例:
select name, chinese+math+english as total from exam_result order by total desc;
查询结果:
条件查询就是通过设定的条件, 将满足条件的记录查询显示, mysql中通过关键字where
+ 条件来设置查询条件.
语法:
select 列名, ... from 表名 where 条件;
要正确的设置条件是离不开运算符的, 下面列出mysql中常用的运算符.
比较运算符:
运算符 | 说明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,null 不安全,例如 null = null 的结果是 null(false) |
<=> | 等于,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 |
lisk | 模糊匹配; % 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
逻辑运算符:
运算符 | 说明 |
---|---|
and | 多个条件必须都为 true(1),结果才是 true(1) |
or | 任意一个条件为 true(1), 结果为 true(1) |
not | 条件为 true(1),结果为 false(0) |
注意:
示例:
查询英语成绩不及格的同学及英语成绩(小于60)
查询语文成绩好于英语成绩的同学
查询总分在 200 分以下的同学
-- 查询英语不及格的同学及英语成绩 ( < 60 )
select name, english from exam_result where english < 60;
-- 查询语文成绩好于英语成绩的同学
select name, chinese, english from exam_result where chinese > english;
-- 查询总分在 200 分以下的同学
select name, chinese+math+english as total from exam_result
where chinese+math+english < 200;
查询语文成绩大于80分,且英语成绩大于80分的同学
查询语文成绩大于80分,或英语成绩大于80分的同学
查询语文成绩和数学成绩要有一门大于80且英语成绩要大于70的同学
-- 查询语文成绩大于80分,且英语成绩大于80分的同学
select * from exam_result where chinese > 80 and english > 80;
-- 查询语文成绩大于80分,或英语成绩大于80分的同学
select * from exam_result where chinese > 80 or english > 80;
-- 查询成绩语文成绩和数学成绩要有一门大于80且英语成绩要大于70的同学
select * from exam_result where
(chinese > 80 or math > 80) and english > 70;
查询语文成绩在 [80, 90] 分的同学及语文成绩
查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
-- 查询语文成绩在 [80, 90] 分的同学及语文成绩
select name, chinese from exam_result where chinese between 80 and 90;
-- 也可以使用and实现
select name, chainese from exam_result where chainese >= 80 and chainese <= 90;
-- 查询数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
select name, math from exam_result where math in (58, 59, 98, 99);
-- 也可以使用or实现
select name, math from exam_result where math = 58 or math = 59 or math = 98, math = 99;
查找名字含有羊的同学
查找姓名最后一个字为狼的同学
-- 查找名字含有羊的同学
select * from exam_result where name like '%羊%';
-- 查找姓名最后一个字为狼的同学
select * from exam_result where name like '%狼';
select * from exam_result where name like '__狼';
注意 :%
可通配多个字符, 而_
只能通配一个字符.
查询语文成绩为null的同学
查询语文成绩不为null的同学
-- 查询语文成绩为null的同学
select name, chinese from exam_result where chinese is null;
-- 查询语文成绩不为null的同学
select name, chinese from exam_result where chinese is not null;
判断是否为null也可以使用<=>null
, 这里要注意<=>null
和is null
的区别,
is null
要求只能比较一个列是否为空, 而<=>
可以直接比较两个列.
现实中分页查询最常见的例子就是浏览器搜索了, 浏览器搜索不会一次性将搜索到的结果都加载显示出来, 而是像下图中将搜索结果按页进行加载呈现, 这种搜索模式就是分页查询;
mysql中也支持分页查询, 使用关键字limit
和offset
来实现.
语法:
select 列名, ... from 表名 limit 限制个数 offset 起始下标;
select 列名, ... from 表名 limit 限制个数, 起始下标;
注意:
示例:
-- 第一页
select * from exam_result limit 3 offset 0;
-- 第二页
select * from exam_result limit 3 offset 3;
-- 第三页
select * from exam_result limit 3 offset 6;
-- 剩下的记录
select * from exam_result limit 3 offset 9;
select * from exam_result order by chinese desc limit 3;
mysql中使用关键字updata
来表示修改.
语法:
update 表名 set 列名 = 值, 列名 = 值, ... where 限制条件下修改;
注意:
示例:
select * from exam_result where name = '喜羊羊';
update exam_result set english = 99 where name = '喜羊羊';
select * from exam_result where name = '喜羊羊';
select * from exam_result order by chinese+math+english desc limit 3;
update exam_result set chinese = chinese+10 order by chinese+math+english desc limit 3;
select * from exam_result order by chinese+math+english desc limit 3;
mysql中使用关键字delete
来表示删除.
语法:
delete from 表名 where 限制条件下删除;
注意:
示例:
删除潇洒哥的成绩
select * from exam_result;
delete from exam_result where name = "潇洒哥";
select * from exam_result;