SQL进阶之子句、关键字和操作符

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本实验带您学习SQL的子句、关键字和操作符等使用方法。

SQL进阶之子句、关键字和操作符


1. 创建实验资源

开始实验之前,您需要先创建实验相关资源。

在实验室页面,单击创建资源

(可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、用户信息等)。

说明:资源创建过程需要3~5分钟。

2. 连接数据库并创建数据库和数据表

本步骤指导您如何连接ECS实例上的MySQL数据库,并查看实验所使用的数据库和表。


1、执行如下命令,登录数据库。

mysql -uroot -p

2、输入root用户登录密码,密码为Test123!。



返回结果如下,表示登录成功。



3、执行如下SQL语句,查看所有的数据库。

show databases;

返回结果如下,您可查看到MySQL数据库中有五个数据库,其中Test数据库是实验室提前创建好的,后续实

验所有操作都在Test数据库中执行。


4、执行如下SQL语句,选择数据库Test

use Test;

5、执行如下SQL语句,查看所有的表。

show tables;

返回结果如下,您可查看到Test数据库中有一个名为Test表,其中Test表是实验室提前创建好的,后续实验所有操作都在Test表中执行。



6、执行如下SQL语句,查询Test表中所有数据。

select * from Websites;

返回结果如下,您可查看到Test表中所有数据



3、WHERE子句

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

  • WHERE子句的语法:
SELECT column_name,column_nameFROM table_nameWHERE column_name operator value;
  • WHERE子句的示例:

执行如下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字句中使用。

运算符

描述

=

等于

<>

不等于

说明:在SQL的一些版本中,该操作符可被写成!=。

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某个范围内

LIKE

搜索某种模式

IN

制定针对某个列的多个可能值

4. 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');


5. ORDER BY关键字

ORDER BY关键字用于对结果集按照一个列或者多个列进行排序。 

ORDER BY关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用DESC关键字。 

  • ORDER BY的语法:
SELECT column_name,column_nameFROM table_nameORDER BY column_name,column_name ASC|DESC;
  • ORDER BY的示例:

执行如下SQL语句,从Websites表中选取所有网站,并按照rank列排序。

SELECT * FROM Websites ORDER BY rank;


  • ORDER BY DESC的示例:

执行如下SQL语句,从Websites表中选取所有网站,并按照rank列降序排序。

SELECT * FROM Websites ORDER BY rank DESC;


  • ORDER BY多列的示例:

执行如下SQL语句,从Websites表中选取所有网站,并按照country和rank列排序。

SELECT * FROM Websites ORDER BY country,rank;


6. SELECT TOP, LIMIT, ROWNUM子句

SELECT TOP, LIMIT, ROWNUM子句用于规定要返回的记录的数目。其中,SELECT TOP子句适用于SQL Server数据库,SELECT LIMIT子句适用于MySQL数据库,SELECT ROWNUM适用于Oracle。

说明:因本实验安装的是MySQL数据库:,所以以SELECT LIMIT子句为例。

  • SELECT LIMIT子句的语法。
SELECT column_name(s)FROM table_nameLIMIT number;
  • SELECT LIMIT子句的示例:

执行如下SQL语句,从Websites表中选取选取头两条记录。

SELECT * FROM Websites LIMIT 2;


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


8. 通配符

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

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

  • 在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]';

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


10. 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';


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


11. SQL别名

通过使用SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。

  • 列的SQL别名语法:
SELECT column_name AS alias_nameFROM table_name;
  • 表的SQL别名语法:
SELECT column_name(s)FROM table_name AS alias_name;
  • 列的别名示例:

执行如下语句,指定了两个别名,一个是name列的别名,一个是country列的别名。

说明:如果列名称包含空格,要求使用双引号或方括号。

SELECT name AS n, country AS cFROM Websites;


执行如下语句,我们把三个列(url、rank 和 country)结合在一起,并创建一个名为site_info的别名。

