MySql--表的基本查询(CRUD)

news2024/11/19 2:19:14
CRUD : Create( 创建 ), Retrieve( 读取 ) Update( 更新 ) Delete (删除)

1.insert

基本插入

创建一张表:

-- 创建一张学生表
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL,
qq VARCHAR(20)
);

单行数据 + 全列插入:

-- 插入两条记录,value_list 数量必须和定义表的列的数量及顺序一致
-- 注意,这里在插入的时候,也可以不用指定id(当然,那时候就需要明确插入数据到那些列了),那么mysql会使用默认的值进行自增。

INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO students VALUES (101, 10001, '孙悟空', '11111');

多行插入

INSERT INTO students (id, sn, name) VALUES
(102, 20001, '曹孟德'),
(103, 20002, '孙仲谋');

一次可以插入多行数据。

插入否则更新

由于 主键 或者 唯一键 对应的值已经存在而导致插入失败。

可以选择性的进行同步更新操作 语法:

INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
on duplicate key update sn = 10010, name = '唐大师';

 注意,更新的值不能和其他的主键或唯一键冲突。

 直接替换(REPLACE)

 如果没有冲突就插入,有冲突就替换。

示例:

replace into students (sn, name) VALUES (20001, '曹阿瞒');

 2.select

查询语句是使用MySql时频率最高的语句。其中涉及到单表,多表和子查询。

 基本查找

 基本语法:

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

order by 表示我们要根据哪列进行排序,可以选择倒序还是正序。

where表示查询条件。

limit表示我们筛选出来的结果显示多少条数。

创建测试表

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 * from exam_result;

通常情况下,是不建议用 * 查询的:

1.查询的列越多,意味着需要传输的数据量越大。

2.可能会影响到索引的使用。

指定列查询:

比如id,name列

select id,name from exam_result;

 其实本质也是先把所有的数据查询出来,然后再把指定的列显示出来。

查询字段为表达式:

select语句很特殊,它后面的语句就是要被执行的表达式。

比如 

select 7 * 9;

或者我们要在查询的时候混入一个10

select id,name,10 from exam_result;

 

发现真的混入了一个10。

或者再混入一个 1 + 1

select id,name,1+1 from exam_result;

 

那么我们也可以计算它们的总成绩并命名为total。(语法:在指定列后面直接加 as + (名字))

select id,name,math + chinese + english as total from exam_result;

(as 其实可以省略) 

查询结果去重

在指定的列前加上distinct

select distinct math from exam_result;

 

 条件查询

实际查询一般是不会将数据全部查询出来的,一般都会用到条件查询。

比较运算符

 需要注意的是,在跟NULL判断的时候是不安全的,它不像C语言里面NULL可以跟0作比较。在MySql中任何数跟NULL比较都是NULL。甚至NULL 跟NULL比较都是没有意义的

如果非要NULL跟NULL比较,可以用<=>

select NULL<=>NULL;

 

不过就算要比较一个数是否是NULL,也会用 IS NULL 或者 IS NOT NULL。

逻辑运算符

 where字句案例

1.查找数学成绩是 58 或者 59 或者 98 或者 99 分的同学及数学成绩:
可以用or

select math from exam_result where math=58 or math=59 or math=98 or math=99;

但是这样写比较繁琐,我们可以用in

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

2.模糊匹配

a.查找姓孙的同学

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

 

b.查找孙某同学,注意只有俩字

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

 

where后面也是可以跟表达式的。

查询总分低于200分的同学:

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

 

但是有一个问题,就是这样写起来感觉很繁琐,我们能不能这样写呢?

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

 答案是不能的

这里就涉及到SQL语句中执行顺序的问题了。

它的执行顺序依次是:

1.先执行 from exam_result。先告诉mysql从哪个表里面筛选数据。 

2.设置筛选条件,也就是 where字句。

3.最后再执行我们要查询哪些列,并且重命名。

所以我们就能理解为什么在where判断的时候不能使用之前的重命名,这是由执行顺序导致的。

另外我们也不能在筛选的时候对数据进行重命名,这是语法不支持的。

order by 字句 

语法:

-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];

 其中NULL参与排序,但是NULL在比较的时候比任何值都要小。

比如分别按数学成绩升序

select name,math from exam_result order by math;

默认asc是升序排序。

降序:

select name,math from exam_result order by math desc;

稍微复杂一点的:

