【MySQL篇】MySQL基本查询详解

目录

前言: 

1,Create

1.1,单行数据+全列插入 

1.2,单行数据+指定列插入 

 1.3,多行数据+全列插入

1.4,多行数据+指定列插入 

1.5,插入否则更新 

1.6,替换

2,Retrieve (读取)

2.1,全列查询

2.2,指定列查询

2.3,查询字段为表达式

 2.4,为查询结果指定别名

2.5,结果去重 

2.6,where条件 

2.7,结果排序 

 2.8,筛选分页结果

3,Update 

4,Delete 

4.1,删除数据

 4.2,删除整张表

 4.3,截断表

5, 插入查询结果

6,聚合函数 

7,group by子句的使用 

 结语:


前言: 

本篇主要讲述对于表内容的增删查改及相关查询语句:
CRUD : Create(创建), Retrieve(读取)Update(更新)Delete(删除)


1,Create

语法:

insert into 表名  (指定列) values  (values1,values2,...)

示例:

  •  创建一张学生表

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

1.1,单行数据+全列插入 

  • 插入数据

注意在这里插入的时候也可以不指明id,因为我们定义了auto_increment属性,mysql会使用默认的值自增。

mysql> insert into students values (1,101,'张三',1111);

mysql> insert into students values (2,102,'李四',11222);

  • 查看插入结果 

select * from students;

1.2,单行数据+指定列插入 

  •  指定列插入数据

mysql> insert into students  (sn,name,qq) values (103,'李四',11333);
mysql> insert into students (id,sn,name) values (10,104,'王五');

 1.3,多行数据+全列插入

mysql> insert into students values (20,105,'赵六',2222) ,(21,106,'田七',3333);

1.4,多行数据+指定列插入 

mysql> insert into students (sn,name) values (116,'北京'),(117,'上海');

1.5,插入否则更新 

在插入数据的时候,由于主键和唯一键的存在,可能导致插入的数据已经存在而插入失败。

如果需要更新,可以进行更新操作。也就是在插入数据时,如果不存在就直接插入,如果存在,发生冲突了,就将原来的数据更新为插入的数据。这个和STL中的unordered_map类似,在使用[ ]的时候,如果存在就更新,如果不存在就插入。

语法:

insert  ......  on duplicate key update  column=value[......]

示例:

mysql> insert into students values (1,101,'张三',55555) on duplicate key update id=1,sn=101,name='张三',qq=55555;

在更新的时候也要保证不和其他值冲突。 

1.6,替换

替换replace与上面的插入更新类似,如果数据存在就替换,如果数据不存在就直接插入。

mysql> replace into students (sn,name) values (120,'广州');//不存在直接插入

mysql> replace into students (id,sn,name,qq)  values (1,101,'苏州',99999);//数据已经存在,则替换掉原数据

2,Retrieve (读取)

首先创建一张学生成绩表,作为示例

mysql> create table exam_result(
    -> id int unsigned primary key auto_increment,
    -> name varchar(20),
    -> chinese int,
    -> math int,
    -> english int);

向表中插入一些数据:

 mysql> insert into exam_result (name,chinese,math,english) values ('孙悟空',87,78,77);
 

mysql> insert into exam_result (name,chinese,math,english) values ('猪悟能',88,98,90);
 

mysql> insert into exam_result (name,chinese,math,english) values ('曹孟德',82,84,67);
 

mysql> insert into exam_result (name,chinese,math,english) values ('刘玄德',55,85,45);
 

mysql> insert into exam_result (name,chinese,math,english) values ('孙权',70,73,78);
 

mysql> insert into exam_result (name,chinese,math,english) values ('宋公明',75,65,30); 

2.1,全列查询

 mysql> select * from exam_result;

通常情况 下不建议使用 * 进行全列查询 

  • 查询的列越多意味着需要传输的数据量越大;
  • 可能会影响到索引的作用。(索引在后面更新)

2.2,指定列查询

select 筛选的列名称 from 表名

示例:

mysql> select id,name,math from exam_result;
mysql> select id,name,chinese  from exam_result; 

2.3,查询字段为表达式

  •  表达式不包含字段

