Перейти к содержимому

Oracle как узнать количество возвращаемых строк select

  • автор:

Ограничение числа возвращаемых строк

Требуется ограничить число возвращаемых запросом строк. Порядок не имеет значения; подойдут любые n строк.

Решение

В Oracle ограничение на количество возвращаемых строк накладывается с помощью функции ROWNUM в предикате WHERE:

select e.* from emp e where rownum  
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- ---------- --- --------- --- ---- ------ 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 

Обсуждение

Для ограничения числа возвращаемых строк в Oracle приходится использовать функцию ROWNUM, возвращающую порядковый номер каждой строки результирующего множества (возвращающую, начиная с 1, величину).

Рассмотрим, то происходит при использовании ROWNUM

  1. Oracle выполняет запрос.
  2. Oracle извлекает первую строку и называет ее строкой номер 1.
  3. Номер строки больше 5? Если нет, Oracle возвращает строку, потому что она отвечает критерию: ее порядковый номер меньше или равен 5. Если да, Oracle не возвращает строку.
  4. Oracle извлекает следующую строку и присваивает ей слудущий порядковый номер по возрастанию (2, затем 3, затем 4 и т.д.).
  5. Переходим к шгу 3.

Как видно из данного процесса, присвоение значений, возвращаемых функцией ROWNUM, происходит после извлечения очередной строки. Это очень важно и является ключевым моментом. Многие разработчики на Oracle пытаются реализовать извлечение только, скажем, пятой возвращенной запросом строки, задавая ROWNUM = 5. Такое использование условия равенства в сочетании с ROWNUM является неверным. При попытке возвратить пятую строку с помощью ROWNUM = 5 роисходит следующее:

  1. Oracle выполняет запрос.
  2. Oracle извлекает первую строку и называет ее строкой номер 1.
  3. Номер строки равен 5? Если нет, Oracle отбрасывает строку, потому что она не отвечает заданному критерию. Если да, Oracle возвращает строку. Но ответ всегда будет отрицательным!
  4. Oracle извлекает следующую строку и называет ее строкой номер 1, поскольку первая возвращенная запросом строка должна быть пронумерована как первая строка.
  5. Переходим к шагу 3.

После тщательного разбора этого процесса становится понятно, почему использование ROWNUM = 5 не обеспечивает возвращения пятой строки. Невозможно получить пятую строку, не возвратив перед этим строки с первой по четвертую!

Однако заметьте, что с помощью ROWNUM = 1 можно получить первую строку. Может показаться, что это противоречит приведенному выше объяснению. Причина, почему ROWNUM = 1 обеспечивает возвращени первой строки, в том, что Oracle для определения наличия строк в таблице приходится извлекать, по крайней мере, одну из них. Внимательно проанализируйте предыдущий процесс, подставив 1 вместо 5, и вы поймете, почему для возвращения одной строки можно в качестве условия задавать ROWNUM = 1.

Tags: Ограничение числа возвращаемых строк

PL/SQL

tags: Администрирование Oracle DataBase || SQL & PL/SQL

Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.

Возвращение n случайных записей таблицы

Требуется возвратить некоторое число записей таблицы, выбранных случайным образом. Необходимо так изменить следующее выражение, чтобы при каждом последующем выполнении оно возвращало разные пять строк:

select e.ename, e.job from emp e 

Решение

Используйте встроенную функцию VALUE, которая находится во встроенном пакете DBMS_RANDOM, в сочетании с ORDER BY и встроенную функцию ROWNUM:

select x.* from ( select e.ename, e.job from emp e order by dbms_random.value() ) x where rownum  
ENAME JOB ---------- ---------- MILLER CLERK SMITH CLERK KING PRESIDENT JONES MANAGER TURNER SALESMAN ENAME JOB ---------- ---------- KING PRESIDENT ALLEN SALESMAN JAMES CLERK SCOTT ANALYST FORD ANALYST 

Обсуждение

Происходит сортировка результирующего набора с помощью оператоара ORDER BY и функции dbms_random.value(). После этого происходит ограничение числа возвращаемых строк с помощью функции ROWNUM.

