Вход, просмотр информации, выбор и переключение между базами
Опустим ситуацию когда 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;