Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
я конечно не понимаю в командах, но мне кажется что SELECT это отбор,а не изменение
вообщем ваша команда не помогла
в программе SQLiteStudio есть функция сгенерировать запрос и выдаётся образец
коды
 
может это как то подскажет правильное напраление?

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 10:34 16-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tahirg
Где надо изменить значение - при каждой выборке(на лету, временное) или сделать постояное изменение в базе?  
Select - временное. Update - постоянное. При update все данные пеманентно изменяют на новые и возврат к старым невозможен.  
После update число 6.48999977111816 будет выглядеть как 7.0, т.к. datatype поля не меняется и число не может выглядеть как integer.
 

Цитата:
вообщем ваша команда не помогла
 
Команда обычно или работает, или вызывает ошибку. Ошибки были?
Честно говоря, я не обратил внимания, что база sqllite.
Поэтому хотелося бы увидеть имя поля, значения каждого поля для первых трех строк
результата исполнения запроса с немного другим синтаксисом:
select PROTEIN, round(PROTEIN, 0) as PROTEIN_ROUNDED from products
А так же текст ошибки, если будет.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:00 16-04-2017 | Исправлено: dneprcomp, 20:45 16-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
 

Цитата:
select PROTEIN, round(PROTEIN, 0) as PROTEIN_ROUNDED from products  

27377 строки возвращены за 69мс из: select PROTEIN, round(PROTEIN, 0) as PROTEIN_ROUNDED from products
 
Ссылка
 
поигрался с цифрой
select PROTEIN, round(PROTEIN, 1) as PROTEIN_ROUNDED from products  
вот такой код в самый раз, вот только как изменить в базе? В смысле внести изменения в базу
 
пишу update PROTEIN, round(PROTEIN, 1) as PROTEIN_ROUNDED from products  
получаю
near ",": syntax error:  
 
Добавлено:
 

Цитата:
 сделать постояное изменение в базе?  

 
да
 
и ещё, искал другие коды для других изменений и вот что сработало
 
update Таблица set Поле='лалала'  заполнение столбца цифрой
 
update products set NAME_LOW=`NAME`;  копирование из столбца в столбец

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 21:40 16-04-2017 | Исправлено: tahirg, 22:01 16-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tahirg
Для 7.58999977111816 round(PROTEIN, 1) должен возвращать 7.6
Для 7.58999977111816 round(PROTEIN, 0) должен возвращать 8.0
 
Но если round(PROTEIN, 1) устраивает, то
UPDATE products SET PROTEIN = round(PROTEIN, 1)
 
Еще раз подчеркиваю, назад после UPDATE ничего не вернуть.
Рекомендую сделать бекап или базы, или table, или хотя бы сохранить данные в другом поле.
 
Для сохранения в новом поле:
alter table products add column PROTEIN_LONG typeof(PROTEIN)
UPDATE products SET PROTEIN_LONG = PROTEIN
UPDATE products SET PROTEIN = round(PROTEIN, 1)
 
Если typeof(PROTEIN) неработает, то надо вручную найти datatype поля PROTEIN и заменить typeof(PROTEIN) на найденное значение. Или, если найти не получается, заменить на:
alter table products add column PROTEIN_LONG char(50)

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 23:00 16-04-2017 | Исправлено: dneprcomp, 23:09 16-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
вы гений! всё отработало как надо!
помогите плиз ещё  
 
нужно в столбце _id, упорядочить порядковые номера, а то сейчас 1..10688...316394
хотя записей в базе 27377
 
нужно в столбце NAME сделать первую заглавную
нужно в столбце NAME убрать кавычки с некоторых записей типа "данон" творожный, клубника
нужно в столбце NAME_LOW сделать все маленькие
нужна команда для очистки любого столбца от всех записей

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 09:56 17-04-2017 | Исправлено: tahirg, 10:35 17-04-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа-товарищи, ну прочитайте какую-нибудь тоненькую книжку по SQL. Язык - приметивнейший. Был создан для  тёток-кассирш, продающих авиабилеты. И является практически естественным английским языком.
Для манипуляции данными имспользуются всего 4 команды:
- SELECT - выбрать данные из таблицы для показа
- INSERT - вставить новые записи (строки) в таблицу
- UPDATE - изменить данные в таблице
- DELETE - удалить данные из таблицы.
Это всё.
 
В каждой команде указываются:
- название таблицы, с которой мы производим манипуляции
- (необязательно) условие: для каких строк таблицы мы производим манипуляции:
 
Итак, как выглядят команды (перевод английских слов обязательно посмотрите в словаре (их не так уж и много)): жирным шрифтом указаны слова, которые нужно написать так, как они указаны. Это ключевые слова. На место того, что написано обычным шрифтом - подставляете то, что вам нужно:
SELECT список_полей
FROM список_таблиц
WHERE условия _отбора_записей и связывания_таблиц
ORDER BY список полей для упорядочивания
 
INSERT INTO название таблицы, в которую будут добавлены значения
VALUES список новых значений
 
UPDATE название таблицы, в которой будут изменены значения
SET  название_поля = новое значение
WHERE условия _отбора_записей для в которых будут изменяться значения полей
 
DELETE
FROM название таблицы, в которой будут удалены записи
WHERE условия _отбора_записей, подлежащих удалению
 
Если в команде не указано WHERE, то действия в командах SELECT, UPDATE, DELETE производятся со всеми записями таблицы.
 

Цитата:
нужна команда для очистки любого столбца от всех записей
UPDATE products SET название_столбца = NULL
Пояснение: Изменяем таблицу "products". Изменяем все записи, поэтому, условие для отбора не требуется
 

Цитата:
нужно в поле NAME_LOW сделать все маленькие
UPDATE products SET name_low = lower(name_low)
Пояснение: Изменяем таблицу "products". Изменяем все записи, поэтому, условие для отбора не требуется. Подумайте, нужна ли вам эта команда? Для показа пользователю какого-либо поля маленькими буквами, это можно сделать в команде "SELECT".
 

Цитата:
нужно в поле NAME сделать первую заглавную  
нужно в поле NAME убрать кавычки с некоторых записей типа "данон" творожный, клубника
это делается командой UPDATE SET name = ....
где вместо многоточия должно быть либо регулярное выражение, либо функции работы с подстроками, убирающие кавычки / делающие первую букву заглавной. Я работаю с БД Oracle и тонкостей синтаксиса SQLite не знаю. Посмотрите в справочнике.

Цитата:
нужно в поле _id, упорядочить порядковые номера, а то сейчас 1..10688...316394  
хотя записей в базе 27377
База данных хранит записи так, как ей это удобно и не нужно ей мешать. Упорядочивание данных нужно только для показа человеку. Это делается командой SELECT. Например:
SELECT name, fat FROM products ORDER BY _id
Эта команда покажет список всех записей таблицы "products", упорядоченный по возрастанию поля "_id" В списке будут поля "name" и "fat"
Ещё пример:
SELECT name, protein, fat FROM products WHERE fat > 0.1 and protein <= 0.9 ORDER BY protein ASC, fat DESC
Будут отобраны продукты, у которых значения fat>0.1 и protein<0.9. Для отобранных записей будут показаны поля "name", "protein", "fat". Записи будут показаны в порядке увеличения значения поля "protein". Продукты с одинаковым значением поля "protein" будут упорядочиваться по убыванию значения поля "fat". (ASC - ascending, DESC - descending)
 
 
 
 
 
 
Добавлено:

Цитата:
а в каких задач уместнее использовать Left Join?
Правильно было бы сказать так: "В каких случаях нужно использовать LEFT OUTER JOIN, а в каких - INNER JOIN?"
- INNER JOIN - пересечение - отбирает записи, которые в обоих таблицах удовлетворяют заданному условию
- LEFT OUTER JOIN - отбирает все записи из левой таблицы. Если в правой таблице есть запись, удовлетворяющие условию из левой таблицы, то выводит соответствующие значения в соответствующей строке, если нет такой записи - выводит NULL в соответствующей колокне соответствующей строки.
Есть иллюстрация: https://www.w3schools.com/sql/sql_join_left.asp

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 11:17 17-04-2017 | Исправлено: Dronton2, 11:41 17-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2
Я понимаю ваше возмущение. Есть однако в моём случае оправдание. Я один раз хочу изменить одну таблицу и более с ними не работать, поэтому изучать матчасть..время терять, тут же спецы для которых секундное дело дать код запроса.
 

Цитата:
UPDATE products SET name_low = lower(name_low)

не сработало, строки так и остались с заглавной буквы...

Цитата:
Подумайте, нужна ли вам эта команда?

нужна т.к база именно регистрозависимая

Цитата:
База данных хранит записи так, как ей это удобно и не нужно ей мешать.

эта база была создана путём обьединения трёх баз и в прошлой жизни базы шли со своими номерами, вот поэтому хочу упорядочить

