MySQL学习记录——칠 表操作

news2025/1/21 5:54:34

文章目录

  • 1、了解
  • 2、创建和插入
    • 1、基本创建和插入
    • 2、插入并更新on duplicate
    • 3、插入并替换replace
  • 3、Retrieve
    • 1、查询select
    • 2、条件查询where
    • 3、结果排序order by
    • 4、限制行数limit
  • 4、更新Update
  • 5、删除delete
  • 6、去重
  • 7、聚合函数(5个)
    • 1、count
    • 2、sum
    • 3、avg
    • 4、max
    • 5、min
    • 6、分组聚合group by


1、了解

表有增删查改操作,有Create创建,Retrieve读取,Update更新,Delete删除,统称CRUD。

2、创建和插入

1、基本创建和插入

insert前面已经用过

insert (into) 表名 (各列名) values (列名对应的数据);

列名可以指定哪几个列名,如果是全部列名,可以都写上,也可以省略这部分,values后面的括号要按照前面列的顺序来写。

create

create table students (
	id int unsigned primary key auto_increment,
	sn int not null unique comment '学号',
	name varchar(20) not null,
	qq varchar(20)
);

全变成小写就是create的形式。每个类型后面跟的都是约束属性,这个在之前的博客中也写过。

insert into students (sn, name, qq) values (123, '哈哈', '4273684');
//全列插入
insert into students values (2, 1234, '哈哈哈', '4345273684');
insert into students values (5, 122345, '呵呵', '3453');
//插入多个, 可以指定列也可以全列
insert into students values (7, 123456,  '呵呵呵', '344353'), (10, 453, '嘿嘿', '78645');
insert into students (sn, name, qq) values (658,  'hfdjd', '7896'), (099, 'xcv', '8756');

在这里插入图片描述
在这里插入图片描述

2、插入并更新on duplicate

我们对上图的7号进行更改,当插入发生冲突时进行更新。

insert into students  values (7, 123456, '呵呵呵', '344353') on duplicate key update sn=86, name='ashjda', qq='07324';

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

row_count()函数可以查看受影响的数据行数。

3、插入并替换replace

replace into students (指定的列名) values (对应的数据);

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

3、Retrieve

1、查询select

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 列名 from 表名;

列名可写多个,比如id,name,password这样的形式。select也可以计算一个表达式,计算可以单独拎出来,也可以和查询放到一起,比如

在这里插入图片描述

也能算这样的

在这里插入图片描述

计算部分的名字可以更改

select name, math, math+chinese-english as total from exam_result;
select name, math, math+chinese-english total from exam_result;
select name 姓名, math 数学, math+chinese-english 总分 from exam_result;

去重则是在列名前加上distinct。

2、条件查询where

可以用select来计算一下,继续用上面select那里创建的表。

在这里插入图片描述

上面的写为大写和小写都行,看这个数据库的校验集。

还有逻辑运算符

and:多个条件必须都为true(1),结果才是true(1)
or:任意一个条件为true,结果就是true
not:条件为true,结果为false

where实际用法

在这里插入图片描述

select name, chinese from exam_result where chinese>=80 and chinese <=90;
select name, chinese from exam_result where chinese between 80 and 90;
//下面两个一样, 但是第二个更简洁
select name, math from exam_result where math in (58, 59) or (98, 99);
select name, math from exam_result where math in (58, 59, 98, 99);

对于模糊的关键词,看上面运算符图中like关键字。

select name from exam_result where name like '孙_';//找到孙某
select name from exam_result where name like '孙%';//找到孙某和孙某某
select name, chinese, english from exam_result where chinese > english;//语文成绩大于英语成绩

找一下总分少于200的,因为当前表没有总分这一列,我们可以这样写

//不能这样写, 即使重命名了, 语句执行顺序是where先开始, 先达到筛选条件再执行select
select name, chinese+english+math total from exam_result where total < 200;
//正确写法
select name, chinese+english+math total from exam_result where chinese+english+math < 200;

