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

05.查询表

查询表

  • 字段显示可以使用别名:

    • col1 AS alias1, col2 AS alias2, …
  • WHERE子句:指明过滤条件以实现“选择"的功能:

    • 过滤条件:
      • 布尔型表达式
      • 算术操作符:+,-,*,/,%
      • 比较操作符:=,<=>(相等或都为空),<>,!=(非标准SQL),>,>=,<,<=
      • 范围查询: BETWEEN min_num AND max_num
      • 不连续的査询:IN(element1,element2,…)
      • 空查询: IS NULL, IS NOT NULL
      • IN 判断某字段是否在一组值中, NOT IN 判断某字段不在一组值中,IN() 可以接受常量列表或子查询
      • DISTINCT 去除重复行
      • 模糊査询: LIKE 使用 % 表示任意长度的任意字符,_ 表示任意单个字符
      • RLIKE:正则表达式,索引失效,不建议使用
      • REGEXP:匹配字符串可用正则表达式书写模式,同上
    • 逻辑操作符:NOT,AND,OR,XOR
  • GROUP BY:根据指定的条件把查询结果进行"分组"以用于做"聚合"运算

    • 常见聚合函数: count(), sum(), max(),min(), avg(),注意:聚合函数不对null统计
    • HAVING: 对分组聚合运算后的结果指定过滤条件
    • 一旦分组 group by,select语句后只跟分组的字段,聚合函数
  • ORDER BY: 根据指定的字段对查询结果进行排序

    • 升序:ASC
    • 降序:DESC
  • LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制,跳过offset,显示row_count行,offset默为值为0

  • 对查询结果中的数据请求施加“锁”

    • FOR UPDATE:写锁,独占或排它锁,只有一个读和写操作
    • LOCK IN SHARE MODE:读锁,共享锁,同时多个读操作

1. 单表查询

1.1 简单查询

mysql> select * from students where id < 5;
mysql> select * from students where gender = 'm';注意:第一条记录的索引是 0
mysql> select * from students order by name desc limit 5;
mysql> select * from students order by name desc limit 0,5;# 判断是否为NULL
mysql> select * from students where classid is null;
mysql> select * from students where classid <=> null;
mysql> select * from students where classid is not null;mysql> select * from students where stuid >= 2 and stuid <= 8;
mysql> select * from students where stuid between 2 and 8;mysql> select * from students where name like 's%';
mysql> select * from students where name rlike '.*[s].*';mysql> select * from students where classid in (1,2,3);
mysql> select * from students where classid not in (1,2,3);# 字段别名
mysql> select stuid 学员ID,name 姓名,gender 性别 from students;# ifnu11函数判断指定的字段是否为空值,如果空值则使用指定默认值
mysql> select stuid 学号, name 姓名, ifnull(classid,'无班级') 班级 from students where classid is null;
+--------+-------------+-----------+
| 学号   | 姓名        | 班级      |
+--------+-------------+-----------+
|     24 | Xu Xian     | 无班级    |
|     25 | Sun Dasheng | 无班级    |
+--------+-------------+-----------+# 记录去重
mysql> select distinct classid from students;
mysql> select distinct age,gender,classid from students;# 分页查询
mysql> select * from students limit 0,3;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |
|     2 | Shi Potian  |  22 | M      |       1 |         7 |
|     3 | Xie Yanke   |  53 | M      |       2 |        16 |
+-------+-------------+-----+--------+---------+-----------+
3 rows in set (0.01 sec)mysql> select * from students limit 3,3;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name      | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
|     4 | Ding Dian |  32 | M      |       4 |         4 |
|     5 | Yu Yutong |  26 | M      |       3 |         1 |
|     6 | Shi Qing  |  46 | M      |       5 |      NULL |
+-------+-----------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)# 查询第n页的数据,每页显示m条记录
mysql>select * from students limit (n-1)*m,m;# 聚合函数
mysql> select count(*) from students where gender = 'm';
+----------+
| count(*) |
+----------+
|       15 |
+----------+
1 row in set (0.01 sec)mysql> select sum(age) from students where gender = 'm';
+----------+
| sum(age) |
+----------+
|      495 |
+----------+
1 row in set (0.00 sec)mysql> select sum(age)/count(*) from students where gender = 'm';
+-------------------+
| sum(age)/count(*) |
+-------------------+
|           33.0000 |
+-------------------+
1 row in set (0.00 sec)# 分组统计
注意:一旦使用分组group by,在select 后面的只能采用分组的列和聚合函数,其它的列不能放在select后面,否则根据系统变量SQL-MODE的值不同而不同的结果mysql> select classid,count(*) from students group by classid;
mysql> select gender,classid,count(*) from students group by gender,classid;mysql> select gender,classid,count(*) from students group by gender,classid having count(*) > 2;
mysql> select gender,classid,count(*) from students group by gender,classid having classid > 2;# group_concat函数实现分组信息的集合
mysql> select classid,group_concat(name) from students group by classid;# with rollup 分组后聚合函数统计后再做汇总
mysql> select ifnull(gender,'总计')性别,count(*) from students group by gender with rollup;# 排序
mysql> select * from students order by stuid desc limit 3;
mysql> select * from students order by stuid desc limit 3,3;
mysql> select * from students where classid is not null order by gender desc,age asc;# 正序排序时将NULL记录排在最后
mysql> select classid from students order by -classid desc;# 分组后排序
mysql> select classid, count(*) from students group by classid order by classid desc;
mysql> select gender,classid,avg(age) from students where classid is not null group by gender,classid order by gender desc,classid desc;注意:分组和排序的次序 顺序:group by,having,order by
mysql> select classid,count(*) from students group by classid having classid is not null order by classid asc;

