2010-04-30 73 views
0

我已阅读,之后选择我们使用列的名字,但我发现,像这样的语句:MySQL的列名和别名

SELECT 'A' FROM T WHERE A = NULL; 

你会租用帮助我吗?谢谢(A是这里的栏柱的名字吗?)我 DBMS是MySQL的

编辑:确切的问题是这样的认为: 将上面的语句产生行(选择所有 适用)?注意ANSI_NULLS是关闭的。

我想知道上述说明会起作用吗?因为有些人说我们应该写IS NULL代替= NULL

+1

的数据库(MySQL和MSSQL,甲骨文..)?问题到底是什么? – Blorgbeard 2010-04-30 16:00:06

+0

如果您可以发布您的数据库模式以及您试图通过查询得到的结果将会很有帮助。 – 2010-04-30 16:00:57

+0

你想用这个声明做什么?目前看起来并不是很有用...... – Blorgbeard 2010-04-30 16:04:40

回答

8

此基础上查询,你会得到包含字符“A”的每一行,其中一个结果集名为A的列等于空。

如果你真的想看到的A列,而不是字符“A”的价值,你必须删除单引号:

SELECT A FROM T WHERE A IS NULL 

无论哪种方式,你不应该使用= NULL。某些RDMS不会按照您的想法处理。标准是使用IS NULL代替。

+0

感谢您的回答。 – user329820 2010-04-30 18:39:52

4

您应该使用

SELECT 'A' FROM T WHERE A IS NULL; 
+1

这是因为SQL在使用'= null'时出现问题,并且在使用这种方式时会产生意想不到的结果。 'IS NULL'将正常工作。 – 2010-04-30 16:02:14

+9

@ rb.usa,它不是“臭名昭着的,因为有= null的问题”,它是臭名昭着的开发人员不明白NULL不是一个价值,你不能使用它像一个。 – 2010-04-30 16:04:44

1

你的SELECT语句具有以下含义:

“对于称为T表的每一行,返回字符串‘A’,如果表T的列A为NULL”

所以,如果你有3条记录,其中A为NULL,输出将是:

A 
A 
A 
3 row(s) selected 

正确的语法是其中A为NULL,而不是其中A = NULL。

1

您是否尝试过在测试数据库上运行它以查看它的作用?或者这只是在阅读?

打破这种说法,是什么说的是:

在表中T(FROM T),找到行,其中A的值为null(其中A = NULL)。

对于每一行,返回'A'。

结果我希望是

+--+ 
|T | 
+--+ 
|A | 
|A | 
... 
|A | 
+--+ 

如果语句是不是:

SELECT A FROM T WHERE A = NULL; 

凡单引号去掉,它会返回一堆空值,列的值A.

1

A是一个列名,但是你可能不想在它周围使用单引号。我试试...

SELECT A FROM T WHERE A IS NULL; 
+1

这取决于原始作者是想要A的值还是字面字符'A'。 – justkt 2010-04-30 16:02:16

+0

鉴于where子句,A的值将始终为空。这是一个非常奇怪的查询,总而言之。 – Blorgbeard 2010-04-30 16:10:38

2

在SQL中有三种类型的引号。

  • 单引号'意味着什么是字符串文字。 'A'这意味着它返回ANULL的所有行的字符A
  • 双引号"意味着某物是标识符。如果标识符与保留字具有相同的名称,如select,这很有用。示例:SELECT "select" FROM T从表T中选择列select
  • 反引用报价`只适用于MySQL,与双引号相同。双引号有时可用于MySQL中的字符串文字,尽管这与标准非常相似。 MySQL有一个选项来符合标准,使用SET SQL_MODE='ANSI';反引号变为无效,而您需要使用单引号和双引号。

不带引号的标识符与带双引号的标识符相同,除非它是保留字。

希望这有助于理解更多。

2

在回答你的问题:

A = NULL永远是假的,所以你会得到没有行返回。要与NULL进行比较,您必须改用A is NULL

NULL在SQL中是特殊的,因为它不等于任何东西,甚至本身。是的,(NULL = NULL)评估为false。

如果将其更改为IS NULL,那么您将得到一列有一列的行,每行包含字符'A'。对于A列为空的表T中的每一行,您将得到一个'A'。

您将得到字母A而不是列的值,因为您对“A”有引号。如果你删除它们,你会在每一行中得到A的值(这将是空的,因为那些是你用where子句选择的行)。

如果你想了解哪些T中有行对于A空值,那么你应该将其更改为select * from T where A is null