limit用法
SELECT * FROM <table_name> LIMIT [offset,] <rows> | <rows> OFFSET <offset>;
需要注意的是,offset的起始值的0而不是1
// 实例
SELECT * FROM table LIMIT 5, 10; // 检索记录 6-15 行
// 用于从某一个offset开始检索到最后一条记录,将第二个参数指定为 -1
SELECT * FROM table LIMIT 95, -1; // 检索记录行 96-last
// 如果只给定一个参数,表示返回的最大的记录行数目
SELECT * FROM table LIMIT 5; // 从检索记录中最多返回5条记录
// LIMIT n <==> LIMIT 0, n
分页查询与性能分析
最基本的分页方式
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...;
子查询分页方式
随着数据量的增加,页数会越来越多,LIMIT语句的offset就会越大,速度也会明显变慢!!
此时可以使用子查询的方式来提高分页效率
// 原查询
SELECT * FROM articles WHERE c_id=123 ORDER BY id LIMIT 10000, 10;
// 使用子查询后的优化查询语句
SELECT * FROM articles WHERE id >=
( SELECT id FROM articles WHERE c_id=123 ORDER BY id LIMIT 10000, 1) LIMIT 10;
- JOIN分页方式
SELECT * FROM content AS t1 JOIN
( SELECT id FROM content ORDER BY id DESC LIMIT ".($page-1) * $pagesize.", 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id DESC LIMIT $pagesize;
使用JOIN和使用子查询的分页方法在分页查询效率上属于一个数量级,原因在于,子查询是在索引上完成的,而普通查询是在数据文件上完成的,通常索引文件比数据文件小很多。
一般来说,小于100页的查询使用基本分页方式,大于100页的使用子查询的方式
条件运算
下面的两个语句等价
select stuname as 姓名, case stusex when 1 then '男' else '女' end as 性别 from tb_student;
select stuname as 姓名, if(stusex, '男', '女') as 性别 from tb_student;
算术运算
查询男学生的姓名和生日按年龄从大到小排列(排序)
select student as 姓名, datediff(curdate(), stubirth) div 365 as 年龄 from tb_student
where stusex=1 order by 年龄 desc;
连接操作
自然连接
// 自然内连接
SELECT * FROM one NATURAL JOIN two; // INNER JOIN 和 NATURAL JOIN 是等效的
// 左外自然连接
SELECT * FROM one NATURAL LEFT JOIN two;
// 右外自然连接
SELECT * FROM one NATURAL RIGHT JOIN two;