数据库学习之MySQL (二十一)—— 分页查询 联合查询 LIMIT UNION 查询语句执行顺序总结

MySQL学习专栏 正在持续更新中:)

分页查询

其实非常简单
我们网页加载往往是动态 用户需要多少就加载多少 好比淘宝搜索匹配1000个商品,它只加载那一页,分页的输出信息,分页的访问数据库而不是一股脑儿全部加载完 以提升性能,降低数据库负担

那么有没有想过 分页访问数据库的方法呢?这就是分页查询 LIMIT

案例 我想查employees员工信息,每10条作为一页 访问数据库的语句该怎么写呢?
第一页这样:
在这里插入图片描述
第二页这样的效果
在这里插入图片描述

USE data1;
SELECT * FROM employees LIMIT 0,10; #第一页
SELECT * FROM employees LIMIT 10,10; #第二页
SELECT * FROM employees LIMIT 20,10; #第三页
SELECT * FROM employees LIMIT 30,10; #第四页

观察一下,语法形式: LIMIT [第一条数据的索引] [本次打印数据的数量]
第一条数据 如同这张表的employee_id 一样 是从0开始 类似C语言的数组索引

用的时候自己推一下就知道该怎么写了 没必要看什么公式2333

联合查询

说白了 就是对两个或者多个查询语句的结果 进行联合 汇总 生成最终结果
联合的方式无非就是数学的那些套路:

名称 英语
合集 UNION
合集不查重 UNION ALL
交集 intersect
差集 minus

这里先讲一下 UNION 和 UNION ALL
玩一下下面这个代码:

USE data1;
SELECT last_name,manager_id FROM employees WHERE manager_id=108 # 没分号结束哦 注意两个SELECT是一句话
UNION
SELECT last_name,manager_id FROM employees WHERE manager_id=114;

在这里插入图片描述
那么如果这样呢?

USE data1;
SELECT last_name,manager_id FROM employees WHERE manager_id=108
UNION
SELECT * FROM employees WHERE manager_id=114;

报错,因为栏目不匹配 也就是属性列不相同 合不到一起去
所以注意 无论哪种联合查询都要匹配属性列
当然你会觉得这个挺没用的——因为WHERE AND都能实现

那如果多表时呢?比如合并一下男神女神咋样:
在这里插入图片描述

USE data2;
SELECT 
  `id` AS 序号,
  `name` AS 名字 
FROM
  beauty 
UNION
SELECT 
  `id`,
  `boyName` 
FROM
  boys ;

现在有几个问题
1️⃣是栏目起别名 到底该怎么用
2️⃣ 如何叠加别的东西 比如排序 分页

1️⃣我们看个例子:

USE data2;
SELECT 
  `id` AS 序号,
  `name` AS 名字 
FROM
  beauty 
UNION
SELECT 
  `id` AS 号码,
  `boyName` AS 称呼 
FROM
  boys
ORDER BY 序号;

思考一下 为啥ORDER BY不跟着 号码
另外 属性的别名为啥是序号 名字 而不是 号码 称呼?

明显 合并之后的表格 别名是由第一个SELECT决定了的
2️⃣用下面代码就OK了

USE data2;
SELECT 
  `id` AS 序号,
  `name` AS 名字 
FROM
  beauty 
UNION
SELECT 
  `id` AS 号码,
  `boyName` AS 称呼 
FROM
  boys
ORDER BY 序号
LIMIT 0,10;

而对于UNION ALL实际上如果SELECT的条目有重复的话 UNION 会自动去重
你可以试试

USE data2;
SELECT 
  `id` AS 序号,
FROM
  beauty 
UNION
SELECT 
  `id`
FROM
  boys
ORDER BY 序号
LIMIT 0,10;

除了这点 性能上说,UNION ALL 要比UNION快很多,所以,不需要去重的话 其实UNION ALL是个更好的选择

那么其他差集 交集咋办?
不幸的是MySQL并不支持 但是显而易见 我们可以利用 [NOT] IN [NOT] EXIST INNER JOIN
来解决 因为貌似用的不多 这里不讲啦 感兴趣CSDN别人有写的 随便查查就有了

查询语句执行顺序总结

这一节作为 查询语句的最后一节
是时候来个大总结——语句的执行顺序问题 了解顺序有助于推理 debug
这是经典模板:

USE [数据库];
SELECT [查询栏目]
FROM [表1名] AS [表2别名]
[连接方式] JOIN [表2名] AS [表2别名]
ON [连接条件]
WHERE [筛选条件]
GROUP BY [分组字段]
HAVING [分组条件]
ORDER BY [排序字段]
LIMIT [数据起始索引] [数据数量]

或者你喜欢英文形式:

USE [db_name];
SELECT [column]
FROM [table1] AS [table1_name]
[join type] JOIN [table2] AS [table2_name]
ON [join condition]
WHERE [condition]
GROUP BY [grouping fields]
HAVING [grouping condition]
ORDER BY [order fields]
LIMIT [offset] [size]

顺序我们可以看图:

在这里插入图片描述
注意 书写代码的顺序也是如此 否则可能会报错

表的概念

这就是一个复习 可以跳过:
关系型数据库 MySQL

具体 英语 抽象理解概念 英语 数据库概念 英文
table 映射 mapping 关系 relation
column 属性 attribution 栏位 field
row 对象实例 instance 记录 record
发布了28 篇原创文章 · 获赞 24 · 访问量 8921

猜你喜欢

转载自blog.csdn.net/weixin_43178828/article/details/104219105