Важно четко различать, что происходит при использовании в ORDER BY функции и числовой константы. При задании в операторе ORDER BY числовой константы, сортировка осуществляется по столбцу с заданным в списке SELECT порядковым номером. Когда в ORDER BY задается функция, сортировке подвергается результат, возвращаемый функцией для каждой строки.

Tags: Возвращение n случайных записей таблицы

PL/SQL

tags: Администрирование Oracle DataBase || SQL & PL/SQL

Исходные коды проекта хранятся на github. Можете заводить Issue и Discussions, при необходимости.
Чтобы задать вопрос, добавить свои знания, исправить ошибки и неточности, пишите в телеграм чате.

SQL оператор SELECT LIMIT

В этом учебном материале вы узнаете, как использовать оператор SELECT LIMIT в SQL, с синтаксисом и примерами.

Описание

SQL оператор SELECT LIMIT используется для извлечения записей из одной или нескольких таблиц в базе данных и ограничения количества возвращаемых записей на основании предельного значения.

Подсказка: SELECT LIMIT поддерживается не во всех базах данных SQL.
Для баз данных, таких как SQL Server или MSAccess, используйте оператор SELECT TOP, чтобы ограничить свои результаты. Оператор SELECT TOP является патентованным эквивалентом оператора SELECT LIMIT.

Синтаксис

Синтаксис для оператора SELECT LIMIT в SQL.

SELECT expressions
FROM tables
[WHERE conditions]
[ORDER BY expression [ ASC | DESC ]]
LIMIT number_rows [ OFFSET offset_value ];

Параметры или аргумент

expressions Столбцы или расчеты, которые вы хотите получить tables Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица WHERE conditions Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны ORDER BY expression Необязательный. Он используется в операторе SELECT LIMIT, чтобы вы могли упорядочить результаты и выбрать те записи, которые вы хотите вернуть. ASC - возрастающий порядок, а DESC - убывающий LIMIT number_rows Он указывает ограниченное количество строк в наборе результатов, которые должны быть возвращены на основе number_rows . Например, LIMIT 10 вернет первые 10 строк, соответствующих критериям SELECT. Именно здесь важен порядок сортировки, поэтому обязательно используйте предложение ORDER BY соответствующим образом OFFSET offset_value Необязательный. Первая строка, возвращаемая LIMIT, будет определена offset_value

Пример - использование ключевого слова LIMIT

Давайте посмотрим, как использовать оператор SELECT с опцией LIMIT в SQL.
Например.

COUNT ФУНКЦИЯ

Oracle/PLSQL функция COUNT возвращает количество возращенных запросом строк.

Синтаксис

Синтаксис Oracle/PLSQL функции COUNT:

SELECT COUNT(aggregate_expression)
FROM tables
[WHERE conditions];

ИЛИ синтаксис функции COUNT с группировке результатов по одному или нескольким столбцам:

SELECT expression1, expression2, . expression_n,
COUNT(aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, . expression_n;

Параметры или аргументы

expression1 , expression2 , . expression_n Выражения, которые не инкапсулированы в функции COUNT и должны быть включены в оператор GROUP BY в конце SQL предложения.

aggregate_expression - это столбец или выражение, чьи ненулевые значения будут учитываться.

tables - таблицы, из которых вы хотите получить записи. В оперторе FROM должна быть указана хотя бы одна таблица.

WHERE conditions - необязательный. Это условия, которые должны быть соблюдены для выбранных записей.

Функция COUNT возвращает numeric значение.

Включает только NOT NULL значения

Не все это понимают, но функция COUNT будет включать в счет только те записи, в которых значение выражения COUNT (expression) НЕ равно NULL. Когда выражение содержит значение NULL, оно не включается в вычисления COUNT.

Давайте рассмотрим пример функции COUNT, который демонстрирует, как значения NULL оцениваются функцией COUNT.

Например, если у вас есть следующая таблица с названием suppliers :

supplier_id supplier_name state
1 IBM CA
2 Microsoft
3 NVIDIA

И если вы запустите следующий оператор SELECT, который использует функцию COUNT:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *