Операции с таблицами

  • CREATE TABLE — Создание новой таблицы

  • ALTER TABLE — Изменение свойств таблицы

  • INSERT — Добавление данных в таблицу

  • DROP TABLE — Удаление таблицы

  • TRUNCATE TABLE — Удаление всех строк из таблицы

  • SHOW TABLES — Вывод списка всех таблиц

  • SHOW COLUMNS — Вывод списка всех колонок

  • DESCRIBE TABLE — Вывод информации о таблице

  • DELETE — Удаление строк из таблицы

  • UPDATE — Обновление строк в таблице

Создание новой таблицы

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] [<table_schema>.]<table_name>
    (<column_name> <column_type>
        [NOT NULL] [DEFAULT <default_expr>]
    ...
    )
    [WITH (<table_param>, ... )]

Создает новую таблицу с указанным именем и указанными колонками.

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] [<table_schema>.]<table_name> AS
    <select_expr>
    [WITH (<table_param>, ... )]

Создает новую таблицу с указанным именем на основе результата запроса SELECT.

Параметры

  • <table_name> — имя создаваемой таблицы


  • <table_schema> — схема создаваемой таблицы


  • <column_name> — имя колонки создаваемой таблицы



  • NOT NULL — данная колонка не принимает значения NULL


  • DEFAULT <default_expr> — константа или константное выражение по умолчанию


  • <select_expr> — выражение SELECT, результат выполнения которого будет записан в создаваемую таблицу


  • <table_param> — параметры создаваемой таблицы

    table_param ::= [<name> = <value>]

    Возможные значения:

    • snapshot_ttl = <duration> — глубина хранения снапшотов (версий таблицы).
      По умолчанию: 7 дней, но не более 1000 снапшотов.
      Например: '1 week', '2 days', '4 days 3 hours 5 minutes 30 seconds'

    • order_by = <column_name> — колонка для сортировки данных на уровне хранения.
      Подробнее: Управление партиционированием таблицы.

Если указан модификатор OR REPLACE, то конечное действие эквивалентно удалению существующей таблицы и созданию новой с тем же именем.

Опциональный модификатор IF NOT EXISTS ограничивает запрос только теми случаями, в которых указанный объект еще не существует.

Модификаторы являются взаимоисключающими. Если указать их оба, это приведет к ошибке.

При отсутствии префикса схемы (<table_schema>) таблица создается в дефолтной для пользователя схеме.

Управление партиционированием таблицы

В параметре order_by можно задать колонку для сортировки данных на уровне хранения.

Таблицы хранятся в формате Iceberg. Гранулярность данных поддерживается за счет разделения данных таблицы на отдельные файлы parquet. Записи между файлами распределяются с помощью параметра order_by, указанного при создании таблицы. Это позволяет кратно ускорить объемные операции изменения данных с условием фильтрации по этому параметру.

Если параметр не указан, то данные в таблице хранятся с произвольной сортировкой. Если параметр указан, то партиционирование таблицы происходит по указанной в этом параметре колонке.

Рекомендуется использовать параметр order_by при создании таблиц большого размера. Это позволяет ускорить операции изменения данных. Например, если в условиях для DELETE будет задан фильтр по колонке сортировки, то удаление будет происходить максимально быстро — по партициям.
  • Пример

    Создадим таблицу с заданным параметром для сортировки и укажем сортировку по колонке column2:

    CREATE TABLE my_table (column1 INT, column2 DATE)
        WITH (order_by = column2);

    Удалим часть данных с фильтром по колонке сортировки:

    DELETE FROM my_table
        WHERE column2  > '2026-01-01';

    В таком случае процесс удаления будет происходить максимально эффективно при больших размерах таблицы.

Автоинкремент

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

Чтобы это сделать, нужно указать в качестве типа колонки ключевое слово IDENTITY. Тогда при добавлении в таблицу новых строк в эту колонку будут автоматически вставляться целые числа начиная с 0.

  • Пример

    Создадим таблицу с двумя колонками и для первой колонки в качестве типа укажем IDENTITY:

    CREATE TABLE my_table (column1 IDENTITY, column2 VARCHAR);
    +--------+
    | status |
    +--------+
    | CREATE |
    +--------+

    Вставим два одинаковых значения в колонку column2, для колонки column1 не будем указывать значения для вставки:

    INSERT INTO my_table (column2) VALUES
        ('test_value'),
        ('test_value');
    +-------+
    | count |
    +-------+
    | 2     |
    +-------+

    Выведем все строки получившейся таблицы:

    SELECT * FROM my_table;
    +---------+------------+
    | column1 | column2    |
    +---------+------------+
    | 0       | test_value |
    +---------+------------+
    | 1       | test_value |
    +---------+------------+

    Мы видим, что в колонку column1 были автоматически вставлены целые числа начиная с 0.