2. 多表查询

多表查询,即查询结果来自于多张表

  • 子查询:在SQL语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询
  • 联合查询:UNION
  • 交叉连接:笛卡尔乘积 CROSS JOIN
  • 内连接:
    • 等值连接:让表之间的字段以"等值”建立连接关系
    • 不等值连接
    • 自然连接:去掉重复列的等值连接,语法: FROM table1 NATURAL JOIN table2;
  • 外连接:
    • 左外连接:FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
    • 右外连接:FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
    • 完全外连接: FROM tb1 FULL OUTER JOIN tb2 ON tb1.col=tb2.col 注意:MySQL不支持此SQL语法
  • 自连接:本表和本表进行连接查询
  • 注意:ON 定义两个表之间的连接条件, JOIN 把两个表按照某种方式合并

2.1 子查询

子查询 subquery 即SQL语句调用另一个SELECT子句,可以是对同一张表,也可以是对不同表,

主要有以下四种常见的用法:

  1. 用于比较表达式中的子查询;子查询仅能返回单个值
mysql> select avg(age) from students;
mysql> select name,age from students where age > (select avg(age) from students);
  1. 用于IN中的子查询:子查询应该单独查询并返回一个或多个值重新构成列表
mysql> select name,age from students where age in (select age from teachers);
  1. 用于EXISTS 和 Not EXISTS

EXISTS(包括 NOT EXISTS)子句返回一个布尔值(TRUEFALSE)。它内部包含一个子查询(称为内查询),用于判断该子查询是否返回了任何行。

对于外查询中的每一行数据,系统都会将该行的值带入到内查询中进行验证。如果内查询返回了至少一行结果,则 EXISTS 返回 TRUE,该行数据就会被包含在外查询的结果集中;否则返回 FALSE,该行不会出现在最终结果中。

NOT EXISTS 的工作方式类似,只不过是在内查询结果为空时才返回 TRUE

mysql> select * from students s where exists (select * from teachers t where s.teacherid=t.tid);# 说明:
1、EXISTS(或 NOT EXISTS))用在 where之后,且后面紧跟子查询语句(带括号)
2、EXISTS(或 NOTEXISTS)只关心子查询有没有结果,并不关心子查询的结果具体是什么
3、上述语句把students的记录逐条代入到Exists后面的子查询中,如果子查询结果集不为空,即说明存在,那么这条students的记录出现在最终结果集,否则被排除。
  1. 用于FROM子句中的子查询
mysql> select classid,avg(age) age from students where classid is not null group by classid;# 主查询 + 子查询
mysql> select s.classid,s.age from (select classid,avg(age) age from students where classid is not null group by classid) s where s.age > 30;

子查询优化

子查询可以一次性完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然可以使査询语句很灵活,但执行效率不高。执行子查询时,需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。

