本系列blog源自前年写的SQL学习笔记,汇总一下发上来。

---------------------------------------------------------------

使用DISTINCT消除重复的行。

虽然空值是未知的,但彼此绝不相等,但DISTINCT认为空值是彼此相等的。

对于DISTINCT操作,DBMS执行内部排序去识别并消除重复的行。排序是需要大量计算开销的,除非不得不用,否则不要使用DISTINCT。

行首先按sortcolumn1排序,然后对sortcolumn1中值相等的行再按sortcolumn2排序。

可以按字符串特定的部分对结果排序:ORDER BY substr(phone,length(phone)-1);

允许在ORDER BY中指定列的相对位置编号而不是列名。位置编号引用的是结果的列,而不是原始表中的列。

 

由DBMS决定空值是大于还是小于所有非空值。

 

影响排序速度的3个因素:

<!--[if !supportLists]-->1.  <!--[endif]-->选择的行的数量。

<!--[if !supportLists]-->2.  <!--[endif]-->ORDER BY 子句中列的数量。

<!--[if !supportLists]-->3.  <!--[endif]-->ORDER BY 子句中列数据类型的长度。

 

可以在ORDER BY中用列的别名替代列名。

ORDER BY列不能在结果中唯一标示每一行,有重复值的行将以任意顺序列出。

对ORDER BY子句增加CASE子句,可支持逻辑条件排序。

可以为经常排序的列创建索引。

 

空值表示未知,不和任何内容值匹配。

一般而言,最快的比较是相等,然后是不相等(>,<,>=,<=),最慢的是不等于。

不能在WHERE子句中使用COUNT、SUM这样的聚集函数。

 

在SELECT中定义的列别名,不能在WHERE子句中引用它。可以改成使用在WHERE子句之前计算的FROM子句的子查询:

SELECT * FROM (SELECT SALES AS SOLD FROM TITLES) ta WHERE SOLD>1000;

 

AND、OR、NOT是逻辑操作符。逻辑操作符,即布尔操作符,被设计为处理真值:真、假、未知。

NOT不能连接两个条件,而是否定一个条件。

将NOT放在列名表达式之前:WHERE NOT state=’RUN’ 等价于WHERE state <> ’RUN’。

 

查询条件只包含AND操作符,首先放置为真可能性最小的条件,查询将会变快。因为DBMS优化器是从左到右读取WHERE子句的(大多数情况)。Oracle基于开销的优化器从右到左读取。

 

某些DBMS支持异或逻辑操作符,当且仅当一个操作数为真时结果为真。

 

LIKE只对字符串起作用,对数字、日期不起作用。

NOT LIKE用于否定LIKE。

操作符%:匹配0个或多个字符。

操作符_:下划线匹配任意一个字符。

按照字面量方式查找%或_:使用转义符!

如:’100!%’  查找的字符串为100%。

 

通配符查找很耗时,特别是使用以%开头的模式。

在模式不包含通配符的情况下,LIKE像=一样比较,NOT LIKE像<>一样比较。=通常比LIKE快。

 

BETWEEN适用于字符串、数字、日期。BETWEEN语句可以用AND语句改写。

NOT BETWEEN否定BETWEEN条件。

 

用IN确定给定值是否匹配指定列表。

IN可以处理字符串、数字、日期。

 

NOT IN用于否定IN。

IN通常要比多个OR运行的快。为了加快速度,首先列出最可能的值。空值表示缺失或者未知的值。LIKE、BETWEEN、IN和其它WHERE子句条件不能发现空值。

 

IS NULL可以应用于任意数据类型的列。

用IS NOT NULL否定IS NULL。

 

如果包含空值的列是WHERE条件中的列,空值行将被排除在结果之外。因为空值不能和任何值比较。