目录

1. 未排序数据

2. 结束SQL语句

3. SQL语句和大小写

4. 使用空格

5. 使用通配符

6. DISTINCT

7. ORDER BY

8. 按多个列排序

9. 指定排序方向

10. SQL过滤与应用过滤

11. 何时使用引号

12. 范围值检查

13. 空值检查(IS NULL)

14. 计算次序

15. 为什么要使用IN操作符?其优点具体如下。

16. 为什么使用NOT?


1. 未排序数据

查询时,如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的。

2. 结束SQL语句

多条SQL语句必须以分号(;)分隔

MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是mysql命令行,必须加上
分号来结束SQL语句。

3. SQL语句和大小写

请注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。

不过,一定要认识到虽然SQL是不区分大小写的,但有些标识符(如数据库名、表名、列名)可能不同:在MySQL 4.1及之前的版本中,这些标识符默认是区分大小写的;在MySQL 4.1.1版本中,这些标识符默认是不区分大小写的。

最佳方式是按照大小写的惯例,且使用时保持一致。

4. 使用空格

在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行。多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。

5. 使用通配符

一般,除非你确实需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。

6. DISTINCT

SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的vend_id行。如果使用DISTINCT关键字,它必须直接放在列名的前面。(下面的sql语句将会报错)

SELECT id, DISTINCT name FROM test_table;

不能部分使用DISTINCT

DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT id, name,除非指定的两个列都不同,否则所有行都将被检索出来。

7. ORDER BY

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

通过非选择列进行排序】 通常,ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。例如,下面语句时正确的:

SELECT name, price from test_table ORDER BY id;

8. 按多个列排序

为了按多个列排序,只要指定列名,列名之间用逗号分开即可。重要的是理解在按多个列排序时,排序完全按所规定的顺序进行。例如,下面sql的查询结果先按name排序,如果name一样,则再按照price排序。

SELECT name, price from test_table ORDER BY name, price;

9. 指定排序方向

升序:ASC

降序:DESC

其中,默认为升序方向;如需降序,必须显式加上DESC。

可以对多个列进行排序,并且多个列之间的排序方向可以不同。如下:

SELECT name, price from test_table ORDER BY name DESC, price ASC;

【排序过程中的大小写问题】

  • 区分大小写和排序顺序 在对文本性的数据进行排序时,A与a相同吗?a位于B之前还是位于Z之后?

这些问题不是理论问题,其答案取决于数据库如何设置

在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。

这里,关键的问题是,如果确实需要改变这种排序顺序,用简单的ORDER BY子句做不到。你必须请求数据库管理员的帮助。

【ORDER BY子句的位置】 在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。

【WHERE子句的位置】 在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。

10. SQL过滤与应用过滤

数据也可以在应用层过滤。为此目的,SQL的SELECT语句为客户机应用检索出超过实际所需的数据,然后客户机代码对返回数据进行循环,以提取出需要的行。

通常,这种实现并不令人满意。因此,对数据库进行了优化,以便快速有效地对数据进行过滤。让客户机应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且使所创建的应用完全不具备可伸缩性。此外,如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费。

11. 何时使用引号

单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。

12. 范围值检查

为了检查某个范围的值,可使用BETWEEN操作符。其语法与其他WHERE子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。例如:

SELECT name, price FROM test_table WHERE price BETWEEN 3 AND 5;

13. 空值检查(IS NULL)

在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值NULL。

NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。

SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。这个WHERE子句就是IS NULL子句。

SELECT name, price FROM test_table WHERE info IS NULL;

【NULL与不匹配】在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行。

14. 计算次序

WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。但是,组合AND和OR带来了优先级组合的问题。以下两个语句的查询条件是不同的。AND在计算次序中优先级更高。

1)SELECT id, name, price FROM test_table WHERE id = 1 OR id = 2 AND price >= 1.5;

2)SELECT id, name, price FROM test_table WHERE (id = 1 OR id = 2) AND price >= 1.5;

【在WHERE子句中使用圆括号】任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

15. 为什么要使用IN操作符?其优点具体如下。

  • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
  • 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
  • IN操作符一般比OR操作符清单执行更快。
  • IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

16. 为什么使用NOT?

对于简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT使找出与条件列表不匹配的行非常简单。

【MySQL中的NOT】 MySQL支持使用NOT 对IN 、BETWEEN 和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。

参考资料:《MySQL必知必会》[英]Ben Forta 著,刘晓霞 钟鸣 译,人民邮电出版社.

Logo

更多推荐