查询各门成绩,依次按照数学降序,英语降序,语文升序的方式显示。

其中它的意思是,如果数学成绩相等的话,就按照英语降序,如果英语又相等的话,那么就按照语文升序。 

先看只按数学降序排序

此时唐三藏是在猪悟能前面的,那么我们完整的执行SQL语句

select name,math,english,chinese from exam_result order by math desc,english desc,chinese;

此时猪悟能就跑到前面去了。

另外我们按总分排序的时候可以这样写

select name,math + english + chinese total from exam_result order by total;

我们发现在where的时候不能这样写(不能使用别名),但是在order by这里就可以了。

这里原因归根结底就还是执行顺序问题。

因为order by是先筛选出合适的数据之后,再排序的。

要注意区分把数据筛选出来和把数据显示出来。

分页查询

语法:

-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

 建议:对未知表进行查询的时候,先带一条limit 1,防止表中数据过大,查询全表数据导致数据库卡死。

比如我们想查询前两行数据

select * from exam_result limit 2;

此时,这里的2表示从表的开始位置查多少行。 

或者我们想从第二行开始,往后查三行。

select * from exam_result limit 2,3;

 此时这里逗号前的2表示开始位置,而3表示步长。(下标是从0开始的)

或者还可以这样写

mysql> select * from exam_result limit 3 offset 0;

这里的offset表示的就是从哪里开始,3表示查三行。

所以总结limit的作用就是:

可以作简单的分页查询,每次只需要更改查询的起始位置,就可以每次查询固定行数的数据。

另外limit的本质是显示,它的执行顺序排在order by后面。(在搭配order by使用时)。

3.Update

语法:

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

 比如:将孙悟空同学的数学成绩改为80

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

注意要加上where条件判断,不然表中所有人的数学成绩都会被修改成80。

再比如:将成绩倒数的三名同学,数学成绩加上30

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

4.Delete

删除数据

语法;

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

 案例1:删除孙悟空同学的数据

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

案例2:删除成绩倒数第一名的同学的数据

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

案例3:删除表中所有的数据

首先我们要清楚,delete是删除表中数据的,它不会删除表的结构。

delete from exam_reslut;

这个操作一定要慎用,这里我就不执行了。

另外一定要注意,delete不会影响表的结构,它只删除表的数据。比如,我们就算删除了表中所有的数据,它也不会影响自增主键计数器的值。

截断表

语法:

TRUNCATE [TABLE] table_name

 这个操作要慎用。同时注意它和delete的区别:

1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作。
2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是 TRUNCATE 在删除数据的时候,并不经过真正的事务,所以无法回滚
3. 会重置 AUTO_INCREMENT 项。(会影响表结构)
truncate不会将操作记录在日志里。

5.插入查询结果

 语法:

INSERT INTO table_name [(column [, column ...])] 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');

删除重复数据的思路就是:

先创建另一张表,结构相同。

CREATE TABLE no_duplicate_table LIKE duplicate_table;

然后通过以去重查询原表的方式,将查询的结果插入到新表中。

INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;

然后再更改原表和新表的名字,即可。

RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;

6.聚合统计

 还是先创建一个测试表

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 count(*) from exam_result;

其中count()括号里面不是*也可以

 

示例2:我们想查询表中记录中有多少条有效的数学成绩

select count(math) from exam_result;

 

注意:NULL是参与计数的。

 示例3:如果我们想统计重复的数据,可以加distinct,但是要注意distinct所加在的位置。

select count(distinct math) from exam_result;

 示例4:统计数学成绩总分

select sum(math) from exam_result;

案例4:统计数学平均分

select avg(math) from exam_result;

 

案例5:统计数学成绩最高的(统计最低的同理)

select max(math) from exam_result;

 

案例6:统计数学成绩大于80分的最小值

select min(math) from exam_result where math>80;

 

 

7.分组聚合统计 

分组的目的是为了分组之后,方便聚合统计。

group by 子句 

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

语法:

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

 

分组聚合案例

 浅看一下员工信息表

EMP 员工表
DEPT 部门表
SALGRADE 工资等级表
在emp那里,有一个部门编号,虽然没有外键之实,但是已经有外键之名了。只是在Mysql中加外键其实是会影响效率的,我们想起到外键约束的效果,可以在上层---也就是我们使用java或者C++这样的语言连接数据库时,在这里判断不符合外键约束的操作。

