SQL基础:从表中检索数据
SELECT从数据库里的一个或多个表中检索行、列和派生值。
基本语法是:
SELECT columns FROM tables [JOIN joins] [WHERE search_conditions] [GROUP BY grouping_columns] [HAVING search_condition] [ORDER BY sort_columns];
本文包含内容:
1.使用SELECT和FROM检索列
2.使用AS创建列的别名
3.使用DISTINCT消除重复的行
4.使用ORDER BY排序行
5.使用WHERE筛选行
6.使用AND、OR和NOT组合及求反条件
7.使用LIKE匹配模式
8.使用BETWEEN进行范围筛选
9.使用IN进行列表筛选
10.使用IS NULL测试空值
1.使用SELECT和FROM检索列
SELECT column(s) FROM table;
从一个表中检索列,可以是一列、多列或全部的列。
FROM子句指定从中提取列的表。
检索多个列:多个列的名称以逗号分隔,列将按照在columns中给出的顺序显示,而不是按照表中定义的顺序显示。
从一个表中检索全部的列:
SELECT * FROM table;
检索全部的列时,列将按照在table中定义的顺序显示。
从一个表中确定列的操作,称为投影。
2.使用AS创建列的别名
在查询结果中,列的标题使用默认值,即表中定义的列名。
列的别名是为了控制在结果中列的标题如何显示而指定的另一个名称(标识符)。
在SELECT语句的SELECT子句中,列的别名直接跟在列名的后面。如果别名是保留关键字或者包含空格、标点或特殊字符,则用单引号或双引号将别名括起来。
SELECT column1 [AS] alias1, column2 [AS] alias2, … columnN [AS] aliasN FROM table;
很多时候,关键字AS是可选的,但应该始终使用它,并用对别名加双引号,以使SQL代码更具有可移植性和可读性。
3.使用DISTINCT消除重复的行
SELECT DISTINCT columns FROM table;
如果包含多列,则所有列值的组合决定了行的唯一性。
虽然空值是未知的,彼此绝不相等,但是DISTINCT认为所有的空值是彼此相等的。
无论遇到多少个空值,SELECT DISTINCT在结果中只返回一个空值。
SELECT语句的语法包括ALL关键字选项,但在实际中很少看到,因为它是默认行为:显示所有的行。
语法关系是:
SELECT [ALL | DISTINCT] columns FROM table;
4.使用ORDER BY排序行
查询结果中行是无序的,因此行可以按任意顺序显示。
ORDER BY经常是SELECT子句中最后一个子句。
1.按一列排序
SELECT columns FROM table ORDER BY sort_column [ASC | DESC]
columns是一个或多个以逗号分隔的列名,sort_column是在其上对结果进行排序的列的列名。
ASC为升序,DESC为降序。
如果没有指定排序的方向,则默认为升序。
2.按多列排序
SELECT columns FROM table ORDER BY sort_column1 [ASC | DESC] sort_column2 [ASC | DESC] … sort_columnN [ASC | DESC]
行首先按sort_column1排序,然后对sort_column1中值相等的行再按sort_column2中的值排序,以此类推。
3.排序时还可以指定列的序号:
SELECT columns FROM table ORDER BY sort_num1 [ASC | DESC] sort_num2 [ASC | DESC] … sort_numN [ASC | DESC]
sort_num1, sort_num2, sort_numN是在1和columns列数之间的整数。
每一个整数指定了某一列在columns中的相对位置。
排序和空值
排序是SQL违反空值不等于任何其他值(包括其他空值)概念的情形之一。
当空值被排序时,它们被认为是彼此相等的。
在排序列中的空值是第一个还是最后一个被列出,这依赖于DBMS。
5.使用WHERE筛选行
可以使用WHERE子句从结果中筛选想要的行。
在WHERE子句里指定查询条件,查询条件有一个或多个需要被表中的行满足的条件。
条件或断言是一个值为true、false或者unknown的逻辑表达式。
条件为true的行出现在结果中;条件为假或未知的被排除在外。
条件和操作符:
比较 =、<>(不等于)、<、<=、>、>=
模式匹配 LIKE
范围筛选 BETWEEN
列表筛选 IN
空值测试 IS NULL
使用比较筛选行:
SELECT columns FROM table WHERE test_column op value;
test_column是表中的列的名称,不是必须在columns中列出,op是一个比较操作符。
在SELECT语句中,将WHERE子句放在ORDER BY子句之前(在两者都要出现的时候)。
空值表示未知,不和任何内容(甚至另一个空值)匹配。在比较中,包含空值的行将不在结果中。
比较的左边项和右边项都可以是表达式。普通的表达形式为:
expr1 op expr2
如果在SELECT子句中给列定义了别名,不能在WHERE子句中引用它,因为WHERE子句是在SELECT子句之前计算的。
从表中选择特定行的操作,称为限制。
6.使用AND、OR和NOT组合及求反条件
可以在单个的WHERE子句中定义多个条件,也就是说,可以基于在多个列中的值检索行。
AND、OR和NOT是逻辑操作符,使用它们可以构造复合条件。
SQL使用三值逻辑(three-value logic,3VL),在三值逻辑中,逻辑表达式的结果是true、false和unknown。
如果复合条件的结果是false或unknown,行将被排斥在结果之外。
当复合条件表达式中使用多个逻辑操作符时,使用优先规则确定哪一个操作符先运算,NOT是最先计算的,然后是AND,最后才是OR。可以使用圆括号改变这个顺序:圆括号内的先运算。
注意AND和OR的计算遵循短路原则,所以如果将为真可能性相对较小的条件放在AND操作符的左边和OR操作符的右边(为真可能性大的放在OR的左边),查询将会变快。
如果条件有相同的可能性,首先放置复杂度最小的表达式。
7.使用LIKE匹配模式
可以使用LIKE依据部分信息检索行。
如果不知道精确值或者想用类似值检索行,那么可以使用LIKE。
LIKE条件的主要特点如下:
LIKE只对字符串起作用,对数字或日期不起作用。
LIKE使用匹配对照值的模式。模式是被引起来的包含要匹配的字面量的字符串及通配符的结合。
通配符是用于匹配部分值的特殊字符:
百分号%匹配零个或多个字符串;
下划线_匹配任意一个字符。
通过匹配模式筛选行:
SELECT columns FROM table WHERE test_column [NOT] LIKE ‘pattern’;
test_column是table中的列名(不是必须在columns中列出),pattern是和test_column中的值相比较的模式。
NOT LIKE检索不匹配pattern的行。
匹配转义符
使用关键字ESCAPE可以定义转义符。紧挨在通配符之前的转义符出除去了通配符的特殊含义。
例如,如果定义!为转义符,那么!%可以被用来查找%。
SELECT columns FROM table WHERE test_column [NOT] LIKE ‘pattern’ ESCAPE ‘escape_char’;
escape_char是单个字符,在pattern中跟在escape_char之后的单个字符将被解释为字面量,escape_char本身不是查找模式的一部分。
test_column可以是一个表达式。
在模式不包含通配符的情况下,LIKE和=一样,NOT LIKE和<>一样。
但是,对于LIKE考虑尾部的空格,而=不考虑。如果这点不重要,=比LIKE要快。
SQL标准对于正则表达式的匹配使用SIMILAR操作符。
8.使用BETWEEN进行范围筛选
使用BETWEEN确定给定值是否落在特定的范围之内。
BETWEEN条件的主要特点如下:
BETWEEN条件适用于字符串、数字和日期。
BETWEEN范围包含用AND分隔的低端值和高端值,低端值必须小于或等于高端值。它可以用AND改写。
要指定不包含端点的排他范围,使用>和<比较。
可以用NOT BETWEEN否定BETWEEN条件。
可以用AND和OR将BETWEEN条件和其他条件组合。
使用范围筛选行:
SELECT columns FROM table WHERE test_column [NOT] BETWEEN low_value AND high_value;
test_column是表中的列名(不是必须在columns中列出),test_column也可以是表达式。
9.使用IN进行列表筛选
用IN确定给定值是否匹配指定列表中的值。
IN可以处理字符串、数字、日期等。
IN列表是由一个或多个逗号分隔、加上括号的值的列表。这个列表的项不需要特定的顺序。
IN可以用OR改写。
可以用AND和OR将IN条件和其他条件组合。
使用列表筛选行:
SELECT columns FROM table WHERE test_column [NOT] IN (value1, value2,…);
test_column是表中的列名(不是必须在columns中列出),test_column也可以是表达式。
value1, value2是和test_column中的值比较的,一个或多个逗号分隔的值。
为了加快速度,应首先列出最可能出现的值。
10.使用IS NULL测试空值
空值表示缺失或者未知的值。
这种情况引发一个问题:因为未知的值不能满足特定条件,所以LIKE、BETWEEN、IN和其他的WHERE子句条件不能发现空值。
空值不与其他值匹配——即使是其他空值。
不能使用=或<>去测试一个值是否为空值。
SQL提供了IS NULL来确定给定值是否为空值。
IS NULL条件的主要特点如下:
IS NULL可以应用于任意数据类型的列。
可以用IS NOT NULL否定IS NULL。
可以用AND和OR将IS NULL条件和其他条件组合。
使用空值或非空值检索行:
SELECT columns FROM table WHERE test_column IS [NOT] NULL;
test_column是表中的列名(不是必须在columns中列出),test_column也可以是表达式。
参考资料
《SQL基础教程(第3版)》第四章