2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (
Transcript of 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (
![Page 1: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/1.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours
![Page 2: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/2.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Me – @lukaseder
SQL is a device whose mystery is only exceeded by its power!
- Founder and CEO at Data Geekery
- SQL Aficionado
- Java Aficionado
![Page 3: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/3.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL is Powerful!
My Reaction when I forget the WHERE clause on my DELETE statement…
With autocommitactive
![Page 4: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/4.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL is Powerful!
Oracle:
SELECT *
FROM my_table
AS OF TIMESTAMP
SYSDATE - 1
![Page 5: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/5.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL?
Let’s talk about SQL
![Page 6: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/6.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Is this SQL?
@Entity @Table(name = "EVENTS")public class Event {private Long id;private String title;private Date date;
@Id @GeneratedValue(generator = "increment")@GenericGenerator(name = "increment", strategy = "increment")public Long getId() { /* … */ }
@Temporal(TemporalType.TIMESTAMP)@Column(name = "EVENT_DATE")public Date getDate() { /* … */ }
![Page 7: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/7.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Is this SQL?
@OneToMany(mappedBy = "destCustomerId")@ManyToMany@Fetch(FetchMode.SUBSELECT)@JoinTable(
name = "customer_dealer_map",joinColumns = {
@JoinColumn(name = "customer_id", referencedColumnName = "id")},inverseJoinColumns = {
@JoinColumn(name = "dealer_id", referencedColumnName = "id")}
)private Collection dealers;
Found at http://stackoverflow.com/q/17491912/521799
![Page 8: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/8.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
JPA 3.0 Preview – Annotatiomania™
@SeveralAndThenNothing @MaybeThisDoesSomething@TweakThisWithThat(
tweak = {@TweakID(name = "id", preferredValue = 1839),@TweakID(name = "test", preferredValue = 839),@TweakID(name = "test.old", preferredValue = 34),
}, inCaseOf = {
@ConditionalXMLFiltering(run = 5),}
)@OneToMany @OneToManyMore @AnyOne @AnyBody @DoesThisEvenMeanAnything @DoesAnyoneEvenReadThis@ManyToMany @Many @AnnotationsTotallyRock @DeclarativeProgrammingRules @NoMoreExplicitAlgorithms@Fetch @FetchMany @FetchWithDiscriminator(name = "no_name")@JoinTable(joinColumns = {
@JoinColumn(name = "customer_id", referencedColumnName = "id")})@PrefetchJoinWithDiscriminator @JustTrollingYouKnow @LOL@IfJoiningAvoidHashJoins @ButUseHashJoinsWhenMoreThan(records = 1000)@XmlDataTransformable @SpringPrefechAdapterprivate Collection employees;
Might not be true
![Page 9: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/9.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
What’s next?
![Page 10: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/10.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Ask the industry experts
www.annotatiomania.com
![Page 11: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/11.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Albert Einstein
I don’t know withwhat annotationsJPA III will ship, but JPA IV will ship with sticksand stones
![Page 12: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/12.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
JPA 4.0 Preview
var employees;
![Page 13: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/13.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
On a more serious note…
![Page 14: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/14.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
On a more serious note…
FYI: Gavin King: Creator of Hibernate!
![Page 15: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/15.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
NoSQL?
…
… so, should we maybe abandon SQL?
![Page 16: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/16.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? What is it?
![Page 17: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/17.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Source: www.itproportal.com
![Page 18: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/18.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
So, JSON storage. Right?
![Page 19: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/19.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? Who said it?
Our service ran at 99.99 percent uptime in the first quarter of 2009, runs more than 200 million transactions a day, and has subsecondresponse time; and we are constantly making advances to deliver it even faster.
![Page 20: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/20.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? Marc Benioff – salesforce.com
Our service ran at 99.99 percent uptime in the first quarter of 2009, runs more than 200 million transactions a day, and has subsecondresponse time; and we are constantly making advances to deliver it even faster.
![Page 21: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/21.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? Marc Benioff – salesforce.com
He’s talking about salesforce.com’s Oracle database.
He “invented” the cloud
![Page 22: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/22.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? Who said it?
• 300 TB of data files for production DBs in total
• LHC logging database ~140TB, expected growth up to ~70 TB / year
• 13 Production experiments' database ~120 TB in total
![Page 23: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/23.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Big Data? CERN, collecting LHC data
• 300 TB of data files for production DBs in total
• LHC logging database ~140TB, expected growth up to ~70 TB / year
• 13 Production experiments' database ~120 TB in total
![Page 24: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/24.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
NoSQL? Stack Overflow on 1 SQL Server Instance
http://stackexchange.com/performance
![Page 25: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/25.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
No – tation
Seen at the 2013 O’Reilly Strata Conf: History of NoSQL by Mark Madsen. Picture published by Edd Dumbill
![Page 26: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/26.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL?
Let’s talk about SQL
![Page 27: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/27.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Shocker! You can now write SQL in Java.
JDBC
![Page 28: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/28.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL in Java – JDBC, SpringJDBC, Apache DbUtils
try (PreparedStatement stmt = c.prepareStatement(" SELECT s.schema_name, s.is_default"
+ " FROM information_schema AS s"+ " ORDER BY s.schema_name");
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) { … }}
![Page 29: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/29.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL in Groovy
sql.eachRow( 'select * from tableName' ) {
println "$it.id -- ${it.firstName} --"
}
![Page 30: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/30.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Typesafe SQL in Java 8 – jOOQ
DSL.using(c)
.select(s.SCHEMA_NAME, s.IS_DEFAULT)
.from(INFORMATION_SCHEMA.SCHEMATA.as("s"))
.orderBy(s.SCHEMA_NAME)
.map(rs -> new Schema(
rs.getValue(s.SCHEMA_NAME),
rs.getValue(s.IS_DEFAULT)
))
.forEach(System.out::println);
![Page 31: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/31.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
When you should use SQL – indicators
- You need JOINs, UNIONs
- You need functions, aggregations
- You need bulk reads / writes
Calculations should be done close to the data
![Page 32: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/32.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Please, run that calculation in your DB
![Page 33: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/33.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – NULL
-- What does this query return?
SELECT 1 AS a FROM dual
WHERE 1 IN (NULL)
UNION ALL
SELECT 2 AS a FROM dual
WHERE NOT(1 IN (NULL))
![Page 34: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/34.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – NULL
-- What does this query return?
SELECT 1 AS a FROM dual
WHERE 1 IN (NULL)
UNION ALL
SELECT 2 AS a FROM dual
WHERE NOT(1 IN (NULL))
![Page 35: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/35.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – NULL
-- Nothing! It’s the same as this
SELECT 1 AS a FROM dual
WHERE 1 = NULL
UNION ALL
SELECT 2 AS a FROM dual
WHERE 1 != NULL
![Page 36: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/36.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – NULL
-- Nothing! It’s the same as this
SELECT 1 AS a FROM dual
WHERE “UNKNOWN”
UNION ALL
SELECT 2 AS a FROM dual
WHERE “UNKNOWN”
![Page 37: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/37.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – Oracle VARCHAR2
-- What does this query return?
SELECT 1 AS a FROM dual
WHERE '' = ''
UNION ALL
SELECT 2 AS a FROM dual
WHERE 'a' != ''
![Page 38: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/38.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – Oracle VARCHAR2
-- Nope! Nothing again (only in Oracle).
SELECT 1 AS a FROM dual
WHERE NULL = NULL
UNION ALL
SELECT 2 AS a FROM dual
WHERE 'a' != NULL
![Page 39: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/39.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SQL Trivia – Oracle VARCHAR2
-- Nope! Nothing again (only in Oracle).
SELECT 1 AS a FROM dual
WHERE NULL = NULL
UNION ALL
SELECT 2 AS a FROM dual
WHERE 'a' != NULL
![Page 40: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/40.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Stockholm Syndrome:
We love COBOL SQL
![Page 41: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/41.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Winston Churchill:
SQL is the worst form of database querying, except for all the other forms.
![Page 42: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/42.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!Intro SQL and Java jOOQ Examples
NoSQL? No, SQL!
So, let’s talk about
SQL
![Page 43: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/43.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
SELECT *FROM v_transactionsWHERE account_id = 1ORDER BY value_date DESC,
id DESC
![Page 44: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/44.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
| ID | VALUE_DATE | AMOUNT ||------|------------|--------|| 9997 | 2014-03-18 | 99.17 || 9981 | 2014-03-16 | 71.44 || 9979 | 2014-03-16 | -94.60 || 9977 | 2014-03-16 | -6.96 || 9971 | 2014-03-15 | -65.95 |
![Page 45: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/45.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 | 99.17 | 19985.81 || 9981 | 2014-03-16 | 71.44 | 19886.64 || 9979 | 2014-03-16 | -94.60 | 19815.20 || 9977 | 2014-03-16 | -6.96 | 19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |
![Page 46: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/46.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 | +99.17 =19985.81 || 9981 | 2014-03-16 | 71.44 | +19886.64 || 9979 | 2014-03-16 | -94.60 | 19815.20 || 9977 | 2014-03-16 | -6.96 | 19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |
![Page 47: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/47.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 | 99.17 | 19985.81 || 9981 | 2014-03-16 | +71.44 =19886.64 || 9979 | 2014-03-16 | -94.60 | +19815.20 || 9977 | 2014-03-16 | -6.96 | 19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |
![Page 48: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/48.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s calculate a running total
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 | 99.17 | 19985.81 || 9981 | 2014-03-16 | +71.44 =19886.64 | n| 9979 | 2014-03-16 | -94.60 | +19815.20 | n+1| 9977 | 2014-03-16 | -6.96 | 19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |BALANCE(ROWn) = BALANCE(ROWn+1) + AMOUNT(ROWn)
BALANCE(ROWn+1) = BALANCE(ROWn) – AMOUNT(ROWn)
![Page 49: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/49.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
How can we do it?
![Page 50: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/50.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
How can we do it?
- In Java
- Calculate on UPDATE
- Nested SELECT
- Recursive SQL
- Window functions
- MODEL clause (Oracle)
- Stored procedures
![Page 51: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/51.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
How can we do it? – With SQL!
- In Java
- Calculate on UPDATE
- Nested SELECT
- Recursive SQL
- Window functions
- MODEL clause (Oracle)
- Stored procedures
![Page 52: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/52.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using nested SELECTs
![Page 53: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/53.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt1.*,t1.current_balance - (
SELECT NVL(SUM(amount), 0)FROM v_transactions t2WHERE t2.account_id = t1.account_idAND (t2.value_date, t2.id) >
(t1.value_date, t1.id)) AS balance
FROM v_transactions t1WHERE t1.account_id = 1ORDER BY t1.value_date DESC, t1.id DESC
![Page 54: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/54.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt1.*,t1.current_balance - (
SELECT NVL(SUM(amount), 0)FROM v_transactions t2WHERE t2.account_id = t1.account_idAND (t2.value_date, t2.id) >
(t1.value_date, t1.id)) AS balance
FROM v_transactions t1WHERE t1.account_id = 1ORDER BY t1.value_date DESC, t1.id DESC
![Page 55: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/55.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt1.*,t1.current_balance - (
SELECT NVL(SUM(amount), 0)FROM v_transactions t2WHERE t2.account_id = t1.account_idAND ((t2.value_date > t1.value_date) OR
(t2.value_date = t1.value_date ANDt2.id > t1.id))
) AS balanceFROM v_transactions t1WHERE t1.account_id = 1 ORDER BY ...
![Page 56: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/56.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using nested SELECTs
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 -(99.17)| +19985.81 || 9981 | 2014-03-16 -(71.44)| 19886.64 || 9979 | 2014-03-16 -(-94.60)| 19815.20 || 9977 | 2014-03-16 | -6.96 | =19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |
![Page 57: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/57.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
| Id | Operation | Name | A-Rows | A-Time |------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 50 |00:00:00.77 || 1 | SORT AGGREGATE | | 1101 |00:00:00.76 ||* 2 | TABLE ACCESS BY INDEX ROWID | T_TRANSACTIONS | 605K|00:00:00.69 ||* 3 | INDEX RANGE SCAN | I_TRX_ACCO_ID | 1212K|00:00:00.21 || 4 | SORT ORDER BY | | 50 |00:00:00.77 || 5 | NESTED LOOPS | | 1101 |00:00:00.01 || 6 | TABLE ACCESS BY INDEX ROWID| T_ACCOUNTS | 1 |00:00:00.01 ||* 7 | INDEX UNIQUE SCAN | SYS_C006991 | 1 |00:00:00.01 || 8 | TABLE ACCESS BY INDEX ROWID| T_TRANSACTIONS | 1101 |00:00:00.01 ||* 9 | INDEX RANGE SCAN | I_TRX_ACCO_ID | 1101 |00:00:00.01 |------------------------------------------------------------------------------
![Page 58: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/58.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using recursive SQL
![Page 59: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/59.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Tables – Common Table Expressions
-- Table variablesWITH t1(v1, v2) AS (SELECT 1, 2),t2(w1, w2) AS (
SELECT v1 * 2, v2 * 2FROM t1
)SELECT *FROM t1, t2
![Page 60: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/60.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Tables – Common Table Expressions
WITH RECURSIVE t(v) AS (SELECT 1 -- Seed RowUNION ALLSELECT v + 1 -- RecursionFROM t
)SELECT vFROM tLIMIT 5
![Page 61: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/61.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Tables – Common Table Expressions
WITH RECURSIVE t(v) AS (SELECT 1 -- Seed RowUNION ALLSELECT v + 1 -- RecursionFROM t
)SELECT vFROM tLIMIT 5
![Page 62: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/62.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Tables – Common Table Expressions
WITH t(v) AS (SELECT 1 FROM dualUNION ALLSELECT v + 1FROM tWHERE v < 5
)SELECT vFROM t
![Page 63: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/63.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Tables – Oracle’s Connect By for Recursion
SELECT level AS vFROM dualCONNECT BY level <= 5
![Page 64: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/64.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
We need to number transactions
| ID | VALUE_DATE | AMOUNT | TRANSACTION_NR ||------|------------|--------|----------------|| 9997 | 2014-03-18 | 99.17 | 1 || 9981 | 2014-03-16 | 71.44 | 2 || 9979 | 2014-03-16 | -94.60 | 3 || 9977 | 2014-03-16 | -6.96 | 4 || 9971 | 2014-03-15 | -65.95 | 5 |
![Page 65: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/65.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
CREATE OR REPLACE VIEW v_transactions_by_timeAS SELECT t.*,ROW_NUMBER() OVER (
PARTITION BY account_idORDER BY t.value_date DESC,
t.id DESC) AS transaction_number
FROMv_transactions t;
![Page 66: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/66.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
WITH ordered_with_balance (account_id, value_date, amount, balance, transaction_number
) AS (
SELECT t1.account_id, t1.value_date, t1.amount, t1.current_balance,t1.transaction_number
FROM v_transactions_by_time t1WHERE t1.transaction_number = 1
UNION ALL
SELECT t1.account_id, t1.value_date, t1.amount, t2.balance - t2.amount,t1.transaction_number
FROM ordered_with_balance t2JOIN v_transactions_by_time t1ON t1.transaction_number = t2.transaction_number + 1AND t1.account_id = t2.account_id
)SELECT *FROM ordered_with_balanceWHERE account_id = 1ORDER BY transaction_number ASC
![Page 67: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/67.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
WITH ordered_with_balance (account_id, value_date, amount, balance, transaction_number
) AS (
SELECT t1.account_id, t1.value_date, t1.amount, t1.current_balance,t1.transaction_number
FROM v_transactions_by_time t1WHERE t1.transaction_number = 1
UNION ALL
SELECT t1.account_id, t1.value_date, t1.amount, t2.balance - t2.amount,t1.transaction_number
FROM ordered_with_balance t2JOIN v_transactions_by_time t1ON t1.transaction_number = t2.transaction_number + 1AND t1.account_id = t2.account_id
)SELECT *FROM ordered_with_balanceWHERE account_id = 1ORDER BY transaction_number ASC
![Page 68: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/68.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
WITH ordered_with_balance (account_id, value_date, amount, balance, transaction_number
) AS (
SELECT t1.account_id, t1.value_date, t1.amount, t1.current_balance,t1.transaction_number
FROM v_transactions_by_time t1WHERE t1.transaction_number = 1
UNION ALL
SELECT t1.account_id, t1.value_date, t1.amount, t2.balance - t2.amount,t1.transaction_number
FROM ordered_with_balance t2JOIN v_transactions_by_time t1ON t1.transaction_number = t2.transaction_number + 1AND t1.account_id = t2.account_id
)SELECT *FROM ordered_with_balanceWHERE account_id = 1ORDER BY transaction_number ASC
![Page 69: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/69.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
---------------------------------------------------------------------------------------------------| Id | Operation | Name | A-Rows | A-Time |---------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 50 |00:00:35.29 || 1 | SORT ORDER BY | | 50 |00:00:35.29 ||* 2 | VIEW | | 1101 |00:00:35.29 || 3 | UNION ALL (RECURSIVE WITH) BREADTH FIRST| | 9999 |00:00:35.28 ||* 4 | VIEW | V_TRANSACTIONS_BY_TIME | 9 |00:00:00.03 ||* 5 | WINDOW SORT PUSHED RANK | | 18 |00:00:00.03 || 6 | NESTED LOOPS | | 9999 |00:00:00.01 || 7 | NESTED LOOPS | | 9999 |00:00:00.01 || 8 | TABLE ACCESS FULL | T_ACCOUNTS | 10 |00:00:00.01 ||* 9 | INDEX RANGE SCAN | I_TRX_ACCO_ID | 9999 |00:00:00.01 || 10 | TABLE ACCESS BY INDEX ROWID | T_TRANSACTIONS | 9999 |00:00:00.01 ||* 11 | HASH JOIN | | 9990 |00:00:35.08 || 12 | VIEW | V_TRANSACTIONS_BY_TIME | 11M|00:00:29.13 || 13 | WINDOW SORT | | 11M|00:00:27.19 || 14 | NESTED LOOPS | | 11M|00:00:13.62 || 15 | NESTED LOOPS | | 11M|00:00:03.89 || 16 | INDEX FAST FULL SCAN | SYS_C006991 | 11450 |00:00:00.06 ||* 17 | INDEX RANGE SCAN | I_TRX_ACCO_ID | 11M|00:00:02.18 || 18 | TABLE ACCESS BY INDEX ROWID | T_TRANSACTIONS | 11M|00:00:06.15 || 19 | RECURSIVE WITH PUMP | | 9999 |00:00:00.01 |---------------------------------------------------------------------------------------------------
![Page 70: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/70.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
But the good news is:
CTE make SQL turing-complete!
![Page 71: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/71.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
CTE make SQL turing complete!
-- Query from http://explainextended.com/2013/12/31/happy-new-year-5/WITH RECURSIVE q(r, i, rx, ix, g) AS (SELECT r::DOUBLE PRECISION * 0.02, i::DOUBLE PRECISION * 0.02,
.0::DOUBLE PRECISION , .0::DOUBLE PRECISION, 0FROM generate_series(-60, 20) r, generate_series(-50, 50) iUNION ALLSELECT r, i, CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN rx * rx - ix * ix END + r,
CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN 2 * rx * ix END + i, g + 1FROM qWHERE rx IS NOT NULL AND g < 99
)SELECT array_to_string(array_agg(s ORDER BY r), '')FROM (SELECT i, r, substring(' .:-=+*#%@', max(g) / 10 + 1, 1) sFROM qGROUP BY i, r
) qGROUP BY iORDER BY i
![Page 72: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/72.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
CTE make SQL turing complete!
-- Query from http://explainextended.com/2013/12/31/happy-new-year-5/WITH RECURSIVE q(r, i, rx, ix, g) AS (SELECT r::DOUBLE PRECISION * 0.02, i::DOUBLE PRECISION * 0.02,
.0::DOUBLE PRECISION , .0::DOUBLE PRECISION, 0FROM generate_series(-60, 20) r, generate_series(-50, 50) iUNION ALLSELECT r, i, CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN rx * rx - ix * ix END + r,
CASE WHEN abs(rx * rx + ix * ix) <= 2 THEN 2 * rx * ix END + i, g + 1FROM qWHERE rx IS NOT NULL AND g < 99
)SELECT array_to_string(array_agg(s ORDER BY r), '')FROM (SELECT i, r, substring(' .:-=+*#%@', max(g) / 10 + 1, 1) sFROM qGROUP BY i, r
) qGROUP BY iORDER BY i
![Page 73: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/73.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using window functions
![Page 74: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/74.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
There was SQL before window functions
And there was SQL after window functions
![Page 75: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/75.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTfunction(...) OVER (PARTITION BY ...ORDER BY ...ROWS BETWEEN ... AND ...
)
![Page 76: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/76.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTfunction(...) OVER (PARTITION BY lengthORDER BY ...ROWS BETWEEN ... AND ...
)
![Page 77: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/77.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTfunction(...) OVER (PARTITION BY lengthORDER BY ...ROWS BETWEEN ... AND ...
)
![Page 78: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/78.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTfunction(...) OVER (PARTITION BY ...ORDER BY titleROWS BETWEEN ... AND ...
)
![Page 79: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/79.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTfunction(...) OVER (PARTITION BY ...ORDER BY titleROWS BETWEEN ... AND ...
)
![Page 80: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/80.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Window functions
-- Aggregations / rankings on a subset of-- rows relative to the current row being -- transformed by SELECTrow_number( ) OVER (PARTITION BY ...ORDER BY titleROWS BETWEEN ... AND ...
)
![Page 81: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/81.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt.*,t.current_balance - NVL(
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING),
0) AS balanceFROM v_transactions tWHERE t.account_id = 1ORDER BY t.value_date DESC,
t.id DESC
![Page 82: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/82.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt.*,t.current_balance - NVL(
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING),
0) AS balanceFROM v_transactions tWHERE t.account_id = 1ORDER BY t.value_date DESC,
t.id DESC
![Page 83: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/83.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING)
![Page 84: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/84.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING)
![Page 85: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/85.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING)
![Page 86: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/86.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING)
![Page 87: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/87.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using window functions
| ID | VALUE_DATE | AMOUNT | BALANCE ||------|------------|--------|------------|| 9997 | 2014-03-18 -(99.17)| +19985.81 || 9981 | 2014-03-16 -(71.44)| 19886.64 || 9979 | 2014-03-16 -(-94.60)| 19815.20 || 9977 | 2014-03-16 | -6.96 | =19909.80 || 9971 | 2014-03-15 | -65.95 | 19916.76 |
![Page 88: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/88.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
------------------------------------------------------------------------------| Id | Operation | Name | A-Rows | A-Time |------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 50 |00:00:00.01 || 1 | WINDOW SORT | | 50 |00:00:00.01 || 2 | NESTED LOOPS | | 1101 |00:00:00.01 || 3 | TABLE ACCESS BY INDEX ROWID| T_ACCOUNTS | 1 |00:00:00.01 ||* 4 | INDEX UNIQUE SCAN | SYS_C006991 | 1 |00:00:00.01 || 5 | TABLE ACCESS BY INDEX ROWID| T_TRANSACTIONS | 1101 |00:00:00.01 ||* 6 | INDEX RANGE SCAN | I_TRX_ACCO_ID | 1101 |00:00:00.01 |------------------------------------------------------------------------------
![Page 89: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/89.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
«jOOQ» 10% discount code
Performance – Please read this book
Markus Winand from
Use-The-Index-Luke.com
ROI of 83’800% (time AND money)
Achieve proper indexing and performance in popular RDBMS
![Page 90: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/90.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Intermission
Anecdote time.
True story!
![Page 91: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/91.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
There is SQL before and after window functions
This just in…
![Page 92: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/92.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Image Copyright © fanpictor.com
Use-case: Choreo export
![Page 93: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/93.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Use-case: Choreo export as Excel
![Page 94: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/94.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Use-case: Choreo export as Excel
![Page 95: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/95.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Use-case: Choreo export as Excel
![Page 96: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/96.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
WITH data AS (SELECT d.*,row(sector, row, scene1, scene2) block
FROM d)SELECT data.*,
CASE WHEN LAG (block) OVER (o) IS DISTINCT FROM blockAND LEAD(block) OVER (o) IS DISTINCT FROM block
THEN 'start / stop'WHEN LAG (block) OVER (o) IS DISTINCT FROM blockTHEN 'start'WHEN LEAD(block) OVER (o) IS DISTINCT FROM blockTHEN 'stop'ELSE '' END start_stop,
COUNT(*) OVER (PARTITION BY sector, row, scene1, scene2)FROM dataWINDOW o AS (ORDER BY sector, row, seat)ORDER BY sector, row, seat
Full example: http://blog.jooq.org/2014/04/15/how-to-do-this-with-sql-of-course
![Page 97: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/97.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Full example: http://blog.jooq.org/2014/04/15/how-to-do-this-with-sql-of-course
WITH data AS (SELECT d.*,row(sector, row, scene1, scene2) block
FROM d)SELECT data.*,
CASE WHEN LAG (block) OVER (o) IS DISTINCT FROM blockAND LEAD(block) OVER (o) IS DISTINCT FROM block
THEN 'start / stop'WHEN LAG (block) OVER (o) IS DISTINCT FROM blockTHEN 'start'WHEN LEAD(block) OVER (o) IS DISTINCT FROM blockTHEN 'stop'ELSE '' END start_stop,
COUNT(*) OVER (PARTITION BY sector, row, scene1, scene2)FROM dataWINDOW o AS (ORDER BY sector, row, seat)ORDER BY sector, row, seat
We can compare rows with each other, not onlycolumns!
![Page 98: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/98.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Full example: http://blog.jooq.org/2014/04/15/how-to-do-this-with-sql-of-course
WITH data AS (SELECT d.*,row(sector, row, scene1, scene2) block
FROM d)SELECT data.*,
CASE WHEN LAG (block) OVER (o) IS DISTINCT FROM blockAND LEAD(block) OVER (o) IS DISTINCT FROM block
THEN 'start / stop'WHEN LAG (block) OVER (o) IS DISTINCT FROM blockTHEN 'start'WHEN LEAD(block) OVER (o) IS DISTINCT FROM blockTHEN 'stop'ELSE '' END start_stop,
COUNT(*) OVER (PARTITION BY sector, row, scene1, scene2)FROM dataWINDOW o AS (ORDER BY sector, row, seat)ORDER BY sector, row, seat
We can reuse window specifications!
![Page 99: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/99.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Let’s find the longest consecutive series of payment dates in a time series
Longest series of payment dates
![Page 100: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/100.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 101: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/101.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 102: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/102.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 103: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/103.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 104: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/104.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 105: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/105.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Longest series of payment dates
WITHdates AS (
SELECT DISTINCT payment_date::DATE FROM payment),series AS (
SELECTpayment_date,payment_date - row_number() OVER (ORDER BY payment_date)::INT AS grp
FROM dates)
SELECTmin(payment_date), max(payment_date), max(payment_date) - min(payment_date) + 1 AS length
FROM series AS dGROUP BY grpORDER BY length DESC
![Page 106: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/106.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Using the Oracle MODEL clause
![Page 107: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/107.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECT account_id, value_date, amount, balanceFROM (SELECT id, account_id, value_date, amount,
current_balance AS balanceFROM v_transactions
) tWHERE account_id = 1MODELPARTITION BY (account_id)DIMENSION BY (ROW_NUMBER() OVER (ORDER BY value_date DESC, id DESC) AS rn
)MEASURES (value_date, amount, balance)RULES (balance[rn > 1] = balance[cv(rn) - 1] - amount[cv(rn) - 1]
)ORDER BY rn ASC
![Page 108: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/108.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECT account_id, value_date, amount, balanceFROM (SELECT id, account_id, value_date, amount,
current_balance AS balanceFROM v_transactions
) tWHERE account_id = 1MODELPARTITION BY (account_id)DIMENSION BY (ROW_NUMBER() OVER (ORDER BY value_date DESC, id DESC) AS rn
)MEASURES (value_date, amount, balance)RULES (balance[rn > 1] = balance[cv(rn) - 1] - amount[cv(rn) - 1]
)ORDER BY rn ASC
![Page 109: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/109.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
RULES (balance[rn > 1] = balance[cv(rn) - 1]
- amount [cv(rn) - 1])
-- does it look familiar?
![Page 110: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/110.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
--------------------------------------------------------------------------------| Id | Operation | Name | A-Rows | A-Time |--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 50 |00:00:00.02 || 1 | SORT ORDER BY | | 50 |00:00:00.02 || 2 | SQL MODEL ORDERED | | 1101 |00:00:00.02 || 3 | WINDOW SORT | | 1101 |00:00:00.01 || 4 | NESTED LOOPS | | 1101 |00:00:00.01 || 5 | TABLE ACCESS BY INDEX ROWID| T_ACCOUNTS | 1 |00:00:00.01 ||* 6 | INDEX UNIQUE SCAN | SYS_C006991 | 1 |00:00:00.01 ||* 7 | TABLE ACCESS FULL | T_TRANSACTIONS | 1101 |00:00:00.01 |--------------------------------------------------------------------------------
![Page 111: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/111.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
The MODEL clause is Oracle’s most powerful and underused feature
![Page 112: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/112.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
The MATCH_RECOGNIZE clause is Oracle’s most powerful and underused feature
![Page 113: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/113.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Our vision at Data Geekery
- SQL dominates database systems
- SQL is expressive
- SQL is type safe
SQL is a device whose mystery is only exceeded by its power!
![Page 114: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/114.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Our vision at Data Geekery
jOOQ is the best way to write SQL in Java
![Page 115: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/115.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
SELECTt.*,t.current_balance - NVL(
SUM(t.amount) OVER (PARTITION BY t.account_idORDER BY t.value_date DESC,
t.id DESCROWS BETWEEN UNBOUNDED PRECEDING
AND 1 PRECEDING),
0) AS balanceFROM v_transactions tWHERE t.account_id = 1ORDER BY t.value_date DESC,
t.id DESC
![Page 116: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/116.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
DSL.using(connection).select(t.VALUE_DATE,
t.AMOUNT,t.CURRENT_BALANCE.sub(sum(t.AMOUNT).over(
partitionBy(t.ACCOUNT_ID).orderBy (t.VALUE_DATE.desc(),
t.ID .desc()).rowsBetweenUnboundedPreceding().andPreceding(1)
)).nvl(0).as("balance"))
.from (V_TRANSACTIONS.as("t"))
.where (t.ACCOUNT_ID.eq(1))
.orderBy(t.VALUE_DATE.desc(),t.ID .desc())
![Page 117: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/117.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
What jOOQ means for developers
Java SQL
one jack all plugs
jOOQ
one adaptor
With jOOQ, Java plugs into SQL intuitively, lettingyour developers focus on business-logic again.
Images from Wikimedia. License: public domain. Travel converter by Cephira. License: CC-BY SA 3.0
![Page 118: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/118.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
What jOOQ means for developers
Java SQL
one jack all plugs
jOOQ
one adaptor
Images from Wikimedia. License: public domain. Travel converter by Cephira. License: CC-BY SA 3.0
![Page 119: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/119.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
Our vision at Data Geekery - Revisited
Open source databases:
- free Apache license
Commercial databases:
- Commercial license
![Page 120: 2000 Lines of Java? Or 50 Lines of SQL? The Choice is Yours...Full example: ('' (](https://reader034.fdocuments.us/reader034/viewer/2022042806/5f6b1b52929e4507626fceb4/html5/thumbnails/120.jpg)
Copyright (c) 2009-2015 by Data Geekery GmbH. Slides licensed under CC BY SA 3.0
NoSQL? No, SQL!
This talk is available as an in-house workshop. Contact me:
• Blog: http://blog.jooq.org
• Twitter: @JavaOOQ / @lukaseder
• E-Mail: [email protected]
That’s it, folks