mysql> select id,name,math,10 from exam_result;
mysql> select id,name,math,10+10 from exam_result;

 

  • 表达式中包含一个字段 

mysql> select id,name,math+10 from exam_result;

  • 表达式中包含多个字段 

mysql> select id,name,math+chinese+english from exam_result;

 2.4,为查询结果指定别名

select  column  [as] 别名 from 表名;

示例: 

mysql> select id,name,math+chinese+english as total from exam_result;
mysql> select id,name,math+chinese+english  '总分'  from exam_result;

2.5,结果去重 

math列中的数据98重复了。

 去重,需要使用distinct

mysql> select distinct math from exam_result;

2.6,where条件 

前面讲的select 用法,是用来筛选出哪些列,而接下来的这部分内容where条件,是筛选出满足条件的行。 

比较运算符

  • >,>=,<,<=:大于,大于等于,小于,小于等于
  • =:等于,比较null值时不安全,比如null=null返回的结果是null
  • <=>:等于,比较null值时是安全的,比如null=null返回的结果是1
  • !=,<>:不等于
  • between a0  and  a1:范围匹配,[a0,a1],如果a0<=values<=a1,返回true(1)
  • in(option...):如果是option中的任意一个,返回true(1)
  • is null:是空
  • is not null:不是空
  • like:模糊匹配。%表示任意多个字符(包括0个),_表示任意一个字符

逻辑运算符 

  • and:多个条件必须都为true,结果才为true
  • or:只要有一个条件为true,结果就为true
  • not:如果条件为true(1),结果就为false(0) 

null和null的比较,=和<=>的比较:

 

使用案例: 

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

mysql> select name,english from exam_result where english<60;

  •  语文成绩在[80,90]的同学及语文成绩

mysql> select name,chinese from exam_result where chinese>=80 and chinese<=90;
mysql> select name,chinese from exam_result where chinese between 80 and 90;

  • 数学成绩是58或者59或者98或者99的同学及数学成绩 

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

 

  • 姓孙的同学

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

  • 孙某同学 

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

  • 语文成绩好于英语成绩的同学 

//where条件中比较运算符两侧都是字段

mysql> select name,chinese,english from exam_result where chinese>english;

  • 总分在200分以下的同学 

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

 

前面在select内容部分,我们可以为查询结果math+chinese+english取别名。但在where子句中是否可以使用别名呢?

可以看到是不能使用的。这和mysql的执行顺序有关。 

 总结:先确定操作哪张表,再根据where子句的条件筛选出我们想要的数据,最后再显示出来。

 所以在where子句中不能使用别名,但在select中仍然可以使用。

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

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

  • 孙某同学,或者总成绩>200并且语文成绩<数学成绩并且英语成绩>80

mysql> 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);

2.7,结果排序 

语法:

---ASC 升序(从小到大)

---DESC 降序(从大到小)

---默认为ASC

select ...... from table_name [where...]  order by column [ASC|DESC];

注意:null视为比任何值都小 

案例:

  • 查询同学及数学成绩,数学成绩按照升序显示

mysql> select name,math from exam_result order by math;

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

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

 

  • 查询同学及总分, 由高到低

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

 

order by 子句可以使用别名 

mysql> select name,math+chinese+english '总分' from exam_result order by 总分 desc;

 

在这里为什么可以使用别名了呢?同样这和mysql的子句执行顺序有关。

总结:首先我们需要确定操作哪张表,如果第二步就执行排序,其实表中有一部分数据是不需要进行排序的, 这样做太浪费时间和空间了。所以先确定操作哪张表,再根据where子句条件筛选出来我们要的数据,这时的数据一定是被筛选出来的有价值的数据,这时我们只是选出来数据了,不给显示出来,最后经过排序,再将数据显示出来。

因此执行ordere by时,别名已经定义了,所以可以使用。

 2.8,筛选分页结果

语法:

----起始下标从0开始

---从0开始,筛选n条结果

select ......from table_name [where...]  [order by...] limit n;

---从s开始,筛选n条结果

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

---从s开始,筛选n条结果,和第二种方法表示一样

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

注意:limit的执行顺序比order by还要靠后 

 按id进行分页,分别显示第1,2,3页

3,Update 

语法:

