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
  • 查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎

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

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

相关文章

Python学习——数组的行列互换

数组的行列互换 data [ [col for col in range (4)] for row in range (4)] for row in data: print (row) print(“--------------”) for r_index,row in enumerate(data): for c_index in range (r_index,len(row)): tmp data [c_index] [r_index] data[c_index] [r_index…

bugku 应急加固1

Linux的应急加固 一、JS劫持 获取JS劫持域名 JS劫持&#xff0c;JavaScript Hijacking介绍&#xff1a; 攻击者通过某种方式篡改网页中的JavaScript代码&#xff0c;从而使网页跳转到恶意域名。 常见攻击方式有&#xff1a; 中间人攻击&#xff0c;在网络传输过程中拦截并修…

ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示

目录 一、问题 二、解决方法 三、总结 一、问题 1.代码里有一个基于ant封装的公共组件数字输入框&#xff0c;测试突然说 无效了&#xff0c;输入其他字符也会显示&#xff1b;改了只有又发现某些 输入法 需要连续输入两次 才能显示出来。 二、解决方法 1.就离谱&#xff0…

郑州工程技术学院赴埃文科技开展访企拓岗促就业活动

6 月 3 日&#xff0c;郑州工程技术学院信息工程学院&软件学院党总支书记尚德基、校企合作处处长吴博、软件学院院长叶恺、信息工程学院院长马耀锋、副院长黄继海、河南省人工智能产业创新发展联盟执行秘书长孟松涛等领导一行到访郑州埃文科技有限公司。埃文科技总经理助理…

pandas 字符串存储技术演进:从 object 到 PyArrow 的十年历程

文章目录 1. 引言2. 阶段1&#xff1a;原始时代&#xff08;pandas 1.0前&#xff09;3. 阶段2&#xff1a;Python-backed StringDtype&#xff08;pandas 1.0 - 1.3&#xff09;4. 阶段3&#xff1a;PyArrow初次尝试&#xff08;pandas 1.3 - 2.1&#xff09;5. 阶段4&#xf…

[特殊字符] 在 React Native 项目中封装 App Icon 一键设置命令(支持参数与默认路径)

📦 前置依赖 使用的是社区维护的 CLI 工具: @bam.tech/react-native-make它扩展了 react-native 命令,支持 set-icon 功能。 安装: yarn add -D "@bam.tech/react-native-make"🧠 封装目标 我们希望能够通过以下方式调用: # 默认使用 ./icon.png yarn …

[论文阅读] 人工智能 | 搜索增强LLMs的用户偏好与性能分析

【论文解读】Search Arena&#xff1a;搜索增强LLMs的用户偏好与性能分析 论文信息 作者: Mihran Miroyan, Tsung-Han Wu, Logan King等 标题: Search Arena: Analyzing Search-Augmented LLMs 来源: arXiv preprint arXiv:2506.05334v1, 2025 一、研究背景&#xff1a;…

[2025CVPR]确定性图像转换新突破:双逼近器布朗桥模型(Dual-approx Bridge)技术详解

本文深入解析CVPR 2024顶会论文《Deterministic Image-to-Image Translation via Denoising Brownian Bridge Models with Dual Approximators》,揭示确定性图像转换的核心突破 一、问题背景:确定性图像转换的挑战 在图像转换任务中(如超分辨率、医学影像处理),​确定性…

Python Pytest

1.Pytest用例发现规则 1.1 模块名(python文件)名必须以 test_ 开头或 _test 结尾&#xff0c;如 test_case&#xff0c;case_test&#xff0c;下划线都不能少 1.2 模块不能放在 . 开头的隐藏目录或者叫 venv的目录下&#xff0c;virtual environment&#xff0c;叫venv1都可以…

CSRF(跨站请求伪造)详解

目录 一、&#x1f4d6;什么是CSRF 二、&#x1f517;漏洞利用过程 三、&#x1f4d1;漏洞的前提条件 四、&#x1f50d;常见漏洞发生位置 五、✅CSRF挖掘技巧 (一) 抓正常请求包进行初步判断 (二) Referer 绕过验证测试 (三) Token 缺失与二次验证缺失识别 六、⚠️漏…

深入解析 Qwen3-Embedding 的模型融合技术:球面线性插值(Slerp)的应用

在深度学习领域&#xff0c;模型融合技术是一种强大的工具&#xff0c;用于提升模型的鲁棒性和泛化能力。通过结合多个模型的优势&#xff0c;可以减少单一模型的过拟合风险&#xff0c;并在多种任务中实现更优的性能表现。在 Qwen3-Embedding 的训练过程中&#xff0c;模型融合…

【在线五子棋对战】二、websocket 服务器搭建

文章目录 Ⅰ. WebSocket1、简介2、特点3、原理解析4、报文格式 Ⅱ. WebSocketpp1、认识2、常用接口3、websocketpp库搭建服务器搭建流程主体框架填充回调函数细节 4、编写 makefile 文件5、websocket客户端 Ⅰ. WebSocket 1、简介 WebSocket 是从 HTML5 开始支持的一种网页端…

针对异构数据的联邦学习

在联邦学习中&#xff0c;数据异构性是指不同客户端之间的数据分布差异&#xff0c;包括数据的特征空间、标签空间以及数据量等方面的差异。处理异构数据是联邦学习中的一个重要挑战&#xff0c;因为异构数据可能导致模型训练过程中的性能不稳定、收敛速度较慢&#xff0c;甚至…

【判断自整除数】2022-4-6

缘由是判断自整除数的&#xff0c;这个我的结果是正确的&#xff0c;但是提交就有运行错误是怎么回事啊-编程语言-CSDN问答 void 自整除数字() {//所谓的自整除数字就是该数字可以整除其每一个位上的数字。 //对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自…

@Import原理与实战

文章目录 前言一、导入普通类二、导入ImportSelector实现类三、导入ImportBeanDefinitionRegistrar实现类四、Import注解的解析4.1、解析实现ImportSelector的候选bean4.2、解析实现ImportBeanDefinitionRegistrar的候选bean4.3、DeferredImportSelector的特殊处理 总结 前言 I…

day 18进行聚类,进而推断出每个簇的实际含义

浙大疏锦行 对聚类的结果根据具体的特征进行解释&#xff0c;进而推断出每个簇的实际含义 两种思路&#xff1a; 你最开始聚类的时候&#xff0c;就选择了你想最后用来确定簇含义的特征&#xff0c; 最开始用全部特征来聚类&#xff0c;把其余特征作为 x&#xff0c;聚类得到…

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…

iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理

1、需求导入 当存在前端需要的数据的字段渲染到表格或者是一些公共的表格组件展示数据时的某个字段名与后台返回的字段不一致时&#xff0c;那么需要前端进行稍加处理&#xff0c;而不能直接this.list res.data;这样数据是渲染不出来的。 2、后台返回的数据类型 Datalist(pn) …

Ubuntu下有关UDP网络通信的指令

1、查看防火墙状态&#xff1a; sudo ufw status # Ubuntu 2、 检查系统全局广播设置 # 查看是否忽略广播包&#xff08;0表示接收&#xff0c;1表示忽略&#xff09; sysctl net.ipv4.icmp_echo_ignore_broadcasts# 查看是否允许广播转发&#xff08;1表示允许&#xff09…

vue3:十六、个人中心-修改密码

一、页面效果 页面展示当前用户名(只读),展示需要输入的当前密码,输入新的密码以及确认密码的提交表单 二、初始建立 1、建立密码修改页面 在个人中心文件夹中写入新页面UpdatepwdView.vue 2、新建路由 在路由页面中写入修改密码页面 3、新建菜单 在菜单布局菜单页面中写…