Цитата:
UPDATE products SET название_столбца = NULL  

в столбце изменилось на null, а мне бы хотелось, чтобы там небыло ничего..никаких надписей, пустое поле
 
 

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 11:36 17-04-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Select - временное. Update - постоянное. При update все данные пеманентно изменяют на новые и возврат к старым невозможен.
Срочно сотрите из своей памяти это ложное и крайне вредное убеждение.
1. SELECT - всего лишь - отбор полей и записей из таблицы для показа пользователю или дальнейших действий с отобранным набором данных
2. UPDATE - изменение записей в таблице. Изменённые записи можно откатить назад командой ROLLBACK, или окончательно зафиксировать командой COMMIT. Почитайте про транзакции - без них базы данных были бы очень ненадёжным инструментом.
 
 
Добавлено:

Цитата:
в столбце изменилось на null, а мне бы хотелось, чтобы там небыло ничего..никаких надписей, пустое поле
NULL - Это и есть пустое значение. Самое правильное. И клиентские приложения должны его правильно показывать.
Если вам зачем-то нужно показывать пустоту не в клиентских приложениях, а, например, для администратора БД или программиста, то напишите
UPDATE products SET название_столбца = ''
т.е, NULL замените на  пустую строку в кавычках, или на строку, состоящую из одного пробела.
Но, последствия могут быть неправильными.
 

Цитата:
UPDATE products SET name_low = lower(name_low)
не сработало, строки так и остались с заглавной буквы...
Если UPDATE делаете в одной сессии, а SELECT - в другой, то после команды UPDATE, в той же самой сессии, нужно выполнить команду, состоящую из одного слова COMMIT
И да, если при закрытии сессии, вы не сделали COMMIT, то все изменения, произощедшие после последнего COMMITа, отменяются. (Т.е., при закрытии, сессия автоматически выполняет команду ROLLBACK).
 
 
 
Добавлено:
Да, и Гугл наше всё: https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=lower+sqlite
Оказывается, что SQLite не любит Юникод. Могу только посоветовать попробоавать регулярные выражения. А ещё лучше - погуглить.

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 12:13 17-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
UPDATE products SET название_столбца = ''

сработало, теперь столбцы полностью пустые
 

Цитата:
UPDATE products SET name_low = lower(name_low)  

 
ох...при каких либо изменениях в базе, если они там произошли, в программе DB Browser for SQLite активируется кнопка "записать изменения"
но перед этим я могу посмотреть что изменилось, так вот, регистр слов не меняется, хотя кнопка активируется

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 12:43 17-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2

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

И как вы предлогаете объяснить что-либо человеку не знакомому с SQL и програмированием?  
Для него изменения в select и являются именно как-бы временными, т.к. ничего не меняют в базе.  

Цитата:
Изменённые записи можно откатить назад командой ROLLBACK, или окончательно зафиксировать командой COMMIT

И что, после commit можно вернуться к первоначальным данным?
Меньше снобизма. Не только вы знаете что такое SQL.  
 
tahirg
Dronton2 прав. Упорядочивaть по _id надо исключительно в select. Упорядочить в базе можно, но не нужно.
База не книга. Ее не читают, с ней работают. В базе не должно быть все красиво.  
В базе должно быть удобно для использования и логически правильно.
 

Цитата:
регистр слов не меняется, хотя кнопка активируется  

Покажите как в прошлый раз значение поля до, знаение поля после для команды:
SELECT name_low, lower(name_low) as name_low FROM products

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 16:41 17-04-2017 | Исправлено: dneprcomp, 04:25 18-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
 
Ссылка
 
Добавлено:

Цитата:
 Упорядочить в базе можно, но не нужно.  

база была создана путём слияния трёх баз и в каждой базе были свои номера id, вот и хочется привести всё к нормальному виду

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 17:19 17-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tahirg
Дайте развернутое определение для "привести всё к нормальному виду"
Что имеем сейчас, как должно выглядеть после.
Надо ли сохранять существующие ID или просто назначить новые.
Если новые, начнать с 0 или с 1
Имейте в виду, если какой-либо код использует ID, их замена с большой веротностью приведет к потере работоспособности программы.
Хотелося бы понять как и где используется и будет использоваться база

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 18:08 17-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
"привести всё к нормальному виду"  

 
сейчас номера 1..243..10473..31845...а записей в базе 27377
хочется, чтобы номеров было столько сколько записей в базе
 