员工薪资表 

 

插入了测试数据

 

部门表

同样插入数据后

 

 

还有薪资等级表

同样有测试数据

 

示例1:显示每个部门的平均工资和最高工资。

select deptno,max(sal) 最高,avg(sal) 平均 from emp group by deptno;

分组(分表),其实就是把一张表按照条件在逻辑上拆成了多个子表,然后分别对各自的子表进行聚合统计。

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

据需求要先按部门分组,再按岗位分组,最后再聚合。

select deptno,job,avg(sal) 平均,min(sal) 最低 from emp group by deptno, job;

一般在分组聚合查询时,select后面只能跟两类,一类是跟分组有关的列,比如deptno和job,另一类就是聚合函数,其他的select后面一般不能跟,比如ename(员工姓名),如果查询的话就会报错。

案例3:显示平均工资低于2000的部门和它的最低工资。

这个需求比较复杂:

1.首先我们需要先统计出每一个部门的平均工资。(也就是结果先聚合出来)

2.再进行判断。(对聚合出来的结果进行判断)

我们用having来对聚合后的结果进行判断。

select deptno,avg(sal) deptavg from emp group by deptno having myavg<2000;

 这个having经常跟group by搭配使用,作用是对分组进行筛选,跟where有点像。

虽然having和where都是条件筛选,但是它们完全不一样。

比如将刚刚的案例having换成where就会报错。

之前也提到过,分组其实就是分表,将原先的一张表,按筛选条件分成了多张表。

同理,我们每次用where条件筛选的时候,每次筛选出来的结果在逻辑上也是一张表。

比如:查每个部门的每种工作的平均工资低于2000,但是SMITH要离职了, 所以他不参与统计。

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

 总结where和having的区别:

1.where是对具体的任意列进行条件筛选。

2.having是对分组聚合之后的结果进行条件筛选。

所以它们条件筛选的阶段是不同的。

总结

基本的表查询就到这里。

到现在,我们已经认识到了:

  不是只有从磁盘上的表结构导入到MySQL而形成的表才叫做表, 中间根据条件筛选出来的,包括最终结果,都可以认为是逻辑上的表。

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

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

相关文章

【软件设计师】大题

一、数据流图 基础知识 数据流图&#xff08;Data Flow Diagram,DFD&#xff09;基本图形元素&#xff1a; 外部实体&#xff08;External Agent&#xff09; 表示存在于系统之外的对象&#xff0c;用来帮助用户理解系统数据的来源和去向加工&#xff08;Process&#xff09;数…

Python设计模式之适配器模式

目录 一、适配器模式 适配器模式的组成部分 适配器模式的种类 应用场景 实现步骤 二、测试例子 一、适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将一个现有接口转换为另一个期望的接口来让不兼容的接口能够合作…

渗透测试 一个很奇怪的支付漏洞

新手实战刷课网站、好玩又有趣&#xff01; 第一步 打开网站、任意账户名密码登陆发现验证码可重复利用 这时候我们可以试试admin账号、发现如果账号正确会提示账户已存在、反之回显账户密码错误 第二步 既然验证码可以重复利用&#xff1b;而且账号名有回显 这时候我们试…

DNS服务的部署与配置(1)

一、DNS的定义 1、域名系统&#xff08;英文&#xff1a;Domain Name System&#xff0c;缩写&#xff1a;DNS&#xff09;是互联网的一项服务。 它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。 DNS使用UDP端口53。 当前&#xff0…

SpringBoot 集成 Nebula

工作需求&#xff0c;开始了解图数据库&#xff0c;经过工具选型&#xff0c;最终选择nebula graph&#xff0c;并集成到springboot&#xff0c;java 环境下如何对 Nebula Graph 进行操作&#xff0c;本文整理下过程。 1、首先引入 pom 依赖 <dependency><groupId&g…

安全访问python字典:避免空键错误的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、直接访问字典键的问题 三、使用get方法安全访问字典键 四、get方法的实际应…

v-model详解

目录 原理 作用 表单类组件封装 ​编辑v-model简化代码 原理 v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value属性和input属性的合写。 作用 提供数据的双向绑定。 数据变&#xff0c;视图跟着变:value视图变&#xff0c;数据跟着变input 注意&…

【C++】AVL树和红黑树模拟实现

