Вы не можете SELECT
без FROM
.
SELECT 1
не удастся, вам нужно:
SELECT 1
FROM dual
Пустая строка и NULL
- это одно и то же.
SELECT *
FROM dual
WHERE '' = ''
ничего не возвращает.
Нет ни TOP
, ни LIMIT
. Вы ограничиваете свои результаты в предложении WHERE
:
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
col
)
WHERE rownum < 10
именно так, используя подзапрос, так как ROWNUM
оценивается до ORDER BY
.
Вы не можете вкладывать коррелированные подзапросы глубиной более одного уровня. Этот не удастся:
SELECT (
SELECT *
FROM (
SELECT dummy
FROM dual di
WHERE di.dummy = do.dummy
ORDER BY
dummy
)
WHERE rownum = 1
)
FROM dual do
Это проблема.
NULL
значения не индексируются. Этот запрос не будет использовать индекс для заказа:
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
col
)
WHERE rownum < 10
, если col
не помечен как NOT NULL
.
Обратите внимание, что это NULL
значения , которые не проиндексированы, а не столбцы . Вы можете создать индекс для пустого столбца, и в индекс попадут не NULL
значения.
Однако индекс не будет использоваться, если условие запроса предполагает, что NULL
значения могут его удовлетворить.
В приведенном выше примере вы хотите, чтобы все значения были возвращены (включая NULL
s). Тогда индекс не знает о не NULL
значениях, следовательно, не может их получить.
SELECT *
FROM (
SELECT *
FROM mytable
ORDER BY
col
)
WHERE rownum < 10
Но этот запрос будет использовать индекс:
SELECT *
FROM (
SELECT *
FROM mytable
WHERE col IS NOT NULL
ORDER BY
col
)
WHERE rownum < 10
, поскольку не NULL
значения не могут когда-либо удовлетворять условию.
По умолчанию NULL
s сортируются последними, а не первыми (как в PostgreSQL
, но в отличие от MySQL
и SQL Server
)
Этот запрос:
SELECT *
FROM (
SELECT 1 AS id
FROM dual
UNION ALL
SELECT NULL AS id
FROM dual
) q
ORDER BY
id
вернет
id
---
1
NULL
Для сортировки как в SQL Server
и MySQL
используйте это:
SELECT *
FROM (
SELECT 1 AS id
FROM dual
UNION ALL
SELECT NULL AS id
FROM dual
) q
ORDER BY
id NULLS FIRST
Обратите внимание, что он нарушает порядок rownum
, если последний не используется из подзапроса (как описано выше)
"MYTABLE"
и "mytable"
(двойные кавычки имеют значение) - это разные объекты.
SELECT *
FROM mytable -- wihout quotes
выберет первое, а не второе. Если первое не существует, запрос не будет выполнен.
CREATE TABLE mytable
создает "MYTABLE"
, а не "mytable"
.
В Oracle
все неявные блокировки (которые являются результатом операций DML
) являются уровнями строки и никогда не увеличиваются. То есть строка, не затронутая транзакцией, не может быть неявно заблокирована.
Писатели никогда не блокируют читателей (и наоборот).
Чтобы заблокировать всю таблицу, вы должны выполнить явный оператор LOCK TABLE
.
Блокировки строк хранятся на страницах данных.
В Oracle
нет "CLUSTERED
indexes", есть "таблицы, организованные по индексам". По умолчанию таблицы организованы в кучу (в отличие от SQL Server
и MySQL
с InnoDB
).
В мире Oracle
«кластеризованное хранилище» означает организацию нескольких таблиц таким образом, чтобы строки, имеющие общий ключ (из нескольких таблиц), также имели общую страницу данных.
Одна страница данных содержит несколько строк из нескольких таблиц, что делает соединения по этому ключу очень быстрыми.