SELECT name, CONCAT(url, ', ', rank, ', ', country) AS site_infoFROM Websites


  • 表的别名示例:

执行如下语句,选取阿里云大学的所有访问记录。我们使用Websites和access_log表,并分别为它们指定表别名w和a(通过使用别名让 SQL 更简短)。

SELECT w.name, w.url, a.count, a.date FROM Websites AS w, access_log AS a WHERE a.site_id=w.id and w.name="阿里云大学";


12. UNION操作符

UNION操作符合并两个或多个SELECT语句的结果集。

请注意,UNION内部的每个SELECT语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个SELECT语句中的列的顺序必须相同。

  • UNION操作符的语法:

说明:默认地,UNION操作符选取不同的值。如果允许重复的值,请使用 UNIONALL。

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;


13. SELECT INTO语句

SELECT INTO语句从一个表复制数据,然后把数据插入到另一个新表中。

注意:MySQL数据库不支持SELECT ... INTO语句,但支持INSERT INTO ... SELECT。因本实验使用MySQL数据库,索引本步骤仅供学习参考使用,无需操作。

  • SELECT INTO的语法:

复制所有的列插入到新表中:

SELECT *INTO newtable [IN externaldb]FROM table1;

只复制希望的列插入到新表中:

SELECT column_name(s)INTO newtable [IN externaldb]FROM table1;
  • SELECT INTO的示例:

执行如下语句,创建Websites的备份复件。

SELECT *INTO WebsitesBackupFROM Websites;

执行如下语句,只复制一些列插入到新表中。

SELECT name, urlINTO WebsitesBackupFROM Websites;

执行如下语句,只复制中国的网站插入到新表中。

SELECT *INTO WebsitesBackup2016FROM WebsitesWHERE country='CN';

执行如下语句,复制多个表中的数据插入到新表中。

SELECT Websites.name, access_log.count, access_log.dateINTO WebsitesBackup2016FROM WebsitesLEFT JOIN access_logON Websites.id=access_log.site_id;

14. INSERT INTO SELECT语句

INSERT INTO SELECT语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

  • INSERT INTO SELECT的语法:

从一个表中复制所有的列插入到另一个已存在的表中。

INSERT INTO table2SELECT * FROM table1;

只复制希望的列插入到另一个已存在的表中。

INSERT INTO table2(column_name(s))SELECT column_name(s)FROM table1;
  • INSERT INTO SELECT的示例:

执行如下语句,复制apps表中的数据插入到Websites表中。

INSERT INTO Websites (name, country)SELECT app_name, country FROM apps;


执行如下语句,只复QQ的APP到Websites表中。

INSERT INTO Websites (name, country)SELECT app_name, country FROM appsWHERE id=1;


实验链接:https://developer.aliyun.com/adc/scenario/b84af5d2bfc144489289db0eee9e30fc

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 存储
如何在 SQL Server 中使用 `OUTPUT` 子句
【8月更文挑战第10天】
95 7
如何在 SQL Server 中使用 `OUTPUT` 子句
|
3月前
|
SQL 数据库
|
3月前
|
SQL 数据挖掘 关系型数据库
|
3月前
|
SQL
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
4月前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
53 1
|
4月前
|
SQL 数据库
SQL LIKE 操作符
【7月更文挑战第12天】SQL LIKE 操作符。
35 14
|
4月前
|
SQL Oracle 关系型数据库
SQL SELECT TOP 子句
【7月更文挑战第12天】SQL SELECT TOP 子句。
42 14
|
4月前
|
SQL 数据库
SQL BETWEEN 操作符
【7月更文挑战第14天】SQL BETWEEN 操作符。
40 10
|
4月前
|
SQL
SQL FULL OUTER JOIN 关键字
【7月更文挑战第17天】SQL FULL OUTER JOIN 关键字。
38 6
|
4月前
|
SQL
SQL INNER JOIN 关键字
【7月更文挑战第17天】SQL INNER JOIN 关键字。
40 5