update table_name set column=expr [column=expr...]  [where...] [order by...] [limit...]

案例: 

  • 将孙悟空同学的数学成绩变更为80

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

  • 将曹孟德同学的数学成绩变更为60,语文成绩变更为70 

mysql> update exam_result set math=60,chinese=70 where name='曹孟德';

  • 将总成绩倒数前 3的同学的数学成绩加上30分 

mysql> select name,math,chinese+math+english 总分 from exam_result order by 总分 limit 3;

 

4,Delete 

4.1,删除数据

语法:

delete from table_name [where...] [order by...] [limit ...]

注意:如果delete from 表名,会将表的内容清空 

案例:

  •  删除孙悟空同学的考试成绩

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

 

 4.2,删除整张表

  • 准备测试表

mysql> create table for_delete(
    -> id int primary key auto_increment,
    -> name varchar(20));

其中id有自增属性。

  • 插入测试数据 

mysql> insert into for_delete values (1,'A'),(2,'B'),(3,'C');

  • 查看测试数据 

  • 删除整张表 ,查看删除结果

mysql> delete from for_delete;

mysql> select * from for_delete;

 

  • 删除表之前id自增到3,现在插入一条新数据。 

mysql> insert into for_delete (name) values ('D');

可以发现在清空表后,id的自增值没有变为0。可以通过show查看表结构。

mysql> show create table for_delete\G

 4.3,截断表

语法:

truncate [table] table_name

注意:这个 操作慎用

1,这个操作只能对整张表使用,不能向delete一样针对部分数据操作

2,不对数据操作,所以比delete快,但是truncate 在删除数据的时候,并不经过正真的事务,所以无法回滚 

3,该操作与delete相比,它会重置auto_increment项

案例:

  • 准备测试表(和for_delete表属性一样)

mysql> create table for_truncate like for_delete;

  • 插入测试数据 ,查看测试数据 

mysql> insert into for_truncate values (1,'A'),(2,'B'),(3,'C');

mysql> select * from for_truncate;

 

  • 截断整表数据,注意影响行数是0,所以实际上没有对表真正操作

mysql> truncate table for_truncate;

  •  查看删除结果

mysql> select * from for_truncate;

  • 再插入 一条数据,自增id重新开始增长  

mysql> insert into for_truncate (name) values ('D');

  • 查看表结构 

mysql> show create table for_truncate \G

5, 插入查询结果

语法:

insert into table_name [column...]  select ...

案例:删除表中的重复记录,重复数据只能有一份

  •  创建原数据表

mysql> create table duplicate_table(
    -> id int,
    -> name varchar(20));

  • 插入测试数据 

mysql> insert into duplicate_table values  (100,'aaa'), (100,'aaa'), (200,'bbb'), (200,'bbb'), (200,'bbb'), (300,'ccc');

思路: 

  • 创建一张空表no_duplicate_table,结构和duplicate_table一样

mysql> create table no_duplicate_table like duplicate_table;

  • 将 duplicate_table数据去重插入到no_duolicate_table表中 

mysql> insert into no_duplicate_table select distinct * from duplicate_table; 

  • 通过重命名,做到原子的去重操作 

mysql> rename table duplicate_table to old_duplicate_table;

mysql> rename table no_duplicate_table to duplicate_table;

  • 查看最终结果 

6,聚合函数 

count():返回查询到的数据的数量

sum():返回查询到的数据的总和,不是数字没有意义

avg():返回查询到的数据的平均值,不是数字没有意义

max():返回查询到的数据的最大值,不是数字没有意义

min():返回查询到的数据的最小值,不是数字没有意义

案例:

  • 统计班级共有多少学生

//使用*做统计

mysql> select count(*) from exam_result;

 

//使用表达式统计

mysql> select count(1) from exam_result; 

  •  统计数学成绩总分

mysql> select sum(math) from exam_result;

  • 统计平均总分 

 mysql> select avg(chinese+math+english) 平均总分 from exam_result;

  •  统计数学成绩中不重复的成绩个数

mysql> select count(distinct math) 不重复的个数 from exam_result;

  • 返回英语最高分 

mysql> select max(english) from exam_result;

 

  • 返回>70分以上的最低分

 mysql> select min(math) from exam_result where math>70;

7,group by子句的使用 

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

select column1 column2... from table group by column

案例:

 准备工作,创建一个雇员信息数据库:

  • emp员工表
  • dept部门表
  • salgrade工作等级表

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

mysql> select deptno,avg(sal),max(sal) from emp group by deptno;

总结:

分组,可以理解为把一张表按照条件在逻辑上分成了很多子表,然后分别对各自的子表进行聚合统计。

 分组聚合结果:

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

mysql> select job,deptno,avg(sal),min(sal) from emp  group by job,deptno;

  • 显示平均工资低于2000的部门和它的平均工资 

首先统计各个部门的平均工资

mysql> select deptno,avg(sal) from emp group by deptno;

having和group by配合使用,对group by的结果进行过滤

mysql> select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000; 

having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where 

 

 结语:

最后在这里再加曾经的一道面试题:

SQL查询中各个关键字的执行顺序:from>on>join>where>group by>with>having>select>distinct>order by>limit

下篇博主会再更新一些相关的实战OJ题

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

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

相关文章

第十七:go 反射

fmt.printf("%T"&#xff0c;obj) // 打印 reflect 的类型 fmt.Printf("%T", obj) // *reflect.rtype //打印的是一个指针类型 reflect包 在Go语言中反射的相关功能由内置的reflect包提供&#xff0c;任意接口值在反射中都可以理解为由reflect.Type和…

热门的壁纸创作风格呈现多元化发展趋势

下热门的壁纸创作风格呈现多元化发展趋势&#xff0c;以下是几种主流风格及其特点&#xff1a; 简约现代风格 流行元素&#xff1a;以简洁的线条、纯净的色彩块面和少量的抽象图形为主。摒弃过多繁杂的装饰&#xff0c;强调形式追随功能的设计理念。热度分析&#xff1a;在各大…

【SpringMVC】深入解析使用 Postman 在请求中传递对象类型、数组类型、参数类型的参数方法和后端参数重命名、及非必传参数设置的方法

SpringMVC—请求传参 1. 传递对象 如果参数比较多时&#xff0c;方法声明就需要有很多形参&#xff1b;并且后续每次新增一个参数&#xff0c;也需要修改方法声明. 我们不妨把这些参数封装为一个对象&#xff1b; Spring MVC 也可以自动实现对象参数的赋值&#xff0c;比如 Us…

AI智能眼镜的视觉革命:算法如何重塑人机交互新纪元

引言&#xff1a;视觉算法的核心地位与AI智能眼镜的崛起 AI智能眼镜作为下一代交互终端&#xff0c;其核心价值在于将视觉感知与人工智能深度融合&#xff0c;通过实时环境解析与动态反馈&#xff0c;重新定义人机交互的边界。据预测&#xff0c;2025年全球AI智能眼镜销量将突…

掌握 ArcGIS Pro:古地图制作技巧与方法

在探索历史的长河中&#xff0c;古地图以其独特的魅力承载着丰富的地理信息和历史文化价值。 随着技术的进步&#xff0c;现代地理信息系统&#xff08;GIS&#xff09;如ArcGIS Pro为我们提供了强大的工具&#xff0c;使制作古地图成为可能。 本文将详细介绍如何使用ArcGIS …

MySQL的安装及配置

一.以安装包方式下载 1.进入MySQL官网&#xff0c;下载安装包 官网链接&#xff1a;https://downloads.mysql.com/archives/installer/ 2.安装MySQL 二.压缩包方式下载 下载位置&#xff1a;mysql下载位置 解压缩后位置&#xff1a;D:\mysql-8.0.15-winx64 在主目录下复制…

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

『VUE』vue 引入Font Awesome图标库(详细图文注释)

目录 Font Awesome介绍安装引入npm 安装导入src/main.js 使用总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 Font Awesome介绍 我一般是中文网搜索找到图标的英文名然后去官方网站搜索 官方网站(英文名搜索) https://font…

0基础 | 看懂原理图Datasheet 系列1

原理图功能分类 控制部分&#xff1a;整个电路板的核心控制和计算部分&#xff08;CPU&#xff09; CPU最小系统是什么?电源时钟复位 接口部分&#xff1a;实现特定功能的部分 如Wife模块、通讯接口 电源部分&#xff1a;整个电路板的供电部分 任何电路板都是必要的&…

python-leetcode-删掉一个元素以后全为 1 的最长子数组

1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode) 可以使用滑动窗口的方式来解决这个问题。我们要找到最长的全 1 子数组,但必须删除一个元素,因此可以将问题转化为寻找最多包含一个 0 的最长子数组。 解题思路 使用双指针(滑动窗口),维护窗口内最多包含一…

ubuntu挂载新硬盘

在准备数据的时候出现空间不够的问题&#xff1a; 添加200G的空间&#xff0c;挂在到/home/vipuser/BEV_Depth/BEVDepth/data/nuScenes 使用lsblk查看挂载的盘 有两块硬盘 vda 和 vdb&#xff0c;其中 vda 已经用于系统安装&#xff0c;vdb 尚未分区和挂载。 1. **分区新磁盘…

Java 生成图形验证码

一、图形验证码的意义 图形验证码是一种广泛应用于互联网领域的安全验证机制&#xff0c;它通过向用户展示包含字符、数字、图形等信息的图片&#xff0c;要求用户正确识别并输入其中的内容&#xff0c;以此来区分用户是人类还是机器程序。图形验证码具有多方面重要意义&#…

Qwen/QwQ-32B 基础模型上构建agent实现ppt自动生成

关心Qwen/QwQ-32B 性能测试结果可以参考下 https://zhuanlan.zhihu.com/p/28600079208https://zhuanlan.zhihu.com/p/28600079208 官方宣传上是该模型性能比肩满血版 DeepSeek-R1&#xff08;671B&#xff09;&#xff01; 我们实现一个 使用Qwen/QwQ-32B 自动生成 PowerPoi…

ios 小组件和数据共享

创建主工程就不必讲了 1 创建小组件 创建子工程 [new Target ] 选择 [ Widger Extension] 小组件入口是WidgetBundle文件&#xff0c;可以进行多个小组件的调试 TestWidget2文件是主要操作&#xff0c;小组件使用swiftUI布局&#xff0c;使用 AppIntent进行事件处理&#xff…

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…

ExBody2: Advanced Expressive Humanoid Whole-Body Control

ExBody2: Advanced Expressive Humanoid Whole-Body Control 研究动机解决方案技术路线实验结果 ExBody2: Advanced Expressive Humanoid Whole-Body Control 研究动机 高维状态空间和复杂控制限制了人形机器人在现实世界中的应用。人形机器人和人类在身体结构上有很大不同&a…

115.不同的子序列(困难)

115.不同的子序列 力扣题目链接(opens new window) 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符…

【学习笔记】【AI医生】2-4 项目详细分析及DeepSeek适用场景

【DeepSeek AI 医生】2-4 项目详细分析及DeepSeek适用场景 1.1 项目流程图1.2 主流AI模型对比1.3 DeepSeek使用途径1.4 DeepSeek 适用场景 1.1 项目流程图 1.2 主流AI模型对比 1.3 DeepSeek使用途径 官网 https://chat.deepseek.com/线上Api &#xff08;目前不可以状态&#…

再聊 Flutter Riverpod ,注解模式下的 Riverpod 有什么特别之处,还有发展方向

三年前我们通过 《Flutter Riverpod 全面深入解析》 深入理解了 riverpod 的内部实现&#xff0c;而时隔三年之后&#xff0c;如今Riverpod 的主流模式已经是注解&#xff0c;那今天就让我们来聊聊 riverpod 的注解有什么特殊之处。 前言 在此之前&#xff0c;我们需要先回忆…

Java【多线程】(3)单例模式与线程安全

目录 1.前言 2.正文 2.1线程安全类 2.2杂谈&#xff08;介绍几个概念&#xff09; 2.2.1内存可见性 2.2.2指令重排序 2.2.3线程饥饿 1. 什么是线程饥饿&#xff1f; 2. 线程饥饿的常见原因 2.2.4区分wait和sleep 2.4单例模式 2.4.1饿汉模式 2.4.2懒汉模式 2.4.2指…