Работа с данными (DML - data manipulation language)
Select
select column1 as field1 from table1можно исключить as из запроса:
select column1 as field1 from table1
тернарный оператор
select if(0, "true", "false")
dual
dual - это виртуальная несуществующая таблица, которую можно использовать для заглушки:regexp, rlike
Функция RLIKE является синонимом для REGEXP, она предусмотрена для совместимости с mSQL.экранирование спец-символов требует двойного обратного слеша:
select * from comment where comment_hi rlike '^1\\.[^\\.]*$'
примеры:
^[0-9]+$ | последовательность цифр |
Вложенный select
можно проверить, существуют ли строки, удовлетворяющие условию:where (not exists (select * from rtu.test_codec_group_comments t1 where t1.codec_group_id=t.codec_group_id))
Сортировка средствами базы
Рандомная сортировкаorder by case attr_id
when 301 then 1
when 305 then 2
when 306 then 3
when 302 then 100
end;
Сортировка по логическому выражению
Связь многие ко многим
Допустим, что есть таблица районов. Таблица предприятий. И таблица связей между районами и предприятиями.Предприятие может иметь филиалы в нескольких районах. Очевидно, что связь многие ко многим через третью таблицу.
Теперь, положим, надо выбрать все районы, но каждый раз определять, есть ли филиал заданного предприятия в каждом районе.
Запрос будет выглядеть примерно так:
(select firm_id from distict_firm t1 where firm_id=78 and t.district_id=t1.district_id) firm_id
from district t
Группировка
Склеить значения varchar поля:Update
update первым параметром получает table_reference, что означает, что вместо имени таблицы можно использовать конструкции left/right/inner join.
set t.path_id=p.path_id;
Update из второй (виртуальной) таблицы
update
table1 t1,
(
select * from (
select '01.01' gui_hi_old, '_01.02' gui_hi_new
union all
select '01.01.01' gui_hi_old, '_01.02.01' gui_hi_new
union all
select '01.02' gui_hi_old, '_01.01.01' gui_hi_new
union all
select '01.02.01' gui_hi_old, '_01.01' gui_hi_new
) t3 order by gui_hi_old desc
) t2
set
t1.gui_hi = t2.gui_hi_new
where
t1.gui_hi = t2.gui_hi_old
Изменение сортировки строк по полю pos
SET pos = ELT(FIELD(pos, 1,2,3), 3,2,1)
WHERE pos IN (1,2,3);
Insert
Копировать данные из одной таблицы в другую
2. insert into mw_string_prop ( str_id, prop_nm, lang_id, str_text )
select 930, 'MERATableColumn', t.lang_id, t.str_text from mw_string_prop
where str_id=928 and prop_nm='name'
При вставке даннных может возникнуть проблема пересечения ключей. Можно сделать обрабочик:
on duplicate key update
field = concat( values(field), my_table.field );
Вставка из виртуальной таблицы
insert into test2 (t1_id, t2_item)select 1, "description"
union
select 2 , "scription"
union
select 2, "unscription"
Replace
replace mw_user_default_aa set gui_hi='119.01', aa_id=3Встроенные функции
Работа со строками
http://www.intuit.ru/department/database/mysql/10/concat | cклеить строки | select concat("str1", "str2"); |
group_concat | склеить результаты подселекта в строку. имеет ограничение в количестве склеиваемых символов (где-то 1000). чтобы отменить ограничение: set group_concat_max_len = 1000000; | select column0, (select group_concat(column1 separator "," ) from t2) from t1; |
replace() | заменить подстроку | SELECT REPLACE('www.mysql.com', 'w', 'Ww'); 'WwWwWw.mysql.com' |
Дата и время
date_format | получить время в заданном формате (как строку) icom-studio.com.ua/blog/use_of_mysql_date_format.html | select date_format(date_column, '%Y.%m.%d %H:%i:%S') from my_table; |
now() | текущее дата-время | |
curdate() | текущая дата | |
выбрать данные за указанный период | select * from my_table where DATE_SUB(NOW(), INTERVAL 1 DAY) < column_nm select * from my_table where DATE_SUB(NOW(), INTERVAL 24 HOUR) < column_nm период может быть указан в виде дроби 1.3 DAY |
Типы данных
Бинарные данные (blob и longblob)
blob и longblob - текстовые поля для хранения бинарных данных.blob ограничен 64кб, longblob - 4.2Gb
Запрос получения данных (select) не может вернуть больше 16Mb (определяется конфигурацией MySQL). Нельзя записать (insert, update) данных больше, чем позволяет оперативная память компьютера. Поэтому, есть ограничения при работе с большими файлами (будем считать, что в blob хранятся файлы).
как строки
С полями blob можно работать точно так же, как со строками. Можно получить часть строки, узнать количество байт, добавить к строке.
select substring(f, 1, 10), length(f) from myTable where id=1;
update myTable set f=f+%s where id=1;
работа через файлы
select f from myTable where id=2 into dumpfile '/tmp/sss.avi';update myTable set f=load_file('/tmp/xxx.avi') where id=1
Lock-и
Залочить таблицу:lock tables debug_call write; # есть ещё read, но не знаю, зачем он нужен
Разлочить таблицы, залоченные текущим курсором:
Получить информацию о залоченных таблицах:
Комментариев нет:
Отправить комментарий