共计 7210 个字符,预计需要花费 19 分钟才能阅读完成。
体验简介
本试验提供一台根底环境为 CentOS 的 ECS(云服务器)实例,点击体验。
咱们将会在这台服务器上安装 mysql,而后学习根本的 SQL 语句。
体验此场景后,能够把握的常识有:
- MySQL 装置。
- 根本 SQL 语句的应用。
背景常识
- SQL:
结构化查询语言(Structured Query Language)简称 SQL,是一种数据库查问和程序设计语言,用于存取数据以及查问、更新和治理关系数据库系统。
- 数据查询语言(Data Query Language,简称 DQL):其语句也称为“数据检索语句”,用以从表中取得数据,确定数据怎么在应用程序给出。保留字 SELECT 是 DQL(也是所有 SQL)用得最多的动词,其余 DQL 罕用的保留字有 WHERE、ORDER BY、GROUP BY 和 HAVING。这些 DQL 保留字常与其余类型的 SQL 语句一起应用。
- 数据操作语言(DML:Data Manipulation Language):其语句包含动词 INSERT、UPDATE 和 DELETE。它们别离用于增加、批改和删除。
- 事务管制语言(TCL):它的语句能确保被 DML 语句影响的表的所有行及时得以更新。包含 COMMIT(提交)命令、SAVEPOINT(保留点)命令、ROLLBACK(回滚)命令。
- 数据管制语言(DCL):它的语句通过 GRANT 或 REVOKE 实现权限管制,确定单个用户和用户组对数据库对象的拜访。某些 RDBMS 可用 GRANT 或 REVOKE 管制对表单个列的拜访。
- 数据定义语言(DDL):其语句包含动词 CREATE、ALTER 和 DROP。DDL 语句用于在数据库中创立新表、批改、删除表(CREATE TABLE 或 DROP TABLE)、为表退出索引等。
- 指针管制语言(CCL):它的语句包含 DECLARE CURSOR、FETCH INTO 和 UPDATE WHERE CURRENT,用于对一个或多个表独自行的操作。
- 云服务器 ECS:
云服务器(Elastic Compute Service,简称 ECS)是阿里云提供的性能卓越、稳固牢靠、弹性扩大的 IaaS(Infrastructure as a Service)级别云计算服务。云服务器 ECS 免去了您洽购 IT 硬件的后期筹备,让您像应用水、电、天然气等公共资源一样便捷、高效地应用服务器,实现计算资源的即开即用和弹性伸缩。阿里云 ECS 继续提供创新型服务器,解决多种业务需要,助力您的业务倒退。
装置并配置 MySQL
\1. 顺次执行如下命令,下载并装置 MySQL。
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server --nogpgcheck
返回如下后果,示意 MySQL 装置胜利。
\2. 执行如下命令,启动 MySQL 数据库。
systemctl start mysqld.service
\3. 执行如下命令,查看 MySQL 运行状态。
systemctl status mysqld.service
返回如下后果,示意 MySQL 失常运行。
\4. 执行如下命令,查看 MySQL 初始密码。
grep "password" /var/log/mysqld.log
返回如下后果。
\5. 执行如下命令,登录数据库。
mysql -uroot -p
返回如下后果,输出 MySQL 初始密码。
返回如下后果,示意登录胜利。
\6. 执行如下命令,批改 MySQL 默认明码。
阐明
- 您须要将上面命令中的 NewPassWord1. 批改为您要设置的数据库明码。
- 设置的新密码必须同时蕴含大小写英文字母、数字和特殊符号中的三类字符,否则会因为明码过于简略报错。
- 留神每条残缺的 SQL 命令结尾都有一个半角分号(;),如果多行命令两头没有分号分隔,这些命令将不会执行,直至遇到一个分号。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassWord1.';
\7. 顺次执行如下命令,退出 MySql 从新登录。
exit
mysql -uroot -p
创立数据库和创立数据表
\1. 应用 create 命令创立数据库,语法如下:
create DATABASE 数据库名;
执行如下命令,创立数据库 Test。
create DATABASE Test;
\2. 执行如下命令,查看以后数据库列表,即可看到创立的 Test 数据库。
show databases;
\3. 执行如下命令,连贯 Test 数据库。
阐明
执行如下命令后,您就曾经胜利抉择了 Test 数据库,您的后续所有操作都会在 Test 数据库中执行。
use Test;
\4. 创立 MySQL 数据表。
创立 MySQL 数据表时须要以下相干信息:
- 表名。
- 表字段名。
- 定义每个表字段。
创立数据表的 SQL 通用语法:
CREATE TABLE table_name(column_name column_type);
执行如下命令,在 Test 数据库中创立数据表 web。
CREATE TABLE `web` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL DEFAULT ''COMMENT' 站点名称 ',
`url` varchar(255) NOT NULL DEFAULT '',
`rank` int(11) NOT NULL DEFAULT '0' COMMENT '排名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
\5. 执行如下命令,查看数据库 Test 下的所有数据表。
show tables;
SQL 的增删改查
\1. 应用 INSERT INTO 语句。
INSERT INTO 语句用于向表中插入新记录。INSERT INTO 语句能够有两种编写模式。
第一种模式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种模式须要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
执行如下命令,向 web 表中插入五条数据。
INSERT INTO `web` VALUES ('1', '阿里云', 'https://www.aliyun.com/','123'), ('2', '淘宝', 'https://www.taobao.com/','1'), ('3', '帮忙核心', 'https://help.aliyun.com/','112'), ('4', '开发者社区', 'https://developer.aliyun.com/','213'), ('5', '体验实验室', 'https://developer.aliyun.com/adc/labs/',456);
\2. 应用 SELECT 语句。
SELECT 语句用于从数据库中选取数据,并将选取的数据存储在一个后果表中,称为后果集。SQL 的 SELECT 语法如下。
第一种模式语法如下,示意从表(table_name)中查问某些字段(column_name)。
SELECT column_name,column_name
FROM table_name;
第二种模式语法如下,示意从表(table_name)中查问所有字段。
SELECT * FROM table_name;
a. 执行如下命令,从 ”web” 表中查问 ”name” 和 ”url” 列。
SELECT name,url FROM web;
返回后果如下。
b. 执行如下命令,从 ”web” 表中查问所有的列。
SELECT * FROM web;
返回后果如下。
\3. 应用 UPDATE 语句。
UPDATE 语句用于更新表中已存在的记录。SQL 的 UPDATE 语法如下,示意在表(table_name)中,如果某列(some_column)取值为特定值(some_value),则将 column 更新成 value。
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
留神:
应用 UPDATE 语句时请留神设置 WHERE 子句。如果您省略了 WHERE 子句,会将数据表中所有的数据都更新。
执行如下命令,把 name 为 ” 阿里云 ” 的数据的 rank 更新为 5。
UPDATE web SET rank='5' WHERE name='阿里云';
b. 执行如下命令,查问所有数据。
SELECT * FROM web;
返回后果如下,您能够看到数据曾经被更新。
\4. 应用 DELETE 语句。
DELETE 语句用于删除表中的行。SQL 的 DELETE 语法如下。
DELETE FROM table_name
WHERE some_column=some_value;
留神:
WHERE 子句规定哪条记录或者哪些记录须要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
a. 执行如下 SQL 语句,向 web 表中插入一条数据。
INSERT INTO web(name, url, rank)
VALUES ('新手入门','https://help.aliyun.com/learn/getting-started.html','789');
b. 执行如下 SQL 语句,查问所有数据,您能够看到新增的数据。
select * from web;
c. 执行如下 SQL 语句,从 web 表中删除 name 为新手入门的数据。
DELETE FROM web WHERE name='新手入门';
d. 执行如下 SQL 语句,查问所有数据,您能够看到数据曾经删除。
select * from web;
SQL 的 AND 和 OR 运算符
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
\1. 应用 AND 运算符。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
执行如下 SQL 语句,从 web 表中选取 id 为 1 且 rank 大于 2 的数据:
SELECT * FROM web WHERE id= '1' AND rank > 2;
返回的后果如下。
\2. 应用 OR 运算符。
如果第一个条件和第二个条件中只有有一个成立,则 OR 运算符显示一条记录。
执行如下 SQL 语句,从 web 表中选取 rank 大于 300 的或 name 为阿里云的数据:
SELECT * FROM web WHERE rank > 300 OR name = '阿里云';
返回的后果如下。
SQL 的 ORDER BY 关键字
ORDER BY 关键字用于对后果集依照一个列或者多个列进行排序。
ORDER BY 关键字默认依照升序对记录进行排序。如果须要依照降序对记录进行排序,您能够应用 DESC 关键字。ORDER BY 语法如下。
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
\1. 应用 ORDER BY。
执行如下 SQL 语句,从 web 表中选取所有数据,并依照 rank 列排序。
SELECT * FROM web ORDER BY rank;
返回后果如下。
\2. 应用 ORDER BY DESC。
执行如下 SQL 语句,从 web 表中选取所有数据,并依照 rank 列降序排序。
SELECT * FROM web ORDER BY rank DESC;
返回后果如下。
\3. 应用 ORDER BY 多列。
执行如下 SQL 语句,查问 web 表中选取所有数据,并依照 rank 列降序排序。
SELECT * FROM web ORDER BY name,rank;
返回后果如下。
SQL 函数阐明
\1. 应用 AVG() 函数。
AVG() 函数返回数值列的平均值。AVG() 语法如下。
SELECT AVG(column_name) FROM table_name
SELECT AVG(column_name) FROM table_name;
a. 执行如下 SQL 语句,在 Test 数据库中创立数据表 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;
b. 执行如下 SQL 语句,向数据表 access_log 插入数据。
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');
c. 执行如下 SQL 语句,从 access_log 数据表的 count 列获取平均值。
SELECT AVG(count) AS CountAverage FROM access_log;
返回后果如下。
\2. 应用 COUNT() 函数。
COUNT() 函数返回匹配指定条件的行数。COUNT() 函数有三种语法,如下所示。
COUNT(column_name) 语法:COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)。
SELECT COUNT(column_name) FROM table_name;
COUNT() 语法 COUNT():函数返回表中的记录数。
SELECT COUNT(*) FROM table_name;
COUNT(DISTINCT column_name) 语法:COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目。
SELECT COUNT(DISTINCT column_name) FROM table_name;
测试方法如下:
a. 执行如下 SQL 语句,计算 access_log 数据表中 site_id= 3 的总访问量。
SELECT COUNT(count) AS nums FROM access_log WHERE site_id=3;
返回后果如下。
b. 执行如下 SQL 语句,计算 access_log 数据表中总记录数。
SELECT COUNT(*) AS nums FROM access_log;
返回后果如下。
c. 执行如下 SQL 语句,计算 access_log 数据表中不同 site_id 的记录数。
SELECT COUNT(DISTINCT site_id) AS nums FROM access_log;
返回后果如下。
\3. 应用 MAX() 函数。
MAX() 函数返回指定列的最大值。MAX() 语法 如下。
SELECT MAX(column_name) FROM table_name;
执行如下 SQL 语句,获取 web 数据表中 rank 列的最大值。
SELECT MAX(rank) AS max_rank FROM web;
\4. 应用 MIN() 函数。
MIN() 函数返回指定列的最小值。MIN() 语法 如下。
SELECT MIN(column_name) FROM table_name;
执行如下 SQL 语句,获取 web 数据表中 rank 列的最小值。
SELECT MIN(rank) AS min_rank FROM web;
返回后果如下。
\5. 应用 SUM() 函数。
SUM() 函数返回数值列的总数。SUM() 语法 如下。
SELECT SUM(column_name) FROM table_name。
执行如下 SQL 语句,获取 access_log 数据表的 count 字段的总数。
SELECT SUM(count) AS nums FROM access_log;
\6. 应用 GROUP BY 语句。
GROUP BY 语句用于联合聚合函数,依据一个或多个列对后果集进行分组。GROUP BY 语法如下。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
执行如下 SQL 语句,获取 access_log 数据表各个 site_id 的访问量。
SELECT site_id, SUM(access_log.count) AS nums
FROM access_log GROUP BY site_id;
\7. 应用 EXISTS 运算符。
EXISTS 运算符用于判断查问子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。EXISTS 语法 如下。
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
执行如下 SQL 语句,查找查找 count 字段大于 200 的网站是否存在。
SELECT web.name, web.url
FROM web
WHERE EXISTS (SELECT count FROM access_log WHERE web.id = access_log.site_id AND count > 200);