Guest User

Untitled

a guest
May 10th, 2019
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 10.61 KB | None | 0 0
  1. SELECT SUM(salary), department_id
  2. FROM e2
  3. GROUP BY department_id;
  4.  
  5. --cost 5056
  6.  
  7. SELECT * FROM user_segments
  8. WHERE segment_name='E2';
  9.  
  10. --18432 bloki bazodanowe
  11.  
  12. DELETE FROM e2
  13. WHERE department_id<>10; --usuwamy 1,7kk rekordow
  14.  
  15. COMMIT;
  16.  
  17. SELECT SUM(salary), department_id
  18. FROM e2
  19. GROUP BY department_id; --koszt tego zapytania jest minimalnie mniejszy
  20.  
  21. SELECT * FROM user_segments
  22. WHERE segment_name='E2'; -- ilsoc blokow taka sama
  23.  
  24. ALTER TABLE e2 move;
  25.  
  26. COMMIT;
  27.  
  28. EXECUTE DBMS_STATS.gather_table_stats('HR','E2'); --odswiezenie statystyk
  29.  
  30.  
  31.  
  32.  
  33.  
  34. --tabele tymczasowe - przechowuja dane do konca sesji albo transakcji
  35. CREATE global temporary TABLE tymczasowa -- do konca transakcji
  36. AS SELECT * FROM employees; --przy tworzeniu auto commit, dlatego zawartosc tabeli jest pusta (zostaje tylko struktura)
  37.  
  38. SELECT * FROM tymczasowa;
  39.  
  40. CREATE global temporary TABLE tymczasowa2 ON COMMIT preserve rows --w tym przypadku dane czyszczone, kiedy konczymy sesje uzytkownika
  41. AS SELECT * FROM employees;
  42.  
  43. SELECT * FROM tymczasowa2;
  44.  
  45.  
  46.  
  47. CREATE global temporary TABLE tmp2(x NUMBER) ON COMMIT preserve rows;
  48.  
  49. INSERT INTO tmp2 VALUES(1);
  50.  
  51. SELECT * FROM tmp2;
  52.  
  53. SELECT * FROM user_tables --podglad tabeli tymczasowych
  54. WHERE temporary='Y';
  55.  
  56.  
  57.  
  58. --tabele przestawne
  59.  
  60. SELECT AVG(salary), department_id
  61. FROM employees
  62. GROUP BY department_id;
  63.  
  64. --pivot, przestawne
  65. SELECT *
  66. FROM
  67. (SELECT salary, department_id
  68. FROM employees)
  69. pivot
  70. (AVG(salary) FOR department_id IN (10,20,30,40,50,60,70,80,90,100));
  71.  
  72. SELECT ROUND(dep10), ROUND(dep20), ROUND(dep30), ROUND(dep40), ROUND(dep50),
  73.     ROUND(dep60), ROUND(dep70), ROUND(dep80), ROUND(dep90), ROUND(dep100)
  74. FROM
  75. (SELECT salary, department_id
  76. FROM employees)
  77. pivot
  78. (AVG(salary) FOR department_id IN (10 dep10,20 dep20,30 dep30,40 dep40,50 dep50,60 dep60,70 dep70,80 dep80,90 dep90,100 dep100));
  79. --nie mozna tu korzystac z funkcji jednowierszowych
  80.  
  81.  
  82. SELECT *
  83. FROM
  84. (SELECT salary, department_name
  85. FROM employees
  86.     join departments using(department_id)
  87. )
  88. pivot
  89. (SUM(salary) FOR department_name IN ('IT', 'Executive', 'Sales'));
  90.  
  91.  
  92. SELECT *
  93. FROM (
  94. SELECT salary, EXTRACT(YEAR FROM hire_date) rok
  95. FROM employees )
  96. pivot (
  97. MAX(salary) FOR rok IN (2001,2002,2003,2004,2005,2006,2007,2008)
  98. );
  99.  
  100.  
  101.  
  102. /*  wysw liczbe pracownikow w miastach.
  103. miasta jako kolumny.
  104. */
  105. SELECT * FROM (
  106. SELECT employee_id, city
  107. FROM employees join departments using(department_id)
  108. join locations using(location_id)
  109. )
  110. pivot (
  111. COUNT(employee_id) FOR city IN ('London' London,'Seattle' Seattle,'Munich' Munich,
  112.     'South San Francisco' "South San Francisco",'Toronto' Toronto,'Southlake' Southlake,'Oxford' Oxford)
  113. );
  114.  
  115.  
  116.  
  117. SELECT NVL(TO_CHAR(manager_id), 'szef') szef, NVL(dep10,0), NVL(dep20,0), NVL(dep30,0), NVL(dep40,0), NVL(dep50,0)
  118. FROM (
  119. SELECT salary, manager_id, department_id
  120. FROM employees
  121. )
  122. pivot
  123. (AVG(salary) FOR department_id IN (10 dep10,20 dep20,30 dep30,40 dep40, 50 dep50));
  124.  
  125.  
  126.  
  127. /* wysw liczbe pracownikow,
  128. nazwe dep, panstwa
  129. */
  130.  
  131. SELECT *
  132. FROM (
  133. SELECT employee_id, department_name, country_name
  134. FROM employees
  135.     join departments using (department_id)
  136.     join  locations using(location_id)
  137.     join countries using(country_id)
  138. )
  139. pivot
  140. (COUNT(employee_id) FOR country_name IN ('United Kingdom','United States of America','Germany','Canada'));
  141.  
  142.  
  143. SELECT *
  144. FROM (
  145. SELECT salary, manager_id
  146. FROM employees
  147. )
  148. pivot xml
  149. ( SUM(salary) FOR manager_id IN (SELECT DISTINCT manager_id
  150.     FROM employees));
  151.  
  152.  
  153. SELECT *
  154. FROM (
  155. SELECT salary, manager_id
  156. FROM employees
  157. )
  158. pivot xml
  159. ( SUM(salary) FOR manager_id IN (ANY));
  160.  
  161.  
  162.  
  163. CREATE TABLE test pivot AS
  164. SELECT ROUND(dep10), ROUND(dep20), ROUND(dep30), ROUND(dep40), ROUND(dep50),
  165.     ROUND(dep60), ROUND(dep70), ROUND(dep80), ROUND(dep90), ROUND(dep100)
  166. FROM
  167. (SELECT salary, department_id
  168. FROM employees)
  169. pivot
  170. (AVG(salary) FOR department_id IN (10 dep10,20 dep20,30 dep30,40 dep40,50 dep50,60 dep60,70 dep70,80 dep80,90 dep90,100 dep100));
  171.  
  172.  
  173. --wyrazenia regularne
  174.                         -- zrodlo, wzorzec
  175. SELECT regexp_substr('abc123','[[:alpha:]]') --znak tekstowy
  176. FROM dual;
  177.  
  178. SELECT regexp_substr('abc123','[[:digit:]]') --cyfry
  179. FROM dual;
  180.  
  181.  
  182. SELECT regexp_substr('abc123','[[:alnum:]]') --literry i cyfry
  183. FROM dual;
  184.  
  185. SELECT regexp_substr('ab1c123','[[:alnum:]]{3}') /* bez {} wyswietla pierwsze wystpienie, z liczba w {} pokaze ciag
  186. (ale tylko zgodny, np 2 znaki 1 niezgodny 1 znak - pokaze tylko 2 pierwsze) */
  187. FROM dual;
  188.  
  189.  
  190. SELECT regexp_substr('ab1c123','[[:alpha:]]{1,4}') --od x do y znakow
  191. FROM dual;
  192.  
  193. SELECT regexp_substr('ab1c123','[[:alpha:]]+') --conajmniej 1 znak
  194. FROM dual;
  195.  
  196. SELECT regexp_substr('abc_123','([[:alpha:]]|_){4}') --4 znaki tekstowe + znak za konkatenacja pojedyncza |, czyli podkreslenie _, te dodatkowe znaki moga byc ale nie musza
  197. FROM dual;
  198.  
  199. SELECT regexp_substr('a-bc_123','([[:alpha:]]|_|-){5}') -- 5 znakow tekstowych i _ oraz -
  200. FROM dual;
  201.  
  202. SELECT regexp_substr('a|-bc_123','([[:alpha:]]|_|-|\|){5}') --kiedy wyszukujemy w tekscie znak specjalny, musimy wczesniej wpisac \
  203. FROM dual;
  204.  
  205. SELECT regexp_substr('a-bc_123','([[:alpha:]]|.){5}') -- 5 znakow tekstowych i wszystkie znaki spejclane (oznaczane .)
  206. FROM dual;
  207.  
  208. SELECT regexp_substr('a-bc@_aaa123','@([[:alpha:]]|_|-){3}') -- znaki tesktowe z _ i -, ale szukac zaczynamy od @
  209. FROM dual;
  210.  
  211.  
  212. SELECT regexp_substr(
  213. 'dwdwdw2dw dwde q  // abcd103@interia.pl wqdsqw     e w  qw
  214. wxcw // j.kowalski@gmail.com scdqwedqw3d2 qw2 // kubus_puchatek@altkom.pl
  215. xwqxsqwsdq ','// ([[:alnum:]]|\.){3,20}@[[:alpha:]]{5,10}.[[:alpha:]]{2,3}',1,2) reg
  216.  FROM dual;                                                                     -- 2 oznacza 2 wystapienie
  217.  
  218. SELECT regexp_substr(
  219. 'dwdwdw2dw dwde q  // abcd103@interia.pl wqdsqw     e w  qw
  220. wxcw // j.kowalski@gmail.com scdqwedqw3d2 qw2 // kubus_puchatek@altkom.pl
  221. xwqxsqwsdq ','// ([[:alnum:]]|\.|_){3,20}@[[:alpha:]]{5,10}.[[:alpha:]]{2,3}',1,3) reg
  222.  FROM dual;    
  223.  
  224.  
  225. SELECT LEVEL
  226. FROM dual
  227. CONNECT BY LEVEL < 4;
  228.  
  229. --wyszukiwanie adresow e-mail
  230. SELECT LTRIM(reg,'// ') reg2
  231. FROM (
  232. SELECT regexp_substr(
  233. 'dwdwdw2dw dwde q  // abcd103@interia.pl wqdsqw     e w  qw
  234. wxcw // j.kowalski@gmail.com scdqwedqw3d2 qw2 // kubus_puchatek@altkom.pl
  235. xwqxsqwsdq ','// ([[:alnum:]]|\.|_){3,20}@[[:alpha:]]{5,10}.[[:alpha:]]{2,3}',1,LEVEL) reg
  236.  FROM dual
  237.  CONNECT BY level<4
  238.  );  
  239.  
  240.  
  241.  
  242. /* wyciagnij numery telefonow, sa one podane po > */
  243. SELECT LTRIM(reg,'> ') reg2
  244. FROM (
  245. SELECT regexp_substr(
  246. 'dewd2ed12c > (22)675-14-82 dqwdwdw cdwdw wdw > 444555888
  247. dqwdw  dwqdwdw  ew2 > 567.123.987 ewdfw > 123 999 568',
  248. '> ([[:digit:]]|\(|\)|-|\.| ){8,15}'
  249. ,1,LEVEL) reg
  250. FROM dual
  251. CONNECT BY LEVEL <= regexp_count(   --sam oblicza ilosc wystpien, nie zawsze da sie to samemu okreslic
  252. 'dewd2ed12c > (22)675-14-82 dqwdwdw cdwdw wdw > 444555888
  253. dqwdw  dwqdwdw  ew2 > 567.123.987 ewdfw > 123 999 568',
  254. '> ([[:digit:]]|\(|\)|-|\.| ){8,15}')
  255. );
  256.  
  257.  
  258.  
  259.  
  260. SELECT last_name, INSTR(last_name,'a')
  261. FROM employees;
  262.  
  263. SELECT last_name, INSTR(last_name,'a',-1) --pierwsze wystapienie 'a' od konca
  264. FROM employees;
  265.  
  266. SELECT SUBSTR(last_name,-3) --3 ostatnie znaki
  267. FROM employees;
  268.  
  269.  
  270. SELECT regexp_instr('123ab456abc789','[[:alpha:]]{3}') --od ktorego znaku zaczyna sie ciag 3 liter
  271. FROM dual;
  272.  
  273.  
  274. SELECT regexp_count( --liczba wystpapien wzorca, ktory nas interesuje
  275. 'aaabb1ccc2','[[:digit:]]')
  276. FROM dual;
  277.  
  278.  
  279.  
  280. SELECT LTRIM(reg,'// ') reg2
  281. FROM (
  282. SELECT regexp_substr(
  283. 'dwdwdw2dw dwde q  // abcd103@interia.pl wqdsqw     e w  qw
  284. wxcw // j.kowalski@gmail.com scdqwedqw3d2 qw2 // kubus_puchatek@altkom.pl
  285. xwqxsqwsdq ','// ([[:alnum:]]|\.|_){3,20}@[[:alpha:]]{5,10}.[[:alpha:]]{2,3}',1,LEVEL) reg
  286.  FROM dual
  287.  CONNECT BY LEVEL <= regexp_count(
  288.  'dwdwdw2dw dwde q  // abcd103@interia.pl wqdsqw     e w  qw
  289. wxcw // j.kowalski@gmail.com scdqwedqw3d2 qw2 // kubus_puchatek@altkom.pl
  290. xwqxsqwsdq ','// ([[:alnum:]]|\.|_){3,20}@[[:alpha:]]{5,10}.[[:alpha:]]{2,3}')
  291. );  
  292.  
  293.  
  294. SELECT regexp_replace('1-2-3', '[[:digit:]]','hiszpanska_inkwizycja')
  295. FROM dual;
  296.  
  297.  
  298. SELECT phone_number
  299. FROM employees
  300. WHERE regexp_like(phone_number,'[[:digit:]]{3}\.[[:digit:]]{3}\.[[:digit:]]{4}'); --regex sluzacy tylko do filtrowania
  301.  
  302.  
  303.  
  304.  
  305. --insert wielotabelowy
  306. CREATE TABLE srednia_dep(
  307. srednia NUMBER,
  308. dep VARCHAR2(100));
  309.  
  310. CREATE TABLE suma_dep(
  311. suma NUMBER,
  312. dep VARCHAR2(100));
  313.  
  314. CREATE TABLE liczba_dep(
  315. liczba NUMBER,
  316. dep VARCHAR2(100));
  317.  
  318. INSERT ALL
  319. INTO srednia_dep(srednia,dep)
  320. VALUES(s1,dep)
  321. INTO suma_dep(suma,dep)
  322. VALUES(s2,dep)
  323. INTO liczba_dep(liczba,dep)
  324. VALUES(11,dep)
  325. SELECT ROUND(AVG(salary),2) s1,SUM(salary) s2, COUNT(employee_id) l1, department_name dep
  326. FROM employees join departments using(department_id)
  327. GROUP BY department_name
  328. ORDER BY department_name;
  329.  
  330.  
  331. --merge - jednoczesne wstawianie i modyfikacja rekordow
  332.  
  333. CREATE TABLE elektrownia(
  334. id INTEGER,
  335. licznik NUMBER);
  336.  
  337. INSERT INTO elektrownia VALUES(1,5000);
  338. INSERT INTO elektrownia VALUES(2,12000);
  339. INSERT INTO elektrownia VALUES(3,3700);
  340. INSERT INTO elektrownia VALUES(4,2137);
  341. INSERT INTO elektrownia VALUES(5,9344);
  342. INSERT INTO elektrownia VALUES(6,1122);
  343.  
  344.  
  345. COMMIT;
  346.  
  347. CREATE TABLE inkasent01 AS
  348. SELECT id, licznik*1.2 licznik
  349. FROM elektrownia
  350. WHERE id<4;
  351.  
  352. SELECT * FROM elektrownia;
  353. SELECT * FROM inkasent01;
  354. DELETE FROM inkasent01 WHERE id=1;
  355.  
  356. merge INTO elektrownia using inkasent01
  357. ON (elektrownia.id=inkasent01.id)
  358. WHEN matched THEN UPDATE SET
  359. elektrownia.licznik=inkasent01.licznik;
  360.  
  361. COMMIT;
  362.  
  363.  
  364. INSERT INTO inkasent01 VALUES(7,6996);
  365.  
  366. merge INTO elektrownia using inkasent01
  367. ON (elektrownia.id=inkasent01.id)
  368. WHEN matched THEN UPDATE SET
  369. elektrownia.licznik=inkasent01.licznik
  370. WHEN NOT matched THEN INSERT
  371. (elektrownia.id, elektrownia.licznik)
  372. VALUES(inkasent01.id, inkasent01.licznik);
  373.  
  374.  
  375. merge INTO elektrownia e using inkasent01 i
  376. ON (e.id=i.id)
  377. WHEN matched THEN UPDATE SET
  378. e.licznik=i.licznik
  379. WHEN NOT matched THEN INSERT
  380. (e.id, e.licznik)
  381. VALUES(i.id, i.licznik);
  382.  
  383.  
  384.  
  385.  
  386. /*  zamien wszystkie nazwy miasta na seattle.
  387.  
  388. zatwierdz.
  389.  
  390. uzywajac as of timestamp utworz tabele, ktora bedzie
  391. zawierala stan tabeli locations sprzed godziny.
  392.  
  393. zaktualizuj 1 tabele na podstawie 2.
  394. */
  395.  
  396.  
  397.  
  398. merge INTO locations using inkasent01
  399. ON (elektrownia.id=inkasent01.id)
  400. WHEN matched THEN UPDATE SET
  401. elektrownia.licznik=inkasent01.licznik;
  402.  
  403. SELECT * FROM locations;
  404.  
  405. UPDATE locations
  406. SET city='Seattle';
  407.  
  408. COMMIT;
  409.  
  410.  
  411. CREATE TABLE locations2 AS
  412. SELECT * FROM locations AS OF TIMESTAMP TO_TIMESTAMP('10-05-2019 14:28:00','dd-mm-yyyy hh24:mi:ss');
  413.  
  414. COMMIT;
  415.  
  416.  
  417. merge INTO locations l using locations2 l2
  418. ON (l.location_id=l2.location_id)
  419. WHEN matched THEN UPDATE SET l.city=l2.city;
  420.  
  421. SELECT * FROM locations;
  422.  
  423. COMMIT;
Add Comment
Please, Sign In to add comment