为什么SELECT *不好做法?如果添加了您想要的新列,是不是意味着要更改的代码更少?
我知道这SELECT COUNT(*)是一些DB上的性能问题,但是如果你真的想要每一列呢?
我的网站相当广泛,我最近刚切换到PHP5(称我为大器晚成).
我之前的所有MySQL查询都是这样构建的:
"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
Run Code Online (Sandbox Code Playgroud)
这使它非常简单,友好.
我出于明显的安全原因,现在正试图切换到mysqli,并且SELECT * FROM在bind_param需要特定参数时,我很难弄清楚如何实现相同的查询.
这句话是否已成为过去?
如果是,如何处理涉及大量列的查询?我真的需要每次都输入它们吗?
我看到Edsger Dijsktra看到的关于编程风格的这篇文章.快速解释一下,主要的不同之处在于莫扎特,当编程的类比,在写任何东西之前完全理解(辩论)问题,而贝多芬在纸上写下笔记时作出了他的决定,并在此过程中创造了许多修改.使用Mozart编程,1.0版本将是软件的唯一版本,其目标应该是无错误和最高效率.此外,Dijkstra表示,不应该向那些提升和稳定性水平的软件发布.
基于他的观点,有两个问题.莫扎特的编程是否可行?如果我们采用莫扎特风格,我们今天写的软件真的会受益吗?
我的想法.看来,为了应对日益复杂的软件,我们已经从这种方法转向敏捷开发,公共beta测试和不断修订,定义Web开发的方法,速度最重要.但是,当我想到网络软件可以经历的所有修订时,尤其是在维护期间,当补丁通常应用于补丁时,然后通过繁琐的重构过程进行改进 - 莫扎特方式似乎非常有吸引力.它至少可以减少那些烦人的软件更新,例如Digsby,Windows,iTunes等,很多是无法预料的漏洞需要新的即时发布的结果.
编辑:有关Dijsktra视图的更准确说明,请参阅下面的响应.
为一篇冗长的帖子道歉,但我需要发布一些代码来说明问题.
灵感来自问题*什么是不使用选择的原因?,我决定指出一些我之前注意到的select*行为的观察结果.
让我们的代码说明一切:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U'))
DROP TABLE [dbo].[starTest]
CREATE TABLE [dbo].[starTest](
[id] [int] IDENTITY(1,1) NOT NULL,
[A] [varchar](50) NULL,
[B] [varchar](50) NULL,
[C] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into dbo.starTest(a,b,c)
select 'a1','b1','c1'
union all select 'a2','b2','c2'
union all select 'a3','b3','c3'
go
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vStartest]'))
DROP VIEW [dbo].[vStartest]
go
create view dbo.vStartest as
select * from dbo.starTest …Run Code Online (Sandbox Code Playgroud) 我们使用的是SQL Server 2005,但这个问题适用于任何RDBMS.
从视图中选择所有列时,以下哪项更有效?
Select * from view
Run Code Online (Sandbox Code Playgroud)
要么
Select col1, col2, ..., colN from view
Run Code Online (Sandbox Code Playgroud) 在我的表中,我有一个字段"firstname"和一个字段"lastname".我想选择firstname + space + lastname为某个值的所有记录.
我试过这个:
$sql = "SELECT * FROM sam_users WHERE (user_firstname + ' ' + user_lastname LIKE ?)";
Run Code Online (Sandbox Code Playgroud)
但这不起作用.有了Google,我发现了一些关于使用||的东西,但我真的不明白我应该如何使用该运算符.请注意,我不想使用or-operator(什么是||在多种语言中),而是要连接2个字段(它们之间有空格)并在其上使用LIKE.
谢谢!
我曾经写过像sql一样的语句
select * from teacher where (TeacherID = @TeacherID) OR (@TeacherID = -1)
Run Code Online (Sandbox Code Playgroud)
并传递@TeacherID值= -1以选择所有教师
现在我担心你能告诉我的表现是一个好的练习还是坏的一个?
非常感谢
如果我有两个问题
SELECT Id, Forename, Surname
FROM Person
WHERE PersonName Like(‘%frank%’)
Run Code Online (Sandbox Code Playgroud)
和
SELECT *
FROM Person
WHERE PersonName Like(‘%frank%’)
Run Code Online (Sandbox Code Playgroud)
哪个查询运行得更快?where子句/表是加入最大因子还是返回的列数?
我问,因为我正在构建一系列映射到数据库表的对象.通常,每个对象至少具有以下三种方法:
Select - 选择一切
List - 选择足够的可用于填充下拉列表
Search - 选择结果中可查看的所有内容,通常约为6列.
如果每个查询返回完全相同的列集,则代码的维护和测试应该更加简单.在任何给定的表中,数据库不可能超过50,000行,因此如果性能差异很小,那么我将节省开发时间.如果表演会在场上摔倒,那么我将从不同角度进行表演.
那么,为了便于开发,是SELECT *明智的还是天真的?
可能重复:
哪个更快/最好?SELECT*或SELECT column1,colum2,column3等
不使用select*的原因是什么?
使用SELECT*而不是SELECT FiledName,FiledName2 ......是否存在性能问题?
假设一个查询,例如:
SELECT * FROM tableA;
Run Code Online (Sandbox Code Playgroud)
如何a_在每列的名称前加上?例如,如果存在列"用户名",则在结果中将其作为"a_username"进行访问.
编辑:该SELECT username AS a_username格式不会帮助,因为我需要继续使用该*字段选择.与JOIN中另一个表的返回列存在JOIN和潜在冲突.我将迭代返回的列(foreach)并且只想将来自特定表(其模式可能更改)的列输出到HTML输入字段,其中站点管理员可以直接编辑字段的内容.有问题的SQL查询看起来像是SELECT firstTable.*, anotherTable.someField, anotherTable.someOtherField存在于firstTable中存在someField或someOtherField的可能性.
谢谢.
sql ×7
performance ×3
sql-server ×3
database ×2
mysql ×2
coding-style ×1
dijkstra ×1
filter ×1
mysqli ×1
php ×1
t-sql ×1
views ×1