关于表的增删查改主要分为CRUD:Create(创建), Retrieve(读取),Update(更新),Delete(删除)
目录
1.Creat(增加内容)
1.1指定列插入
1.2全列插入
1.3多行插入
1.4插入冲突更新
1.5替换
2.Retrieve(查询)
2.1全列查询
2.2指定行列查询
2.3查询结果去重
2.4where子句查询
案例1:英语不及格的同学及英语成绩 ( < 60 )
案例2:语文成绩在 [80, 90] 分的同学及语文成绩
案例3:数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
案例4:姓孙的同学 及 孙某同学
案例5:语文成绩好于英语成绩的同学
案例6:总分在200分以下的同学
案例7:语文成绩 > 80 并且不姓孙的同学
2.5 order by子句(结果查询)
案例1:同学及数学成绩,按数学成绩升序显示
案例2:NULL 视为比任何值都小,升序出现在最上面,降序出现在最下面。
案例3: 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
案例4:查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
2.6筛选分页结果
总结
1.Creat(增加内容)
语法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
常用的增加内容语句就是insert,以上的语法结构中凡是带中括号的区域都是可以被省略的。
案例:
首先需要建一张表
create table students(
id int unsigned primary key auto_increment,
sn int unsigned unique key,
name varchar(20) not null,
qq varchar(32) unique key
);
1.1指定列插入
我们要选择给哪一列插入信息时语法如下
insert into students () values ();
可以看到我们在在一个括号中指定了一些列信息,在第二个括号中插入了相应的值,即可完成指定的列插入。
我们可以将values看作扁担一样,左边括号中的列属性要和右边括号中的值一一对应。
1.2全列插入
却列插入语法如下:
insert into students values ()
可以看到虽然我们给id定义了自增长键,但是全裂插入还是可以插入我们想要的值,每一列都是我们指明的values后面的数据。
1.3多行插入
我们一次只插入一条数据会有点慢,可以进行多行插入。
可以看到我们在values后可以使用的多个括号,并且可以用逗号将他们隔开即可完成多行数据的插入。
1.4插入冲突更新
当我们在插入时可能会遇到唯一键或者主键冲突,这时他会报错不让我们插入数据。
可以看到报错信息为Duplicate
我们就可以可以选择性的进行同步更新操作
语法:
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
案例:
我们现在想要对wdd这个人的信息进行修正
首先我们插入一条关于wdd被修正过后的信息,可以看到发现了主键冲突
我们就可以使用 on duplicate key update
可以看到wdd就更新成了wyx。
要注意的是刚刚再插入时出现以下提示
这个意思是两行数据被影响
-- 0 row affected:表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected:表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新
当我们插入了一个表中没有的数据时使用了这个语法
可以看到一行受到了影响,也就是说表中没有冲突数据,数据被插入了
1.5替换
替换操作可以在发生on duplicate时使用
案例:
替换操作的语法只需要将insert 替换车replace 即可。
可以看到只有一行受到影响了,所以会直接插入数据
接下来我们修改刚刚替换语句中的信息
这里将 ’许攸‘ 改为 ‘许攸1’,
可以看到两行出现影响,所以会删除原先的数据再插入新的数据
id 从之前的15变成了16,许攸变成了许攸1
2.Retrieve(查询)
在查询操作之前,我们首先需要建一张表
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese float DEFAULT 0.0 COMMENT '语文成绩',
math float DEFAULT 0.0 COMMENT '数学成绩',
english float DEFAULT 0.0 COMMENT '英语成绩'
);
观察表结构
再向表中插入数据
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
2.1全列查询
select * from table
但是通常情况下不建议使用 * 进行全列查询 -- 1. 查询的列越多,意味着需要传输的数据量越大; -- 2. 可能会影响到索引的使用。
2.2指定行列查询
我们可以通过select 来指定列查询
并且还可以同时选择多个列查询
select 后面可以跟表达式,例如我们还可以将所有的成绩加在一起
select name,math+chinese+english from exam_result;
如果我们觉得三项成绩加在一起有点长的话我们还可以改名字
select name,math+chinese+english as total from exam_result;
同样的也可以对指定列进行重命名
select name 姓名 ,math+chinese+english 总分 from exam_result;
2.3查询结果去重
先查询一下数学成绩,发现有重复的,我们可以再筛选语句中添加distinct去重
2.4where子句查询
在学习where语句之前我们先要学习运算符
比较运算符:
逻辑运算符:
案例1:英语不及格的同学及英语成绩 ( < 60 )
select name,english from exam_result where english < 60;
可以看到我们这里利用where查询的结果
案例2:语文成绩在 [80, 90] 分的同学及语文成绩
select name,chinese from exam_result where chinese>=80 and chinese <=90;
这里需要结合上面的运算符来使用语句。
同样的我们也可以使用between and语句来查询
select name,chinese from exam_result where chinese between 80 and 90;
案例3:数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩
我们不妨使用IN
select name,math from exam_result where math in (58,59,98,99)
查询结果符合要求
案例4:姓孙的同学 及 孙某同学
% 匹配任意多个(包括 0 个)任意字符
select name from exam_result where name like '孙%';
我们找到了姓孙的人
_ 匹配严格的一个任意字符
select name from exam_result where name like '孙_';
这样就可以找到孙某
案例5:语文成绩好于英语成绩的同学
select name ,chinese,english from exam_result where chinese > english;
案例6:总分在200分以下的同学
select name,chinese+english+math as total from exam_result where chinese+math+english < 200;
案例7:语文成绩 > 80 并且不姓孙的同学
select name,chinese from exam_result where chinese > 80 and name not like '孙%';
2.5 order by子句(结果查询)
语法:-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
默认为 ASC
案例1:同学及数学成绩,按数学成绩升序显示
首先我们先筛选出同学和数学成绩
在后面加上升序或降序的条件
select name, math from exam_result order by math asc;
此时排序为升序
select name, math from exam_result order by math desc;
此时为降序。
案例2:NULL 视为比任何值都小,升序出现在最上面,降序出现在最下面。
我们先查看test表中的内容
再将它排序
升序
降序
案例3: 查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示
select name,math,english,chinese from exam_result order by math desc,english desc,chinese asc;
案例4:查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc;
结果如图所示
2.6筛选分页结果
当我们查询表的全部内容时可以通过limit筛选出我们想要读的行页。
先全列查询
这里比如我们只想看到第三行
limit后只有一个数字的话就表示从表开始(下标为零的地方),连续读取和数字一样的行数信息。
limit后也可以跟两个数字
这里的2表示下标开始位置,4表示步数,连续读取四条信息。
同样的也可以使用offset来表示。
select * from exam_result limit 4 offset 2;
可以看到和上面的 limit 2,4是同样的结果。
由于以后的学习中可能会遇到非常多的表和信息,如果读取全部可能会出现加载慢的问题,limit的作用就是使这些信息简单分页读取。
总结
通过以上的案例,我们最后需要知道的是我们需要有数据才能展示,先查后排。
只有数据准备好了,才能展示,limit的本质功能就是显示,所以limit的使用会更靠后。