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数据库表查询数据的各种方法。