其实非常简单
我们网页加载往往是动态 用户需要多少就加载多少 好比淘宝搜索匹配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 |
这一节 我们终于完结了DQL语句 也就是SQL中的重中之重——查询
下面我们会好好收拾 DML 数据操作语言 还有DDL 数据定义语言 以及 TCL 事务操作语言
这些的学习都是并行不悖的
DML :数据库学习之MySQL (二十二)——DML 数据操作语言 INSERT UPDATE DELETE
DDL:数据库学习之MySQL (二十三)—— DDL(一) 概述 创建 修改 删除 库 表
TCL:数据库学习之MySQL (二十七)—— 事务 transaction 事务控制语言 TCL commit rollback
对了 这么重要的日子 我们需要庆祝一下 :)
算了 还是笑着好看
嗯咳咳 还要继续学习 下一站:
数据库学习之MySQL (二十二)——DML 数据操作语言 INSERT UPDATE DELETE