Внутри механизма автоинкремента используется функция nextval_tngri.

Изменение свойств таблицы

Переименование таблицы

ALTER TABLE [<table_schema>.]<old_table_name>
    RENAME TO [<table_schema>.]<new_table_name>;

Переименовывает существующую таблицу в указанное имя <new_table_name>. Все атрибуты и права при этом сохраняются.

Указание схемы перед новым именем таблицы необязательно.

Добавление колонки

ALTER TABLE [<table_schema>.]<table_name>
    ADD COLUMN <column_name> <column_type>;

Добавляет в таблицу колонку с указанным именем и указанным типом данных. Во все строки добавленной колонки записывается значение NULL.

Удаление колонки

ALTER TABLE [<table_schema>.]<table_name>
    DROP COLUMN <column_name>;

Удаляет из таблицы колонку с указанным именем.

Добавление данных в таблицу

INSERT INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
       {
         VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ]  |
         <query>
       }

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

Параметры

  • <target_table> — имя целевой таблицы, в которую будут вставлены строки


  • <target_col_name> — имена столбцов, в которые будут вставлены значения. Если какие-то столбцы таблицы не указаны, то в них будут вставлены значения по умолчанию. Параметр является опциональным. Если его не указывать, то должны быть указаны добавляемые значения для всех столбцов.


  • VALUES ( value | DEFAULT | NULL [ , …​ ] ) [ , ( …​ ) ] — указывает одно или несколько значений для вставки в соответствующие столбцы целевой таблицы.

    • value — явно указанное значение; может быть литералом или выражением.

    • DEFAULT — значение по умолчанию для соответствующего столбца целевой таблицы.

    • NULL — пустое значение.

    Значения разделяются запятыми.

    Вы можете вставить несколько строк, указав дополнительные наборы значений в выражении.


  • query — запрос, результат которого будет вставлен в целевую таблицу. Таким образом можно вставлять строки в целевую таблицу из одной или нескольких исходных таблиц.

Пример вставки явно заданных значений

Вставим в таблицу capitals значения для столбцов country и capital:

CREATE TABLE capitals (country VARCHAR, capital VARCHAR);
INSERT INTO capitals VALUES
    ('Russia', 'Moscow'),
    ('Italy', 'Rome'),
    ('Spain', 'Madrid'),
    ('France', 'Paris');

SELECT * FROM capitals;
+---------+---------+
| country | capital |
+---------+---------+
| France  | Paris   |
+---------+---------+
| Italy   | Rome    |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+

Пример вставки результатов вложенного запроса

Теперь создадим другую таблицу capitals_m и сделаем вставку строк из capitals, которые будут результатом вложенного запроса SELECT. Вставим такие строки из capitals, в которых значение capital содержит M.

CREATE TABLE capitals_m (country VARCHAR, capital VARCHAR);

INSERT INTO capitals_m (country, capital)
    SELECT * FROM capitals
        WHERE capital LIKE '%M%';

SELECT * FROM capitals_m;
+---------+---------+
| country | capital |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+

Удаление таблицы

DROP TABLE [IF EXISTS] [<table_schema>.]<table_name>;

Удаляет таблицу с указанным именем.

Опциональный модификатор IF EXISTS ограничивает запрос только теми случаями, в которых указанный объект существует.

Удаление всех строк из таблицы

TRUNCATE TABLE [IF EXISTS] [<table_schema>.]<table_name>;

Удаляет все строки из таблицы, но не удаляет саму таблицу (сохраняются колонки, типы данных колонок, привилегии на таблицу).

Опциональный модификатор IF EXISTS ограничивает запрос только теми случаями, в которых указанный объект существует.

Вывод списка всех таблиц

SHOW TABLES;

Выводит список всех существующих таблиц, доступных пользователю.

Формат вывода:

+-------------+------------+
| schema_name | table_name |
+-------------+------------+
| ...         | ...        |
+-------------+------------+

Вывод списка всех колонок

SHOW COLUMNS;

Выводит список всех колонок всех таблиц, доступных пользователю.

Формат вывода:

+-------------+------------+-------------+
| schema_name | table_name | column_name |
+-------------+------------+-------------+
| ...         | ...        | ...         |
+-------------+------------+-------------+

Вывод информации о таблице

DESC[RIBE] TABLE <table_name>;

Выводит информацию о таблице.

Формат вывода:

+-------------+-------------+------+---------+
| column_name | column_type | null | default |
+-------------+-------------+------+---------+
| ...         | ...         | ...  | ...     |
+-------------+-------------+------+---------+
  • column_name — имя колонки

  • column_type — тип данных колонки

  • null — допустимы ли в колонке значения NULL

  • default — значение колонки по умолчанию