【MySQL从青铜到王者】第四篇:数据库表的基本查询增、删、查、改

在这里插入图片描述

系列文章目录


文章目录


前言


一、Create

1.首先创建一张学生表

create table students(id int unsigned primary key auto_increment,sn int not null unique comment ‘学号’,name varchar(20) not null,qq varchar(20));
在这里插入图片描述

1.单行数据 + 全列插入

在这里插入图片描述
插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致:

insert into students value(100,1000,‘唐僧’ ,null);
在这里插入图片描述
insert into students value(101,10001,‘孙猴子’,‘11111’);
在这里插入图片描述

2. 多行数据 + 指定列插入

插入两条记录,value_list 数量必须和指定列数量及顺序一致。

insert into students (id,sn,name) values(102,2001,‘曹孟德’),(103,2002,‘孙仲谋’),(104,2003,‘刘备’),(105,2004,‘诸葛亮’);
在这里插入图片描述

3.插入否则更新

由于 主键 或者 唯一键 对应的值已经存在而导致插入失败:

1.主键冲突

INSERT INTO students (id, sn, name) VALUES (100, 10010, ‘唐大师’);
在这里插入图片描述

2.唯一键冲突

INSERT INTO students (sn, name) VALUES (2001, ‘曹阿瞒’);
在这里插入图片描述

4.替换

在这里插入图片描述
主键 或者 唯一键 没有冲突,则直接插入;主键 或者 唯一键 如果冲突,则删除后再插入。
主键 或者 唯一键 没有冲突,则直接插入。

replace into students(sn,name) values(10001,‘赵云’);
在这里插入图片描述
主键 或者 唯一键 如果冲突,则删除后再插入。
replace into students(sn,name) values(2001,‘曹孟德’);
在这里插入图片描述

二、Retrieve

1.创建一张exam_result的表

-> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(20) NOT NULL COMMENT ‘同学姓名’,
-> yuwen float DEFAULT 0.0 COMMENT ‘语文成绩’,
-> shuxue float DEFAULT 0.0 COMMENT ‘数学成绩’,
-> yingyu float DEFAULT 0.0 COMMENT ‘英语成绩’
-> );
在这里插入图片描述

2.向exam_result表中插入数据

MariaDB [user2]> INSERT INTO exam_result (name, yuwen, shuxue, yingyu) VALUES
-> (‘唐三藏’, 67, 98, 56),
-> (‘孙悟空’, 87, 78, 77),
-> (‘猪悟能’, 88, 98, 90),
-> (‘曹孟德’, 82, 84, 67),
-> (‘刘玄德’, 55, 85, 45),
-> (‘孙权’, 70, 73, 78),
-> (‘宋公明’, 75, 65, 30);
在这里插入图片描述

3.select列

在这里插入图片描述

1.全列查询

通常情况下不建议使用 * 进行全列查询:
– 1. 查询的列越多,意味着需要传输的数据量越大;
– 2. 可能会影响到索引的使用。(索引待后面博客讲解)

select * from exam_result;
在这里插入图片描述

2.指定列查询

select name ,shuxue from exam_result;
在这里插入图片描述

3.查询字段为表达式

表达式不包含字段

select id,name,10 from exam_result;
在这里插入图片描述

表达式包含一个字段

select id,name ,yingyu+10 from exam_result;
在这里插入图片描述

表达式包含多个字段:

select id, name,yingyu+shuxue+yuwen from exam_result;
在这里插入图片描述

4.为查询结果指定别名

语法:

SELECT column [AS] alias_name […] FROM table_name;

select id,name,yingyu+shuxue+yuwen 总分 from exam_result;
在这里插入图片描述

5.查询结果去重

select distinct shuxue from exam_result;
在这里插入图片描述

4.where约束条件

比较运算符:
在这里插入图片描述
逻辑运算符:
在这里插入图片描述

1.英语不及格的同学及英语成绩 ( < 60 )

select name ,yingyu from exam_result where yingyu<60;
在这里插入图片描述

2.语文成绩在 [80, 90] 分的同学及语文成绩

select name,yuwen from exam_result where yuwen>=80 and yuwen<=90;
在这里插入图片描述

