Заметки кодящего дизайнера

Вход, просмотр информации, выбор и переключение между базами

В этой заметке рассказываю как войти в СУБД, узнать какие у нас есть в наличии базы, посмотреть информацию о базе, выбрать / сменить базу для работы, посмотреть таблицы и их структуру, выбрать строки с определёнными данными.

Опустим ситуацию когда MySQL отсутствует на компьютере или работает некорректно. Предположим, что у нас открыт терминал на устройстве с установленной СУБД MySQL. Мы знаем имя пользователя и пароль.

Вход в СУБД

В таком случае чтобы войти в СУБД потребуется ввести следующую команду, а за ней пароль.

mysql -u root -p

Просмотр информации о базах, выбор базы, просмотр таблиц

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

SHOW DATABASES;

Как то мне потребовалось узнать размер базы. Сделать это можно вот так.

SELECT table_schema AS "Database", SUM(data_length + index_length) / 1024 / 1024 AS "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "database_name"
GROUP BY table_schema;

Выберем базу, с которой будем работать.

USE database_name;

Посмотрим какие таблицы она содержит.

SHOW TABLES;

Изучим структуру интересующей нас таблицы.

Можно сделать это так.

SHOW COLUMNS FROM table_name;

А можно так.

DESCRIBE table_name;

В целом команды идентичны. DESCRIBE является синонимом для SHOW COLUMNS. Разница в том, что DESCRIBE всегда выводит полную структуру указанной таблицы, в то время как SHOW COLUMNS позволяет фильтровать вывод, например так:

SHOW COLUMNS FROM table_name LIKE 'column_name';

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

USE database_name_2;

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

SELECT DATABASE();

Если никакая база не выбрана, результатом будет NULL.

Выбор строк

Теперь посмотрим как нам выбрать определённые строки.

Например, возьмём стандартную таблицу Opencart3 t_product и попробуем вывести первые 24 строки из неё.

SELECT * 
FROM `t_product` 
LIMIT 24;

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

SELECT product_id, model, manufacturer_id, price, date_added, date_modified 
FROM `t_product` 
LIMIT 24;

Отлично! Уже чище. Попробуем теперь добавить сортировку. Например, я хочу посмотреть 24 недавно отредактированных товара.

SELECT product_id, model, manufacturer_id, price, date_added, date_modified
FROM `t_product`
ORDER BY date_modified DESC
LIMIT 24;

Дополним запрос условием. Например, я хочу выбрать 10 недавно добавленных товаров, у которых manufacturer_id = 54.

SELECT product_id, model, manufacturer_id, price, date_added, date_modified
FROM `t_product`
WHERE manufacturer_id = 54
ORDER BY date_added DESC
LIMIT 10;

Хорошо. А если для выбора строк нужно смотреть в две таблицы? Например, мне нужно узнать название позиции name с известным артикулом model. Но дело в том, что name лежит в таблице t_product_description;, а model в таблице t_product, а соединяет их product_id.

Есть два способа сделать это. Первый — использовать подзапрос.

SELECT product_id, name
FROM `t_product_description`
WHERE product_id IN (SELECT product_id FROM `t_product` WHERE model = 'ЗНАЧЕНИЕ_МОДЕЛИ');

Второй — использовать соединение таблиц. Этот способ, во-первых, в большинстве случаев оптимальнее, а во-вторых позволяет делать составной вывод.

Например, вывести общий для обеих таблиц product_id из таблицы t_product_description взять name, а из таблицы t_product вывести model и price.

Например, зная model из таблицы product_id сделаем следующий составной вывод: 1) product_id, общий для двух таблиц; 2) model; 3) price из таблицы t_product; 4) name из таблицы t_product_description.

SELECT 
    p.product_id, 
    p.model, 
    p.price, 
    pd.name
FROM 
    t_product AS p
INNER JOIN 
    t_product_description AS pd 
ON 
    p.product_id = pd.product_id
WHERE 
    p.model = 'ЗНАЧЕНИЕ_МОДЕЛИ';

И следом добавлю пример комбинации внешнего запроса и подзапроса с соединением таблиц.

Например, нам надо получить 50 недавно добавленных товаров и следом отсортировать их по модели.

SELECT *
FROM (
    SELECT 
        p.product_id, 
        p.model, 
        pd.name,
        p.date_added
    FROM 
        t_product AS p
    INNER JOIN 
        t_product_description AS pd 
    ON 
        p.product_id = pd.product_id
    ORDER BY p.date_added DESC
    LIMIT 50
) AS subquery
ORDER BY model;