表查询基础【mysql】【表内容 增,删,改,查询】

 博客主页:花果山~程序猿-CSDN博客

文章分栏:Linux_花果山~程序猿的博客-CSDN博客MySQL之旅_花果山~程序猿的博客-CSDN博客Linux_花果山~程序猿的博客-CSDN博客

关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!

目录

一,表内容的插入,删除,修改

插入 

插入是否更新

替换式插入

查询

where

结果排序(order by)

结果分页(limit)

修改

update*

删除

 delete*

truncate*

向新表插入查询结果

二,聚合统计函数

group by & having

结语


嗨!收到一张超美的风景图,愿你每天都能顺心!

一,表内容的插入,删除,修改

插入 

常见的插入我们已经熟练使用过了,如b连续插入表:

insert  [ into ] table_name [列名1,列明2]  values (内容1, 内容2,...) , (内容1, 内容2)...;

下面来几个特殊的插入:

插入是否更新

由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,因此对已存在的数据进行修改

语法: 
insert [into] ... on duplicate key update 列名=新内容 ...;

检测此次特殊的插入操作结果:

-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新

例如,下面就是有冲突数据,将已经存在的数据进行更新:

替换式插入

替换式插入,如果 主键或者唯一键冲突,则 删除后再插入;没有则直接插入。
语法:
replace [into] table_name[列名1,列名2...] value (内容1,内容2...);

检测插入结果:

-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入

示例如下:

查询

语法:

SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

我们经常用的比如  *  from , where,剩余的我们通过例子进行了解。   

为查询操作,制作实验库

-- 创建表结构
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);

首先我们需要了解的是 select 的特殊用法,如:

select  + 表达式

