这些都是理论,一些总结的比较好的概念,自己复习用,不喜勿喷,这是我看完一本书总结出来的,请尊重劳动成果,谢谢
了解SQL
表是一种结构化的文件,可用来存储某种特定类型的数据
存储在表中的数据是同一种类型的数据或清单
数据库中的每个表都有一个名字来标识自己。这个名字是唯一的,即数据库中没有其他表具有相同的名字。
描述表的这组信息就是所谓的模式(schema),模式可以用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)。
更糟的是,偶然会有相同的数据类型在不同的DBMS中具有不同的名称。对此用户毫无办法,重要的是在创建表结构时要记住这些差异。
检索数据
多条SQL语句必须以分号(;)分隔。多数DBMS不需要在单条SQL语句后加分号,但也有DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,加上分号也肯定没有坏处。
提示:SQL语句和大小写
请注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成Select也没有关系。许多SQL开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做使代码更易于阅读和调试。不过,一定要认识到虽然SQL是不区分大小写的,但是表名、列名和值可能有所不同(这有赖于具体的DBMS及其如何配置)。
多数DBMS不需要在单条SQL语句后加分号,但也有DBMS可能必须在单条SQL语句后加上分号
当然,如果愿意可以总是加上分号。事实上,即使不一定需要,加上分号也肯定没有坏处。
SQL语句不区分大小写,因此SELECT与select是相同的
处理SQL语句时,其中所有空格都被忽略
多数SQL开发人员认为,将SQL语句分成多行更容易阅读和调试。
一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符。虽然使用通配符能让你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
可以使用TOP关键字来限制最多返回多少行
排序检索数据
ORDER BY子句取一个或多个列的名字,据此对输出进行排序
在指定一条ORDER BY子句时,应该保证它是SELECT语句中最后一条子句。如果它不是最后的子句,将会出现错误消息。
要按多个列排序,简单指定列名,列名之间用逗号分开即可(就像选择多个列时那样)。
ORDER BY 2表示按SELECT清单中的第二个列prod_price进行排序。ORDER BY 2, 3表示先按prod_price,再按prod_name进行排序。
首先,不明确给出列名有可能造成错用列名排序。
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。
ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。
过滤数据
单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号
!=和<>通常可以互换。
Microsoft Access支持<>而不支持!=
BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中。
高级数据过滤
SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。
圆括号具有比AND或OR操作符更高的求值顺序,所以DBMS首先过滤圆括号内的OR条件。
任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认求值顺序,即使它确实如你希望的那样。使用圆括号没有什么坏处,它能消除歧义。
IN操作符一般比一组OR操作符执行得更快(在上面这个合法选项很少的例子中,你看不出性能差异)。
IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句
WHERE子句中用来否定其后条件的关键字。
用通配符进行过滤
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
如果使用的是Microsoft Access,需要使用*而不是%。
更好的解决办法是用函数去掉空格。
通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。子句WHERE prod_name LIKE '%’不会匹配产品名称为NULL的行。
此通配符可以用前缀字符^(脱字号)来否定
以J和M之外的任意字符起头的任意联系人名(与前一个例子相反):
如果使用的是Microsoft Access,需要用!而不是^来否定一个集合,因此,使用的是[! JM]而不是[^JM]。
把通配符置于开始处,搜索起来是最慢的。
使用函数处理数据
SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。
SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。
现在试一下使用SOUNDEX()函数进行搜索,它匹配所有发音类似于Michael Green的联系名:
输入▼
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
输出▼
cust_name cust_contact
Kids Place Michelle Green
汇总数据
注意:只用于单个列
AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
说明:NULL值
AVG()函数忽略列值为NULL的行。
COUNT()函数
COUNT()函数进行计数。可利用COUNT()确定表中行的数目或符合特定条件的行的数目。
COUNT()函数有两种使用方式:
□ 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)
AVG()函数忽略列值为NULL的行。
使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
使用COUNT(column)对特定列中具有值的行进行计数,忽略NULL值。
说明:NULL值
如果指定列名,则COUNT()函数会忽略指定列的值为空的行,但如果COUNT()函数中用的是星号(*),则不忽略。
MAX()函数
MAX()返回指定列中的最大值。MAX()要求指定列名,如下所示:
如果指定列名,则COUNT()函数会忽略指定列的值为空的行,但如果COUNT()函数中用的是星号(*),则不忽略。
MAX()函数忽略列值为NULL的行。
MIN()函数忽略列值为NULL的行。
SUM()函数忽略列值为NULL的行。
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。类似地,DISTINCT必须使用列名,不能用于计算或表达式。
提示:将DISTINCT用于MIN()和MAX()
虽然DISTINCT从技术上可用于MIN()和MAX(),但这样做实际上没有价值。一个列中的最小值和最大值不管是否只考虑不同值,结果都是相同的。
说明:其他聚集参数
除了这里介绍的DISTINCT和ALL参数,有的DBMS还支持其他参数,如支持对查询结果的子集进行计算的TOP和TOP PERCENT。为了解具体的DBMS支持哪些参数,请参阅相应的文档。
如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。类似地,DISTINCT必须使用列名,不能用于计算或表达式