当前位置:网站首页>【MySQL】多表连接查询
【MySQL】多表连接查询
2022-06-28 03:29:00 【今夜鸣风】
在数据量庞大的数据库中,为了发挥数据库的作用,便开发了多种数据库操作语言来查询数据,其中多表连接查询就是常用的一个模块。
多表连接查询,顾名思义,就是将多张表的信息数据进行归纳查询,从而得到我们想要的的数据。
接下来我们便来学习常用的查询方式吧。
笛卡尔集:
笛卡尔集就是在查询数据时简单的将表关联在一起,数据以m*n的形式组合,类似于矩阵相乘,造成了大量重复的无逻辑的数据,丧失了最初筛选数据的初衷。
造成笛卡尔集的原因:
* 产生条件:
1. 省略连接条件
2. 连接条件无效
3. 所有表中所有行互相连接
* 解决方案:
添加有效筛选条件
内连接:
* SQL92语法:
SELECT 查询列表
FROM 表名1 别名1 ,表名2 别名2
WHERE 连接条件
AND 筛选条件
GROUP BY 分组列表
HAVING 分组后筛选条件
ORDER BY 排序列表
* SQL99语法:
select 字段列表
from 表名1
[inner] join 表名2 on 条件
where 筛选条件
group by 分组条件
having 分组后的筛选条件
order by 排序字段
* 注意:
1. 使用表名前缀在多个表中区分相同的列
2. 在不同表中具有相同列名的列可以用表的别名加以区分
3. 如果使用了表别名,则在select语句中需要使用表别名代替表名
4. 表别名最多支持32个字符长度,但建议越少越好
外连接(常用):
左外连接
* 语法:
select 字段列表
from 表1
left [outer] join 表2 on 条件
...
* 注意:
左外连接查询的是左表所有数据以及其交集部分,表1为查询主表
-------------------------------------------------------------------------
5. 右外连接
* 语法:
select 字段列表
from 表1
right [outer] join 表2 on 条件
...
* 注意:
右外连接查询的是右表所有数据以及其交集部分,表2为查询主表
子查询:查询中嵌套查询,称嵌套查询为子查询
简单来说就是将复杂的查询要求拆分实现,括号内为拆分的查询结果或者内容。
特点:
1、子查询都放在小括号内
2、子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
3、子查询优先于主查询执行,主查询使用了子查询的执行结果
4、子查询根据查询结果的行数不同分为以下两类:
① 单行子查询
结果集只有一行
一般搭配单行操作符使用:> < = <> >= <=
非法使用子查询的情况:
a、子查询的结果为一组值
b、子查询的结果为空
② 多行子查询
结果集有多行
一般搭配多行操作符使用:any、all、in、not in
in: 属于子查询结果中的任意一个就行
any和all往往可以用其他查询代替
分页查询:顾名思义,就是将查询结果的显示做出页数上的调整。
* 语法:
select 字段|表达式,...
from 表
where 条件
group by 分组字段
having 条件
order by 排序的字段
limit 起始的条目索引,条目数;
* 示例:每页显示3条记录
* SELECT * FROM student LIMIT 0,3; -- 第1页
* SELECT * FROM student LIMIT 3,3; -- 第2页
* SELECT * FROM student LIMIT 6,3; -- 第3页
* 特点:
1.起始条目索引从0开始
2.limit子句放在查询语句的最后
3.公式:select * from 表 limit (page-1)*sizePerPage,sizePerPage
假如:
每页显示条目数sizePerPage
要显示的页数 page
联合查询:
* 语法:
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
select 字段|常量|表达式|函数 from 表 where 条件 union 【all】
.....
select 字段|常量|表达式|函数 from 表 where 条件
* 特点:
1、多条查询语句的查询的列数必须是一致的
2、多条查询语句的查询的列的类型几乎相同
3、union代表去重,union all代表不去重
一点小思考:如何不使用max函数查询数据,以最高工资为例:
方法一:利用排序和分页查询:
SELECT employee_id,salary
FROM employees
ORDER BY salary DESC
LIMIT 1;方法二:子查询
SELECT
employee_id,salary
FROM
employees e
WHERE
e.salary NOT IN (
SELECT DISTINCT
a.salary
FROM
employees a
JOIN employees b ON a.salary < b.salary
)
边栏推荐
猜你喜欢

Principle and Simulation of switching power supply buck circuit

MySQL master-slave replication, separation and resolution

品达通用权限系统(Day 5~Day 6)

歐洲家具EN 597-1 跟EN 597-2兩個阻燃標准一樣嗎?

黑體輻射初探

02 MongoDB数据类型、重要概念以及shell常用指令

Analyzing the comprehensive application ability of educational robot

Paging query optimization in MySQL of database Series

Notes to friendship chain

电学基础知识整理(一)
随机推荐
窗帘做EN 1101易燃性测试过程是怎么样的?
A Preliminary Study of Blackbody radiation
多线程与高并发三:AQS底层源码分析及其实现类
友链须知
sqlserver 数据库之事物使用入门 案例
GenICam GenTL 标准 ver1.5(2)
ERP升级的另一种选择,MES系统
事件委托的原理
vscode中出现无法在只读编辑器中编辑
机器人编程教育的市场竞争力
利用ELK 搭建日志分析系统(一)—— 组件介绍
多项目开发入门,基础设计 类库项目使用
基于正点原子stm32的mini板的TFTLCD显示实验
Web APIs DOM event foundation dark horse programmer
利用ELK 搭建日志分析系统(三)—— 安全认证
以自动化赋能转型,飞鹤乳业加速迈向数字化!
数字电路学习笔记(二)
组件拆分实战
Pycharm setting pseudo sublime color scheme
leetcode - 329. 矩阵中的最长递增路径