Perl MySQL Select Data

摘要:在本教程中,我们将向您展示如何使用 Perl DBI 从 MySQL 数据库表中查询数据。

要通过 Perl 程序查询 MySQL 数据库表中的数据,请使用以下步骤:

  • 通过调用connect()方法连接到 MySQL 数据库
  • 使用数据库句柄对象的prepare()方法准备一条用于执行的SELECT语句。 prepare()方法返回一个语句句柄对象,该对象代表 MySQL 数据库中的一条语句。
  • 通过调用语句句柄对象的execute()方法来执行SELECT语句。
  • 调用fetchrow_array()fetchrow_arrayref()fetchrow_hashref()方法从结果集中获取数据,直到没有剩余行。您可以使用while语句来迭代结果集。
  • 断开与 MySQL 数据库的连接。

Perl MySQL SELECT 示例

我们将使用下表作为示例:

Perl MySQL 事务 - 示例表

如果您尚未创建表,我们强烈建议您按照创建表教程创建它们。

查询一张表的数据示例

以下示例从links表中选择数据:

#!/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();Code language: Perl (perl)

主要逻辑在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();
}Code language: Perl (perl)

脚本的输出如下:

MySQL Tutorial  http://mysqltutorial.org/
Perl MySQL Insert Demo  https://www.mysqltutorial.org/perl-mysql/perl-mysql-insert/
Perl    http://www.perl.org
MySQL   http://www.mysql.com
Comprehensive Perl Archive Network      http://www.cpan.org/Code language: JavaScript (javascript)

通过参数查询一张表的数据示例

我们经常将值传递给查询以根据条件选择数据。以下示例从links表中查询具有指定目标的links的数据:

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();
}Code language: Perl (perl)

我们在SELECT语句的WHERE 子句中放置一个问号作为占位符。占位符将被我们传递给execute()方法的值替换。

例如,要选择目标为_self的链接,请按如下方式调用子例程:

query_links_by_target($dbh,'_self');Code language: Perl (perl)

输出是:

MySQL Tutorial  http://mysqltutorial.org/    _self
MySQL   http://www.mysql.com    _selfCode language: JavaScript (javascript)

或者,要选择目标为_blank的链接,请将值传递给query_links_by_target()子例程,如下所示:

query_links_by_target($dbh,'_blank');Code language: Perl (perl)

输出是:

Perl MySQL Insert Demo  https://www.mysqltutorial.org/perl-mysql/perl-mysql-insert/      _blank
Perl    http://www.perl.org     _blank
Comprehensive Perl Archive Network      http://www.cpan.org/    _blankCode language: JavaScript (javascript)

查询数据并转储结果集

语句句柄对象提供了一个名为dump_results()的便捷方法,用于快速显示结果集,而无需调用fetchrow_*方法。

以下示例从tags表中选择数据并使用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();
}Code language: Perl (perl)

输出是:

'1', 'Perl'
1 rowsCode language: JavaScript (javascript)

查询多个表的数据

以下脚本使用带有INNER JOIN子句的SELECT语句从三个表中选择数据: linkstagslink_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();
}Code language: Perl (perl)

在此示例中,我们使用fetchrow_arrayref()方法从结果集中获取数据。 fetchrow_arrayref()方法返回对数组的引用而不是数组本身。 fetchrow_arrayref()方法不像fetchrow_array()方法那样将结果集中的每一行数据复制到新数组中,因此,它比fetchrow_array()方法更快。

以下是脚本的输出:

Comprehensive Perl Archive Network      http://www.cpan.org/    _blank  PerlCode language: JavaScript (javascript)

我们得到 1 行,因为link_tags表中只有一行。

在本教程中,您学习了使用 Perl DBI API 从 MySQL 数据库表查询数据的各种方法。

本教程有帮助吗?