还有一些例子

//语文大于80且不姓孙
select name, chinese from exam_result where chinese>80 and name not like '孙%';
//孙某同学, 否则总成绩大于200且语文小于数学且英语大于80
//条件可以用圆括号括起来
select name, chinese, math, english, chinese+math+english 总分 from exam_result where name like '孙_' or (chinese+math+english>200 and chinese < math and english < 80);

null和空串也可以查询,这俩不一样的概念。

3、结果排序order by

asc为升序,desc为降序,默认为asc。没有order by子句的查询,返回的顺序是未定义的,查询时通常用order by。

还是用上面的exam_result表。

//按数学成绩降序排序同学名和数学成绩
select name, math from exam_result order by math desc;

可以多列不同的排序方式,但其实有好几列的排序都会混乱。上面用where时前面临时改的名字不可以用来判断,但是order by可以,因为先执行前面的再执行order by。

4、限制行数limit

//limit从0开始
select * from 表名 limit 4;//前4行
select * from 表名 limit 4, 7;//第5行开始, 读取7行, 如果不够7行, 就读取剩下的全部
select * from 表名 limit 4 offset 2//从第3行开始读取4行

放在一起。limit可以放到偏后面。

select name, english+chinese+math total from exam_result where english+math+chinese>200 order by total
desc limit 2 offset 3;

4、更新Update

update会先查找到再更改。以上面的exam_result表为例,update后面可以跟条件选择。

//如果不加where就是默认把所有的都设置上
update exam_result set math=80 where name='孙悟空';
update exam_result set math=60, chinese=70 where name='曹孟德';
//将数学分数+30后选取倒数3位
update exam_result set math=math+30 order by chinese+math+english asc limit 3;

使用update时要谨慎用没用where,没用会更新全部,写时要记着where来更新选定的一部分。

5、删除delete

delete from 表名//不加任何条件也是全删

全删是删表中的数据,但不影响属性,比如show create 表名,里面还是一样,没变化。删总成绩倒数第一的

delete from exam_result order by chinese+math+english asc limit 1;

清空表除了delete,还有截断表做法

truncate table 表名

会重置auto_increment选型,且无法回滚。truncate不会把自己的操作记录进mysql的日志文件中,而是直接删除,所以速度更快一些,不过只能删整表。

6、去重

创建一个新表并插入一些数据

create table dt( id int, name varchar(20) );
insert into dt values
(100, 'aaa'),
(100, 'aaa'),
(200, 'bbb'),
(200, 'bbb'),
(200, 'bbb'),
(300, 'ccc');

接下来把去重后的数据放到一个新表中

//建立表结构和dt一样的空表ndt
create table ndt like dt;
//去重表示一下原表
select distinct * from dt;
//插入到新表
insert into ndt select distinct * from dt;
//重命名一下
rename table dt to old_dt;
rename table ndt to dt;

7、聚合函数(5个)

1、count

//看一个表有多少个记录
select count(*) from exam_result;
//上面的*写成1, 2, 3也行

写成select 1 from 表名,表里有多少行就打印多少行的1;同样的,select后写上某一列名,就会打印出这列所有的数据,select count(列名)就打印出这一列有多少个数据。

如果一列有重复的数据,不能这样写select distinct count(列名) …,因为要去重的是一列的数据,而不是count的结果,应该写count(distinct 列名)。

2、sum

select sum(列名) from 表名;
//均值
select sum(列名) / count(*) from 表名;
//针对上面的表exam_result, 计算英语不及格的几个人的均值
select sum(english) / count(english) from exam_result where english < 60;

3、avg

计算平均

select avg(列名) from 表名;

avg里面可以有a+b+c这样的表达式。

4、max

最大值

select max(列名) from 表名;

max前面不可以加另外的列名

5、min

最小值

select min(列名) from 表名;

6、分组聚合group by

分组是为了更方便地聚合。

引入一个表scott,emp员工表,dept部门表,salgrade工资等级表。

在这里插入图片描述
在这里插入图片描述

