SQL编程大赛总结

本次SQL编程大赛由ITPUB举办,共四期。比赛过程中学习了Oracle 11g R2 的 with 递归语法,并对性能、扩展性和代码易读性进行了平衡。最终在71位参赛者中获得第10名。

这次SQL编程大赛是由ITPUB举办的,共四期:
第四期SQL大赛活动链接:http://www.itpub.net/thread-1411495-1-1.html
第三期SQL大赛活动链接:http://www.itpub.net/thread-1408182-1-1.html
第二期SQL大赛活动链接:http://www.itpub.net/thread-1403356-1-1.html
第一期SQL大赛活动链接:http://www.itpub.net/thread-1400067-1-1.html

SQL数据库编程大赛第四期评分及所有答题公布链接:http://www.itpub.net/thread-1417576-1-1.html
SQL数据库编程大赛第三期评分及所有答题公布链接:http://www.itpub.net/thread-1415335-1-1.html
SQL数据库编程大赛第二期评分及所有答题公布链接:http://www.itpub.net/thread-1411980-1-1.html
SQL数据库编程大赛第一期评分及所有答题公布链接:http://www.itpub.net/thread-1407072-1-1.html


第一期,难度一般,平时很少用SQL去实现一些复杂的功能,看到题后不知道如何下手,所以先用存储过程实现草稿,最后改成一条SQL,算是练手吧。
第二期,最难,主要是扩展性和性能问题。
第三期,难度一般,如果有算法基础会更有效。
第四期,难度较低,评委给出的测试数据太少,所以性能不好估算,不利于参赛人员调优。

参加这次SQL编程大赛感觉最大的收获是学习了ORACLE 11gR2的with递归语法,感觉功能更强大,但是使用不方便,语法很别扭,估计ORACLE设计的人只是为了考虑实现功能,没有考虑最终开发人员的思维形惯,没有参考手册很难使用。
总共参赛的人有71位,最终获得了第10名,成绩还算不错 高手太多了,有rollingpig、yangtingkun等资深版主, 还有许多像xgghxkhuang一样隐藏的算法高手,与他们差距很大,重在参与吧。

整个大赛感觉过程很久,可以感受到评委和组织方的工作量非常巨大,而且对评委本身的技能要求也是一种挑战。最终评分与评语非常难搞,由于每个评委对标准的理解不一样,可能存在个别不太合理的地方,可以理解,希望下次能更做得更好。

 

通过这次SQL编程大赛也可以看出个人的编程习惯,我属于那种没有算法功底,总是先用最笨的方法去实现功能,然后逐渐优化,最终满足需求。每次写代码都有一些基本的目标:
1、结果正确。
2、性能满足需求。
3、代码易读,考虑最有可能发生的扩展性问题,要做到很好的扩展性非常难,可能会降低系统的易读性和性能,代码太复杂了以后开发及维护成本都很高,而且很多情况下扩展的方向都会预估不准。
4、喜欢代码通用性,新特性只是有时会关注,很少用或者不用,比如这次的oracle11g with新语法。
5、在性能、扩展性、代码易读性方面平衡,不会为了追求高性能而增加代码的复杂度,除非这个功能点性能非常重要,另外对于开放API或底层应用对性能及可扩展性要求会更高。

 

### 数据库编程竞赛初始数据SQL脚本 对于数据库编程竞赛而言,创建一个合理的初始化数据环境至关重要。这不仅有助于参赛者熟悉所使用的数据库结构,还能确保所有参与者在一个公平的基础上竞争。下面是一个简单的例子来展示如何编写这样的SQL脚本来准备必要的表格和一些基础的数据条目。 #### 创建表结构 首先定义几个基本的实体关系模型中的对象作为练习的基础: ```sql CREATE TABLE Users ( UserID INT PRIMARY KEY AUTO_INCREMENT, Username VARCHAR(50) NOT NULL UNIQUE, PasswordHash CHAR(64), EmailAddress VARCHAR(100), CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 上述命令建立了`Users`表用来存储用户账户的信息[^2]。 接着可以增加更多相关的表以模拟更复杂的业务场景,比如订单(Order),产品(Product)等: ```sql CREATE TABLE Products ( ProductID INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(100) NOT NULL, Description TEXT, Price DECIMAL(8 , 2 ), StockQuantity SMALLINT UNSIGNED CHECK (StockQuantity >= 0) ); CREATE TABLE Orders ( OrderID INT PRIMARY KEY AUTO_INCREMENT, CustomerID INT REFERENCES Users(UserID), TotalAmount DECIMAL(9 , 2 ) NOT NULL, Status ENUM('Pending', 'Shipped', 'Delivered') DEFAULT 'Pending', OrderedAt DATETIME DEFAULT NOW() ); CREATE TABLE OrderItems ( ItemID INT PRIMARY KEY AUTO_INCREMENT, OrderID INT REFERENCES Orders(OrderID), ProductID INT REFERENCES Products(ProductID), Quantity TINYINT UNSIGNED CHECK (Quantity > 0), UnitPrice DECIMAL(7 , 2 ) ); ``` 这些语句构建了一个电子商务平台可能涉及的核心组件之间的关联[^3]。 #### 插入初始记录 为了使比赛更加贴近实际应用,在设置好架构之后还需要向各个表内填充适量的真实感强的数据样本供选手们操作分析: ```sql INSERT INTO Products(Name, Description, Price, StockQuantity) VALUES ('Laptop', 'High performance laptop suitable for gaming.', 1299.99, 10), ('Smartphone', 'Latest model smartphone with advanced camera features.', 799.99, 20), ('Tablet', 'Portable tablet perfect for reading e-books or watching videos.', 399.99, 15); INSERT INTO Users(Username, PasswordHash, EmailAddress) VALUES ('adminUser', SHA2('AdminPassword!', 256), 'admin@example.com'), ('regularUser', SHA2('RegularPassword!', 256), 'user@example.net'); -- 假设有一个已存在的顾客下了两笔不同的订单... INSERT INTO Orders(CustomerID, TotalAmount, Status) SELECT u.UserID, SUM(p.Price * oi.Quantity), CASE WHEN RAND() < .7 THEN 'Shipped' ELSE 'Pending' END AS status FROM Users u CROSS JOIN Products p LEFT JOIN LATERAL( SELECT FLOOR(RAND()*p.StockQuantity)+1 as quantity LIMIT 1 )oi ON true WHERE u.Username IN ('regularUser') GROUP BY u.UserID; ``` 这段代码片段展示了怎样通过随机数函数和其他逻辑表达式组合起来生成看似真实的交易历史给定条件下[^4]。 以上就是针对一次典型的数据库编程赛事而设计的一套完整的初始化SQL脚本方案;当然实际情况可能会依据具体的赛制要求有所不同,但总体思路大致相同——即先搭建起合适的模式框架再注入适当规模且具有代表性的实例资料以便于后续的任务开展。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值