3.2 MySQL的命名规则
几乎每条SQL 语句都在某种程度上涉及一个数据库或其组成成分。本节介绍引用数据库、表、列、索引和别名的语法规则。名称是区分大小写的,这里也对其进行了介绍。
3.2.1引用数据库的成分
在用名称引用数据库的成分时,受到可使用的字符以及名称可具有的长度的限制。名称的形式还依赖于使用它们的上下文环境:
■ 名称中可用的字符。名称可由服务器所采用的字符集中任意字母、数字、“_”和“ $”组成。名称可按上述任意字符包括数字起头。但是名称不能单独由数字组成,因为那样会使其与数值相混。MySQL所提供的名称用一个数起始的能力是很不寻常的。如果使用了这样的一个名称,要特别注意包含“ E”和“ e”的名称,因为这两个字符可能会导致与表达式的混淆。23e + 14 表示列23e 加14,但是23e+14 又表示什么?它表示一个科学表示法表示的数吗?
■ 名称的长度。数据库、表、列和索引的名称最多可由6 4个字符组成。别名最多可长达256个字符。
■ 名称限定词。为了引用一个数据库,只要指定其名称即可,如:
其中db_name 为所要引用的数据库名。要想引用一个表,可有两种选择。一种选择是使用由数据库名和表名组成的完全限定的表名,例如:
其中,tbl_name 为要引用的表名。另一种选择是由表名自身来引用缺省(当前)数据库中的一个表。如果samp_db 为缺省数据库中的一个表,下面的两个语句是等价的:
其中member 为数据库samp_db 中的一个表。要引用一个列,有三种选择,它们分别为:完全限定、部分限定和非限定。完全限定名(如db _ name . tbl _ name . col _ name)是完全地指定。部分限定名(如tbl_name. col _ name)引用指定表中的列。非限定名(如col _ name)引用由环境上下文给出的表中的列。下面两个查询使用了相同的列名,但是FROM 子句提供的上下文指定了从哪个表中选择列:
虽然愿意的话,提供完全限定名也是合法的,但是一般不需要提供完全限定名,如果用USE 语句选择了一个数据库,则该数据库将成为缺省数据库并在每一个非限定表引用中都隐含指向它。如果正使用一条SELECT 语句,此语句只引用了一个表,那么该语句中的每个列引用都隐含指向这个表。只在所引用的表或数据库不能从上下文中确定时,才需要对名称进行限定。下面是一些会出现混淆的情形:
■ 从多个数据库中引用表的查询。任何不在缺省数据库中的表都必须用“数据库名表名”的形式引用,以便让MySQL知道在哪个数据库中找到该表。
■ 从多个表中选择一列的查询,其中不止一个表含有具有该名称的列。
3.2.2 SQL 语句中的大小写规则
SQL 中的大小写规则在语句的不同部分是不同的,而且还取决于所引用的东西以及运行的操作系统。下面给出相应的说明:
■ SQL 关键字和函数名。关键字与函数名是不区分大小写的。可按任意的大小写字符给出。下面的三条语句是等价的:
■ 数据库与表名。MySQL中数据库和表名对应于服务器主机上的基本文件系统中的目录和文件。因此,数据库与表名是否区分大小写取决于主机上的操作系统处理文件名的方式。运行在UNIX 上的服务器处理数据库名和表名是区分大小写的,因为UNIX 的文件名是区分大小写的。而Windows 文件名是不区分大小写的,所以运行在Windows上的服务器处理数据库名和表名也是不区分大小写的。如果在UNIX 服务器上创建一个某天可能会移到Windows 服务器上的数据库,应该意识到这个特性:如果现在创建了两个分别名为abc 和ABC 的表,它们在Windows 机器上将是没有区别的。避免这种情况发生的一种方法是选择一种字符(如小写),总是以这种字符创建数据库和表名。这样,在将数据库移到不同的服务器时,名称的大小写便不会产生问题。
■ 列与索引名。MySQL中列和索引名是不区分大小写的。下面的查询都是等价的:
■ 别名。别名是区分大小写的。可按任意的大小写字符说明一个别名(大写、小写或大小写混合),但是必须在任何查询中都以相同的大小写对其进行引用。不管数据库、表或别名是否是区分大小写的,在同一个查询中的任何地方引用同一个名称都必须使用相同的大小写。对于SQL 关键字、函数名或列名和索引名没有这个要求。可在同一个查询中多个地方用不同的大小写对它们进行引用。当然,如果使用一致的大小写而不是“胡乱写”的风格(如SelECt NamE FrOm ...),相应的查询可读性要强得多。