Mysql分页查询和联合查询

本文深入解析SQL分页查询的语法与应用场景,详解limit关键字的使用,以及union、intersect、except和除运算等集合查询操作符的运用技巧,帮助读者掌握高效的数据检索与整合方法。

应用场景:要显示的数据,一页显示不全,需要分页提交sql请求

特点:要将limit放在查询语句的最后

语法

select 查询列表
from 表
【join type】join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段
limit 【offset】,size;

offset要显示的条目的起始索引(起始索引从0开始)可省略
size 要显示的条目个数

查询前五条员工信息

select * from employees
limit 0,5;

查询第11条到第25条员工信息

select * from employees limit 10,15;

 

集合查询

一、union合并:将多条查询语句的结果合并成一个结果

注意事项:

1.两个查询语句查询的列数必须相同,而且列的属性名必须对应相同

2.使用union进行联合 默认会去掉重复的项,如果不想去重,则需要在union后加歌 all

 

查询部门编号>90或邮箱中包含a 的员工信息

select *from employees where email like'%a%' or department_id>90

如果用上联合查询

select * from employees where email like'%a%'
union
select * from employees where department_id>90

如果比较复杂的话用union查询会比较清晰

二、交集运算

语法

select * from student where sdept = 'CS'
intersect
select * from student where sage<=19;

三、差运算

select * from student where sdept = 'CS'
except
select * from student where sage<=19;

四、除运算

除运算

### 如何在 MySQL 中实现分页查询的最佳实践 #### 使用 `LIMIT` `OFFSET` 实现基本分页查询 在 Java 应用程序中操作 MySQL 数据库时,可以利用 SQL 的 `LIMIT` `OFFSET` 子句来实现分页查询。这种技术通过指定返回记录的数量以及跳过的记录数量来控制每一页的数据范围[^1]。 ```sql SELECT * FROM table_name LIMIT page_size OFFSET (page_number - 1) * page_size; ``` 上述代码片段展示了如何基于当前页面编号 (`page_number`) 每页大小 (`page_size`) 来构建分页查询语句。这种方法简单易懂,在数据量较小时表现良好。 --- #### 高效替代方案:基于主键的分页查询 当面对大规模数据集时,传统的 `LIMIT` `OFFSET` 方法可能会导致性能瓶颈,因为随着偏移量增大,数据库需要扫描更多的行才能定位目标数据[^2]。为了缓解这一问题,推荐采用基于主键或其他唯一索引字段的方法进行分页查询: ```sql SELECT * FROM table_name WHERE id > last_id ORDER BY id ASC LIMIT page_size; ``` 在此模式下,每次查询都以前一次获取的最大 ID 值作为起点继续检索新一批数据。此策略显著减少了不必要的磁盘 I/O 操作并提升了整体效率[^3]。 --- #### 大规模场景下的进一步优化措施 对于包含数百万甚至上亿条记录的大表而言,即使采用了基于主键的方式也可能遇到挑战。此时可考虑引入覆盖索引、延迟关联等高级技巧来增强性能[^4]。例如: - **创建复合索引**:确保用于排序过滤条件的关键列已被适当索引化; - **减少回表次数**:尽可能只选取所需字段而非整个行内容; - **预计算汇总视图**:如果某些统计信息频繁访问,则可通过维护物化视图降低实时查询压力; 以下是结合这些原则的一个实际例子——针对某月车辆行驶轨迹表执行高效分页读取: ```sql -- 此处假设存在按时间戳升序排列且带有索引支持的时间列'timestamp' SELECT vehicle_id, timestamp, location FROM trip_records WHERE timestamp >= :lastTimestamp AND month = 'target_month' ORDER BY timestamp ASC LIMIT 100; ``` 这里我们不仅限定了日期区间还加入了上次结束位置标记(`:lastTimestamp`)从而实现了连续滚动加载效果同时兼顾速度与资源消耗平衡。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值