可以使用连接(J0IN)查询来替代子査询。连接査询不需要建立临时表,其速度比子查询要快,如果查询中使用到索引的话,性能会更好。

2.2 联合查询

联合査询 Union 实现的条件,多个表的字段数量相同,字段名和数据类型可以不同,但一般数据类型是相同的

mysql> select tid id,name,age,gender from teachers union select stuid id,name,age,gender from students;# 合并数据并去重 UNION, 合并数据且无需去重 UNION ALL
mysql> select * from teachers union select * from teachers;
mysql> select * from teachers union all select * from teachers;

2.3 交叉连接

cross join 即多表的记录之间做笛卡尔乘积组合,并且多个表的列横向合并相加,"雨露均沾

比如: 第一个表3行4列,第二个表5行6列,cross join后的结果为3*5=15行,4+6=10列

交叉连接生成的记录可能会非常多,建议慎用

# 完全等价,都表示笛卡尔积
mysql> select * from teachers cross join students;
mysql> select * from teachers,students;

2.4 内连接

inner join 内连接取多个表的交集

mysql> select * from students s inner join teachers t on s.teacherid=t.tid;# 内连接后再过滤
mysql> select * from students s inner join teachers t on s.teacherid=t.tid where s.age > 30;# 自然连接
1. 当源表和目标表共享相同名称的列时,就可以在它们之间执行自然连接,而无需指定连接列。
2. 在使用纯自然连接时,如没有相同的列时,会产生交叉连接(笛卡尔乘积)语法:SELECT table1.column, table2.column FROM table1 NATURAL JOIN table2;

2.5 左和右外连接

左连接: 以左表为主根据条件查询右表数据,如果根据条件查询右表数据不存在使用nul值填充

右连接:以右表为主根据条件查询左表数据,如果根据条件查询左表数据不存在使用null值填充

mysql> select s.stuid,s.name,s.age,s.teacherid,t.tid,t.name,t.age from students s left join teachers t on s.teacherid=t.tid;mysql> select s.stuid,s.name,s.age,s.teacherid,t.tid,t.name,t.age from students s left outer join teachers t on s.teacherid=t.tid;# 先左外连接再过滤
mysql> select * from students s left join teachers t on s.teacherid=t.tid where s.teacherid is null;# 右外连接
mysql> select * from students s right join teachers t on s.teacherid=t.tid;
mysql> select * from students s right outer join teachers t on s.teacherid=t.tid;# 右外连接再过滤
mysql> select * from students s right outer join teachers t on s.teacherid=t.tid where t.tid is null;注意:右外连接其实就是把左外连接的表位置对换一下,结果是一样的。

2.6 完全外连接

MySQL不支持完全外连接 full outer join语法

# 用这个方法替代 full outer join
mysql> select * from students left join teachers on students.teacherid=teachers.tid-> union-> select * from students right join teachers on students.teacherid=teachers.tid;

2.7 自连接

自连接, 即表自身连接自身

3. 补充说明

  • SQL语句查询顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
  • 查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎

相关文章:

05.查询表

查询表 字段显示可以使用别名: col1 AS alias1, col2 AS alias2, … WHERE子句:指明过滤条件以实现“选择"的功能: 过滤条件: 布尔型表达式算术操作符:,-,*,/,%比较操作符:,<>(相等或都为空),<>,!(非标准SQL),>,>,<,<范围查询: BETWEEN min_num …...

基于深度强化学习的智能机器人导航系统

前言 随着人工智能技术的飞速发展&#xff0c;机器人在日常生活和工业生产中的应用越来越广泛。其中&#xff0c;机器人导航技术是实现机器人自主移动的关键。传统的导航方法依赖于预设的地图和路径规划算法&#xff0c;但在复杂的动态环境中&#xff0c;这些方法往往难以适应。…...

【第三十九周】ViLT

ViLT 摘要Abstract文章信息介绍提取视觉特征的方式的演变模态融合的两种方式四种不同的 VLP 模型Q&A 方法模型结构目标函数Whole Word Masking&#xff08;WWM&#xff09; 实验结果总结 摘要 本篇博客介绍了ViLT&#xff08;Vision-and-Language Transformer&#xff09;…...

代码随想录算法训练营第60期第六十天打卡

