1.WHERE子句
WHERE子句用于提取满足指定标准的记录。
SELECT column_name,column_nameFROM table_nameWHERE column_name operator value;
执行如下SQL语句,从Websites表中选取国家为CN的所有网站。
SELECT * FROM Websites WHERE country='CN';
WHERE子句中的文本字段和数值字段。
在SQL语句的WHERE子句中,文本字段使用单引号来环绕文本值(大部分数据库系统也接受双引号)。在上个示例中'CN'文本字段使用了单引号。如果是数值字段,请不要使用引号。
执行如下SQL语句,从Websites表中选取id为1的网站。
SELECT * FROM Websites WHERE id=1;
WHERE子句中的运算符。
下方的运算符可以在WHERE字句中使用。
= 等于
<> 或者!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
IN 指定针对某个列的多个可能值
2.AND和OR运算符
AND和OR运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则AND运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。
AND运算符的示例
执行如下SQL语句,从Websites表中选取国家为CN且rank排名大于50的所有网站。
SELECT * FROM Websites WHERE country='CN'AND rank > 50;
OR运算符的示例
执行如下SQL语句,从Websites表中选取国家为USA或者CN的所有客户。
SELECT * FROM Websites WHERE country='USA'OR country='CN';
结合AND和OR运算符的示例
执行如下SQL语句,从Websites表中选取rank排名大于15且国家为CN或USA的所有网站。
SELECT * FROM Websites WHERE rank > 15 AND (country='CN' OR country='USA');
3.SELECT TOP, LIMIT, ROWNUM子句
SELECT TOP, LIMIT, ROWNUM子句用于规定要返回的记录的数目。其中,SELECT TOP子句适用于SQL Server数据库,SELECT LIMIT子句适用于MySQL数据库,SELECT ROWNUM适用于Oracle。
SELECT LIMIT子句的语法。
SELECT column_name(s)FROM table_nameLIMIT number;
执行如下SQL语句,从Websites表中选取选取头两条记录。
SELECT * FROM Websites LIMIT 2;
4.LIKE操作符
LIKE操作符用于在WHERE子句中搜索列中的指定模式。
LIKE操作符的语法:
SELECT column_name(s)FROM table_nameWHERE column_name LIKE pattern;
LIKE操作符的示例:
执行如下SQL语句,从Websites表中选取name列以字母G开始的所有网站。
说明:%符号用于在模式的前后定义通配符(缺省字母)。您将在下一步骤中学习更多有关通配符的知识。
SELECT * FROM WebsitesWHERE name LIKE 'G%';
执行如下SQL语句,从Websites表中选取name列以字母k"结尾的所有网站。
SELECT * FROM WebsitesWHERE name LIKE '%k';
执行如下SQL语句,从Websites表中选取name列包含模式oo的所有网站。
SELECT * FROM WebsitesWHERE name LIKE '%oo%'
通过使用NOT关键字,您可以选取不匹配模式的记录。执行如下SQL语句,从Websites表中选取name列不包含模式oo的所有网站。
SELECT * FROM WebsitesWHERE name NOT LIKE '%oo%';
4.通配符
通配符可用于替代字符串中的任何其他字符。
在SQL中,通配符与SQL LIKE操作符一起使用。SQL通配符用于搜索表中的数据。
% 替代0个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或[!charlist] 不在字符列中的任何单一字符
使用%通配符。
执行如下命令,选取url以字母https开始的所有网站。
SELECT * FROM WebsitesWHERE url LIKE 'https%';
执行如下命令,选取url包含字母oo的所有网站。
SELECT * FROM WebsitesWHERE url LIKE '%oo%';
使用_通配符。
执行如下命令,选取name以一个任意字符开始,然后是oogle的所有网站。
SELECT * FROM WebsitesWHERE name LIKE '_oogle';
执行如下命令,选取name以字母G开始,然后是一个任意字符,然后是字母o,然后是一个任意字符,然后是字母le的所有网站。
SELECT * FROM WebsitesWHERE name LIKE 'G_o_le';
使用[charlist]通配符。说明:MySQL中使用REGEXP或NOT REGEXP运算符(或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
执行如下命令,选取name以G、F或s开始的所有网站。
SELECT * FROM WebsitesWHERE name REGEXP '^[GFs]';
执行如下命令,选取name不以A到H字母开头的网站。
SELECT * FROM WebsitesWHERE name REGEXP '^[^A-H]';
5.IN操作符
IN操作符允许您在WHERE子句中规定多个值。
IN操作符的语法:
SELECT column_name(s)FROM table_nameWHERE column_name IN (value1,value2,...);
IN操作符的示例:
执行如下语句,选取name为Google或淘宝的所有网站。
SELECT * FROM WebsitesWHERE name IN ('Google','淘宝');
6.BETWEEN操作符
BETWEEN操作符选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。
BETWEEN操作符的语法:
SELECT column_name(s)FROM table_nameWHERE column_name BETWEEN value1 AND value2;
BETWEEN操作符的示例。
执行如下语句,选取rank介于1和20之间的所有网站。
SELECT * FROM WebsitesWHERE alexa BETWEEN 1 AND 20;
NOT BETWEEN操作符实例。
执行如下语句,选取rank不介于1和20之间的所有网站。
SELECT * FROM WebsitesWHERE alexa NOT BETWEEN 1 AND 20;
带有IN的BETWEEN操作符实例。
执行如下语句,选取rank介于1和20之间但country不为USA所有网站。
SELECT * FROM WebsitesWHERE (rank BETWEEN 1 AND 20)AND NOT country IN ('USA');
带有文本值的BETWEEN操作符实例。
执行如下语句,选取name以介于A和H之间字母开始的所有网站。
SELECT * FROM WebsitesWHERE name BETWEEN 'A' AND 'H';
带有文本值的NOT BETWEEN 操作符实例。
执行如下语句,选取name不介于A和H之间字母开始的所有网站。
SELECT * FROM WebsitesWHERE name NOT BETWEEN 'A' AND 'H';
带有日期值的BETWEEN 操作符实例。
执行如下语句,创建一个网站访问记录表,并插入数据,然后选取date介于2016-05-10'和2016-05-14之间的所有访问记录。
DROP TABLE IF EXISTS `access_log`;
CREATE TABLE `access_log` ( `aid` int(11) NOT NULL AUTO_INCREMENT, `site_id` int(11) NOT NULL DEFAULT '0' COMMENT '网站id', `count` int(11) NOT NULL DEFAULT '0' COMMENT '访问次数', `date` date NOT NULL, PRIMARY KEY (`aid`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
INSERT INTO `access_log` VALUES ('1', '1', '45', '2016-05-10'), ('2', '3', '100', '2016-05-13'), ('3', '1', '230', '2016-05-14'), ('4', '2', '10', '2016-05-14'), ('5', '5', '205', '2016-05-14'), ('6', '4', '13', '2016-05-15'), ('7', '3', '220', '2016-05-15'), ('8', '5', '545', '2016-05-16'), ('9', '3', '201', '2016-05-17');
SELECT * FROM access_logWHERE date BETWEEN '2016-05-10' AND '2016-05-14';
7.UNION操作符
UNION操作符合并两个或多个SELECT语句的结果集。
请注意,UNION内部的每个SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个SELECT语句中的列的顺序必须相同。
UNION操作符的语法:
SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2;
UNION操作符的示例:
执行如下语句,创建一个APP数据表,并插入数据,然后从Websites和apps表中选取所有不同的country(只有不同的值)。
CREATE TABLE `apps` ( `id` int(11) NOT NULL AUTO_INCREMENT, `app_name` char(20) NOT NULL DEFAULT '' COMMENT '站点名称', `url` varchar(255) NOT NULL DEFAULT '', `country` char(10) NOT NULL DEFAULT '' COMMENT '国家', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `apps` VALUES ('1', 'QQ APP', 'http://im.qq.com/', 'CN'), ('2', '微博 APP', 'http://weibo.com/', 'CN'), ('3', '淘宝 APP', 'https://www.taobao.com/', 'CN');
SELECT country FROM WebsitesUNIONSELECT country FROM appsORDER BY country;
UNION ALL的示例:
执行如下语句,从Websites和apps表中选取所有的country(也有重复的值)。
SELECT country FROM WebsitesUNION ALLSELECT country FROM appsORDER BY country;
带有WHERE的UNION ALL的示例:
执行如下语句,从Websites和apps表中选取所有的CN的数据(也有重复的值)。
SELECT country, name FROM WebsitesWHERE country='CN'UNION ALLSELECT country, app_name FROM appsWHERE country='CN'ORDER BY country;