Подтвердить что ты не робот

SQL. Как найти наибольшее число в столбце?

Допустим, у меня есть следующие данные в таблице "Клиенты": (ничего более)

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

Какого рода оператор SELECT может дать мне номер 22 в столбце идентификатора?

Мне нужно сделать что-то вроде этого, чтобы создать уникальный идентификатор. Конечно, я могу позволить системе делать это с помощью автоинкремента, но тогда как мне получить автоматически сгенерированный идентификатор?

Я думал о SELECT ID FROM Customers и подсчитывал возвращаемые строки, но это кажется ужасно неэффективным, и в этом случае он будет неправильно возвращать "3", хотя мне нужен уникальный идентификатор 23.

4b9b3361

Ответ 1

Вы можете сделать

SELECT MAX(ID) FROM Customers;

Ответ 2

Если вы только что вставили запись в таблицу Customers и вам нужно значение недавно заполненного поля ID, вы можете использовать функцию SCOPE_IDENTITY. Это полезно только тогда, когда INSERT произошел в той же области, что и вызов SCOPE_IDENTITY.

INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')

SET @mostRecentId = SCOPE_IDENTITY()

Это может или не может быть полезно для вас, но это хорошая техника, чтобы знать. Он также будет работать с автоматически генерируемыми столбцами.

Ответ 3

SELECT * FROM Customers ORDER BY ID DESC LIMIT 1

Затем получите идентификатор.

Ответ 4

select max(id) from customers

Ответ 5

Чтобы получить его в любое время, вы можете сделать SELECT MAX(Id) FROM Customers.

В процедуре, которую вы добавили, однако, вы также можете использовать SCOPE_IDENTITY -, чтобы получить идентификатор, последний добавленный этой процедурой.
Это безопаснее, потому что это гарантирует, что вы получите свой Id - на случай, если другие будут добавлены в базу данных одновременно.

Ответ 6

Если вы говорите о MS SQL, здесь наиболее эффективный способ. Это извлекает текущее семя идентичности из таблицы на основе того, какой столбец является идентификатором.

select IDENT_CURRENT('TableName') as LastIdentity

Использование MAX(id) более общее, но, например, у меня есть таблица с 400 миллионами строк, для получения MAX(id) требуется 2 минуты. IDENT_CURRENT почти мгновенно...

Ответ 7

select max(id) from Customers 

Ответ 8

Если вы используете 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) небезопасно, если только вы не заблокируете таблицу, поскольку возможно (в упрощенном случае) выполнить другую вставку, которая происходит до того, как вы вызовете MAX(ID), и вы потеряете идентификатор первой вставки. Приведенные выше функции основаны на сеансах, поэтому, если вставляется другой сеанс, вы все равно получаете вставленный вами идентификатор.

Ответ 9

Если вы не используете поля с автоматическим увеличением, вы можете добиться аналогичного результата с помощью следующего:

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

Это не даст шансов на состояние гонки, которое может быть вызвано тем, что кто-то другой вставляет в таблицу между извлечением максимального идентификатора и вашей вставкой новой записи.

Это использует стандартный SQL, нет никаких сомнений в том, что его можно использовать с конкретными СУБД, но они не обязательно переносимы (что мы очень серьезно относимся к нашему магазину).

Ответ 10

Вы также можете использовать реляционную алгебру. Немного продолжительная процедура, но здесь просто понять, как работает MAX():

E: = π ID (Table_Name)
E1: = π ID ID >= ID ' ((ρ ID' E) ⋈ E)) - π ID ID < ID ((p ID ' E) ⋈ E))

Ваш ответ: Table_Name ⋈ E1

В основном вы вычитаете набор упорядоченного отношения (a, b), в котором a < b из A, где a, b ∈ A.

Для символов алгебры связей см. Реляционная алгебра Из Википедии

Ответ 11

Зависит от того, какую реализацию SQL вы используете. Как MySQL, так и SQLite, например, имеют способы получить последний идентификатор вставки. На самом деле, если вы используете PHP, есть даже отличная функция для именно этого mysql_insert_id().

Вероятно, вам стоит использовать эту функцию MySQL вместо того, чтобы смотреть на все строки, чтобы получить самый большой идентификатор вставки. Если ваш стол становится большим, это может стать очень неэффективным.

Ответ 12

Если вы хотите просто выбрать 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

select * from tablename order by ID DESC

который даст вам строку с идентификатором 22

Ответ 14

В 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, если последняя запись в столбце равна 22.