четверг, 16 марта 2017 г.

SQL. Полезные запросы

Это моя шпаргалка по SQL запросам, которую я постоянно использую в работе. Сохранена в простом блокнотике, пополняю по необходимости. Очень удобно, когда, например, сессия подвисла, а ты не знаешь где. Чтобы каждый раз не бегать и не гуглить "как ее найти и убить", просто открываю шпаргалочку.

А как разбить поле, выцепив только часть ДО двоеточия или наоборот, после? Я это никогда не запомню Smile :) А если ты работаешь уже на реальной, большой базе, то одна ошибка в запросе приводит к 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#';


А какие запросы подсматриваете вы? ツ

См также:

2 комментария:

  1. Чуть позаднудствую.
    select distinct extract(year from pt_acual_date) from buffer_folks; --- только дата

    Только год

    7. Посмотреть, где подмножества пересекаются
    select hid_party from folks
    intersect
    select hid_phone from phone;

    Нет, это где множества пересекаются

    :)

    ОтветитьУдалить
    Ответы
    1. да, верно)) с годом даже подправить стоит, а про множества — главное, чтобы я понимала )))

      Удалить