Perl MySQL选择数据
简介:在本教程中,我们将向您展示如何使用Perl DBI从MySQL数据库表中查询数据。
要从Perl程序中查询MySQL数据库表中的数据,请使用以下步骤:
通过调用connect()方法连接到MySQL数据库。
通过使用数据库句柄对象的prepare()方法准备要执行的SELECT语句。
prepare()方法返回一个语句句柄对象,该对象代表MySQL数据库中的一条语句。通过调用语句句柄对象的execute()方法来执行SELECT语句。
调用fetchrow_array(),fetchrow_arrayref()或fetchrow_hashref()方法从结果集中获取数据,直到没有剩余行为止。
您可以使用while语句来迭代结果集。断开与MySQL数据库的连接。
Perl MySQL SELECT示例
我们将使用下表作为示例:
如果尚未创建表,强烈建议您按照创建表教程来创建表。
从一个表示例查询数据
以下示例从链接表中选择数据:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10; # for say() function
use DBI;
# MySQL database configurations
my $dsn = "DBI:mysql:perlmysqldb";
my $username = "root";
my $password = '';
# connect to MySQL database
my %attr = ( PrintError=>0, # turn off error reporting via warn()
RaiseError=>1 # report error via die()
);
my $dbh = DBI->connect($dsn,$username,$password,\%attr);
# query data from the links table
query_links($dbh);
# disconnect from the MySQL database
$dbh->disconnect();
主要逻辑在query_links子例程中实现:
sub query_links{
# query from the links table
my ($dbh) = @_;
my $sql = "SELECT title,
url
FROM links";
my $sth = $dbh->prepare($sql);
# execute the query
$sth->execute();
while(my @row = $sth->fetchrow_array()){
printf("%s\t%s\n",$row[0],$row[1]);
}
$sth->finish();
}
脚本的输出如下:
MySQL Tutorial http://theitroad.local/ Perl MySQL Insert Demo https://www.theitroad.local/perl-mysql/perl-mysql-insert/ Perl http://www.perl.org MySQL http://www.mysql.com Comprehensive Perl Archive Network http://www.cpan.org/
使用参数示例从一张表查询数据
我们经常将值传递给查询以根据条件选择数据。
以下示例通过链接表中具有指定目标的链接查询数据:
sub query_links_by_target{
# query from the links table by target
my ($dbh,$target) = @_;
my $sql = "SELECT title,url,target
FROM links
WHERE target = ?";
my $sth = $dbh->prepare($sql);
# execute the query
$sth->execute($target);
while(my @row = $sth->fetchrow_array()){
printf("%s\t%s\n",$row[0],$row[1],$row[3]);
}
$sth->finish();
}
我们在SELECT语句的WHERE子句中添加一个问号作为占位符。
占位符将替换为我们传递给execute()方法的值。
例如,要选择目标为_self的链接,请按以下方式调用子例程:
query_links_by_target($dbh,'_self');
输出为:
MySQL Tutorial http://theitroad.local/ _self MySQL http://www.mysql.com _self
或选择目标为_blank的链接,您可以按如下所示将该值传递给query_links_by_target()子例程:
query_links_by_target($dbh,'_blank');
输出为:
Perl MySQL Insert Demo https://www.theitroad.local/perl-mysql/perl-mysql-insert/ _blank Perl http://www.perl.org _blank Comprehensive Perl Archive Network http://www.cpan.org/ _blank
查询数据并转储结果集
语句句柄对象提供了一个名为dump_results()的便捷方法,用于快速显示结果集,而无需调用fetchrow_ *方法。
以下示例从标签表中选择数据并使用dump_results()方法转储结果集:
sub query_tags{
# query data from the tags table
my ($dbh) = @_;
my $sql = "SELECT * FROM tags";
my $sth = $dbh->prepare($sql);
$sth->execute();
$sth->dump_results( );
$sth->finish();
}
输出为:
'1', 'Perl' 1 rows
从多个表查询数据
以下脚本通过使用带有INNER JOIN子句的SELECT语句从三个表中选择数据:链接,标签和link_tags表。
sub query_all{
# query data from links, tags, link_tags tables
my ($dbh) = @_;
my $sql = "SELECT title, url, target,tag
FROM link_tags
INNER JOIN links ON links.link_id = link_tags.link_id
INNER JOIN tags ON tags.tag_id = link_tags.tag_id";
my $sth = $dbh->prepare($sql);
$sth->execute();
while(my $array_ref = $sth->fetchrow_arrayref()){
printf("%s\t%s\t%s\t%s\n", $array_ref->[0],
$array_ref->[1],
$array_ref->[2],
$array_ref->[3]);
}
$sth->finish();
}
在此示例中,我们使用了fetchrow_arrayref()方法从结果集中获取数据。
fetchrow_arrayref()方法返回对数组的引用,而不是对数组本身的引用。
fetchrow_arrayref()方法不会像fetchrow_array()方法那样针对结果集中的每一行将数据复制到新数组中,因此它比fetchrow_array()方法要快。
以下是脚本的输出:
Comprehensive Perl Archive Network http://www.cpan.org/ _blank Perl
我们获得了1行,因为link_tags表中只有一行。
在本教程中,您学习了使用Perl DBI API从MySQL数据库表查询数据的各种方法。

