如何優雅地寫SQL?

在進行數據寫操作的時候(尤其是查詢),往往條件是不確定的,需要根據不同的情況「拼接」出一個完整的SQL。但是覺得這樣寫很亂,如何才能更優雅?


你也可以選擇使用stored procedure


所以就有了各種ORM


使用PreparedStatement的Batch功能肯定很優雅

Update大量的數據時, 先Prepare一個INSERT語句再多次的執行, 會導致很多次的網路連接. 要減少JDBC的調用次數改善性能, 你可以使用PreparedStatement的AddBatch()方法一次性發送多個查詢給資料庫. 例如, 讓我們來比較一下下面的例子.

例 1: 多次執行Prepared Statement

PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");

for (n = 0; n &< 100; n++) { ps.setString(name[n]); ps.setLong(id[n]); ps.setInt(salary[n]); ps.executeUpdate(); }

例 2: 使用Batch

PreparedStatement ps = conn.prepareStatement(
"INSERT into employees values (?, ?, ?)");

for (n = 0; n &< 100; n++) { ps.setString(name[n]); ps.setLong(id[n]); ps.setInt(salary[n]); ps.addBatch(); } ps.executeBatch();

在例 1中, PreparedStatement被用來多次執行INSERT語句. 在這裡, 執行了100次INSERT操作, 共有101次網路往返. 其中,1次往返是預儲statement, 另外100次往返執行每個迭代. 在例2中, 當在100次INSERT操作中使用addBatch()方法時, 只有兩次網路往返. 1次往返是預儲statement, 另一次是執行batch命令. 雖然Batch命令會用到更多的資料庫的CPU周期, 但是通過減少網路往返,性能得到提高. 記住, JDBC的性能最大的增進是減少JDBC驅動與資料庫之間的網路通訊


1. prepared statement

2. stored procedure

3. ORM


樓主的問題是優雅的寫SQL,而不是寫優雅的SQL,所以我的建議就是:

生活中有哪些優雅的小動作? - 生活


著名大牛上個世紀的封面文章

never use select * .


只要公司有足夠的資料庫開發,DAO全交給存儲過程也不是不可能,也可以把查詢封裝成視圖


不抖機靈不扯皮,只針對oracle作答。

1. 做10053 trace

2. 在trace file中查找關鍵字final

3. 某一個final(基本上是最後一個)後面跟著的sql就是你想要的,很優雅的sql

4. 如果不夠優雅,對3找出的sql做10053 trace,並重複上述步驟


這樣說來今天要面朝西北才能優雅些!


怎麼沒人提到 iBatis/MyBatis?簡直就是專門為你這種需要而設計出來的。


曾經一個人說,用where 1=1,後面拼條件。


JOOQ 或者queryDsl


select * from 存儲過程

join 新鮮美妙的特性

where 極致到變態的縮進和


優雅?

你應該考慮換掉db,which根本跟scale就是本質上衝突的東西


jooq


我是一個實施,每天面對的就是這些J2EE的產品拼出來的垃圾sql。

這種sql非常差,差到要命,一個最次的數據工程師都不會寫出這種爛sql來。

一般開發都不會寫sql,不會優化sql,所以寫出來的東西非常慢非常怪。

最近我們給自己產品的sql進行了優化,跑批時間從一小時降到56秒,你就說有多差吧。

想優雅地寫sql先得讓自己不挨實施的罵。

存儲過程?動態sql


存儲過程是最佳選擇。

調試,修改方便,利於閱讀。

功能比拼接SQL更強大。

AND (@p IS NULL OR COLUMNA = @p)


只需要翹起小指.......


分而治之


推薦orm,比如laravel的orm就很優雅


推薦閱讀:

為什麼公司不準使用SQL語句查詢的「*」?
sql語句面試問題?
如何自學SQL?
SQL 查詢按照家庭住址進行分組時,組內平均年齡小於50歲的組中成員的姓名和年齡?
索引列只要參與了計算, 查詢就會不走索引, 為什麼 MySQL 不對這種情況進行優化?

TAG:資料庫 | SQL | 編程 | SQL優化 |