【MySQL数据库】表的增删改查
目录
前言:
1,表的创建
2,表的查询
2-1,select查询
2-2,where条件表达式
2-3,有序查询
2-4,分页查询
3,表的修改
4,表相关的删除
4-1,drop删除
4-2,delete删除
4-3,清空表truncate
5,聚合函数
6,group by分组查询
前言:
在讲解表的增删查改之前,若不明白表的基本操作流程,可先观看本人之前的文章:MySQL基础说明。里面包含了表的插入操作,本文就不再说明。
1,表的创建
create(创建指令)可用于创建表结构。创建完之后,我们可以选择进行单行插入和多行插入。
样例:
创建表结构:create table student (name varchar(32), age varchar(32));
单行插入:insert into student (name,age) values ('刘备','18');
多行插入:insert into student (name,age) values ('张飞',17), ('关羽',16)......;
replace(插入或替换指令)用于插入或替换表中的数据。它的操作实际上是delete + insert,如果表中没有与新记录冲突的主键或唯一键,则直接插入新记录,但如果表中已经存在具有相同主键或唯一键的记录,replace 会先删除旧记录,再插入新记录。
样例:
replace into student (name,age) values ('刘备', 20);
2,表的查询
2-1,select查询
select(查询指令)可用于表的查询。查询的方法多种多样,下面我用具体实例来依次介绍。
首先创建一张学生表并插入相关数据
mysql> create table student (
-> name varchar(32) not null comment '学生名字',
-> age int unsigned not null comment '学生年龄'
-> );
mysql> insert into student (name,age) values
-> ('刘备',25),('张飞',24),('关羽',23),('曹操',25),('孙权',23);查询样例:
全列查询:select * from student;
指定列查询:select name from student;
查询字段为表达式:select name,age+100 from student; 查询将age+100后的结果
为查询结果指定别名:select name,age+100 百年之后 from student; 取别名为百年之后
select 还可以用于去重查询,但需要运用 distinct 去重指令,它用于从查询结果中去除重复的记录,只返回唯一的不同值。
去掉age列中重复的字段:select distinct age from student;
2-2,where条件表达式
where 语句用于从表中查找数据时,判断所满足的条件。它过滤了查询结果,使得只有符合条件的记录才会被返回。where 是一个子句,通常与其它语句联合使用,如:select、delete等。
比较运算符
逻辑运算符
样例:
查询student表中age>23的name
select name,age from student where age>23;
查询student表中age在[23,24]里的name
方法一:select name,age from student where age>=23 and age<=24;
方法二:select name,age from student where age between 23 and 24;
查询student表中age是23或25里的name
方法一:select name,age from student where age<=>23 or age<=>25;
方法二:select name,age from student where age in(23,25);
查询姓孙的所有同学
select name,age from student where name like '孙%';
查询姓孙的任意一个同学
select name,age from student where name like '孙_';
查找年龄大于24且不姓孙的所有同学
select name,age from student where age>24 and name not like '孙%';
查询qq不为NULL(空)的所有同学
select name,qq from student where qq is not null;
2-3,有序查询
order by(有序语句)用于将指定的字段排序。需要注意的是 null 视为比任何值都小,即升序出现在最上面,降序出现在最下面。语法如下:
基础语法:
order by [字段] [asc 或 desc], [字段] [asc 或 desc].....
其中,asc 为升序,desc 为降序。默认情况为asc(升序)。
样例:
将所有同学的年龄按升序显示
select name,age from student order by age;
多字段排序,排序优先级随书写顺序。下面指令按照age降序排列
select name,age,qq from student order by age desc,qq desc;
order by 使用表达式排序。下面指令将age + qq表达式进行排序显示
select name,age+qq from student order by age+qq;
order by 使用别名排序,效果与上相同
select name,age+qq 年龄QQ from student order by 年龄QQ;
查询姓孙的同学或者姓曹的同学年龄,结果按由高到低显示
select name,age from student where name like '孙%' or name like '曹%' order by age desc;
2-4,分页查询
limit 子句用于限制查询结果集的行数。它通常用于分页显示数据。limit相关用法如下:
基础语法:
从 0 开始,筛选 n 条结果
select ... from [表名] [where ...] [order by ...] limit n;
过滤掉前 s 行,从 s + 1 行开始,筛选 n 条结果
方式一:select ... from [表名] [where ...] [order by ...] limit s, n;
方式二:select ... from [表名] [where ...] [order by ...] limit n offset s;
样例:
按照qq进行升序排列,从第三行开始,显示出三行的内容
select name,qq from student order by qq limit 3 offset 2;
3,表的修改
在 MySQL 中,update 语句用于修改表中的现有记录。它允许你更新一个或多个列的值,并且可以根据特定条件选择要更新的行。如果未指定 where 子句,则表中所有记录都将被更新。具体用法如下:
基础语法:
update [表名] set [列名1]=[新值1], [列名2]=[新值2]... [where ...] [order by ...] [limit ...]
样例:
将student表里的刘备年龄改为26,qq改为11
update student set age=26,qq=11 where name='刘备';
将student表里的所有人年龄加一,qq加100
update student set age=age+1,qq=qq+110;
4,表相关的删除
4-1,drop删除
drop 删除用于删除数据库对象(如表、数据库等)及其定义。它的删除能力强,影响范围大,不仅删除数据,还会删除整个对象结构,如表定义,列等。
删除数据库:drop database [数据库]
删除表:drop table [表]
删除表中的某一列:alter table [表名] drop [列名称];
4-2,delete删除
delete删除用于从表中删除数据行。它只会删除表中的数据,不会删除表结构本身。
基础语法:
delete from [表名] [where ...] [order by ...] [limit ...];
样例:
删除 student 表中名为曹操的人delete from student where name='曹操';
删除 student 表中的所有数据(逐行删除)
delete from student;
4-3,清空表truncate
truncate 是 MySQL 中用于快速删除表中所有数据的一个命令。与 delete 不同,truncate 操作不是逐行删除数据(delete删除方式),而是通过释放存储该表数据的存储空间来实现快速清空表的目的。具体说明如下:
语法:
truncate [table] 表名;
说明:
- [table]:关键字 table 是可选的。
- 表名:需要清空数据的表的名称。
因为 truncate 是直接释放存储空间,而 delete 则是逐行删除数据,所以 truncate 比 delete 更快,但是,truncate 只能对整张表操作,不能像 delete 一样针对部分数据操作。其次,它还会重置 auto_increment 项,delete 不会。
样例:
清空表test:truncate table test;
5,聚合函数
函数语法:
count([列]):统计某列结果不为null的行数量。这里的 [列] 可以是任何数据,若表中不存在该列,表示查询表中的行数;若count(null),对应的数值是0。
sum([列]):统计某列中所有值的总和。该列的值必须是数字,否则无意义
avg([列]):统计某列中所有值的平均值。该列的值必须是数字,否则无意义
max([列]):找到某列中的最大值。该列的值必须是数字,否则无意义
min([列]):找到某列中的最小值。该列的值必须是数字,否则无意义
样例:
统计一个班中有多少名学生
方法一:select count(*) from student; 用count(*)做统计,不受 NULL 影响
方法二:select count(1) from student; 用 1 表达式做统计
统计一个班中有qq学生的数量
select count(qq) from student; qq为null不会被统计
统计数学成绩分数的个数,重复的去掉
select count(distinct math) from student; distinct 可以去重
统计学生的数学成绩总分
select sum(math) from student;
统计学生的数学成绩和语文成绩的平均分
select avg(chinese + math) from student;
找出数学成绩的最高分
select max(math) from student;
找出数学成绩的最低分
select min(math) from student;
6,group by分组查询
在 select 中使用 group by 子句可以对指定列进行分组查询。group by 子句在 SQL 查询中用于将具有相同值的行分组,经过 group by 后,每一组的数据一定是相同的。
group by 通常与聚合函数和 having 一起使用,以对每个组执行汇总计算和条件选择。下面来具体说明下 having。
having 与 where 都能做条件筛选,但它们的使用场景和作用对象有所不同。
where 直接作用于表中的行,是在数据分组之前进行过滤条件,可以与任何类型的列一起使用,包括但不限于数值、字符串、日期等,但不能直接与聚合函数(如count、sum等)一起使用,因为这些函数是在数据分组后计算的。
having 作用于由 group by 子句定义的组,是在数据分组之后应用过滤条件。having可以直接与聚合函数一起使用,且主要用于与聚合函数结合使用,以便根据分组后的结果进行过滤。
语法:select [列1], [列2], ... [聚合函数(列)] from [表名] group by [列1], [列2], ...;
样例:
显示每个部门(deptno)的平均工资和最高工资(sal)
select deptno 部门,avg(sal) 平均工资,max(sal) 最高工资 from emp group by deptno;
注意:这里不能select job,deptno,avg(sal),min(sal) from emp group by deptno; 但 可以select avg(sal),min(sal) from emp; 或 select job,deptno from emp; 这里可以理 解为只有分组后的列才能被显示出来。
显示每个部门的每种岗位(job)的平均工资和最低工资(先 deptno 分组,再 job 分组)
select avg(sal),min(sal),job,deptno from emp group by deptno,job;
显示平均工资低于2000的部门(deptno)和它的平均工资(sal)
select deptno,avg(sal) average from emp group by deptno having average<2000;
最后说明下,SQL查询中各个关键字的执行先后顺序:from > on > join > where > group by > with > having > select > distinct > order by > limit 这也是一道经典的面试题。