SQL必知必会理论

这些都是理论,一些总结的比较好的概念,自己复习用,不喜勿喷,这是我看完一本书总结出来的,请尊重劳动成果,谢谢

了解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必须使用列名,不能用于计算或表达式

发布了45 篇原创文章 · 获赞 6 · 访问量 1993

猜你喜欢

转载自blog.csdn.net/qq_22583191/article/details/104365641