• SQL LIMIT限制SELECT语句返回的行数


    本教程我们将演示如何使用SQL LIMIT子句来限制SELECT语句返回的行数。

    1. SQL LIMIT子句简介

    要检索查询返回的行的一部分,请使用LIMITOFFSET子句。 以下说明了这些子句的语法:

    SELECT 
        column_list
    FROM
        table1
    ORDER BY column_list
    LIMIT row_count OFFSET offset;
    

    在这个语法中,

    • row_count确定将返回的行数。
    • OFFSET子句在开始返回行之前跳过偏移行。 OFFSET子句是可选的。 如果同时使用LIMITOFFSET子句,OFFSET会在LIMIT约束行数之前先跳过偏移行。

    在使用LIMIT子句时,使用ORDER BY子句确保返回的行按指定顺序非常重要。更多教程请访问http://www.manongzj.com

    并非所有数据库系统都支持LIMIT子句,因此,LIMIT子句仅在某些数据库系统中可用,例如MySQLPostgreSQLSQLite,Sybase SQL Anywhere和HSQLDB。

    1. SQL LIMIT子句示例

    我们将使用示例数据库中的employees表来演示LIMIT子句用法。

    以下语句返回employees表中按first_name列排序的所有行。

    SELECT 
        employee_id, first_name, last_name
    FROM
        employees
    ORDER BY first_name;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+
    | employee_id | first_name | last_name |
    +-------------+------------+-----------+
    |         103 | Alexander  | Lee       |
    |         115 | Alexander  | Su        |
    |         114 | Avg        | Su        |
    |         193 | Britney    | Zhao      |
    |         104 | Bruce      | Wong      |
    ... ...
    |         100 | Steven     | Lee       |
    |         203 | Susan      | Zhou      |
    |         106 | Valli      | Chen      |
    |         206 | William    | Wu        |
    +-------------+------------+-----------+
    40 rows in set
    

    如果要只返回前5行,请使用LIMIT子句,如以下语句。

    SELECT 
        employee_id, first_name, last_name
    FROM
        employees
    ORDER BY first_name
    LIMIT 5;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+
    | employee_id | first_name | last_name |
    +-------------+------------+-----------+
    |         115 | Alexander  | Su        |
    |         103 | Alexander  | Lee       |
    |         114 | Avg        | Su        |
    |         193 | Britney    | Zhao      |
    |         104 | Bruce      | Wong      |
    +-------------+------------+-----------+
    5 rows in set
    

    要跳过两行并获取接下来的五行,请使用LIMITOFFSET子句,如以下语句所示。

    SELECT 
        employee_id, first_name, last_name
    FROM
        employees
    ORDER BY first_name
    LIMIT 5 OFFSET 3;
    

    结果如下图所示 -

    如果使用的是MySQL,则可以使用LIMIT OFFSET子句的较短形式。

    SELECT 
        employee_id, first_name, last_name
    FROM
        employees
    ORDER BY first_name
    LIMIT 3 , 5;
    

    2. 使用SQL LIMIT获取具有最高或最低值的前N行

    可以使用LIMIT子句获取具有最高或最低值的前N行。 例如,以下声明获得薪资最高的前五名员工。

    SELECT 
        employee_id, first_name, last_name, salary
    FROM
        employees
    ORDER BY salary DESC
    LIMIT 5;
    

    执行上面示例代码,得到以下结果 -

    首先,ORDER BY子句按工资按降序对员工进行排序,然后LIMIT子句限制从查询返回的五行。

    为了获得薪资最低的前五名员工,可以按升序对员工进行排序。

    3. 获取具有第N个最高值的行

    假设必须得到公司薪水第二高的员工。请使用LIMIT OFFSET子句,如下所示。

    SELECT 
        employee_id, first_name, last_name, salary
    FROM
        employees
    ORDER BY salary DESC
    LIMIT 1 OFFSET 1;
    

    ORDER BY子句按工资降序对员工进行排序。 LIMIT 1 OFFSET 1子句从结果集中获取第二行。

    此查询的假设是每个员工都有不同的薪水。 如果有两名员工拥有相同的最高薪水,那么它将会失败。 此外,如果有两个或更多具有相同第二高薪的员工,则查询只返回第一个。

    要解决此问题,可以使用以下语句首先获得第二高薪。

    SELECT DISTINCT
        salary
    FROM
        employees
    ORDER BY salary DESC
    LIMIT 1 , 1;
    

    执行上面示例代码,得到以下结果 -

    mysql> SELECT DISTINCT
        salary
    FROM
        employees
    ORDER BY salary DESC
    LIMIT 1 , 1;
    +--------+
    | salary |
    +--------+
    | 17000  |
    +--------+
    1 row in set
    

    并将结果传递给另一个查询:

    SELECT 
        employee_id, first_name, last_name, salary
    FROM
        employees
    WHERE
        salary = 17000;
    

    结果如下所示 -

    如果使用子查询,则可以将两个查询组合到单个查询中,如下所示:

    SELECT 
        employee_id, first_name, last_name, salary
    FROM
        employees
    WHERE
        salary = (SELECT DISTINCT
                salary
            FROM
                employees
            ORDER BY salary DESC
            LIMIT 1 , 1);
    

    结果如下所示 -

    在本教程中,我们向您介绍了SQL LIMITOFFSET子句,这些子句用于限制查询返回的行数。

  • 相关阅读:
    Linuxqq shell脚本安装后的卸载
    A Spy in the Metro UVA-1025(dp)
    L1-064 估值一亿的AI核心代码
    龙芯 3A4000 安装 Debian10 (via debootstrap)
    Linux用户和用户组
    /etc/issue、/etc/issue.net和/etc/motd的区别
    一种注释
    龙芯平台51单片机开发环境搭建笔记
    Rails UVA-514 (stack)
    The SetStack Computer UVA-12096 (set 操作)
  • 原文地址:https://www.cnblogs.com/myhomepages/p/15826219.html
Copyright © 2020-2023  润新知