(注:从上面单独列名的查询可以看出,加上在linux指令对 * 的理解,*  是代表全部,任一的意思。说到 select * ,我们就需要注意一下,在未来我们工作时,mysql的服务一般在远端,需要通过网络传输,而一个中小型公司的数据库的数据量少说都是几千万行的数据,如果select *,则会消耗大量的网络资源,因此select  * 一般学习时用用就好。

where

  where 关键字在sql 类似于 编程语言中if语句,是一个判断语句。

常见的语法:

select ...  from  table_name   where []

下面我们看看mysql中有那些逻辑语句:

就当做C语言来学即可,需要多注意null的比较,0表示有效,null则表示未填入。 

查询案例:

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

select name,  english from exam_result where english < 60;

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

select name , chinese from exam_result where chinese  between 80 and 90 ;

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

select name, math from exam_result where math=58 or math=59 or math=98 or math=99;
select name , math from exam_result where math in(58,59,98,99);

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

select name from exam_result where name like '孙%';
select name from exam_result where name like '孙_';

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

select name from exam_result chinese > english;

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

select name, math + chinese + english as total from exam_result where math + chinese + english < 200;

这里我们需要再次了解一下select,如图:

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

select name , chinese from exam_result  where chinese > 80 and name not like '孙%'
ke '孙%';

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

select name, chinese, math, english , chinese + math+english as total-> from exam_result-> where name like '孙_' or (chinese + math+english > 200 and chinese < math and english > 80);

结果排序(order by)

语法:

select ... from table_name [where ...] order by column [desc | asc]
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC

mysql语句执行顺序,先通过where筛选出表数据,结果可以再进行处理(排序),最后展示。

比如下面这个例子:

查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
 select name, math from exam_result where name like '孙%' or name like '曹%'order by math desc;

结果分页(limit)

        并没有分页,只是选择性的每次只展示一些数据。 

语法:

select ... from ... [where ...] [order by ...]  limit s , n;

 s表示开始的行,以0作为起始行下标n表示展示行的步数

....  limit  n;    //则默认从0下标行开始

案例:

修改

update*

        update这个语句的使用比较危险,使用示例如下:

将孙悟空的数学成绩变成80分:

update exam_result   set  math = 80  where  name ='孙悟空';

如果我们忘记搭配 where 使用,那么 math这列的数据,全部设置为80,直接破坏其余数据,因此Update的使用风险很大,对单个数据的修改,宁愿使用insert的插入式更新。

不添加 where 就是对全表进行操作,需谨慎

删除

 delete*

语法:

delete [table] table_name;

清楚孙悟空的数据

delete from exam_result where name = '孙悟空';

 区别于drop删除表,delete则是清空表,保留自增值,请看下面例子:

实验表: 

-- 准备测试表
CREATE TABLE for_delete (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);-- 插入测试数据
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

截断表 (truncate)

语法:

trunvcate [table]  table_name;

相对于delete,有以下区别:

1. 只能对整表操作 ,不能像 DELETE 一样针对部分数据操作;
2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是 TRUNCATE 在删除数据的时候,并不经过真正的事物,所以无法回滚
(说大白话就是,一般的mysql执行命令时,处理形成事物,然后会被记录到日志中,方便以后操作回滚,truncate操作则不记录至日志中,无法回滚)
3. 重置 AUTO_INCREMENT

向新表插入查询结果

语法:

insert [into] table table_name1 ... select ... 

情景:获取去重后的表

实验表创建:

CREATE TABLE duplicate_table (id int, name varchar(20));INSERT INTO duplicate_table VALUES
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');

曾经我们通过distinct来处理结果,达到去重的效果,

但这不是一个新表,我们无法进行后续的数据操作。因此,通过下面几步在mysql中来完成一个去重表替换旧表的操作。

1. 创建一张相同结构的空表

create table no_duplicate_table like duplicate_table;

2. 将去重后的查询结果插入空表

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;

怎么理解该去重的原子操作?答:在重命名前,在旧数据表无法察觉的情况下,已经创建了替换副本,由于重命名本质上就是修改文件名,也就是调用move指令,修改文件名,因此等再次使用数据表时,已经完成替换,属于原子操作。

二,聚合统计函数

函数如下: 

 案例:

1.统计参与的同学数

2. 统计平均总分

如何理解聚合统计函数? 答:我们得以整个表的角度来看,例如:min(math),在获取每一行的math时,会经过min函数判断是否比历史最小值小。因此,

count 是对查询结果的行个数进行统计;

sum 则是统计每一行查询出的结果进行统计,得出表级别的数据;

group by & having

select 中使用 group by 子句可以对指定列进行分组查询,一但分组
select column1, column2, .. from table group by column1, column2;

(注:group by 可以用于去重,对比distinct,group by在大表中,效率会更高,用法 select 字段 .. group by 字段) 

准备一个测试表,如下:

准备工作,创建一个雇员信息表(来自 oracle 9i 的经典测试表)
  • EMP员工表
  • DEPT部门表
  • SALGRADE工资等级表
DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE `scott`;DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',`dname` varchar(14) DEFAULT NULL COMMENT '部门名称',`loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',`ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',`job` varchar(9) DEFAULT NULL COMMENT '雇员职位',`mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',`hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',`sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',`comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',`deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (`grade` int(11) DEFAULT NULL COMMENT '等级',`losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',`hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

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

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

显示平均工资低于 2000 的部门和它的平均工资 , having和 group by 配合使用,对 group by 结果进行过滤。

如何区别 where & having?

面试题 )SQL 查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select > distinct > order by > limit

结语

   本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获,请动动你发财的小手点个免费的赞,你的点赞和关注永远是博主创作的动力源泉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/16393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EXCEL_VBA_常用过程 函数】

结合日常工作需要&#xff0c;收录或改写相关过程及函数&#xff0c;现共享给大家&#xff0c;希望能对大家有所帮助&#xff01; 目录 1. 过程 1.1 批量处理框架Application.GetOpenFilename 2. 功能函数 2.1 字符串数组比对 / 两组数据比对是否一致&#xff08;不要求元素…

服务器硬件基础知识以及如何部署相关应用

服务器硬件是构成服务器物理基础的组件集合&#xff0c;它们共同工作以提供计算服务、数据存储、网络通信等功能。以下是一些关键的服务器硬件基础知识&#xff1a; 1. 处理器&#xff08;CPU&#xff09; 作用&#xff1a;服务器的大脑&#xff0c;负责执行程序指令和处理数…

Redis(十三) 事务

文章目录 前言事务的特性Redis事务的执行原理Redis中使用事务WATCH UNWATCH实现乐观锁 前言 前面我们学习 MySQL 的时候&#xff0c;肯定也学习了事务。事务是什么&#xff1f;给大家举个例子&#xff1a;假如我给朋友微信转账&#xff0c;我给他转了 100 块钱&#xff0c;当我…

【14】bat脚本备份mysql数据

说明 1、请注意windows的bat脚本语法 2、请注意linux和windows的格式 3、请注意时间是个位数的问题 一、参数说明 1、参数说明: setlocal ENABLEDELAYEDEXPANSION 是延迟变量 setlocal和endlocal 是必须要一起用 @echo on 是开启显示,方便调试 :: 注释 cd /d D:\dbbackup …

Golang | Leetcode Golang题解之第114题二叉树展开为链表

题目&#xff1a; 题解&#xff1a; func flatten(root *TreeNode) {curr : rootfor curr ! nil {if curr.Left ! nil {next : curr.Leftpredecessor : nextfor predecessor.Right ! nil {predecessor predecessor.Right}predecessor.Right curr.Rightcurr.Left, curr.Righ…

格式转化——Labelme标注好的json文件批量转为png(标签)文件(物体为红色,背景为黑色)和jpg原图

作用如题目&#xff0c;批量将标注好的json文件转成png标签&#xff0c;jpg原图&#xff0c;其中标签时红黑图。 代码如下&#xff1a; import argparse import base64 import json import os import os.path as osp import imgviz import PIL.Image import yaml from labelm…

Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册

文章目录 前言Dashboard开发总结 前言 后台管理系统中的Dashboard是一种图形化的信息显示工具&#xff0c;通常用于提供一个特定领域或系统的概况。它可以帮助用户监控和分析数据&#xff0c;快速获取重要信息。可以帮助用户监控业务状况、分析数据、获取关键信息和管理资源。…

list的模拟实现(一)

嗨喽大家好&#xff0c;时隔许久阿鑫又给大家带来了新的博客&#xff0c;list的模拟实现&#xff08;一&#xff09;&#xff0c;下面让我们开始今天的学习吧&#xff01; list的模拟实现&#xff08;一&#xff09; 1.list splice接口的使用 2.list尾插的实现 3.list的迭代…

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…

Linux CentOs如何升级openssl

1.获取 OpenSSL 1.1.n 源码 wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz tar -xzf openssl-1.1.1n.tar.gz cd openssl-1.1.1n 2.编译和安装 OpenSSL 1.1.n ./config --prefix/usr/local/openssl-1.1.1n --openssldir/usr/local/openssl-1.1.1n shared zlib m…

【C语言】strstr函数的使用和模拟

前言 今天给大家带来一个字符串函数&#xff0c;strstr()的使用介绍和模拟实现。 模拟实现这个函数&#xff0c;可以帮助我们更深刻地理解这个函数的功能和提高解决字符串相关问题的能力&#xff0c;有兴趣的话就请往下看吧。 strstr函数介绍 函数功能&#xff1a; strstr函…

synchronized什么情况下会释放锁?

synchronized关键字可以用于实现线程之间的同步&#xff0c;它可以修饰方法或代码块&#xff0c;保证在同一时间只有一个线程能够访问被synchronized修饰的代码。 synchronized会在以下情况下释放锁&#xff1a; 代码块执行完毕&#xff1a; 当一个线程执行完了一个被synchro…

Three.js 研究:3、创建一个高科技圆环

打开Alpha混合 修改环形颜色&#xff0c;更改发光的颜色&#xff0c;更改发光的强度为2 更改世界环境灯光

使用 Docker Compose 接管现有容器的文档

前言 在使用 Docker 容器技术时&#xff0c;有时我们可能需要 Docker Compose 来接管并管理已经存在的容器。这通常发生在容器手动启动或由其他部署流程创建后&#xff0c;我们希望利用 Docker Compose 来简化未来的管理任务。 准备工作 在尝试接管现有容器之前&#xff0c;…

如何编辑 PDF 中的文本?4个有效的编辑PDF方法

PDF 文件可以轻松打开和查看&#xff0c;但修改要复杂得多 - 尤其是在 PDF 中的文本编辑方面。 知道如何离线编辑 PDF 中的文本对于任何需要快速更改而无需在线加载文档或担心安全问题的人来说都非常有益。它使用户能够更好地控制他们的文档&#xff0c;并有更广泛的字体和图形…

着急联系媒体投稿发表文章有什么好方法?

作为一名曾经的信息宣传员,我深知在紧张的宣传节点上,急于将精心撰写的文章推向更广阔的读者群体,那种紧迫感和焦虑几乎成了常态。记得那段时间,为了能让稿件得到及时有效的曝光,我不得不亲自踏上了一场寻找媒体联系方式的“马拉松”。那时,我手头的资源有限,仅有的几个联系方式…

JRT1.7发布

JRT1.7连仪器在线演示视频 JRT1.5实现质控主体、1.6基本完成质控&#xff1b;本次版本推进到1.7&#xff0c;1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全&#xff0c;上十年写系统用到的都全了。 这次直接挑战检验最难…

就业信息|基于SprinBoot+vue的就业信息管理系统(源码+数据库+文档)

就业信息管理系统 目录 基于SprinBootvue的就业信息管理系统 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 4.2.1管理员功能 4.2.2学生功能 4.2.3企业功能 4.2.4导师功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

Python3 笔记:模块的导入方式

1、import import 模块名 2、import as import a as b import as的方式其实是实现了两步操作&#xff1a;先将模块导入&#xff0c;再为模块重命名。 3、from import from a import func from import方式是直接导入模块内的函数。 from import *方式将模块中所有的名字…

算法学习-构造

文章目录 相关题目667.优美的排列II481.神奇字符串 构造题会让我们按照一定的规律去构造一个符合条件的结果&#xff0c;其通常是和其他算法结合起来考察的&#xff0c;其中的规律有时候是比较难找的&#xff0c;因此只能对其进行规律总结。 相关题目 667.优美的排列II 参考…