2. Plan
● Place of data mining methods in MVC model
● Data mining alternatives
○ Benefits and restrictions
● Focus on SQL
○ Some "innovations" SQL99
○ examples
4. Methods to obtaining data
● DB native API & native SQL
● SQL
○ SQL92
○ SQL99
○ SQL2003
○ SQL2008
● Object-relational mapping (ORM)
5. DB native API & native SQL
Benefits Losses
● Quick ● Specificity
● Fine request tuning ● difficulty or inability to
● Compact data transfer transfer to another DB
6. ORM layer
Benefits Losses
● Simple work with entities ● Misunderstanding data
● Misunderstanding data extracting processes
extracting processes ● Can't be used for
● Portability between any recursive data
DB (RDBMS and noSQL connections
DBMS)
7. SQL
Benefits Losses
● Portability between other ● No portability to noSQL
RDBMS DBMS
● Data extracting processes
is a clear
● All thirteen from twelve
Codd's rules are rules!!! :)
10. 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!!!
11. C: Please, give me all products from my storage where price
greater then $100 and corresponds to "tools" category
P: (ha! it's easy too!!!)
> SELECT p.title, p.price
FROM products p INNER JOIN category c ON p.categoryId = c.id
WHERE price > 100 and c.title = 'tool'
All are happy!!!
12. 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.id
WHERE price > 100 and c.title = 'tool'
UNION ALL
SELECT p.title, p.price
FROM products p INNER JOIN countries cs ON p.deliveryId = cs.id
WHERE price > 100 and cs.title = 'China'
Сustomer is happy... maybe
13. 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 x
WHERE !(x.price > 150 and x.produceDate > '01.01.2000' and x.title = 'China')
14. 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')
16. Simple hierarchy
ID PARENT_ID CONTENT
1 R State
2 1 City 1
3 1 City 2
4 2 Сity block 41
5 4 Street 541
6 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');
17. 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
18. 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;
21. 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, 1
R, 1, 2
R, 1, 3
R, 1, 2, 4
R, 1, 2, 4, 5
R, 1, 2, 4, 6
22. Oracle
1. How to exclude cycle
SELECT 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;
23. 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;