AVL树和红黑树 1. 背景2. AVL树的概念3. AVL树节点的定义4. AVL树的插入5. AVL树的旋转5.1. 左单旋5.2. 右单旋5.3. 左右单旋5.4. 右左单旋5.5. 旋转总结 6. AVL树的验证7. AVL树的性能8. 红黑树的概念9. 红黑树的节点的定义10. 红黑树的插入10.1. 情况一10.2.情况二 11. 红黑树…

2024电工杯数学建模B题高质量成品论文,包括代码数据

2024电工杯数学建模B题高质量成品论文&#xff0c;包括代码数据 完整内容见文末名片 摘要 大学时期是学生们知识学习和身体成长的重要阶段&#xff0c;良好的饮食习惯对于促进生长发育和保证身体健康具有重要意义。针对当前大学生中存在的饮食结构不合理及不良饮食习惯的问题…

React useState数组新增和删除项

在React中&#xff0c;我们可以使用useState钩子来管理组件的状态&#xff0c;其中包括数组。如何在React函数组件中对数组进行增加和删除项的操作&#xff1f; 新增项时&#xff1a;我们可以对原数组进行解构&#xff0c;并把新增项一起加入到新数组&#xff1b; 删除项时&…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题&#xff1a;大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

IT行业已经饱和?2024年报考计算机类专业还有出路吗?

&#x1f446;点击关注 获取更多编程干货&#x1f446; “高薪”光环加持&#xff0c;IT行业一直是不少人心仪的职业选择&#xff0c;计算机专业一度成为最热门的本科专业。 然而&#xff0c;正因报考计算机专业、想要入行IT行业的人越来越多&#xff0c;“行业饱和”、“人才…

探数API统计分享-2017年-2021年中国各省人均消费支出统计

根据2017年至2021年的统计数据&#xff0c;我国各省&#xff08;市、区&#xff09;的人均消费支出情况各不相同。其中&#xff0c;上海的人均消费支出最高&#xff0c;达到了2021年的48879元&#xff0c;位居全国之首。紧随其后的是北京&#xff0c;人均消费支出为43640元。 …

Vivado 使用教程(个人总结)

Vivado 是 Xilinx 公司推出的一款用于 FPGA 设计的集成开发环境 (IDE)&#xff0c;提供了从设计输入到实现、验证、调试和下载的完整流程。本文将详细介绍 Vivado 的使用方法&#xff0c;包括项目创建、设计输入、约束文件、综合与实现、仿真、调试、下载配置等步骤。 一、创建…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中&#xff0c;经常会见到一些徽章(Badge)小图标&#xff0c;如…

抽烟行为检测:从传统巡查到智能算法

在当前人工智能和计算机视觉技术的迅猛发展下&#xff0c;基于视觉分析的抽烟行为检测算法成为一种高效的技术手段。此类算法通常依赖于深度学习模型&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过对摄像头捕捉的视频流进行实时分析&#xff0c;能…

租赁系统|北京租赁系统|租赁软件开发流程

在数字化时代的浪潮下&#xff0c;小程序成为了各行各业争相探索的新领域。租赁行业亦不例外&#xff0c;租赁小程序的开发不仅提升了用户体验&#xff0c;更为商家带来了更多商业机会。本文将详细解析租赁小程序的开发流程&#xff0c;为有志于进军小程序领域的租赁行业从业者…

AI爆文写作:如果你有一篇文章爆了,正确的做法是:自己抄袭自己,重复发,还可以继续爆!

爆款总是相似的&#xff0c;如果你有一篇文章爆了&#xff0c;正确的做法&#xff0c;就是重复发&#xff0c;让它继续爆下去。 以前我在小红书看到一个人&#xff0c;将一篇自己火的笔记&#xff0c;连续发了5次&#xff0c;每次点赞数据都不错。 公众号文章也是一样的。 我…

【LeetCode】【209】长度最小的子数组(1488字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现前缀和二分查找滑动窗口 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定一个含有n个正整数的数组和一个正整数target找出该数组…

Spring Boot 3.3 正式发布,王炸级更新,应用启动速度直接起飞!

最新消息&#xff0c;Spring Boot 一次性发布了 3 个版本&#xff1a; 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式发布了&#xff0c;3.1.x 在前几天也停止维护了。 最新的支持版本如下&#xff1a; 从路线图可以看到每个版本的终止时间&#xff0c;每个版本的生命周期只有…