大家好&#xff0c;今天因为有数学建模比赛的校赛&#xff0c;今天的文章可能会简单一点&#xff0c;望大家原谅&#xff0c;我们昨天主要讲的是并查集的题目&#xff0c;我们复习了并查集的功能&#xff0c;我们昨天的题目其实难度不小&#xff0c;尤其是后面的有向图&#xf…...

数据结构——D/串

一、串的定义和基本操作 &#xfeff; 1. 串的定义 &#xfeff; &#xfeff; 1&#xff09;串的概念 &#xfeff; &#xfeff; 组成结构: 串是由零个或多个字符组成的有限序列&#xff0c;记为 &#xfeff;S′a1a2⋯an′Sa_1a_2\cdots a_nS′a1​a2​⋯an′​&#x…...

瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用

&#x1f525; 机械键盘固件开发从入门到精通&#xff1a;HWKeyboard模块全解析 作为一名嵌入式开发老司机&#xff0c;今天带大家拆解一个完整的机械键盘固件代码。即使你是单片机小白&#xff0c;看完这篇教程也能轻松理解机械键盘的工作原理&#xff0c;甚至自己动手复刻一…...

Nginx+Tomcat负载均衡与动静分离架构

目录 简介 一、Tomcat基础部署与配置 1.1 Tomcat应用场景与特性 1.2 环境准备与安装 1.3 Tomcat主配置文件详解 1.4 部署Java Web站点 二、NginxTomcat负载均衡群集搭建 2.1 架构设计与原理 2.2 环境准备 2.3 Tomcat2配置&#xff08;与Tomcat1对称&#xff09; 2.4…...

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…...

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…...

css | class中 ‘.‘ 和 ‘:‘ 的使用 | 如,何时用 .is-selected{ ... } 何时用 :hover{...}?

省流总结&#xff1a;交互时的短暂视觉反馈 → 用 :hover&#xff0c;状态需要记录或切换 → 用类名如 .is-selected。 &#x1f9e0; 本质区别&#xff1a; 写法触发方式用途&.is-selected依赖 class 切换需要 JavaScript 控制状态&#xff0c;如选中、激活&:hover鼠…...

【第九篇】 SpringBoot测试补充篇

简介 本文介绍了SpringBoot测试中的五项关键技术&#xff1a;测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置&#xff09;。这些技术可以有效隔离测试环境&#xff0c;确保测试数据不影响生产环境&#xff0c;同时提供了…...

springcloud SpringAmqp消息队列 简单使用

这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。 前提 如果没有安装RabbitMQ是无法连接成功的&#xff01;所以前提是你要安装好RabbitMQ。 docker 安装命令 # 拉取docker镜像 docker pull rabbitmq:management# 创建容器 docker run -id --namera…...

Framework开发之IMS逻辑浅析1--关键线程及作用

关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰&#xff0c;写字笔&#xff0c;键盘等)&#xff0c;每种类型都对应一种驱动设备&#xff0c;而每个硬件驱动设备又对应Linux的一个目录文件…...

The Quantization Model of Neural Scaling

文章目录 摘要1引言2 理论3 概念验证&#xff1a;一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因&#xff08;monogenic&#xff09;与多基因&#xff08;polygenic&#xff09;的规模曲…...

数据源指的是哪里的数据,磁盘中还是内存中

在 MyDB 项目中&#xff0c;特别是这段缓存框架代码&#xff1a; T obj getForCache(key);以及它的上下文&#xff1a; AbstractCache 是一个抽象类&#xff0c;内部有两个抽象方法&#xff0c;留给实现类去实现具体的操作&#xff1a; protected abstract T getForCache(lon…...

系统思考:跳出症状看全局

明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程&#xff01;通过经典的啤酒游戏经营决策沙盘&#xff0c;一起沉浸式体验如何从全局视角看待问题&#xff0c;发现单点最优并不等于全局最优。 这不仅是一次简单的课程&#xff0c;更是一次洞察系统背后…...

DeepSeek R1 V2 深度探索:开源AI编码新利器,效能与创意并进

最近&#xff0c;AI界迎来了一位神秘的“突袭者”——DeepSeek团队悄无声息地发布了其推理模型DeepSeek R1的重磅升级版V2&#xff08;具体型号R1-0528&#xff09;。这款基于MIT许可的开源模型&#xff0c;在原版R1的基础上进行了多项令人瞩目的改进&#xff0c;正以其强大的潜…...

