【MySQL基本查询(下)】

文章目录


一、update

该关键字的功能就是更新指定表中指定的数据。

语法:

UPDATE table_name SET column = expr [, column = expr ...]

[WHERE ...] [ORDER BY ...] [LIMIT ...]

接着上一篇文章的表:

现在想更新孙悟空的数学成绩到100分。

mysql> update exam_result set math=100 where name = '孙悟空';

案例

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

mysql> update exam_result set math=60,chinese=70 where name = '曹孟德';

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

第一步:先找出这三名同学

mysql> select name,math,chinese + math + english as total from exam_result order by total limit 3 ;

第二步:将这三名同学的数学成绩加上30

mysql> update exam_result set math=math+30 order by chinese+math+english limit 3 ;

成绩修改前:

成绩修改后:

注意:不支持 math += 30 这种语法

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

mysql> update exam_result set chinese = chinese*2;

注意:update更新全表的这条语句慎用。其危害不亚于delete表。

二、Delete

语法:

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

注意区别于drop,drop是删除表结构的,不是删除表数据。

案例

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

mysql> delete exam_result where name = '孙悟空';

注意:delete 全表数据的行为慎用!

准备一张测试表:

CREATE TABLE for_delete (

id int primary key auto_increment,

name varchar(20)

);

插入一些数据后:如下图

执行delete命令后,结果为空了。

但是这种删除表的方式,不会对表的自增式数据清空,比如上面表插入了三条信息,删除完后,再次插入信息,auto_increment约束记录的是从id=4开始的。

truncate

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
    物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项

该关键字也能将表的内容删除。

truncate + 表名

删除表的所有数据。

不同于delete的是,这个truncate关键字,删除表的内容后,也会将自增键auto_increment的值清空,也就意味着下次插入的时候会从1开始自增。


三、插入查询结果

语法:

  • INSERT INTO table_name [(column [, column ...])] SELECT ...

也就是把 select 查询出来的结果进行插入。

案例

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

首先创建原数据表 CREATE TABLE duplicate_table (id int, name varchar(20)); Query OK, 0 rows affected (0.01 sec)

再插入测试数据 INSERT INTO duplicate_table VALUES (100, 'aaa'), (100, 'aaa'), (200, 'bbb'), (200, 'bbb'), (200, 'bbb'), (300, 'ccc'); Query

OK, 6 rows affected (0.00 sec)Records: 6 Duplicates: 0 Warnings: 0

思路:

1)创建一个跟duplicate_table 相同类型的表格。

CREATE TABLE no_duplicate_table LIKE duplicate_table;

2)将duplicate_table的去重数据插入到no_duplicate_table

INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;

3)通过重命名表,实现原子的去重操作

RENAME TABLE duplicate_table TO old_duplicate_table,

no_duplicate_table TO duplicate_table;

最后结果如下:

其中上篇文章讲到,去重的关键字是distinct

四、了解一些函数

1.count函数

案例:统计班级共有多少同学。

select count(*) as 总数 from exam_result;

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

mysql> select count(qq) from students;

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

mysql> select count(math) from exam_result; ---统计的是统计的是全部成绩

mysql> select count(distinct math) from exam_result; ---统计的是统计的是去重成绩

2.sum函数

一般用来统计总分。

案例:

统计班级数学总成绩

mysql> select sum(math) from exam_result;

3. avg函数

一般用来统计平均分。

案例:统计平均总分

mysql> select avg(chinese+math+english) as 平均总分 from exam_result;

4.max函数

可以用来统计最高分。

案例:统计全班英语最高分

mysql> select max(english) from exam_result;

5. min函数

一般统计最低(小)的分数。

案例:返回 > 70 分以上的数学最低分

mysql> select min(math) from exam_result where math > 70;

五、group by子句的使用

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

group by 的核心作用:为了分组之后,方便进行聚合统计。

语法:

  • select column1, column2, ... from table group by column;

获取一张员工表,员工表的信息如下:

上面的员工信息表,可以看成一个大组。

给员工表按照deptno(department No. 部门)进行分组,结果如下:

mysql> select deptno,max(sal) as 最高工资 , avg(sal) as 平均工资 from emp group by deptno;

按照部门进行分组后,三个部门的的最高工资,平均工资就一目了然,这样就是按照要求进行分组了。

分组,就是把一组按照条件,拆分成多个组,进行各自组内的统计。

分组,也就是把一张表按照一定条件,拆分成多组,然后在每个组内进行聚合统计。

案例

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

mysql> select deptno,job,min(sal), avg(sal) from emp group by deptno,job;

先分组统计每个部门的最低和平均工资,再对结果进行聚合。

having和where

having:对最后聚合出来的结果进行判断。

案例:列出表的信息,SMITH这名员工不参与统计。

mysql> select deptno,job,avg(sal) as myavg from emp where ename!='SMITH' group by deptno,job having myavg < 2000;

对该SQL语句进行解读:


不能单纯地认为,只有从磁盘上导入到MySQL中的真实存在的才叫做表。
每个过程中产生的,和最终筛选出来的,都是表!!!

总结:

"MySQL下一切皆表。"

相关推荐
momo小菜pa1 小时前
【MySQL 06】表的增删查改
数据库·mysql
网络研究院1 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
凉亭下1 小时前
android navigation 用法详细使用
android
程序员大金3 小时前
基于SpringBoot+Vue+MySQL的装修公司管理系统
vue.js·spring boot·mysql
小比卡丘4 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
gorgor在码农4 小时前
Mysql 索引底层数据结构和算法
数据结构·数据库·mysql
-seventy-4 小时前
SQL语句 (MySQL)
sql·mysql
一般路过糸.4 小时前
MySQL数据库——索引
数据库·mysql
前行的小黑炭5 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
无敌少年小旋风6 小时前
MySQL 内部优化特性:索引下推
数据库·mysql