Perl MySQL选择数据

时间:2019-11-20 08:52:38  来源:igfitidea点击:

简介:在本教程中,我们将向您展示如何使用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数据库表查询数据的各种方法。