SQL会在语句之间使用改进吗?

时间:2015-11-02 04:45:32

标签: sql-server sql-server-2014

我想找出一个select语句,表中的哪些列共享相似的信息。

示例:带有Classes列的ClassID, ClassName, ClassCode, ClassDescription表。

这是我已经上传的SQL课程的一部分。问题是“哪些课程是英语系的一部分?”

我使用了这个Select声明:

SELECT * 
FROM Classes
WHERE ClassName LIKE "English%" OR ClassCode LIKE "ENG%"

当然,我们只在这个数据库中输入了一个实际的英语课程,最终的结果是它执行得很好,只显示了英语课的所有内容。我认为这是成功的,因为我们在数据库中填充了其他非英语课程。

无论如何,有人告诉我应该使用BETWEEN语句。

我只是坐在这里以为他们会做我需要他们做的事情吗?

我正在使用SQL Server 2014

3 个答案:

答案 0 :(得分:1)

不,BETWEEN在这里可能是一个坏主意。 BETWEEN不允许使用通配符,并且在我使用的任何RDBMS中都没有进行任何模式匹配。所以你不得不说BETWEEN 'ENG' AND 'English'。除了不会返回像英语这样的东西之外我不会这样做。 (将在排序列表中的'英语'之后)。

它还可能包括像'工程'或者' Engaging Artistry',但这也是你现有查询的弱点,因为LIKE' ENG%'匹配那些。

如果您碰巧使用区分大小写的排序规则,则会添加一个全新的复杂维度。你的BETWEEN声明变得更加混乱。只要知道大写字母通常出现在小写字母之前,所以'刻画我'将被包括但是'雕刻我'不会。此外,' eng'不包括在内。请注意,不区分大小写的排序规则是默认排序。

  

在一个表中搜索空值时,还有什么区别   和一栏

column_name =''
     

column_name IS NULL

您无法理解空字符串与null之间的区别。

空字符串是显式的。它说"这个字段有一个已知值,它是一个零长度的字符串。"

空字符串不精确。这意味着"未知"。这可能意味着"这个值没有被要求,"或"此值不可用,"或"此值尚未确定,"或"此值对此记录没有意义。"

"这个人的中间名是什么?"

"他没有。看,他的出生证没有列出中间名。" - >空字符串

"我不知道。他从未告诉过我,也没有任何出生或身份记录。" - > NULL

请注意,Oracle由于向后兼容性而导致treats empty strings as NULLs。这显然是反对 ANSI SQL,但由于Oracle已经过时了,而且它的工作方式总是如此,以至于它将如何继续工作。

另一种看待它的方法是我倾向于使用数字的例子。 0和NULL之间的差异是拥有余额为0美元的银行账户与根本没有银行账户之间的差异。

答案 1 :(得分:0)

除非我们看到表及其数据,否则什么也不能说。尽管不要在它们之间使用。

其次首先通过design来查找哪个列不为null。例如ClassName不能为null然后使用ClassCode LIKE“ENG%”没有用,只是ClassName LIKE“English%”就够了,反之亦然也是如此。

第三,你应该在两个列中使用相同的参数。例如

  

ClassName LIKE“English%”OR ClassCode LIKE“English%”

看到差异。

答案 2 :(得分:-1)

Select * FROM Classes
    Where ClassName LIKE "%English%"