SQL 必知必会(3)——SQL进阶之子句、关键字和操作符

简介: 了解并掌握SQL的子句、关键字和操作符等使用方法

实验地址:https://developer.aliyun.com/adc/scenario/b84af5d2bfc144489289db0eee9e30fc?spm=a2c6h.26876520.0.i1.4f55371cpxFKLt

1.WHERE子句

WHERE子句用于提取满足指定标准的记录。

SELECT column_name,column_nameFROM table_nameWHERE column_name operator value;

执行如下SQL语句,从Websites表中选取国家为CN的所有网站。

SELECT * FROM Websites WHERE country='CN';

image.png

WHERE子句中的文本字段和数值字段。

在SQL语句的WHERE子句中,文本字段使用单引号来环绕文本值(大部分数据库系统也接受双引号)。在上个示例中'CN'文本字段使用了单引号。如果是数值字段,请不要使用引号。

执行如下SQL语句,从Websites表中选取id为1的网站。

SELECT * FROM Websites WHERE id=1;

image.png

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;

image.png

OR运算符的示例

执行如下SQL语句,从Websites表中选取国家为USA或者CN的所有客户。

SELECT * FROM Websites WHERE country='USA'OR country='CN';

image.png

结合AND和OR运算符的示例

执行如下SQL语句,从Websites表中选取rank排名大于15且国家为CN或USA的所有网站。

SELECT * FROM Websites WHERE rank > 15 AND (country='CN' OR country='USA');

image.png

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;

image.png

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%';

image.png

执行如下SQL语句,从Websites表中选取name列以字母k"结尾的所有网站。

SELECT * FROM WebsitesWHERE name LIKE '%k';

image.png

执行如下SQL语句,从Websites表中选取name列包含模式oo的所有网站。

SELECT * FROM WebsitesWHERE name LIKE '%oo%'

image.png

通过使用NOT关键字,您可以选取不匹配模式的记录。执行如下SQL语句,从Websites表中选取name列不包含模式oo的所有网站。

SELECT * FROM WebsitesWHERE name NOT LIKE '%oo%';

image.png

4.通配符

通配符可用于替代字符串中的任何其他字符。

在SQL中,通配符与SQL LIKE操作符一起使用。SQL通配符用于搜索表中的数据。

%                         替代0个或多个字符
_                         替代一个字符
[charlist]                字符列中的任何单一字符
[^charlist][!charlist]  不在字符列中的任何单一字符

使用%通配符。

执行如下命令,选取url以字母https开始的所有网站。

SELECT * FROM WebsitesWHERE url LIKE 'https%';

image.png

执行如下命令,选取url包含字母oo的所有网站。

SELECT * FROM WebsitesWHERE url LIKE '%oo%';

image.png

使用_通配符。

执行如下命令,选取name以一个任意字符开始,然后是oogle的所有网站。

SELECT * FROM WebsitesWHERE name LIKE '_oogle';

image.png

执行如下命令,选取name以字母G开始,然后是一个任意字符,然后是字母o,然后是一个任意字符,然后是字母le的所有网站。

SELECT * FROM WebsitesWHERE name LIKE 'G_o_le';

image.png

使用[charlist]通配符。说明:MySQL中使用REGEXP或NOT REGEXP运算符(或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

执行如下命令,选取name以G、F或s开始的所有网站。

SELECT * FROM WebsitesWHERE name REGEXP '^[GFs]';

image.png

执行如下命令,选取name不以A到H字母开头的网站。

SELECT * FROM WebsitesWHERE name REGEXP '^[^A-H]';

image.png

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','淘宝');

image.png

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;

image.png

NOT BETWEEN操作符实例。

执行如下语句,选取rank不介于1和20之间的所有网站。

SELECT * FROM WebsitesWHERE alexa NOT BETWEEN 1 AND 20;

image.png

带有IN的BETWEEN操作符实例。

执行如下语句,选取rank介于1和20之间但country不为USA所有网站。

SELECT * FROM WebsitesWHERE (rank BETWEEN 1 AND 20)AND NOT country IN ('USA');

image.png

带有文本值的BETWEEN操作符实例。

执行如下语句,选取name以介于A和H之间字母开始的所有网站。

SELECT * FROM WebsitesWHERE name BETWEEN 'A' AND 'H';

image.png

带有文本值的NOT BETWEEN 操作符实例。

执行如下语句,选取name不介于A和H之间字母开始的所有网站。

SELECT * FROM WebsitesWHERE name NOT BETWEEN 'A' AND 'H';

image.png

带有日期值的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';

image.png

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;

image.png

UNION ALL的示例:

执行如下语句,从Websites和apps表中选取所有的country(也有重复的值)。

SELECT country FROM WebsitesUNION ALLSELECT country FROM appsORDER BY country;

image.png

带有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;

image.png

相关文章
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
54 0
|
7月前
11SQL - distinct关键字
11SQL - distinct关键字
22 1
|
6天前
|
SQL 存储 关系型数据库
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
SQL的基本语法以及SQL语句的关键字的使用,SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等。
|
7月前
|
SQL
09SQL - order by关键字
09SQL - order by关键字
25 0
|
6天前
|
SQL XML Java
【JavaEE进阶】 MyBatis之动态SQL
【JavaEE进阶】 MyBatis之动态SQL
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
34 0
|
6天前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶-SQL优化
MySQL性能分析、SQL优化方案
74 1
|
6天前
|
SQL 流计算
在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
【1月更文挑战第4天】【1月更文挑战第18篇】在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
33 1
|
6天前
|
SQL 数据库
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
71 0
|
6天前
|
SQL 数据库
SQL HAVING 子句详解:在 GROUP BY 中更灵活的条件筛选
HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用。
80 0