//显示每个部门的平均工资和最高工资
//下句如果select后不写deptno, 那就只显示最高和平均两列, 写上就会打印出对应的部分
select deptno, max(sal) 最高, avg(sal) 平均 from emp group by deptno;

在这里插入图片描述

分组是用选定列的不同的行的数据来进行分组,分组的条件,比如上面的deptno,会去重,也就是聚合压缩。分组是把一张表按照条件再逻辑上拆成了多个子表,然后分别对各自的子表进行聚合统计。

只有在group by之后出现的列名,前面才允许出现这些列名。

//显示每个部门的每种岗位的平均工资和最低工资
select deptno 部门, job 岗位, avg(sal) 平均, min(sal) 最低 from emp group by deptno, job;
//上句如果在select后再加上一个ename, 要查看对应的人名, 这时候就会出错, 因为人名无法按照后面分组条件来分组的

//显示平均工资低于2000的部门和它的平均工资
//要结合having, 对聚合后的结果再做条件选择
select deptno, avg(sal) 平均 from emp group by deptno having 平均<2000;

在这里插入图片描述
在这里插入图片描述

如果写select * from 表名 having 条件,比如ename=‘…’,也会正常显示。where是对具体的任意列进行条件筛选,having是对分组聚合之后的结果进行条件筛选。

不仅仅是定义的表,筛选出来的结果也是表。对于MySQL来说,一切皆表。只要是能够处理好单表的操作,那么所有的sql场景都能用统一的方式进行。

结束。

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

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

相关文章

Project2007下载安装教程,保姆级教程,附安装包和工具

前言 Project是一款项目管理软件&#xff0c;不仅可以快速、准确地创建项目计划&#xff0c;而且可以帮助项目经理实现项目进度、成本的控制、分析和预测&#xff0c;使项目工期大大缩短&#xff0c;资源得到有效利用&#xff0c;提高经济效益。软件设计目的在于协助专案经理发…

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle、Spark执行流程

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spa…

高德 API 10009

问题 笔者使用高德地图所提供的API接口&#xff0c;访问接口报错 {"info":"USERKEY_PLAT_NOMATCH","infocode":"10009","status":"0","sec_code_debug":"d41d8cd98f00b204e9800998ecf8427e"…

SolidWorks学习笔记——草图绘制的基本命令

目录 一、进入草图绘制 二、直线命令与删除命令 三、圆弧命令与矩形命令 四、槽口命令以及多边形命令 五、椭圆以及倒角命令 六、草图绘制中的剪裁命令 七、草图中的几何关系 八、草图绘制中的智能尺寸 九、从外部粘贴草图&#xff08;CAD&#xff09; 一、进入草图绘…

基于鲲鹏服务NodeJs安装

准备工作 查看当前环境 uname -a查看鲲鹏云CPU架构 cat /proc/cpuinfo# 查看CPU architecture项&#xff0c;8表示v8&#xff0c;7表示v7下载Node.js NodeJs 选择 Linux Binaries (ARM) ARMv8 wget -c https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-arm64.tar.xz…

创新指南|生成式AI实验 - 企业快速渐进采用人工智能的科学新方法

生成式人工智能&#xff08;Gen AI&#xff09;正迅速成为各行各业的企业创新焦点。 生成式AI实验对于企业创新而言至关重要&#xff0c;不仅可以帮助企业识别最适合和最有影响的应用场景&#xff0c;还能促进组织沿着生成式 AI 学习曲线前进&#xff0c;建立早期的创新领导者和…

【Java】苍穹外卖 Day02

苍穹外卖-day02 课程内容 新增员工员工分页查询启用禁用员工账号编辑员工导入分类模块功能代码 **功能实现&#xff1a;**员工管理、菜品分类管理。 员工管理效果&#xff1a; 菜品分类管理效果&#xff1a; 1. 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需…

git rebase # |REBASE 1/1 #rebase in progress; onto

