麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
676
2023-04-09
MySQL 快速教程
MySQL 快速教程将快速向您介绍 MySQL 数据库的基础知识。
世界数据库
MySQL 文档网站提供了一些示例数据库。 我们将使用世界数据库。 数据已过时,但对于我们的测试目的并不重要。
我们使用wget工具下载压缩文件。
$ ls -sh world.sql.gz 92K world.sql.gz
压缩文件大约有 92KB。
$ gunzip world.sql.gz
我们将文件解压缩。 我们有一个world.sql文件。
$ ls -hs world.sql 392K world.sql
未压缩的文件有 392KB。
$ mysql -uroot -p
我们使用根帐户连接到服务器。 我们需要 root 帐户来创建新数据库,并为我们的新数据库的测试帐户授予权限。
mysql> CREATE DATABASE world;
世界数据库已创建。
mysql> USE world;
我们转到世界数据库。 现在,世界数据库是当前数据库。
mysql> source world.sql
我们通过执行world.sql SQL 脚本来构建世界数据库的表。 需要一些时间。
mysql> GRANT ALL ON world.* TO 'user12'@'localhost';
我们向user12授予对世界数据库的所有对象的特权。
mysql> quitBye$ mysql -u user12 -pEnter password: mysql> USE world;
我们退出连接。 重新连接user12测试帐户并更改为 world 数据库。 我们准备工作。
检查数据库
在本节中,我们将大致看一下 world 数据库的表。
mysql> SHOW TABLES;+-----------------+| Tables_in_world |+-----------------+| city || country || countrylanguage |+-----------------+3 rows in set (0,00 sec)
我们用SHOW TABLES语句显示所有可用表。 有三种。
mysql> DESCRIBE city;+-------------+----------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-------------+----------+------+-----+---------+----------------+| ID | int(11) | NO | PRI | NULL | auto_increment || Name | char(35) | NO | | | || CountryCode | char(3) | NO | MUL | | || District | char(20) | NO | | | || Population | int(11) | NO | | 0 | |+-------------+----------+------+-----+---------+----------------+5 rows in set (0,00 sec)
通过DESCRIBE语句,我们可以看到City表的表结构。 我们看到列名及其数据类型。 加上其他重要信息。
mysql> SHOW CREATE TABLE city;
如果我们想找出创建City表的 SQL,我们将发出SHOW CREATE TABLE city语句。
$ mysqldump -u root -p world city > city.sql
在这里,我们使用mysqldump工具备份city表。
mysql> DROP TABLE city;mysql> SHOW TABLES;+-----------------+| Tables_in_world |+-----------------+| country || countrylanguage |+-----------------+2 rows in set (0,00 sec)
我们使用DROP TABLE语句删除city表。 随后的语句验证该表已删除。
mysql> source city.sqlmysql> SHOW TABLES;+-----------------+| Tables_in_world |+-----------------+| city || country || countrylanguage |+-----------------+3 rows in set (0,00 sec)
我们从备份中重新创建city表。 source命令执行备份city.sql脚本。
查询
查询用于从数据库表中查找数据。
限制数据输出
数据库表中有数千行。 它们无法全部显示在屏幕上。 我们可以使用LIMIT子句控制要显示的行数。
mysql> SELECT Id, Name, Population FROM city limit 10;+----+----------------+------------+| Id | Name | Population |+----+----------------+------------+| 1 | Kabul | 1780000 || 2 | Qandahar | 237500 || 3 | Herat | 186800 || 4 | Mazar-e-Sharif | 127800 || 5 | Amsterdam | 731200 || 6 | Rotterdam | 593321 || 7 | Haag | 440900 || 8 | Utrecht | 234323 || 9 | Eindhoven | 201843 || 10 | Tilburg | 193238 |+----+----------------+------------+10 rows in set (0,00 sec)
在上面的查询中,我们显示City表的五个列中的三个。 表中有很多行。 我们将查询限制为前 10 行。
mysql> SELECT Id, Name, Population FROM city limit 15, 5;+----+-------------------+------------+| Id | Name | Population |+----+-------------------+------------+| 16 | Haarlem | 148772 || 17 | Almere | 142465 || 18 | Arnhem | 138020 || 19 | Zaanstad | 135621 || 20 | ´s-Hertogenbosch | 129170 |+----+-------------------+------------+5 rows in set (0,00 sec)
LIMIT子句后面可以有两个数字。 第一个是偏移量,第二个是要显示的行数。 我们的查询显示第 16-20 行。
mysql> pager lessPAGER set to 'less'mysql> SELECT * FROM city;+------------------------------------+------------+| Name | Population |+------------------------------------+------------+| Kabul | 1780000 || Qandahar | 237500 || Herat | 186800 |...:
$ mysql -u user12 -p world -e "SELECT * FROM city" > cityEnter password: $ ls -sh city144K city
mysql命令工具可以非交互方式使用。 我们在-e选项之后指定 SQL 语句,然后将结果重定向到城市文件。 现在我们可以使用任何文本编辑器来显示数据。
COUNT(),MAX(),MIN()函数
COUNT(),MAX(),MIN()是 MySQL 聚合函数,可从聚合数据中计算一些值。
mysql> SELECT COUNT(Id) AS '# of cities' FROM city;+-------------+| # of cities |+-------------+| 4079 |+-------------+1 row in set (0,00 sec)
表中有 4079 个城市。 我们使用内置的COUNT()函数找出行数。
mysql> SELECT Name, Population FROM city -> WHERE Population = (SELECT Max(Population) FROM city);+-----------------+------------+| Name | Population |+-----------------+------------+| Mumbai (Bombay) | 10500000 |+-----------------+------------+1 row in set (0,08 sec)
上面的查询显示了表中人口最多的城市。 SQL 是称为 子查询 的特殊查询类型。 外部查询使用内部查询返回的数据。 内部查询以括号为界。
mysql> SELECT Name, Population FROM city -> WHERE Population = (SELECT Min(Population) FROM city);+-----------+------------+| Name | Population |+-----------+------------+| Adamstown | 42 |+-----------+------------+1 row in set (0,02 sec)
此子查询显示表中人口最少的城市。
使用WHERE子句选择特定的行
WHERE子句可用于过滤结果。 它提供了选择条件,仅从数据中选择特定的行。
mysql> SELECT Name, Population FROM city -> WHERE Population > 1000000;+--------------------------+------------+| Name | Population |+--------------------------+------------+| Kabul | 1780000 || Alger | 2168000 || Luanda | 2022000 || Buenos Aires | 2982146 || La Matanza | 1266461 || Córdoba | 1157507 || Yerevan | 1248700 || Sydney | 3276207 |...
上面的 SQL 语句返回人口超过一百万的所有城市。
mysql> SELECT Name FROM city WHERE Name LIKE 'Kal%';+-------------+| Name |+-------------+| Kalookan || Kalyan || Kalemie || Kallithea || Kalisz || Kaliningrad || Kaluga |+-------------+7 rows in set (0,00 sec)
在这里,我们选择所有以“ Kal”开头的城市名称。 我们在表中找到了七个城市。 我们可以使用LIKE子句在列中查找特定的模式。
mysql> SELECT Name, Population FROM city WHERE ID IN (5, 23, 432, 2021);+------------+------------+| Name | Population |+------------+------------+| Amsterdam | 731200 || Dordrecht | 119811 || Eunápolis | 96610 || Jining | 265248 |+------------+------------+4 rows in set (0,05 sec)
此 SQL 代码返回 ID 为 5、23、432 和 2021 的行的城市及其人口。
mysql> SELECT * FROM city WHERE Name = 'Bratislava';+------+------------+-------------+------------+------------+| ID | Name | CountryCode | District | Population |+------+------------+-------------+------------+------------+| 3209 | Bratislava | SVK | Bratislava | 448292 |+------+------------+-------------+------------+------------+1 row in set (0,00 sec)
通过上面的 SQL 语句,我们选择一个特定城市(即布拉迪斯拉发)的所有列。
mysql> SELECT Name, Population FROM city -> WHERE Population BETWEEN 670000 AND 700000;+----------------+------------+| Name | Population |+----------------+------------+| Teresina | 691942 || Natal | 688955 || Bandar Lampung | 680332 || Gwalior | 690765 || Kermanshah | 692986 || Palermo | 683794 || Toronto | 688275 || Huainan | 700000 || Jixi | 683885 || Antananarivo | 675669 || Chihuahua | 670208 || Kano | 674100 || Tunis | 690600 |+----------------+------------+13 rows in set (0,03 sec)
假设我们想找出人口在两个特定值之间的城市。 为此有一个BETWEEN运算符。 我们发现了 13 个城市,人口在 670,000 到 700,000 之间。
排序数据
可以使用ORDER BY子句完成订购数据。
mysql> SELECT Name, Population FROM city -> ORDER BY Population DESC LIMIT 10;+-------------------+------------+| Name | Population |+-------------------+------------+| Mumbai (Bombay) | 10500000 || Seoul | 9981619 || São Paulo | 9968485 || Shanghai | 9696300 || Jakarta | 9604900 || Karachi | 9269265 || Istanbul | 8787958 || Ciudad de México | 8591309 || Moscow | 8389200 || New York | 8008278 |+-------------------+------------+10 rows in set (0,03 sec)
我们找到了十个人口最多的城市。 我们按人口从人口最多的城市到人口最少的城市排序。 我们使用LIMIT子句限制输出。
mysql> SELECT Name, Population FROM city -> ORDER BY Population ASC LIMIT 10;+---------------------+------------+| Name | Population |+---------------------+------------+| Adamstown | 42 || West Island | 167 || Fakaofo | 300 || Città del Vaticano | 455 || Bantam | 503 || Yaren | 559 || The Valley | 595 || Alofi | 682 || Flying Fish Cove | 700 || Kingston | 800 |+---------------------+------------+10 rows in set (0,02 sec)
在这里,我们得到了人口最少的城市。 这次我们以升序对数据进行排序。 为此,我们使用ASC关键字。
mysql> SELECT Name, Population FROM city ORDER By Name LIMIT 10;+------------------------+------------+| Name | Population |+------------------------+------------+| A Coruña (La Coruña) | 243402 || Aachen | 243825 || Aalborg | 161161 || Aba | 298900 || Abadan | 206073 || Abaetetuba | 111258 || Abakan | 169200 || Abbotsford | 105403 || Abeokuta | 427400 || Aberdeen | 213070 |+------------------------+------------+10 rows in set (0.01 sec)
在上面的 SQL 语句中,我们按城市名称排序数据并获得前十个城市。
分组数据
GROUP BY子句用于将具有相同值的数据库记录组合到单个记录中。 它通常与聚合功能一起使用。
mysql> SELECT District, SUM(Population) FROM city -> WHERE District = 'New York' GROUP BY District;+----------+-----------------+| District | SUM(Population) |+----------+-----------------+| New York | 8958085 |+----------+-----------------+1 row in set (0,09 sec)
上面的 SQL 语句返回在我们数据库中列出的纽约地区城镇的总人数。
mysql> SELECT Name, District FROM city WHERE District = 'New York';+-----------+----------+| Name | District |+-----------+----------+| New York | New York || Buffalo | New York || Rochester | New York || Yonkers | New York || Syracuse | New York || Albany | New York |+-----------+----------+6 rows in set (0,00 sec)
先前的数字是这六个城市的总和。
mysql> SELECT District, SUM(Population) FROM city -> WHERE CountryCode = 'USA' GROUP BY District -> HAVING SUM(Population) > 3000000;+------------+-----------------+| District | SUM(Population) |+------------+-----------------+| Arizona | 3178903 || California | 16716706 || Florida | 3151408 || Illinois | 3737498 || New York | 8958085 || Texas | 9208281 |+------------+-----------------+6 rows in set (0,28 sec)
我们选择人口超过 300 万的所有地区。 当我们处理数据组时,我们使用HAVING子句而不是WHERE子句。
更新,删除和插入数据
接下来,我们将关注更新,删除和插入数据。
mysql> SELECT Name, HeadOfState FROM country WHERE Name = 'United States';+---------------+----------------+| Name | HeadOfState |+---------------+----------------+| United States | George W. Bush |+---------------+----------------+1 row in set (0,12 sec)
如前所述,世界数据库已过时。 乔治·布什(George Bush)不再是美国总统。
mysql> UPDATE country SET HeadOfState = 'Donald Trump' -> WHERE Name = 'United States';
使用UPDATE语句,我们将行更改为实际数据。
mysql> SELECT Name, HeadOfState FROM country WHERE Name = 'United States';+---------------+--------------+| Name | HeadOfState |+---------------+--------------+| United States | Donald Trump |+---------------+--------------+1 row in set (0,02 sec)
我们已经成功更新了该行。
mysql> CREATE TABLE toptencities engine=MEMORY SELECT * FROM city LIMIT 10;
我们在内存中创建一个临时表。 它将包含city表中的前十个城市。
mysql> SELECT * FROM toptencities;+----+----------------+-------------+---------------+------------+| ID | Name | CountryCode | District | Population |+----+----------------+-------------+---------------+------------+| 1 | Kabul | AFG | Kabol | 1780000 || 2 | Qandahar | AFG | Qandahar | 237500 || 3 | Herat | AFG | Herat | 186800 || 4 | Mazar-e-Sharif | AFG | Balkh | 127800 || 5 | Amsterdam | NLD | Noord-Holland | 731200 || 6 | Rotterdam | NLD | Zuid-Holland | 593321 || 7 | Haag | NLD | Zuid-Holland | 440900 || 8 | Utrecht | NLD | Utrecht | 234323 || 9 | Eindhoven | NLD | Noord-Brabant | 201843 || 10 | Tilburg | NLD | Noord-Brabant | 193238 |+----+----------------+-------------+---------------+------------+10 rows in set (0,00 sec)
这是toptencities表的内容。
mysql> DELETE FROM toptencities WHERE ID IN (2, 4, 6, 8, 10);
使用DELETE FROM语句和WHERE子句,我们从toptencities表中删除第二行。
mysql> SELECT * FROM toptencities;+----+-----------+-------------+---------------+------------+| ID | Name | CountryCode | District | Population |+----+-----------+-------------+---------------+------------+| 1 | Kabul | AFG | Kabol | 1780000 || 3 | Herat | AFG | Herat | 186800 || 5 | Amsterdam | NLD | Noord-Holland | 731200 || 7 | Haag | NLD | Zuid-Holland | 440900 || 9 | Eindhoven | NLD | Noord-Brabant | 201843 |+----+-----------+-------------+---------------+------------+5 rows in set (0.00 sec)
表中还有五行。
mysql> TRUNCATE TABLE toptencities;Query OK, 0 rows affected (0.00 sec)mysql> SELECT * FROM toptencities;Empty set (0,00 sec)
我们使用TRUNCATE语句删除表中的所有行。 没有数据了。
mysql> INSERT INTO toptencities VALUES(1, 'Kabul', 'AFG', 'Kabol', 1780000);mysql> SELECT * FROM toptencities;;+----+-------+-------------+----------+------------+| ID | Name | CountryCode | District | Population |+----+-------+-------------+----------+------------+| 1 | Kabul | AFG | Kabol | 1780000 |+----+-------+-------------+----------+------------+1 row in set (0.00 sec)
使用INSERT INTO语句,我们在表中插入一行。
mysql> DROP TABLE toptencities;Query OK, 0 rows affected (0,06 sec)
我们从数据库中删除该表。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。