MySQL8 中文参考(八十四)(1)
22.4.4 关系表
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-relational-tables.html
22.4.4.1 向表中插入记录
22.4.4.2 选择表
22.4.4.3 更新表
22.4.4.4 删除表
您也可以使用 X DevAPI 来处理关系表。在 MySQL 中,每个关系表都与特定的存储引擎相关联。本节中的示例使用InnoDB
表在world_x
模式中。
确认模式
要显示分配给db
全局变量的模式,请发出db
。
mysql-py> db <Schema:world_x>
如果返回的值不是Schema:world_x
,请将db
变量设置如下:
mysql-py> \use world_x Schema `world_x` accessible through db.
显示所有表
要显示world_x
模式中的所有关系表,请在db
对象上使用get_tables()
方法。
mysql-py> db.get_tables() [ <Table:city>, <Table:country>, <Table:countrylanguage> ]
基本表操作
由表限定的基本操作包括:
操作形式 | 描述 |
db.* name*.insert() |
insert() 方法将一个或多个记录插入到指定的表中。 |
db.* name*.select() |
select() 方法返回指定表中的一些或所有记录。 |
db.* name*.update() |
update() 方法更新指定表中的记录。 |
db.* name*.delete() |
delete() 方法从指定的表中删除一个或多个记录。 |
相关信息
- 有关更多信息,请参阅处理关系表。
- CRUD EBNF 定义 提供了操作的完整列表。
- 请参阅第 22.4.2 节,“下载和导入 world_x 数据库”,了解设置
world_x
模式示例的说明。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-insert.html
22.4.4.1 向表中插入记录
您可以使用insert()
方法与values()
方法将记录插入到现有的关系表中。insert()
方法接受单个列或表中的所有列。使用一个或多个values()
方法来指定要插入的值。
插入完整记录
要插入完整记录,将表中的所有列传递给insert()
方法。然后,对于每个列,将一个值传递给values()
方法。例如,要向world_x
数据库中的 city 表添加新记录,请插入以下记录并按两次Enter。
mysql-py> db.city.insert("ID", "Name", "CountryCode", "District", "Info").values( None, "Olympia", "USA", "Washington", '{"Population": 5000}')
city 表有五列:ID、Name、CountryCode、District 和 Info。每个值必须与其代表的列的数据类型匹配。
插入部分记录
以下示例将值插入到 city 表的 ID、Name 和 CountryCode 列中。
mysql-py> db.city.insert("ID", "Name", "CountryCode").values( None, "Little Falls", "USA").values(None, "Happy Valley", "USA")
当您使用insert()
方法指定列时,值的数量必须与列的数量匹配。在前面的示例中,您必须提供三个值以匹配指定的三列。
相关信息
- 请参阅 TableInsertFunction 以获取完整的语法定义。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-select.html
22.4.4.2 选择表
您可以使用select()
方法从数据库中的表中查询并返回记录。X DevAPI 提供了与select()
方法一起使用的附加方法,以过滤和排序返回的记录。
MySQL 提供以下运算符来指定搜索条件:OR
(||
)、AND
(&&
)、XOR
、IS
、NOT
、BETWEEN
、IN
、LIKE
、!=
、<>
、>
、>=
、<
、<=
、&
、|
、<<
、>>
、+
、-
、*
、/
、~
和%
。
选择所有记录
要发出返回现有表中的所有记录的查询,请使用未指定搜索条件的select()
方法。以下示例从world_x
数据库中的 city 表中选择所有记录。
注意
限制空的select()
方法的使用仅限于交互式语句。始终在应用程序代码中使用显式列名选择。
mysql-py> db.city.select() +------+------------+-------------+------------+-------------------------+ | ID | Name | CountryCode | District | Info | +------+------------+-------------+------------+-------------------------+ | 1 | Kabul | AFG | Kabol |{"Population": 1780000} | | 2 | Qandahar | AFG | Qandahar |{"Population": 237500} | | 3 | Herat | AFG | Herat |{"Population": 186800} | ... ... ... ... ... | 4079 | Rafah | PSE | Rafah |{"Population": 92020} | +------+------- ----+-------------+------------+-------------------------+ 4082 rows in set (0.01 sec)
空集(没有匹配记录)返回以下信息:
Empty set (0.00 sec)
过滤搜索
要发出返回一组表列的查询,请使用select()
方法,并在方括号之间指定要返回的列。此查询从 city 表返回 Name 和 CountryCode 列。
mysql-py> db.city.select(["Name", "CountryCode"]) +-------------------+-------------+ | Name | CountryCode | +-------------------+-------------+ | Kabul | AFG | | Qandahar | AFG | | Herat | AFG | | Mazar-e-Sharif | AFG | | Amsterdam | NLD | ... ... | Rafah | PSE | | Olympia | USA | | Little Falls | USA | | Happy Valley | USA | +-------------------+-------------+ 4082 rows in set (0.00 sec)
要发出返回符合特定搜索条件的行的查询,请使用where()
方法包含这些条件。例如,以下示例返回以字母 Z 开头的城市的名称和国家代码。
mysql-py> db.city.select(["Name", "CountryCode"]).where("Name like 'Z%'") +-------------------+-------------+ | Name | CountryCode | +-------------------+-------------+ | Zaanstad | NLD | | Zoetermeer | NLD | | Zwolle | NLD | | Zenica | BIH | | Zagazig | EGY | | Zaragoza | ESP | | Zamboanga | PHL | | Zahedan | IRN | | Zanjan | IRN | | Zabol | IRN | | Zama | JPN | | Zhezqazghan | KAZ | | Zhengzhou | CHN | ... ... | Zeleznogorsk | RUS | +-------------------+-------------+ 59 rows in set (0.00 sec)
您可以使用bind()
方法将值与搜索条件分开。例如,不要使用"Name = ‘Z%’ "作为条件,而是替换为以字母开头的名称为前缀的命名占位符,例如name。然后将占位符和值包含在bind()
方法中,如下所示:
mysql-py> db.city.select(["Name", "CountryCode"]).where( "Name like :name").bind("name", "Z%")
提示
在程序内部,绑定使您可以在表达式中指定占位符,在执行之前用值填充,并可以根据需要受益于自动转义。
始终使用绑定来清理输入。避免使用字符串连接引入查询中的值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。
项目结果
要使用AND
运算符发出查询,请在where()
方法中的搜索条件之间添加运算符。
mysql-py> db.city.select(["Name", "CountryCode"]).where( "Name like 'Z%' and CountryCode = 'CHN'") +----------------+-------------+ | Name | CountryCode | +----------------+-------------+ | Zhengzhou | CHN | | Zibo | CHN | | Zhangjiakou | CHN | | Zhuzhou | CHN | | Zhangjiang | CHN | | Zigong | CHN | | Zaozhuang | CHN | ... ... | Zhangjiagang | CHN | +----------------+-------------+ 22 rows in set (0.01 sec)
要指定多个条件运算符,可以将搜索条件括在括号中以更改运算符优先级。以下示例演示了AND
和OR
运算符的放置位置。
mysql-py> db.city.select(["Name", "CountryCode"]).where( "Name like 'Z%' and (CountryCode = 'CHN' or CountryCode = 'RUS')") +-------------------+-------------+ | Name | CountryCode | +-------------------+-------------+ | Zhengzhou | CHN | | Zibo | CHN | | Zhangjiakou | CHN | | Zhuzhou | CHN | ... ... | Zeleznogorsk | RUS | +-------------------+-------------+ 29 rows in set (0.01 sec)
限制、排序和偏移结果
您可以应用limit()
、order_by()
和offset()
方法来管理select()
方法返回的记录数量和顺序。
要指定结果集中包含的记录数,请将一个值附加到select()
方法的limit()
方法。例如,以下查询返回 country 表中的前五条记录。
mysql-py> db.country.select(["Code", "Name"]).limit(5) +------+-------------+ | Code | Name | +------+-------------+ | ABW | Aruba | | AFG | Afghanistan | | AGO | Angola | | AIA | Anguilla | | ALB | Albania | +------+-------------+ 5 rows in set (0.00 sec)
要指定结果的顺序,请将order_by()
方法附加到select()
方法。将一个或多个要排序的列的列表传递给order_by()
方法,并根据需要选择降序(desc
)或升序(asc
)属性。升序是默认的排序类型。
例如,以下查询按 Name 列对所有记录进行排序,然后以降序返回前三条记录。
mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3) +------+------------+ | Code | Name | +------+------------+ | ZWE | Zimbabwe | | ZMB | Zambia | | YUG | Yugoslavia | +------+------------+ 3 rows in set (0.00 sec)
默认情况下,limit()
方法从表中的第一条记录开始。您可以使用offset()
方法来更改起始记录。例如,要忽略第一条记录并返回符合条件的接下来三条记录,请将一个值传递给offset()
方法。
mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3).offset(1) +------+------------+ | Code | Name | +------+------------+ | ZMB | Zambia | | YUG | Yugoslavia | | YEM | Yemen | +------+------------+ 3 rows in set (0.00 sec)
相关信息
- MySQL 参考手册提供了有关函数和运算符的详细文档。
- 请参阅 TableSelectFunction 以获取完整的语法定义。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-update.html
22.4.4.3 更新表格
您可以使用update()
方法修改表中的一个或多个记录。update()
方法通过过滤查询以仅包括要更新的记录,然后对这些记录应用您指定的操作来工作。
要在城市表中替换城市名称,请将新城市名称传递给set()
方法。然后,将要定位和替换的城市名称传递给where()
方法。以下示例将城市 Peking 替换为 Beijing。
mysql-py> db.city.update().set("Name", "Beijing").where("Name = 'Peking'")
使用select()
方法验证更改。
mysql-py> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where("Name = 'Beijing'") +------+-----------+-------------+----------+-----------------------------+ | ID | Name | CountryCode | District | Info | +------+-----------+-------------+----------+-----------------------------+ | 1891 | Beijing | CHN | Peking | {"Population": 7472000} | +------+-----------+-------------+----------+-----------------------------+ 1 row in set (0.00 sec)
相关信息
- 查看 TableUpdateFunction 以获取完整的语法定义。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-delete.html
22.4.4.4 删除表
你可以使用delete()
方法从数据库中的表中删除一些或所有记录。X DevAPI 提供了额外的方法与delete()
方法一起使用,以过滤和排序要删除的记录。
使用条件删除记录
以下示例将搜索条件传递给delete()
方法。所有匹配条件的记录都将从city
表中删除。在这个示例中,有一条记录符合条件。
mysql-py> db.city.delete().where("Name = 'Olympia'")
删除第一条记录
要删除城市表中的第一条记录,使用值为 1 的limit()
方法。
mysql-py> db.city.delete().limit(1)
删除表中的所有记录
你可以删除表中的所有记录。要这样做,使用delete()
方法而不指定搜索条件。
注意
当你删除记录而不指定搜索条件时要小心;这样会删除表中的所有记录。
删除表
drop_collection()
方法也可用于在 MySQL Shell 中从数据库中删除关系表。例如,要从world_x
数据库中删除citytest
表,执行:
mysql-py> db.drop_collection("citytest")
相关信息
- 查看 TableDeleteFunction 获取完整的语法定义。
- 查看第 22.4.2 节,“下载和导入 world_x 数据库”以获取重新创建
world_x
数据库的说明。
MySQL8 中文参考(八十四)(3)https://developer.aliyun.com/article/1566020