Цитата:
как и где используется и будет использоваться база

это база для андроид приложения, просто в оригинале было маловато продуктов, я объединил несколько баз в одну, приложение использую чисто для себя, никуда выкладывать не собираюсь, вот и хочется навести порядок а базе  
ссылку на базу отправил в лс
 

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 18:28 17-04-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тут уже явный перебор в обсуждении.
Человек же написал - ничего не знаю, изучать - время терять. Либо дайте готовое решение, либо направляйте сюда http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2395&start=820#lt.
Как вариант - весь этот мусор в отдельную тему.
 
P.S. Еще бы лекцию про Foreign Key прочитали (который точно присутствует, судя по названию таблицы)...

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 19:46 17-04-2017 | Исправлено: Alexzzy, 19:56 17-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tahirg

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:34 17-04-2017 | Исправлено: dneprcomp, 00:08 18-04-2017
tahirg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
что?

Всего записей: 1970 | Зарегистр. 23-03-2003 | Отправлено: 21:44 17-04-2017
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tahirg
Я sqlite не использую, поэтому открыть не могу
 
CREATE TABLE tmp_products  (_id integer primary key autoincrement,  добавить через запятую остальные поля и их type - text или date или integer);
INSERT INTO tmp_products(добавить через запятую поля без type - поле _ID НЕ ДОБАВЛЯТЬ )
SELECT добавить через запятую поля без type - поле _ID НЕ ДОБАВЛЯТЬ  
FROM products ;
 
ALTER TABLE products  RENAME TO products_old;
ALTER TABLE tmp_products RENAME TO products;
 
Добавлено:
sqlite не работает нормально с русскими буквами, поэтому lower и не работает

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:55 17-04-2017 | Исправлено: dneprcomp, 22:00 17-04-2017
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
товарищи знатоки SQL, можете дать наглядный пример, когда в жизни пригождается Left Join?

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 09:44 18-04-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
P.S. Еще бы лекцию про Foreign Key прочитали (который точно присутствует, судя по названию таблицы)
Кстати, да: вопрос к tahirg: у вас есть другие таблицы, в которых присутствуют продукты из таблицы Products? Если есть, то значение поля _id менять нельзя.
 
dneprcomp

Цитата:
И как вы предлогаете объяснить что-либо человеку не знакомому с SQL и програмированием?  
Для него изменения в select и являются именно как-бы временными, т.к. ничего не меняют в базе.  
Проблема в том, что select ничего в базе данных не изменяет. Ни временно, ни постоянно. Это и буду объяснять.
Прокомментируйте мне ваш же запрос: "SELECT name_low, lower(name_low) as name_low FROM products". Что и где он "как-бы временно" изменяет? И на какое время? И почему "как-бы"?
Есть простые команды на простом английском языке, которые означают лишь то, что в них написано. И сделаны они так, чтобы не нужно было в них ничего домысливать.
 
 
 
 
Добавлено:

Цитата:
И что, после commit можно вернуться к первоначальным данным?
Нельзя. Но я нигде и не утверждал, что можно. Я писал, что после команды Update можно вернуться назад.
 
Добавлено:
Steepe_Hare

Цитата:
товарищи знатоки SQL, можете дать наглядный пример, когда в жизни пригождается Left Join?
На этой же странице, посмотрите чуть раньше. Повторю:
Цитата:
а в каких задач уместнее использовать Left Join?
Правильно было бы сказать так: "В каких случаях нужно использовать LEFT OUTER JOIN, а в каких - INNER JOIN?"  
- INNER JOIN - пересечение - отбирает записи, которые в обоих таблицах удовлетворяют заданному условию  
- LEFT OUTER JOIN - отбирает все записи из левой таблицы. Если в правой таблице есть запись, удовлетворяющие условию из левой таблицы, то выводит соответствующие значения в соответствующей строке, если нет такой записи - выводит NULL в соответствующей колокне соответствующей строки.  
Есть иллюстрация: https://www.w3schools.com/sql/sql_join_left.asp
Примеры есть в википедии: https://ru.wikipedia.org/wiki/Join_(SQL)
И в гугле можно получить ответ, практически мгновенно, задав запрос: "left join sql википедия"

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:58 18-04-2017 | Исправлено: Dronton2, 10:16 18-04-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2

Цитата:
Если есть, то значение поля _id менять нельзя.

Заменить то везде всё можно, но смысла нет, да и задача не для тех кто ничего не знает.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 12:48 18-04-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Активные темы » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru