代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

SQL-如何在列中找到最大的数字?

  •  42
  • Robin Rodricks  · 技术社区  · 15 年前

    假设我在客户表中有以下数据:(没有其他数据)

    ID   FirstName   LastName
    -------------------------------
    20   John        Mackenzie
    21   Ted         Green
    22   Marcy       Nate
    

    什么类型的select语句可以让我在id列中获得数字22?

    我需要这样做来生成一个唯一的ID。当然,我可以让系统通过自动增量来实现这一点,但是我如何获得自动生成的ID呢?

    我想到了“从客户中选择ID”并计算返回的行数,但这似乎效率极低,在这种情况下,它将错误地返回“3”,尽管我需要一个唯一的ID 23。

    14 回复  |  直到 6 年前
        1
  •  96
  •   notnoop    15 年前

    你可以做到

    SELECT MAX(ID) FROM Customers;
    
        2
  •  16
  •   David Andres    15 年前

    如果您刚刚在customers表中插入了一条记录,并且需要最近填充的id字段的值,那么可以使用scope_identity函数。只有当插入发生在与调用scope_标识相同的范围内时,这才有用。

    INSERT INTO Customers(ID, FirstName, LastName)
    Values
    (23, 'Bob', 'Smith')
    
    SET @mostRecentId = SCOPE_IDENTITY()
    

    这可能对你有用,也可能不有用,但这是一个值得注意的好技巧。它还可以与自动生成的列一起使用。

        3
  •  10
  •   McGarnagle    12 年前
    SELECT * FROM Customers ORDER BY ID DESC LIMIT 1
    

    然后拿到身份证。

        4
  •  8
  •   warren    15 年前
    select max(id) from customers
    
        5
  •  8
  •   Pritesh Jain    12 年前

    为了随时得到它,你可以 SELECT MAX(Id) FROM Customers .

    但是,在添加它的过程中,也可以使用 SCOPE_IDENTITY --获取该过程最后添加的ID。
    这样更安全,因为它可以保证你 Id --以防同时将其他人添加到数据库中。

        6
  •  7
  •   Damon    15 年前

    如果你说的是SQL女士,这里是最有效的方法。这将基于标识的列从表中检索当前标识种子。

    select IDENT_CURRENT('TableName') as LastIdentity
    

    使用 MAX(id) 更通用,但例如,我有一个表,它有4亿行,需要2分钟才能得到 最大(ID) . IDENT_CURRENT 几乎是瞬间的…

        7
  •  6
  •   warren    15 年前
    select max(id) from Customers 
    
        8
  •  4
  •   ItsJ0el indiPy    6 年前

    如果您正在使用 AUTOINCREMENT ,用途:

    SELECT LAST\_INSERT\_ID();
    

    假设您使用的是MySQL: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

    Postgres通过 currval(sequence_name) 功能。

    注意使用 MAX(ID) 除非锁定表,否则是不安全的,因为(在简化的情况下)在调用 最大(ID) 您将丢失第一个插入的ID。上面的函数是基于会话的,因此如果插入另一个会话,您仍然可以获得插入的ID。

        9
  •  2
  •   paxdiablo    15 年前

    如果您不使用自动递增字段,则可以通过如下方式获得类似的结果:

    insert into Customers (ID, FirstName, LastName)
        select max(ID)+1, 'Barack', 'Obama' from Customers;
    

    这将确保在提取最大ID和插入新记录之间,没有可能由其他人插入表而导致的竞争条件。

    这是使用标准的SQL,毫无疑问,用特定的DBMS来实现它有更好的方法,但是它们不一定是可移植的(我们在车间里非常重视)。

        10
  •  2
  •   Arnab    12 年前

    也可以使用关系代数。这个过程有点冗长,但这里只是为了了解max()的工作原理:

    E: = 身份证件 (表名)
    E1: = 身份证件 (_ id>=id' (_ 身份证 e)__e)__ 身份证件 (α) ID<ID_ (下) 身份证 e)(e)e)

    你的答案是: 表e1

    基本上你要做的是减去一组有序关系(a,b),其中a < b从a开始,其中a,b__a。

    有关关系代数符号,请参见: Relational algebra From Wikipedia

        11
  •  0
  •   sohum    15 年前

    取决于您使用的是什么SQL实现。例如,mysql和sqlite都有获取最后一个insert id的方法。事实上,如果您使用的是php,甚至有一个漂亮的函数专门用于mysql_insert_id()。

    您可能应该使用这个MySQL特性,而不是只查看所有行以获得最大的插入ID。如果您的表变大了,这可能会变得非常低效。

        12
  •  0
  •   Mihai Chelaru klin    6 年前

    如果您只想选择 id 使用 select max(id) from customer .

    如果要选择整行,请使用如下查询:

    select c1.*
    from customer c1, (select max(id) as max_id from customer )c2 
    where c1.id=c2.max_id
    

    c2 是新临时表的别名,其中包含 max id . 然后将它的叉积与客户表一起获取整行。

    这里我们在FROM子句中编写一个查询,这通常非常有用。

        13
  •  -1
  •   Ben    12 年前
    select * from tablename order by ID DESC
    

    那会给你22号身份证

        14
  •  -1
  •   skuntsel    10 年前

    在PHP中:

    $sql = mysql_query("select id from customers order by id desc");
    $rs = mysql_fetch_array($sql);
    if ( !$rs ) { $newid = 1; } else { $newid = $rs[newid]+1; }
    

    因此 $newid = 23 如果ID列中的最后一条记录是22。