当前位置: 首页 > news >正文

【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  这也是一道经典的面试题。

相关文章:

  • 雪花算法生成int64,在前端js的精度问题
  • PostgreSQL的dblink扩展模块使用方法
  • Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排
  • 数据库监控 | MongoDB监控全解析
  • vue3实现v-directive;vue3实现v-指令;v-directive不触发
  • 【AI平台】n8n入门1:详细介绍n8n的多种安装方式(含docer图形化安装n8n)
  • 武汉火影数字虚拟展厅制作:打破时空限制的数字化盛宴
  • 【高频考点精讲】JavaScript中的组合模式:从树形结构到组件嵌套实战
  • 基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
  • AD16如何设置合适的PCB板框
  • 常见的限流算法
  • 两段文本比对,高亮出差异部分
  • 最新AI-Python机器学习与深度学习技术在植被参数反演中的核心技术应用
  • Redis从入门到上手-全面讲解redis使用.
  • Vue3中index.html与app.vue、main.ts三个文件的作用和关系
  • 北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架
  • 在方德桌面操作系统V5.0-G23上使用 NetworkManager 配置静态 IP 和动态 IP 的完整指南
  • 含锡废水的处理
  • OSI七层模型和TCP/IP四层模型
  • 时间序列-数据窗口进行多步预测
  • 铁线礁、牛轭礁珊瑚礁“体检”报告首次发布,专家:菲非法活动产生胁迫性影响
  • 当哲学与戏剧作为一种生活方式——《人生六戏》分享会
  • 乌代表团与美特使在伦敦举行会谈,双方同意继续对话
  • 医改经验如何因地制宜再创新?国家卫健委“以例说法”
  • 北京市交通委通报顺平路潮白河大桥事故直接原因
  • 首开股份:去年亏损约81.4亿元,是公司发展史上极其困难的一年