本系列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条件中的列,空值行将被排除在结果之外。因为空值不能和任何值比较。