- 多条语句必须以分号分隔
- SQL语句不区分大小写
检索数据
检索单个列
SELECT 列名 FROM 表名;
结果将返回所有行的该列字段。
检索多个列
在SELECT关键字后面给出多个列名,列名之间以逗号分隔。
SELECT 列名1,列名2,列名3 FROM 表名;
检索所有列
在实际列名的位置使用*通配符即可检索所有列。
SELECT * FROM 表名;
检索不同的值
如果希望过滤掉相同的值,只返回不同(唯一)的值,则使用DISTINCT关键字,放在列名前面:
SELECT DISTINCT 列名 FROM 表名;
在应用于多个列时,DISTINCT关键字应用于所有指定的列。
限制结果
SELECT语句返回指定表中所有匹配的行,很可能是每一行。
如果只想返回特定数量的行,在MySQL中要使用LIMIT子句:
SELECT 列名 FROM 表名 LIMIT 数量;
OFFSET关键字用于指定从什么位置开始检索:
SELECT 列名 FROM 表名 LIMIT 数量 OFFSET 起始位置;
比如limit 5 offset 5表示返回从第六行开始的五行数据。
- 注意,offset指定的偏移量从0开始计数,因此limit 1 offset 1会检索第二行。
- 可以使用简化语法
LIMIT 3,4
,逗号之前的值对应OFFSET,逗号后面的值对应LIMIT
使用注释
注释的形式是两个连字符:--
多行注释则是/* */
,这种方式常用于注释代码。
排序检索数据
排序数据
单纯使用上面提到过的SELECT语句返回的数据不保证顺序。
为了明确地排序用SELECT语句检索出的语句,可使用ORDER BY子句。
ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
SELECT 列名 FROM 表名 ORDER BY 列名;
注意ORDER BY子句一定是SELECT语句中最后一条语句,否则会报错。
ORDER BY子句中使用的列可以是非检索列,而不一定是指定的列。
按多个列排序
经常需要按不止一个列进行数据排序。
要按多个列排序,简单指定列名,列名之间用逗号分开即可。
SELECT 列名1,列名2 FROM 表名 ORDER BY 列名2,列名3;
这将会首先按列名2排序,然后按列名3排序。
按列位置排序
ORDER BY还支持按相对列位置进行排序。
即指出的是列的相对位置而不是列名。
ORDER BY 2
表示按SELECT清单中的第二个列进行排序。
ORDER BY 2,3
表示首先按SELECT清单中的第二个列进行排序,然后按第三个列进行排序。
这一技术的好处在于不用重新输入列名。但是对于不在SELECT清单中列无法依据其进行排序。
指定排序方向
默认的排序顺序是升序,还可以利用关键字DESC设置降序排序。
SELECT 列名 FROM 表名 ORDER BY 列名 DESC;
如果依据多个列进行排序,DESC只应用于位于其前面的列名:
SELECT 列名1,列名2 FROM 表名 ORDER BY 列名2 DESC,列名3;
在这个例子中,首先依据列名2倒序排序,然后按列名3升序排序。
如果想再多个列上进行降序排序,必须对每一列指定DESC关键字。
过滤数据
使用where子句
在SELECT语句中,数据根据where子句中指定的搜索条件进行过滤。
WHERE子句在FROM子句之后给出:
SELECT 列名 FROM 表名 WHERE 列名 = 值;
这个示例使用了简单的相等检验,检验这一列的值是否等于指定值。
where子句操作符
where子句支持以下操作符:
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
BETWEEN 在指定的两个值之间
IS NULL 为null值
要检查范围值,可以应用BETWEEN操作符:
SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
使用BETWEEN时,必须指定两个值:最低值和最高值。这两个值用AND分隔。BETWEEN匹配范围内的所有值,包括指定的开始值和结束值。
当表中某一个列不包含值时,称其包含空值NULL,这与包含0、空字符串或空格不同。
要确定是否为空值,不能简单地检查是否=NULL,而可以利用IS NULL子句:
SELECT 列名 FROM 表名 WHERE 列名 IS NULL;
高级数据过滤
组合where子句
上一节的WHERE子句在过滤数据是使用的都是单一的条件,为了进行更强的过滤控制,SQL允许给出多个WHERE子句,这些子句以AND或OR的方式使用。
AND操作符
要通过不止一个列进行过滤,可以使用AND操作符给WHERE子句附加条件:
SELECT 列名 FROM 表名 WHERE 列名1 = 值1 AND 列名2 <= 值2;
多个过滤条件之间都要用AND关键字连接。
只有满足所有过滤条件才会被返回。
OR操作符
OR操作符指示只要满足任一条件即可:
SELECT 列名 FROM 表名 WHERE 列名1 = 值1 OR 列名2 >= 值2;
求值顺序
WHERE子句可以包含任意数目的AND和OR操作符。
而对于组合过滤条件的求值顺序,AND拥有更高的优先级。
为了改变求值顺序可以使用圆括号进行分组。
IN操作符
IN操作符用于指定条件范围,范围中的每个条件都可以进行匹配。
IN操作符取一组由逗号分隔,括在圆括号中的合法值。
SELECT 列名 FROM 表名 WHERE 列名1 IN (值1,值2);
其实IN操作符完成了和OR操作符相同的功能,下面的语句与上面的语句完成相同的工作:
SELECT 列名 FROM 表名 WHERE 列名1 = 值1 OR 列名1 = 值2;
但是使用IN操作符有一系列好处:
- 当有很多合法选项时,IN操作符更直观
- IN操作符一般比一组OR操作符执行得更快
- IN的最大优点是可以包含其他SELECT语句,能够动态建立WHERE子句。
NOT操作符
WHERE子句中的NOT操作符用来否定其后所跟的任何条件。
SELECT 列名 FROM 表名 WHERE NOT 列名1 = 值1;
用通配符进行过滤
LIKE操作符
为了在搜索子句中使用通配符,必须使用LIKE操作符。LIKE操作符指示后面的是通配符匹配模式而不是简单地相等匹配。
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
百分号%通配符
最常用的通配符是%。在搜索串中,%表示任何字符出现任意次数。
例如,为了寻找以FISH开头的产品,可以使用以下SELECT子句:
SELECT 列名 FROM 表名 WHERE 列名1 LIKE 'FISH%';
通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符:
SELECT 列名 FROM 表名 WHERE 列名1 LIKE '%bean bag%';
搜索模式’%bean bag%’表示匹配任何位置上包含文本bean bag的值。
通配符也可以出现在搜索模式中间:
SELECT 列名 FROM 表名 WHERE 列名1 LIKE 'F%y';
上面的句子将找出所有以F开头、以y结尾的数据。
下划线_通配符
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。
SELECT 列名 FROM 表名 WHERE 列名1 LIKE '__ inch teddy bear';
两个下划线表示两个字符,因此8 inch teddy bear这样的数据是不会被返回的。
方括号[]通配符
方括号通配符用来指定一个字符集,它必须匹配指定位置的一个字符。
SELECT 列名 FROM 表名 WHERE 列名1 LIKE '[JM]%';
这样会匹配以J或M开头的数据。
这个通配符可以使用前缀字符^来否定。
例如,下面的语句匹配所有以J和M开头之外的数据:
SELECT 列名 FROM 表名 WHERE 列名1 LIKE '[^JM]%';
使用通配符的技巧
通配符会比其他搜索耗费更长的处理时间。
- 不要过度使用通配符。如果其他操作符能达到相同目的,应该使用其他操作符。
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处,这样搜索起来是最慢的。
创建计算字段
有时我们可能希望直接从数据库中检索出转换、计算或格式化过的数据,这时就需要使用计算字段了。
拼接字段
假设我们需要一个由两个字段组合而成的数据,那么就要在SELECT语句中用一个特殊的操作符来拼接两个列。
SELECT Concat(列名1,列名2) FROM 表名;
也可以加上更多辅助的字符:
SELECT Concat(列名1,'(',列名2,')') FROM 表名;
使用别名
新拼接出的字段没有名字,SQL支持赋予别名:
SELECT Concat(列名1,'(',列名2,')') AS 别名 FROM 表名;
执行算术计算
计算字段的另一常见用途就是对检索出的数据进行算术运算。
SELECT 列名1,列名2,列名1*列名2 AS 别名 FROM 表名
可以使用加减乘除这四种算术操作符。