select name,yuwen from exam_result where yuwen between 80 and 90;
在这里插入图片描述

3.数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩

select name,shuxue from exam_result where shuxue=58 or shuxue=59 or shuxue=98 or shuxue=99;
在这里插入图片描述

4.姓孙的同学 及 孙某同学

在这里插入图片描述
% 匹配任意多个(包括 0 个)任意字符:

select name from exam_result where name like ‘孙%’;
在这里插入图片描述

_ 匹配严格的一个任意字符:

select name from exam_result where name like ‘孙_’;
在这里插入图片描述

5.语文成绩好于英语成绩的同学

select name ,yuwen,yingyu from exam_result where yuwen>yingyu;
在这里插入图片描述

6.总分在 200 分以下的同学

WHERE 条件中使用表达式-- 别名不能用在 WHERE 条件中

select name ,yuwen+shuxue+yingyu as 总分 from exam_result where yuwen+shuxue+yingyu<200;
在这里插入图片描述

7.语文成绩 > 80 并且不姓孙的同学

select name,yuwen from exam_result where yuwen>80 and name not like ‘孙%’;
在这里插入图片描述

8.孙某同学,否则要求总成绩 > 200 并且 语文成绩 < 数学成绩 并且 英语成绩 > 80

select name,yingyu,shuxue,yuwen,yingyu+shuxue+yuwen from exam_result where name like ‘孙%’ or(yingyu+shuxue+yuwen>200 and yuwen80);
在这里插入图片描述

9.NULL 的查询

select name,qq from students where qq is not null;
在这里插入图片描述

5.结果排序

在这里插入图片描述
语法:

– ASC 为升序(从小到大)
– DESC 为降序(从大到小)
默认为 ASC
SELECT … FROM table_name [WHERE …]
ORDER BY column [ASC|DESC], […];

注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。

1.同学及数学成绩,按数学成绩升序显示

select name,shuxue from exam_result order by shuxue;
在这里插入图片描述

2.同学及 qq 号,按 qq 号排序显示

NULL 视为比任何值都小,升序出现在最上面:

select name ,qq from students order by qq;
在这里插入图片描述

NULL 视为比任何值都小,降序出现在最下面

select name ,qq from students order by qq desc;
在这里插入图片描述

3.查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示

在这里插入图片描述

select name , shuxue,yingyu ,yuwen from exam_result order by shuxue desc,yingyu,yuwen;
在这里插入图片描述

4.查询同学及总分,由高到低

select name ,shuxue,yingyu,yuwen ,shuxue+yingyu+yuwen from exam_result order by shuxue+yingyu+yuwen desc;
在这里插入图片描述

ORDER BY 子句中可以使用列别名:

select name ,shuxue,yingyu,yuwen ,shuxue+yingyu+yuwen as 总分 from exam_result order by 总分 desc;
在这里插入图片描述

5.查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示

select name,shuxue from exam_result where name like ‘孙%’ or name like ‘曹%’ order by shuxue desc;
在这里插入图片描述

6.筛选分页结果

语法:

– 起始下标为 0
– 从 0 开始,筛选 n 条结果
SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n;
– 从 s 开始,筛选 n 条结果
SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT s, n;
– 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT … FROM table_name [WHERE …] [ORDER BY …] LIMIT n OFFSET n;

建议:对未知表进行查询时,最好加一条 LIMIT 1,避免因为表中数据过大,查询全表数据导致数据库卡死按 id 进行分页,每页 3 条记录,分别显示 第 1、2、3 页.。

select * from exam_result limit 2;
在这里插入图片描述
select * from exam_result limit 1,2;
在这里插入图片描述

select * from exam_result limit 3 offset 0;
在这里插入图片描述

三、Update

在这里插入图片描述
在这里插入图片描述
语法:

UPDATE table_name SET column = expr [, column = expr …]
[WHERE …] [ORDER BY …] [LIMIT …]

对查询到的结果进行列值更新:

1.将孙悟空同学的数学成绩变更为 80 分

select name,shuxue from exam_result where name =‘孙悟空’;
在这里插入图片描述
select name,shuxue from exam_result where name =‘孙悟空’;
在这里插入图片描述

