最糟糕的SQL

sam*_*ich 9 sql database

您见过的最糟糕的SQL查询是什么?是什么让它变坏了?

Rob*_*ble 35

DELETE FROM table
Run Code Online (Sandbox Code Playgroud)

在我输入并执行它之后看到,我忘记了WHERE子句.现在我总是首先运行一个SELECT语句,并在我确信正确的行会受到影响后将SELECT更改为DELETE.

  • 我做了类似的事情,除了我在写作时将TableName写为TableNameFOO.在编写完整的电子邮件和校对之前,我还将电子邮件的"收件人:"字段保留为空...以防万一;) (4认同)
  • 我之前在工作时已经完成了这项工作,幸运的是我正在开发服务器,我刚刚恢复了最后一次工作的数据库备份.我还写了一个最近管理员工教育状况的网页,并省略了where子句.我们现在就说每个人都有学位. (2认同)

Dou*_* T. 25

经典的xkcd当然是:

WHERE name = ROBERT'); DROP TABLE students;--
Run Code Online (Sandbox Code Playgroud)

  • 我们称他为Little Bobby Tables (6认同)

sho*_*osh 13

最糟糕的是每次使用 SQL查询:

一个SELECT查询,它计算对应于某个条件的行数,在for循环的停止条件中调用.
像这样的东西:

for(int i = 0; i < query("SELECT COUNT .... WHERE ..."); i++)
{

}
Run Code Online (Sandbox Code Playgroud)

不,查询的结果不会每次迭代都改变.是的我意识到服务器将缓存结果.


Sea*_*ght 9

客户在varchar字段(经典ASP应用程序)中存储了3个值的逗号分隔列表,因此它们具有如下所示的存储过程:

SELECT *
FROM
    SomeTable
WHERE
    Field LIKE @Param + ',%'
    OR
    Field LIKE '%,' + @Param + ',%'
    OR
    Field LIKE '%,' + @Param
Run Code Online (Sandbox Code Playgroud)

应该很明显为什么它太可怕了:)


gre*_*jor 9

PL/SQL(Oracle)存储过程,使用冒泡排序对结果集进行排序.当我和DBA被要求弄清楚一个严重的性能问题时,就发现了它.开发人员,甲骨文"专家"已经为此工作了一个多星期.他直言不讳地解释说,他在计算机科学课上学到了泡泡排序.该算法通常用于说明性能不佳.

用ORDER BY子句替换整个混乱.性能提高了几个数量级.


Pau*_*lin 6

select * from users where clue > 0;
0 results found.
Run Code Online (Sandbox Code Playgroud)

  • 关于这个sql最糟糕的事情是它永远不会返回任何结果,无论你在哪里运行它 (5认同)
  • 这就是为什么我们应该能够upvote评论:) (2认同)
  • 为什么这个错误的SQL?为什么要玩射击信使? (2认同)

Bob*_*bst 6

我自己的,这里发布的时间很长 - 现在关闭3500线

我必须真正与一个绝对可怕的架构分担责任.最开始的一个简单的练习是使用一些工会转动非规范化数据,这变成了一个笨拙的噩梦.它非常需要维修.

亚军是这样的:

select 
case datepart(mm,getdate())
when 1 then 'Jan'
when 2 then 'Feb'
when 3 then 'March'
when 4 then 'Apr'
when 5 then 'May'
when 6 then 'Jun'
when 7 then 'July'
when 8 then 'Aug'
when 9 then 'Sept'
when 10 then 'Otc'
when 11 then 'Nov'
when 11 then 'Dec'
end
Run Code Online (Sandbox Code Playgroud)

该帖子中没有拼写错误 - 这就是它的编写方式.谢谢,咨询美元!

我当然用Select left重构(datename(mm,getdate()),3)

  • 我们在十二月发现了这颗宝石. (15认同)

tva*_*son 5

当我第一次获得目前的工作时,我的第一个项目是创建一个应用程序,用于汇总我们计算机实验室中的许可证使用数据。他坚持认为他不希望后端数据库被规范化,因为连接“太贵了”。这是我的第一周,我没有资格争论。

现在,为了从数据库中提取任何有用的数据,必须在需要提取摘要以删除每一行中的重复数据的每个查询中“撤消”非规范化。当然,这些是唯一实际使用的查询。你会看到很多嵌套的选择,如果数据被规范化,这些选择是完全没有必要的,例如:

select location, sum(login_time) as total_login_time
from
    (select location, session_id, max(login_time) as login_time
     from sessions
     where location in ('lab1','lab2') 
           and session_start >= @start_date 
           and session_end <= @end_date
     group by location, session_id) tbl
group by location
Run Code Online (Sandbox Code Playgroud)

虽然,查询本身并不是特别难看——尽管有些是——每次必须跳过箍以撤消不必要的非规范化伤害的过程。

现在boss走了,但我没时间重写……