git 代码解决冲突之后会提示rebase in progress; onto 1 执行git rebase --abort 回到没有pull代码之前 2 git pull 3 解决冲突 4 git add . (不需要git commit) 5 git rebase --continue 6 git push

MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置

MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件&#xff08;增删改查SQL文&#xff09;3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章&#xff0c;我们…

【leetcode热题100】最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1",&quo…

【教3妹学编程-算法题】LCP 30. 魔塔游戏

3妹&#xff1a;2哥&#xff0c;干嘛呢&#xff0c;一个人闷闷不乐的&#xff0c;在看什么呢。 2哥 : 这不快过年了嘛&#xff0c; 想回家过年给我的小侄子买个礼物&#xff0c;结果他张口说想要个ps5. 那玩意我都没有&#xff0c;他还想要。我看看网上有什么好的礼物适合他的。…

使用npm包js-web-screen-shot做网页截图,可以对截图加文字,箭头等等,类似于微信截图

<template><div class"m-feedback-wrap" :style"{ top: ${feedbackHeight}px }"><div class"m-feedback-icon-wrap"><el-tooltipclass"item"effect"dark"content"内容"placement"left-…

Linux线程库封装

一 MyThread.hpp #pragma once #include<pthread.h> #include<iostream> #include<unistd.h> #include<string> #include<ctime>typedef void (*callback_t)(); static int num 1; //任务和线程绑定 class Thread {static void* Routine(void …

Qt 字符串类应用与常用基本数据类型

目录 操作字符串 查询字符串 Qt 常见数据类型 操作字符串 创建一个控制台项目 &#xff08;1&#xff09;QString提供一个二元的 “” 操作符&#xff0c;主要用于组合两个字符串。QString str1 "Hello World 传递给QString一个 const char* 类型的ASCII字符串 “He…

计算机网络基本知识(一)

文章目录 概要速率带宽、吞吐量带宽吞吐量 时延发送&#xff08;传输&#xff09;时延传播时延排队时延处理时延时延带宽积 利用率 概要 速率、带宽、吞吐量、时延、利用率 速率 记忆要点&#xff1a;10的三次方 记忆要点&#xff1a;2的10次方 带宽、吞吐量 带宽 单位&…

Linux开发:PAM1 介绍

PAM(Pluggable Authentication Modules )是Linux提供的一种通用的认证方式,他可以根据需要动态的加载认证模块,从而减少认证开发的工作量以及提供认证的灵活度。 1.PAM的框架 PAM的框架由一下几个部分构成 1)应用程序,即需要使用认证服务的程序,这些应用程序是使用抽象…

【pip】本地和Anaconda的pip冲突时如何指定安装位置

输入指令&#xff1a; where pip 显示如下&#xff1a; D:\LenovoSoftstore\Anaconda\Scripts\pip.exe C:\python\python3.8\Scripts\pip.exe 可以看到有两个位置的pip&#xff0c;一个Anaconda下的pip&#xff0c;一个是本地的pip。 当我们使用pip安装的时候&#xff0c;系…

百家cms代审

环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。&#xff08;在Mysql命令行中执行&#xff09; 接下来访问CMS&#xff0c;会默认跳转至安装界面 数据库名称和…

初始web服务器(并基于idea来实现无需下载的tomcat)

前言 前面学习了对应的http协议&#xff0c;我们知道了他是在网络层进行数据传输的协议&#xff0c;负责相应数据以及接收数据的规则&#xff0c;但是在人员开发后端的时候不仅仅需要你写io流进行数据传输&#xff0c;还需要你进行对应的tcp协议来进行数据打包发送http协议-CSD…

[疑难杂症2024-001] java多线程运行时遇到java.util.ConcurrentModificationException的解决方案

本文由Markdown语法编辑器编辑完成。 1.背景 由于近日在改进一个医学图像的收图服务。之前的版本&#xff0c;我们采用了pynetdicom的服务。 https://pydicom.github.io/pynetdicom/stable/ 它的介绍为: pynetdicom is a pure Python package that implements the DICOM net…