limit用法

  1. SELECT * FROM <table_name> LIMIT [offset,] <rows> | <rows> OFFSET <offset>;

需要注意的是,offset的起始值的0而不是1

  1. // 实例
  2. SELECT * FROM table LIMIT 5, 10; // 检索记录 6-15 行
  3. // 用于从某一个offset开始检索到最后一条记录,将第二个参数指定为 -1
  4. SELECT * FROM table LIMIT 95, -1; // 检索记录行 96-last
  5. // 如果只给定一个参数,表示返回的最大的记录行数目
  6. SELECT * FROM table LIMIT 5; // 从检索记录中最多返回5条记录
  7. // LIMIT n <==> LIMIT 0, n

分页查询与性能分析

  1. 最基本的分页方式

    1. SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...;
  2. 子查询分页方式

随着数据量的增加,页数会越来越多,LIMIT语句的offset就会越大,速度也会明显变慢!!
此时可以使用子查询的方式来提高分页效率

  1. // 原查询
  2. SELECT * FROM articles WHERE c_id=123 ORDER BY id LIMIT 10000, 10;
  3. // 使用子查询后的优化查询语句
  4. SELECT * FROM articles WHERE id >=
  5. ( SELECT id FROM articles WHERE c_id=123 ORDER BY id LIMIT 10000, 1) LIMIT 10;
  1. JOIN分页方式
    1. SELECT * FROM content AS t1 JOIN
    2. ( SELECT id FROM content ORDER BY id DESC LIMIT ".($page-1) * $pagesize.", 1) AS t2
    3. WHERE t1.id <= t2.id ORDER BY t1.id DESC LIMIT $pagesize;

    使用JOIN和使用子查询的分页方法在分页查询效率上属于一个数量级,原因在于,子查询是在索引上完成的,而普通查询是在数据文件上完成的,通常索引文件比数据文件小很多。

一般来说,小于100页的查询使用基本分页方式,大于100页的使用子查询的方式

条件运算

下面的两个语句等价

  1. select stuname as 姓名, case stusex when 1 then '男' else '女' end as 性别 from tb_student;
  2. select stuname as 姓名, if(stusex, '男', '女') as 性别 from tb_student;

算术运算

查询男学生的姓名和生日按年龄从大到小排列(排序)

  1. select student as 姓名, datediff(curdate(), stubirth) div 365 as 年龄 from tb_student
  2. where stusex=1 order by 年龄 desc;

连接操作

自然连接

  1. // 自然内连接
  2. SELECT * FROM one NATURAL JOIN two; // INNER JOIN 和 NATURAL JOIN 是等效的
  3. // 左外自然连接
  4. SELECT * FROM one NATURAL LEFT JOIN two;
  5. // 右外自然连接
  6. SELECT * FROM one NATURAL RIGHT JOIN two;

其他连接操作

转自菜鸟教程 https://www.runoob.com/mysql/mysql-join.html