Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.88.155] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте.
Работаю с базой данный через PhpMyAdmin. В нем можно отправлять SQL запросы к базе и в интерфейсе PhpMyAdmin видеть результат. Заинтересовали расчеты с помощью SQL. Помогите с ними разобраться. Пример 1. Есть Таблица с одинаковым товаром, с полями - номер заказа - количество проданного товара - стоимость товара за штуку Можно ли с помощью SQL посчитать сумму за каждый заказ умножив (количество проданного товара)*(стоимость товара за штуку)? Где в таком случае выведется результат произведения? Будет создан абстрактный (временный) столбец, где выведутся произведения для каждого заказа? Объясните, пожалуйста, как это работает. -- Пример 2. Есть таблицы с полями - Номер заказа - Статус заказа - Дата время наступления статуса Строка 1: - Номер заказа: "123" - Статус заказа: "Создан" - Дата время наступления статуса: "01.12.2023" Строка 2: - Номер заказа: "123" - Статус заказа: "Завершен" - Дата время наступления статуса: "03.12.2023" Нужно посчитать с помощью SQL сколько дней для Заказа "123" прошло между статусам "Создан" и "Завершен". Т.е. "03.12.2023" - "01.12.2023" = 2дня Можно ли это посчитать через SQL? Вопрос аналогичный, где будет выведен результат? Будет создана абстрактная (временная) таблица в которой будут выведены - Номер заказа - Количество дней между прошло между статусам "Создан" и "Завершен". ?? |
Сообщ.
#2
,
|
|
|
Цитата rownong@yandex.ru @ Можно ли это посчитать через SQL? Конечно можно. Для этого тебе нужно сделать соединение таблицы с самой себя. Условие соединения - что номера заказов совпадают, и у первой таблицы в поле статуса заказа "создан", и у второй "завершен". В этом запросе в блоке SELECT указываешь первым полем - номер заказа (первой или присоединяемой таблицы - без разницы, т.к. они равны), вторым полем используешь функцию с постфикcом AS days. Этим самым ты переназовешь второй столбец. Функцию ищи в документации, которая рассчитывает разницу в днях. Если я не ошибаюсь - в MySQL это DATEDIFF. В PostgreSQL используй что-то типа: (timestamp2::date - timestamp1::date) AS days Добавлено Цитата rownong@yandex.ru @ Вопрос аналогичный, где будет выведен результат? Будет создана абстрактная (временная) таблица в которой будут выведены - Номер заказа - Количество дней между прошло между статусам "Создан" и "Завершен". ?? Будет создан результат, который будет выведен в интерфейс phpMyAdmin, и никуда не будет записан. Если нужно его куда-то сохранить - копируй из интерфейса копипастой. Или создай заранее нужную таблицу в БД и в нее произведи запись результата запроса. |
Сообщ.
#3
,
|
|
|
Цитата rownong@yandex.ru @ Где в таком случае выведется результат произведения? В запросе, который описывает задание серверу, указывается, какие поля нужно вернуть, и с помощью каких выражений следует получать для них значения. Можно вывести поле исходной таблицы без изменения, можно его при выводе переименовать, можно на основе нескольких полей написать вычисляющее выражение и дать ему имя... Например, запрос может выглядеть так: SELECT table1.name1, table2.name2 AS name3, table1.name4 * table2.name5 AS name6 FROM ... Соответственно после связывания исходных таблиц в соответствии в секцией FROM, фильтрации в соответствии со WHERE и сортировкой в соответствии с ORDER BY будет возвращён набор записей. Он будет состоять из трёх полей с именами name1, name3 и name6, первые два будут содержать неизменённые значения указанных полей исходных таблиц, третье - произведение указанных полей. |
Сообщ.
#4
,
|
|
|
Цитата В запросе, который описывает задание серверу, указывается, какие поля нужно вернуть, и с помощью каких выражений следует получать для них значения. Можно вывести поле исходной таблицы без изменения, можно его при выводе переименовать, можно на основе нескольких полей написать вычисляющее выражение и дать ему имя... Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц Добавлено Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц? |
Сообщ.
#5
,
|
|
|
Цитата rownong@yandex.ru @ Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц Да. Цитата rownong@yandex.ru @ Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц? Можем. Есть несколько вариантов. Первый - используй фильтрацию запросов оператором WHERE чтобы получить одну нужную строку, либо пробуй использовать оператор LIMIT с аргументом 1. Во втором случае скорее всего нужно будет прибегнуть заранее к сортировке строк результата, ибо лимит только "обрежет" остальные строки из результата. А без предварительной сортировки это будет недетерминированный результат. Хотя, суммируя все продажи, мы реально должны получить одну строку без всяких телодвижений типа WHERE и LIMIT. |
Сообщ.
#6
,
|
|
|
Цитата rownong@yandex.ru @ Получается когда делаем SQL запрос, чтобы соединить 2 таблицы можем в результате скрывать (не выводить) определённые столбцы? Вернее, выводить только нужны столбцы из обоих таблиц Выводить нужно (не можно, а именно нужно) только то, что реально требуется. Если нужны только результаты вычисления каких-то выражений - в выходном наборе должны быть только они. SELECT * в рабочей версии приложения пишут исключительно идиоты (да, вот настолько безальтернативно) - даже если действительно нужны все поля, следует их перечислять по одному. Или идти учить матчасть по нормализации данных. Цитата rownong@yandex.ru @ Если есть например 10 менеджеров по продажам, мы можем в результате SQL запроса вывести не 10 строка с суммой продажи каждого менеджера за месяц, а 1 строк с суммой продаж всех менеджеров за месяц? Продажа отдельного менеджера и продажа всех менеджеров - это разные уровни группировки. Поэтому сама фраза не имеет смысла - нужно ведь либо то, либо другое. А если вдруг надо всё это одновременно (программист не умеет заставить клиентскую часть выводить итоги), то есть GROUP BY WITH ROLLUP/CUBE. Нереляционно, но если по другому не умеешь - пусть его. Это ж потом не SQL-серверу трахаться, а клиентской части, её не жалко. |
Сообщ.
#7
,
|
|
|
Цитата Akina @ SELECT * в рабочей версии приложения пишут исключительно идиоты (да, вот настолько безальтернативно) - даже если действительно нужны все поля, следует их перечислять по одному Согласен полностью. Но только с учетом именно рабочей версии. В процессе написания скрипта и его отладки SELECT * вполне допустимо использовать, иногда это немного экономит время. ИМХО. |
Сообщ.
#8
,
|
|
|
SELECT * можно писать в рабочем коде. Вот MS SQL пример:
IF EXISTS(SELECT * … Есть еще по крайней мере один случай, когда нельзя перечислять поля, а надо писать SELECT * в рабочем коде. |
Сообщ.
#9
,
|
|
|
Цитата MIF @ надо писать SELECT * в рабочем коде Хм...Это с какого такого перепугу? |
Сообщ.
#10
,
|
|
|
Цитата MIF @ SELECT * можно писать в рабочем коде. Вот MS SQL пример: Вас спасает только то, что MS SQL достаточно умный. И знает, что в EXISTS сами значения полей не нужны, и лезть за ними в тело таблицы не требуется. Но вот формально - такой код требует метнуться за значениями полей, а потому SELECT {const} разумнее и логичнее. Цитата MIF @ Есть еще по крайней мере один случай, когда нельзя перечислять поля, а надо писать SELECT * в рабочем коде. Хотелось бы конкретики. Я пока о таких случаях не слышал - за исключением ситуации, когда необходимость грести всё подряд определяется или отставанием клиента, или мультиверсионностью БД. |
Сообщ.
#11
,
|
|
|
Еще подскажите:
1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса? Аналогично как это сделано например в PhpMyAdmin для обычных полей (столбцов)? 2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"? Например выбрать все записи из table1, в которых поле log содержит текст "395948" Пример значений поля log {"items_data":[{"item_sid":"7069294","qty":1}],"contact_phone":"79777777777","contact_name":"u0421u043eu0431u0441u0442u0432u0435u043du043du0430u044f u0437u0430u044fu0432u043au0430","contact_email":"service@yandex.ru","jp_purchase_id":"395948"} {"items_data":[{"item_sid":"2388062","qty":2}],"contact_phone":"79777777777","contact_name":"u0421u043eu0431u0441u0442u0432u0435u043du043du0430u044f u0437u0430u044fu0432u043au0430","contact_email":"service@yandex.ru","jp_purchase_id":"395948"} Интересует как это указывать в запросе и в фильтре PhpMyAdmin. |
Сообщ.
#12
,
|
|
|
Цитата rownong@yandex.ru @ 1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса? Нет. Цитата rownong@yandex.ru @ 2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"? Показанные примеры не относятся к типу "содержит". Это типичный случай "равно" (использован синтаксис MySQL): WHERE log->>"$.jp_purchase_id" = '395948' |
Сообщ.
#13
,
|
|
|
Цитата Akina @ Цитата rownong@yandex.ru @ 1. При SQL запросе, когда создаем абстрактные (не существующие) поле (столбцы) можно ли кроме присвоения им имен, также добавлять комментарии, на время просмотра SQL запроса? Нет. Цитата rownong@yandex.ru @ 2. Какой оператор нужно использовать, чтобы использовать фильтр типа "содержит"? Показанные примеры не относятся к типу "содержит". Это типичный случай "равно" (использован синтаксис MySQL): WHERE log->>"$.jp_purchase_id" = '395948' Спасибо! |
Сообщ.
#14
,
|
|
|
Подскажите, правильно понимаю, что результатом SQL запроса могут быть:
1. Реальная таблица из БД. 2. Абстрактная таблица (с несуществующими столбцами, но которые создаем в момент запроса) 3. Число (например результат расчетов). Т.е. просто одно число (без таблиц и столбцов), которое получаем в результате. ?? |
Сообщ.
#15
,
|
|
|
Цитата rownong@yandex.ru @ Подскажите, правильно понимаю, что результатом SQL запроса могут быть: 1. Реальная таблица из БД. 2. Абстрактная таблица (с несуществующими столбцами, но которые создаем в момент запроса) 3. Число (например результат расчетов). Т.е. просто одно число (без таблиц и столбцов), которое получаем в результате. Не совсем правильно. Результатом SQL запроса не может быть ни реальная таблица из БД, ни абстрактная таблица, и ни число. Ибо результатом SQL запроса может быть только сам результат SQL запроса Другое дело, что может содержать этот результат. А он может содержать: 1. Значения всех или отдельных полей (столбцов) реальной таблицы или таблиц из БД 2. Значения полей (столбцов), получаемых в результате вычислений, обращений к VIEW или хранимым процедурам 3. Значения полей (столбцов), заданных константой Последний вариант, скажем так, сильно менее распространён. Как правило используется в подзапросах. Ибо в финальном запросе указывать поле, содержащее константу, по факту - бессмысленно. |