SQL’99 and some techniques of data mining Kiselyov Alexey
Jan 15, 2015
SQL’99 and some techniquesof data mining
Kiselyov Alexey
Plan● Place of data mining methods in MVC model ● Data mining alternatives
○ Benefits and restrictions● Focus on SQL
○ Some "innovations" SQL99○ examples
MVC
Trygve Reenskaug (1979)
passive active
Methods to obtaining data
● DB native API & native SQL● SQL
○ SQL92○ SQL99○ SQL2003 ○ SQL2008
● Object-relational mapping (ORM)
DB native API & native SQL
Benefits● Quick● Fine request tuning● Compact data transfer
Losses● Specificity● difficulty or inability to
transfer to another DB
ORM layer
Benefits● Simple work with entities ● Misunderstanding data
extracting processes● Portability between any
DB (RDBMS and noSQL DBMS)
Losses● Misunderstanding data
extracting processes● Can't be used for
recursive data connections
SQL
Benefits● Portability between other
RDBMS● Data extracting processes
is a clear● All thirteen from twelve
Codd's rules are rules!!! :)
Losses● No portability to noSQL
DBMS
"Innovations" in examplesfrom simple to complex
and again to simple
just "SELECT" them!!!
...but not only!
Client (C): Please, give me all products from my storage where price greater then $100...Programmer (P): it's easy!!! > SELECT title, price FROM products WHERE price > 100
All are happy!!!
C: Please, give me all products from my storage where price greater then $100 and corresponds to "tools" categoryP: (ha! it's easy too!!!) > SELECT p.title, p.price FROM products p INNER JOIN category c ON p.categoryId = c.idWHERE price > 100 and c.title = 'tool'
All are happy!!!
C: Great! And now, please, give me all products from my storage where price greater then $100 and corresponds to "tools" category and I want to get all product with price greater then $100 that delivered from China!P: it's easy too... (but) > SELECT p.title, p.price FROM products p INNER JOIN category c ON p.categoryId = c.idWHERE price > 100 and c.title = 'tool'UNION ALLSELECT p.title, p.price FROM products p INNER JOIN countries cs ON p.deliveryId = cs.idWHERE price > 100 and cs.title = 'China'
Сustomer is happy... maybe
C: Please, give me all products from my storage where price greater then $100 and corresponds to "tools" category, and I want to get all product with price greater then $100 that delivered from China! And I want to exclude from previous collection products with price greater than $150 from China produced before 01.01.2000. P: mmmm.... mama... :-(> SELECT x.title, x.price FROM ( SELECT p.title, p.price, p.produceDate, cs.title FROM products p INNER JOIN category c ON p.categoryId = c.id LEFT JOIN countries cs ON p.deliveryId = cs.id WHERE price > 100 and c.title = 'tool'UNION DISTINCT SELECT p.title, p.price, p.produceDate, cs.title FROM products p INNER JOIN countries cs ON p.deliveryId = cs.id WHERE price > 100 and cs.title = 'China') x) AS xWHERE !(x.price > 150 and x.produceDate > '01.01.2000' and x.title = 'China')
WITH p100 as ( SELECT deliveryId, title, price, produceDate FROM products p WHERE price > 100)SELECT title, price FROM p100 INNER JOIN category c ON p100.categoryId = c.id WHERE c.title = 'tool'UNION DISTINCT SELECT title, price FROM p100 INNER JOIN countries cs ON p100.deliveryId = cs.id WHERE cs.title = 'China' and (p100.price > 150 and p100.produceDate > '01.01.2000')
What more?
RECURSIVE QUERY
Simple hierarchy
ID PARENT_ID CONTENT1 R State2 1 City 13 1 City 24 2 Сity block 415 4 Street 5416 4 Street 641
... ... ...
CREATE TABLE T2 (id VARCHAR(50), parent_id VARCHAR(20), content VARCHAR(20));
INSERT INTO T2 VALUES ('1', 'R', 'State');INSERT INTO T2 VALUES ('2', '1', 'City 1');INSERT INTO T2 VALUES ('3', '1', 'City 2');INSERT INTO T2 VALUES ('4', '2', 'Сity block 41');INSERT INTO T2 VALUES ('5', '4', 'Street 541');INSERT INTO T2 VALUES ('6', '4', 'Street 641');
DB2, MS SQL
WITH TEMP(ID, PARENT_ID) AS( SELECT ID, PARENT_ID FROM T2 WHERE ID = '6' UNION ALL SELECT T2.ID, T2.PARENT_ID FROM TEMP, T2 WHERE TEMP.PARENT_ID = T2.ID ) SELECT * FROM TEMP
Oracle
SELECT child FROM T2 WHERE id = '6'START WITH id = 'R' CONNECT BY PRIOR parent_id = id; Display the full tree (indenting child items) SELECT child FROM T2 START WITH id = 'R' CONNECT BY PRIOR parent_id = id;
MySQL
Infinitive loop
DB2
WITH list(k, leaf, path) AS ( SELECT DISTINCT 1, id, parent_id||', '||id FROM T2 WHERE parent_id = 'R' UNION ALL SELECT k + 1, id, path || ', ' || id FROM list AS tt, T2 AS subroot WHERE k < 5 AND tt.leaf = subroot.parent_id AND LOCATE(subroot.id, tt.path) = 0)SELECT path FROM list; R, 1R, 1, 2R, 1, 3R, 1, 2, 4R, 1, 2, 4, 5R, 1, 2, 4, 6
Oracle
1. How to exclude cycleSELECT child FROM T2 START WITH id IS NULL CONNECT BY NOCYCLE PRIOR parent_id = id;
2. How to restrict amount of hierarchy level SELECT child FROM T2 START WITH id IS NULL CONNECT BY PRIOR parent_id = id AND LEVEL < 5;
Useful recursive SQL
WITH ALL_DAYS(DT) AS ( VALUES (DATE('2011-10-01')) UNION ALL SELECT DT + 1 DAY FROM ALL_DAYS WHERE DT < '2012-01-01' )SELECT DT FROM ALL_DAYS;
I think it enough
Thank you for attention!!!