2.将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

update exam_result set shuxue=60 , yuwen=70 where name=‘曹孟德’;
在这里插入图片描述

3.将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

select name,shuxue+yingyu+yuwen from exam_result order by shuxue+yingyu+yuwen limit 3;
在这里插入图片描述

在这里插入图片描述
update exam_result set shuxue=shuxue+30 order by shuxue+yingyu+yuwen limit 3;
在这里插入图片描述

4. 将所有同学的语文成绩更新为原来的 2 倍

update exam_result set yuwen=yuwen*2;
在这里插入图片描述

四、Delete

1.删除数据

在这里插入图片描述
语法:

DELETE FROM table_name [WHERE …] [ORDER BY …] [LIMIT …]

2.删除孙悟空同学的考试成绩

delete from exam_result where name=‘孙悟空’;
在这里插入图片描述

3. 删除整张表数据(慎用)

在这里插入图片描述

4.截断表

在这里插入图片描述
语法:

TRUNCATE [TABLE] table_name

  • 注意:这个操作慎用
  • 只能对整表操作,不能像 DELETE 一样针对部分数据操作。
  • 实际上 MySQL 不对数据操作,所以比 DELETE 更快。
  • 会重置 AUTO_INCREMENT 项。
1.首先建立一张for_truncate表

create table for_truncate(id int primary key auto_increment,name varchar(20));
在这里插入图片描述

2.插入一些数据到for_truncate表

insert into for_truncate(name) values(‘A’),(‘B’),(‘C’);
在这里插入图片描述

3.截断表数据

在这里插入图片描述
截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作。

truncate for_truncate;
在这里插入图片描述

再次插入数据时自增系列重置。
在这里插入图片描述

五、插入查询结果

INSERT INTO table_name [(column [, column …])] SELECT …

删除表中的的重复复记录,重复的数据只能有一份。

六、聚合函数

在这里插入图片描述

1.统计班级共有多少同学

select count(*) from students;
在这里插入图片描述

2.统计班级收集的 qq 号有多少

select count(qq) from students;
在这里插入图片描述

3.统计本次考试的数学成绩分数个数

COUNT(shuxue) 统计的是全部成绩。

select count(shuxue) from exam_result;
在这里插入图片描述

COUNT(DISTINCT shuxue) 统计的是去重成绩数量

select count(distinct shuxue) from exam_result;
在这里插入图片描述

4.统计数学成绩总分

select sum(shuxue) from exam_result;
在这里插入图片描述

5.统计平均总分

select avg(shuxue+yuwen+yingyu) from exam_result;
在这里插入图片描述

6.返回英语最高分

select max(yingyu) from exam_result;
在这里插入图片描述

7.返回 > 70 分以上的数学最低分

select min(shuxue) from exam_result where shuxue>70;
在这里插入图片描述

七、group by子句的使用

在select中使用group by 子句可以对指定列进行分组查询。

select column1, column2, … from table group by column;

1.先备份一张scott_data.sql数据库

在这里插入图片描述

2.准备工作,创建一个雇员信息表

在这里插入图片描述

  • EMP员工表。
  • DEPT部门表。
  • SALGRADE工资等级表。
    在这里插入图片描述

3.如何显示每个部门的平均工资和最高工资

select deptno,avg(sal),max(sal) from emp group by deptno;
在这里插入图片描述

4.显示每个部门的每种岗位的平均工资和最低工资

select avg(sal),min(sal),deptno from emp group by deptno,job;
在这里插入图片描述

5.显示平均工资低于2000的部门和它的平均工资

1.统计各个部门的平均工资

select deptno,avg(sal) from emp group by deptno;
在这里插入图片描述

2.having和group by配合使用,对group by结果进行过滤

select deptno,avg(sal) as myavg from emp group by deptno having myavg<2000;
在这里插入图片描述


总结

以上就是今天要讲的内容,本文详细介绍了数据库表的查询,像表的增、删、查、改,数据库提供了大量的方法供我们使用,非常的便捷,我们务必掌握。希望大家多多支持!另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。加油啊!
在这里插入图片描述

  • 70
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森明帮大于黑虎帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值