Это моя шпаргалка по SQL запросам, которую я постоянно использую в работе. Сохранена в простом блокнотике, пополняю по необходимости. Очень удобно, когда, например, сессия подвисла, а ты не знаешь где. Чтобы каждый раз не бегать и не гуглить "как ее найти и убить", просто открываю шпаргалочку.
А как разбить поле, выцепив только часть ДО двоеточия или наоборот, после? Я это никогда не запомню А если ты работаешь уже на реальной, большой базе, то одна ошибка в запросе приводит к 5-10-30 минутам ожидания впустую. Не не, я лучше подсмотрю!
Итак, моя шпаргалка:
План
explain plan for select * from n_document_view ;
select * from table(dbms_xplan.display);
1. Только дата, без времени:
select distinct trunc(created, 'DDD') from folks
where hid_party in (select * from TMP$RESULT_HIDS);
select distinct extract(year from pt_acual_date) from buffer_folks; --- только дата
2. REGEXP
WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$')
3. Разбивка Аuthor (поле вида "AL:1")
substr(author,1,INSTR(author,':',1)-1) - до двоеточия
SUBSTR(author, INSTR(author, ':', 1)+1, LENGTH(author) - INSTR(author, ':', 1)+1) - после
substr(author, 0, instr(author, ':') - 1) — до двоеточия, source_system
substr(author, instr(author, ':') + 1) — после, external_id
3.1. Sample - указывается в %, рандомная выборка по базе. Пример - 10% от телефонов:
select countrycode||citycode||telephone from phone sample(10)
where version = 1;
4. Изменение колонки
alter table FOLKS
modify first_name CHAR(10 byte);
5. Выцепить дату вплоть до часов
select to_char(DML_DATE_TIME_DT, 'DD.MM.YYYY HH'), count (*)
FROM buffer_table b
WHERE b.record_id BETWEEN 11 AND 100
group by to_char(DML_DATE_TIME_DT, 'DD.MM.YYYY HH');
6. Информация за 2012 год и далее
select * from logging
where trunc(eventdate, 'DDD') > trunc(to_date('01.01.12'))
and event in ('edit', 'findObject');
trunc(report+date, 'DDD') = trunc(to_date('23.12.2015', 'DD.MM.YYY'), 'DDD');
7. Посмотреть, где подмножества пересекаются
select hid_party from folks
intersect select hid_phone from phone;
8. Убить сессию без инсайдера
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND' and s.username = 'MATS_OLGAK';
ALTER SYSTEM KILL SESSION 'sid,serial#';
А как разбить поле, выцепив только часть ДО двоеточия или наоборот, после? Я это никогда не запомню А если ты работаешь уже на реальной, большой базе, то одна ошибка в запросе приводит к 5-10-30 минутам ожидания впустую. Не не, я лучше подсмотрю!
Итак, моя шпаргалка:
План
explain plan for select * from n_document_view ;
select * from table(dbms_xplan.display);
1. Только дата, без времени:
select distinct trunc(created, 'DDD') from folks
where hid_party in (select * from TMP$RESULT_HIDS);
select distinct extract(year from pt_acual_date) from buffer_folks; --- только дата
2. REGEXP
WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$')
3. Разбивка Аuthor (поле вида "AL:1")
substr(author,1,INSTR(author,':',1)-1) - до двоеточия
SUBSTR(author, INSTR(author, ':', 1)+1, LENGTH(author) - INSTR(author, ':', 1)+1) - после
substr(author, 0, instr(author, ':') - 1) — до двоеточия, source_system
substr(author, instr(author, ':') + 1) — после, external_id
3.1. Sample - указывается в %, рандомная выборка по базе. Пример - 10% от телефонов:
select countrycode||citycode||telephone from phone sample(10)
where version = 1;
4. Изменение колонки
alter table FOLKS
modify first_name CHAR(10 byte);
5. Выцепить дату вплоть до часов
select to_char(DML_DATE_TIME_DT, 'DD.MM.YYYY HH'), count (*)
FROM buffer_table b
WHERE b.record_id BETWEEN 11 AND 100
group by to_char(DML_DATE_TIME_DT, 'DD.MM.YYYY HH');
6. Информация за 2012 год и далее
select * from logging
where trunc(eventdate, 'DDD') > trunc(to_date('01.01.12'))
and event in ('edit', 'findObject');
trunc(report+date, 'DDD') = trunc(to_date('23.12.2015', 'DD.MM.YYY'), 'DDD');
7. Посмотреть, где подмножества пересекаются
select hid_party from folks
intersect select hid_phone from phone;
8. Убить сессию без инсайдера
SELECT s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND' and s.username = 'MATS_OLGAK';
ALTER SYSTEM KILL SESSION 'sid,serial#';
А какие запросы подсматриваете вы? ツ
См также:
Чуть позаднудствую.
ОтветитьУдалитьselect distinct extract(year from pt_acual_date) from buffer_folks; --- только дата
Только год
7. Посмотреть, где подмножества пересекаются
select hid_party from folks
intersect
select hid_phone from phone;
Нет, это где множества пересекаются
:)
да, верно)) с годом даже подправить стоит, а про множества — главное, чтобы я понимала )))
Удалить