surfer15安装

安装文件 安装包和破解文件 安装 破解及汉化 打开软件...

MySQL从入门到DBA深度学习指南

目录 引言 MySQL基础入门 数据库基础概念 MySQL安装与配置 SQL语言进阶 数据库设计与规范化 数据库设计原则 表结构设计 MySQL核心管理 用户权限管理 备份与恢复 性能优化基础 高级管理与高可用 高可用与集群 故障诊断与监控 安全与审计 DBA实战与运维 性能调…...

Python训练营---DAY48

DAY 48 随机函数与广播机制 知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机…...

debian12拒绝海外ip连接

确保 nftables 已安装&#xff1a; Debian 12 默认使用 nftables 作为防火墙框架。检查是否安装&#xff1a; sudo apt update sudo apt install nftables启用并启动 nftables 服务 sudo systemctl enable nftables sudo systemctl start nftables下载maxmind数据库 将文件解…...

70年使用权的IntelliJ IDEA Ultimate安装教程

安装Java环境 下载Java Development Kit (JDK) 从Oracle官网或OpenJDK。推荐选择JDK 11或更高版本。 运行下载的安装程序&#xff0c;按照提示完成安装。注意记录JDK的安装路径&#xff08;如C:\Program Files\Java\jdk-11.0.15&#xff09;。 配置环境变量&#xff1a; 右键…...

MySQL的日志

就相当于人的日记本&#xff0c;记录每天发生的事&#xff0c;可以对数据进行追踪 一、错误日志 也就是存放错误信息的 二、二进制日志-binlog 在低版本的MySQL中&#xff0c;二进制日志是不会默认开启的 存放除了查询语句的其他语句 三、查询日志 查询日志会记录客户端的所…...

低功耗高安全:蓝牙模块在安防系统中的应用方案

随着物联网(IoT)和智能家居的快速发展&#xff0c;安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术&#xff0c;凭借其低成本、易部署和智能化管理等优势&#xff0c;在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...

数据库(sqlite)基本操作

数据库&#xff08;sqlite&#xff09; 一&#xff1a;简介&#xff1a; 为什么需要单独的数据库来进行管理数据&#xff1f; 数据的各种查询功能数据的备份和恢复花大量时间在文件数据的结构设计和维护上要考虑多线程对数据的操作会涉及到同步问题&#xff0c;会增加很多额…...

【HarmonyOS 5】游戏开发教程

一、开发环境搭建 ‌工具配置‌ 安装DevEco Studio 5.1&#xff0c;启用CodeGenie AI助手&#xff08;Settings → Tools → AI Assistant&#xff09;配置游戏模板&#xff1a;选择"Game"类型项目&#xff0c;勾选手机/平板/折叠屏多设备支持 二、游戏引擎核心架构…...

神经元激活函数在神经网络里起着关键作用

神经元激活函数在神经网络里起着关键作用&#xff0c;它能为网络赋予非线性能力&#xff0c;让网络可以学习复杂的函数映射关系。下面从多个方面详细剖析激活函数的作用和意义&#xff1a; 1. 核心作用&#xff1a;引入非线性因素 线性模型的局限性&#xff1a; 假设一个简单…...

[蓝桥杯 2024 国 B] 蚂蚁开会

问题描述 二维平面上有 n 只蚂蚁&#xff0c;每只蚂蚁有一条线段作为活动范围&#xff0c;第 i 只蚂蚁的活动范围的两个端点为 (uix,uiy),(vix,viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费&#xff0c;它们决定只在所有交点为整点的地方设置会议…...

GIT(AI回答)

在Git中&#xff0c;git push 命令主要用于将本地分支的提交推送到‌远程仓库‌&#xff08;如GitHub、GitLab等&#xff09;。如果你希望将本地分支的改动同步到另一个‌本地分支‌&#xff0c;这不是 git push 的设计目的。以下是正确的替代方法&#xff1a; 方法1&#xff1…...

JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”

问题: java语言编辑&#xff0c;实现TF-IDF算法 &#xff1a;用于文本特征提取。 解答思路: TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种常用的文本特征提取方法&#xff0c;用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的…...