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()
方法返回的记录数量和顺序。
要指定结果集中的记录数,您可以将limit()
方法与一个值一起附加到select()
方法中。例如,以下查询返回国家表的前五条记录。
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
)属性。升序是默认顺序类型。
例如,以下查询按名称列进行排序,然后返回所有记录的前三条记录,以降序排列。
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()
方法传递一个值1。
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以获取完整的语法定义。