Mysqli 简明教程
MySQLi - Introduction
MySQLi 是 PHP 中 MySQL API 的一个扩展,从 PHP 5.0 开始使用。它也被称为改良的 MySQL 扩展。MySQLi 背后的动机是要利用 MySQL 4.1.3 及更高版本中可用新功能的优势。它提供了比 MySQL 扩展有许多优势。
-
MySQL 提供面向对象接口。它提供了面向对象和过程化方法来处理数据库操作。
Object Oriented Interface
<?php
$mysqli = mysqli_connect("localhost", "user", "password", "database-name");
$result = mysqli_query($mysqli, "SELECT 'Welcome to MySQLi' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo $row['_msg'];
?>
Procedural Approach
<?php
$mysqli = new mysqli("localhost", "user", "password", "database-name");
$result = $mysqli→query("SELECT 'Welcome to MySQLi' AS _msg FROM DUAL");
$row = $result→fetch_assoc();
echo $row['_msg'];
?>
-
MySQLi supports prepared statments.
-
MySQLi supports multiple statments.
-
MySQLi supports transactions.
-
MySQLi 提供增强的调试能力。
MySQLi - PHP Syntax
MySQL 可与 PERL、C、C++、JAVA 和 PHP 等各种编程语言完美结合使用。在这些语言中,PHP 因其 Web 应用程序开发功能而最受欢迎。
本教程着重于在 PHP 环境中使用 MySQL。如果您对带有 PERL 的 MySQL 感兴趣,那么您可以考虑阅读 PERL 教程。
PHP 提供了各种功能来访问 MySQL 数据库并在 MySQL 数据库中操作数据记录。您需要像调用任何其他 PHP 函数一样调用 PHP 函数。
用于 MySQL 的 PHP 函数采用以下常规格式:
mysqli function(value,value,...);
函数名的第二部分特定于函数,通常是一个描述函数执行操作的单词。以下是我们将在本教程中使用的两个函数:
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
mysqli→query(,"SQL statement");
以下示例显示 PHP 调用任何 MySQL 函数的通用语法。
<html>
<head>
<title>PHP with MySQL</title>
</head>
<body>
<?php
$retval = mysqli - > <i>function</i>(value, [value,...]);
if( !$retval ) {
die ( "Error: a related error message" );
}
// Otherwise MySQL or PHP Statements
?>
</body>
</html>
从下一章开始,我们将看到所有重要的 MySQL 功能以及 PHP。
MySQLi - Connection
MySQL Connection Using MySQL Binary
你可以在命令提示符下使用 mysql 二进制文件建立 MySQL 数据库。
Example
下面是一个从命令提示符连接到 MySQL 服务器的简单示例 −
[root@host]# mysql -u root -p
Enter password:******
这会给你 MySQL 命令提示符,你可以在其中执行任何 SQL 命令。以下是上述命令的结果−
以下代码块显示了以上代码的结果 −
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2854760 to server version: 5.0.9
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
在上述示例中,我们使用了 root 作为用户,但你也可以使用任何其他用户。任何用户都可以执行所有被允许执行的 SQL 操作。
你可以随时使用 mysql> 提示符下的 exit 命令断开 MySQL 数据库连接。
mysql> exit
Bye
MySQL Connection Using PHP Script
PHP 提供 mysqli 构造或 mysqli_connect() 函数来打开一个数据库连接。此函数采用六个参数,并且在成功时返回一个 MySQL 链接标识符,在失败时返回 FALSE。
Syntax
$mysqli = new mysqli($host, $username, $passwd, $dbName, $port, $socket);
Sr.No. |
Parameter & Description |
1 |
$host 可选 - 运行数据库服务器的主机名。如果不指定,则默认值将为 localhost:3306 。 |
2 |
$username 可选 - 访问数据库的用户名。如果不指定,则默认值将为作为服务器进程所有者用户的名称。 |
3 |
$passwd 可选 - 访问数据库的用户的密码。如果不指定,则默认值将为空密码。 |
4 |
$dbName 可选 - 要执行查询的数据库名称。 |
5 |
$port 可选 - 要尝试连接到 MySQL 服务器的端口号。 |
6 |
$socket 可选 - 应使用的套接字或命名管道。 |
你可以随时使用另一个 PHP 函数 close() 来断开 MySQL 数据库连接。
Example
尝试以下示例以连接到 MySQL 服务器 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Connecting MySQL Server</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$mysqli→close();
?>
</body>
</html>
MySQLi - Create Database
Create Database Using mysqladmin
您需要拥有特殊权限才能创建或删除 MySQL 数据库。因此,假设您有权访问 root 用户,则可以使用 mysql mysqladmin 二进制文件创建任何数据库。
Create a Database using PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来创建或删除 MySQL 数据库。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 创建 MySQL 数据库的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例来创建数据库 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head><title>Creating MySQL Database</title></head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($mysqli→query("CREATE DATABASE TUTORIALS")) {
printf("Database TUTORIALS created successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not create database: %s<br />", $mysqli→error);
}
$mysqli→close();
?>
</body>
</html>
MySQLi - Drop Database
Drop a Database using mysqladmin
您将需要特殊权限来创建或删除 MySQL 数据库。因此,假设您可以访问 root 用户,那么可以使用 mysql mysqladmin 二进制文件创建任何数据库。
删除任何数据库时要小心,因为这会让你失去数据库中所有可用数据。
以下是一个示例,用于删除在上一个章节中创建的数据库 (TUTORIALS) −
[root@host]# mysqladmin -u root -p drop TUTORIALS
Enter password:******
这会给你一个警告,并会确认你是否真的想删除此数据库。
Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.
Do you really want to drop the 'TUTORIALS' database [y/N] y
Database "TUTORIALS" dropped
Drop Database using PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来删除 MySQL 数据库。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - SQL 查询以删除 MySQL 数据库。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例来删除数据库−
将以下示例复制粘贴为 mysql_example.php:
<html>
<head><title>Dropping MySQL Database</title></head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass);
if($mysqli->connect_errno ) {
printf("Connect failed: %s<br />", $mysqli->connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($mysqli->query("Drop DATABASE TUTORIALS")) {
printf("Database TUTORIALS dropped successfully.<br />");
}
if ($mysqli->errno) {
printf("Could not drop database: %s<br />", $mysqli->error);
}
$mysqli->close();
?>
</body>
</html>
MySQLi - Select Database
一旦连接到 MySQL 服务器,就需要选择一个数据库进行操作。这是因为 MySQL Server 可能有多个数据库可用。
Selecting a MySQL Database Using PHP Script
PHP 使用 mysqli_select_db 函数来选择要执行查询的数据库。此函数接受两个参数,并成功时返回 TRUE,失败时返回 FALSE。
Syntax
mysqli_select_db ( mysqli $link , string $dbname ) : bool
Sr.No. |
Parameter & Description |
1 |
$link 必需 - mysqli_connect() 或 mysqli_init() 返回的链接标识符。 |
2 |
$dbname 必需 - 要连接的数据库的名称。 |
Example
尝试以下示例以选择数据库 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Selecting MySQL Database</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die('Could not connect: ' . mysqli_error($conn));
}
echo 'Connected successfully<br />';
$retval = mysqli_select_db( $conn, 'TUTORIALS' );
if(! $retval ) {
die('Could not select database: ' . mysqli_error($conn));
}
echo "Database TUTORIALS selected successfully\n";
mysqli_close($conn);
?>
</body>
</html>
MySQLi - Create Table
首先,表格创建命令需要以下详细信息 -
-
Name of the table
-
Name of the fields
-
Definitions for each field
Syntax
以下是一个用于创建 MySQL 表的通用 SQL 语法 −
CREATE TABLE table_name (column_name column_type);
现在,我们在 TUTORIALS 数据库中创建以下表。
create table tutorials_tbl(
tutorial_id INT NOT NULL AUTO_INCREMENT,
tutorial_title VARCHAR(100) NOT NULL,
tutorial_author VARCHAR(40) NOT NULL,
submission_date DATE,
PRIMARY KEY ( tutorial_id )
);
此处,需要对几个项目进行说明 -
-
正在使用字段属性 NOT NULL ,因为我们不希望此字段为 NULL。因此,如果用户尝试使用 NULL 值创建记录,则 MySQL 将引发错误。
-
字段属性 AUTO_INCREMENT 告诉 MySQL 继续并将下一个可用数字添加到 id 字段。
-
关键字 PRIMARY KEY 用于将列定义为主键。您可以使用逗号分隔的多个列来定义主键。
Creating Tables from Command Prompt
很容易从 mysql> 提示符创建 MySQL 表。您将使用 SQL 命令 CREATE TABLE 来创建表。
Example
这是一个示例,它将创建 tutorials_tbl −
root@host# mysql -u root -p
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> CREATE TABLE tutorials_tbl(
→ tutorial_id INT NOT NULL AUTO_INCREMENT,
→ tutorial_title VARCHAR(100) NOT NULL,
→ tutorial_author VARCHAR(40) NOT NULL,
→ submission_date DATE,
→ PRIMARY KEY ( tutorial_id )
→ );
Query OK, 0 rows affected (0.16 sec)
mysql>
NOTE - MySQL 在 SQL 命令末尾输入分号 (;) 之前不会终止命令。
Creating Tables Using PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来创建 MySQL 表。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 创建 MySQL 表的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例以创建一个表 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Creating MySQL Table</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = "CREATE TABLE tutorials_tbl( ".
"tutorial_id INT NOT NULL AUTO_INCREMENT, ".
"tutorial_title VARCHAR(100) NOT NULL, ".
"tutorial_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( tutorial_id )); ";
if ($mysqli→query($sql)) {
printf("Table tutorials_tbl created successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not create table: %s<br />", $mysqli→error);
}
$mysqli→close();
?>
</body>
</html>
MySQLi - Drop Table
删除现有的 MySQL 表格非常容易,但您在删除任何现有表格时需要非常小心,因为删除表格后丢失的数据将无法恢复。
Dropping Tables Using PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来删除 MySQL 表。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必填 - 用来删除表的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例来删除一个表格 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Dropping MySQL Table</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($mysqli→query("Drop Table tutorials_tbl")) {
printf("Table tutorials_tbl dropped successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not drop table: %s<br />", $mysqli→error);
}
$mysqli→close();
?>
</body>
</html>
MySQLi - Insert Query
要将数据插入 MySQL 表格,您需要使用 SQL INSERT INTO 命令。您可以使用 mysql> 提示符或使用任何像 PHP 这样的脚本将数据插入 MySQL 表格。
Syntax
以下是 INSERT INTO 命令用于将数据插入 MySQL 表格的通用 SQL 语法 -
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
要插入字符串数据类型,需要将所有值放入双引号或单引号中。例如 "value" 。
Inserting Data from the Command Prompt
要从命令提示符插入数据,我们将使用 SQL INSERT INTO 命令将数据插入 MySQL 表格 tutorials_tbl。
Example
以下示例将在 tutorials_tbl 表格中创建 3 条记录 -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> INSERT INTO tutorials_tbl
→(tutorial_title, tutorial_author, submission_date)
→VALUES
→("Learn PHP", "John Poul", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
→(tutorial_title, tutorial_author, submission_date)
→VALUES
→("Learn MySQL", "Abdul S", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl
→(tutorial_title, tutorial_author, submission_date)
→VALUES
→("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 1 row affected (0.01 sec)
mysql>
NOTE - 请注意所有箭头符号 (→) 不是 SQL 命令的一部分。它们表示一个新行,并且在命令的每行末尾不加分号时,它们会由 MySQL 提示符自动创建。
在上述示例中,我们没有提供 tutorial_id,因为在创建表格时,我们为该字段给出了 AUTO_INCREMENT 选项。因此,MySQL 会自动插入这些 ID。此处, NOW() 是一个 MySQL 函数,它会返回当前日期和时间。
Inserting Data Using a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数向 MySQL 表中插入记录。此函数接受两个参数,在成功时返回 TRUE,在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 用于向表中插入记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
此示例将从用户那里获取三个参数,并将它们插入 MySQL 表 − −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Add New Record in MySQL Database</title>
</head>
<body>
<?php
if(isset($_POST['add'])) {
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if(! get_magic_quotes_gpc() ) {
$tutorial_title = addslashes ($_POST['tutorial_title']);
$tutorial_author = addslashes ($_POST['tutorial_author']);
} else {
$tutorial_title = $_POST['tutorial_title'];
$tutorial_author = $_POST['tutorial_author'];
}
$submission_date = $_POST['submission_date'];
$sql = "INSERT INTO tutorials_tbl ".
"(tutorial_title,tutorial_author, submission_date) "."VALUES ".
"('$tutorial_title','$tutorial_author','$submission_date')";
if ($mysqli→query($sql)) {
printf("Record inserted successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not insert record into table: %s<br />", $mysqli→error);
}
$mysqli→close();
} else {
?>
<form method = "post" action = "<?php $_PHP_SELF ?>">
<table width = "600" border = "0" cellspacing = "1" cellpadding = "2">
<tr>
<td width = "250">Tutorial Title</td>
<td><input name = "tutorial_title" type = "text" id = "tutorial_title"></td>
</tr>
<tr>
<td width = "250">Tutorial Author</td>
<td><input name = "tutorial_author" type = "text" id = "tutorial_author"></td>
</tr>
<tr>
<td width = "250">Submission Date [ yyyy-mm-dd ]</td>
<td><input name = "submission_date" type = "text" id = "submission_date"></td>
</tr>
<tr>
<td width = "250"> </td>
<td></td>
</tr>
<tr>
<td width = "250"> </td>
<td><input name = "add" type = "submit" id = "add" value = "Add Tutorial"></td>
</tr>
</table>
</form>
<?php
}
?>
</body>
</html>
MySQLi - Select Query
SQL SELECT 命令用于从 MySQL 数据库中获取数据。您可以在 mysql> 提示符以及任何像 PHP 这样的脚本中使用此命令。
Syntax
以下是用于从 MySQL 表格中获取数据的 SELECT 命令的通用 SQL 语法 -
SELECT field1, field2,...fieldN
FROM table_name1, table_name2...
[WHERE Clause]
[OFFSET M ][LIMIT N]
-
您可以使用一个或多个用逗号分隔的表格,使用一个 WHERE 子句包含各种条件,但 WHERE 子句是 SELECT 命令的可选部分。
-
你可以在单个 SELECT 命令中获取一个或多个字段。
-
你可以使用星号 (*) 来代替字段。这种情况下,SELECT 将返回所有字段。
-
您可以使用 WHERE 子句指定任何条件。
-
您可以使用 OFFSET 指定一个偏移量,SELECT 将从此偏移量开始返回记录。默认情况下,偏移量从零开始。
-
您可以使用 LIMIT 属性限制返回的数量。
Fetching Data from a Command Prompt
这将使用 SQL SELECT 命令从 MySQL 表 tutorials_tbl 中获取数据。
Example
以下示例将返回 tutorials_tbl 表中的所有记录 -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-21 |
| 2 | Learn MySQL | Abdul S | 2007-05-21 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.01 sec)
mysql>
Fetching Data Using a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来从 MySQL 表中选择记录。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 从 MySQL 表中选择记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试使用以下示例从表中选择记录-
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Creating MySQL Table</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl";
$result = $mysqli->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
Output
访问在 apache web 服务器上部署的 mysql_example.php,并验证输出。在运行选择脚本之前,我们在此表中输入了多条记录。
Connected successfully.
Id: 1, Title: MySQL Tutorial, Author: Mahesh, Date: 2021
Id: 2, Title: HTML Tutorial, Author: Mahesh, Date: 2021
Id: 3, Title: PHP Tutorial, Author: Mahesh, Date: 2021
Id: 4, Title: Java Tutorial, Author: Mahesh, Date: 2021
Id: 5, Title: Apache Tutorial, Author: Suresh, Date: 2021
MySQLi - WHERE Clause
我们已经看到了 SQL SELECT 命令,用于从 MySQL 表获取数据。我们可以使用一个称为 WHERE Clause 的条件子句来过滤结果。使用此 WHERE 子句,我们可以指定选择条件以从表中选择所需的记录。
Syntax
以下代码块有使用 WHERE 子句的 SELECT 命令的通用 SQL 语法,用于从 MySQL 表中获取数据 -
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
-
您可以使用一个或多个以逗号分隔的表,以使用 WHERE 子句包含各种条件,但 WHERE 子句是 SELECT 命令的可选部分。
-
您可以使用 WHERE 子句指定任何条件。
-
您可以使用 AND 或 OR 运算符指定多个条件。
-
WHERE 子句还可以与 DELETE 或 UPDATE SQL 命令一起用于指定条件。
WHERE 子句的工作方式类似于任何编程语言中的 if condition 。此子句用于将给定值与 MySQL 表中可用的字段值进行比较。如果外部的给定值等于 MySQL 表中可用的字段值,则它会返回该行。
以下是该 WHERE 子句中可以使用的运算符列表。
假设字段 A 持有 10 且字段 B 持有 20,那么 -
Operator |
Description |
Example |
= |
检查两个操作数的值是否相等,如果相等,则条件变为真。 |
(A = B) 为假。 |
!= |
检查两个操作数的值是否相等,如果值不相等,则条件变为真。 |
(A != B) 为真。 |
> |
检查左操作数的值是否大于右操作数的值,如果大于,则条件变为真。 |
(A > B) 不为真。 |
< |
检查左操作数的值是否小于右操作数的值,如果小于则条件变为真。 |
(A < B) 为真。 |
>= |
检查左操作数的值是否大于或等于右操作数的值,如果大于或等于,则条件变为真。 |
(A >= B) 不为真。 |
⇐ |
检查左操作数的值是否小于或等于右操作数的值,如果小于或等于,则条件变为真。 |
(A ⇐ B) 为真。 |
当您想要从表中获取所选行时,WHERE 子句非常有用,尤其是在使用 MySQL Join 时。联接将在另一章中讨论。
使用 Primary Key 搜索记录是一种常见的做法,可以使搜索更快。
如果给定条件与表中的任何记录都不匹配,则该查询将不会返回任何行。
Fetching Data from the Command Prompt
这将使用带有 WHERE 子句的 SQL SELECT 命令从 MySQL 表中获取所选数据 - tutorials_tbl 。
Example
以下示例将返回 tutorials_tbl 表中所有作者名为 Sanjay 的记录。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl WHERE tutorial_author = 'Sanjay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
除非对字符串执行 LIKE 比较,否则该比较不区分大小写。您可以使用 BINARY 关键字使搜索区分大小写,如下所示 -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl \
WHERE BINARY tutorial_author = 'sanjay';
Empty set (0.02 sec)
mysql>
Fetching Data Using a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数通过 where 子句选择 MySQL 表中的记录。此函数接受两个参数,并在成功时返回 TRUE,在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql Required - 使用 Where 子句选择 MySQL 表中记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例,通过表中的 where 子句选择记录 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Using Where Clause</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl where tutorial_author = "Mahesh"';
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
MySQLi - Update Query
可能需要修改 MySQL 表中的现有数据。您可以使用 SQL UPDATE 命令执行此操作。这将修改任何 MySQL 字段的任何字段值。
Syntax
以下代码块具有修改 MySQL 表中的数据的 UPDATE 命令的通用 SQL 语法 -
UPDATE table_name SET field1 = new-value1, field2 = new-value2
[WHERE Clause]
-
您可以同时更新一个或多个字段。
-
您可以使用 WHERE 子句指定任何条件。
-
每次可以更新单个表中的值。
当您想要更新表中的选定行时,WHERE 子句非常有用。
Updating Data from the Command Prompt
这将使用带 WHERE 子句的 SQL UPDATE 命令来更新 MySQL 表 tutorials_tbl 中选定的数据。
Example
以下示例将更新教程 ID 为 3 的记录的 tutorial_title 字段。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> UPDATE tutorials_tbl
→ SET tutorial_title = 'Learning JAVA'
→ WHERE tutorial_id = 3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
Updating Data Using a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来更新 MySQL 表中的记录。此函数接收两个参数,成功时返回 TRUE,失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 更新 MySQL 表中记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试使用以下示例来更新表中的记录-
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Updating MySQL Table</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($mysqli→query('UPDATE tutorials_tbl set tutorial_title = "Learning Java" where tutorial_id = 4')) {
printf("Table tutorials_tbl updated successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not update table: %s<br />", $mysqli→error);
}
$sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl";
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
Output
访问在 apache web 服务器上部署的 mysql_example.php,并验证输出。在运行选择脚本之前,我们在此表中输入了多条记录。
Connected successfully.
Table tutorials_tbl updated successfully.
Id: 1, Title: MySQL Tutorial, Author: Mahesh, Date: 2021
Id: 2, Title: HTML Tutorial, Author: Mahesh, Date: 2021
Id: 3, Title: PHP Tutorial, Author: Mahesh, Date: 2021
Id: 4, Title: Learning Java, Author: Mahesh, Date: 2021
Id: 5, Title: Apache Tutorial, Author: Suresh, Date: 2021
MySQLi - Delete Query
如果您想从任何 MySQL 表中删除记录,那么您可以使用 SQL 命令 DELETE FROM 。您可以在 mysql> 提示符处以及在 PHP 等任何脚本中使用此命令。
Syntax
以下代码块是 DELETE 命令的通用 SQL 语法,用于从 MySQL 表中删除数据。
DELETE FROM table_name [WHERE Clause]
-
如果未指定 WHERE 子句,则将从给定的 MySQL 表中删除所有记录。
-
您可以使用 WHERE 子句指定任何条件。
-
一次只能删除单个表中的记录。
当你想删除表中的选定行时,WHERE 子句非常有用。
Deleting Data from the Command Prompt
这将使用带有 WHERE 子句的 SQL DELETE 命令将所选数据删除到 MySQL 表中 - tutorials_tbl 。
Deleting Data Using a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来删除 MySQL 表中的记录。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 删除 MySQL 表中记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试使用以下示例来删除表中的记录 -
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Deleting MySQL Table record</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($mysqli→query('DELETE FROM tutorials_tbl where tutorial_id = 4')) {
printf("Table tutorials_tbl record deleted successfully.<br />");
}
if ($mysqli→errno) {
printf("Could not delete record from table: %s<br />", $mysqli→error);
}
$sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl";
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
Output
访问在 apache web 服务器上部署的 mysql_example.php,并验证输出。在运行选择脚本之前,我们在此表中输入了多条记录。
Connected successfully.
Table tutorials_tbl record deleted successfully.
Id: 1, Title: MySQL Tutorial, Author: Mahesh, Date: 2021
Id: 2, Title: HTML Tutorial, Author: Mahesh, Date: 2021
Id: 3, Title: PHP Tutorial, Author: Mahesh, Date: 2021
Id: 5, Title: Apache Tutorial, Author: Suresh, Date: 2021
MySQLi - Like Clause
我们已经见过 SQL SELECT 命令以从 MySQL 表中获取数据。我们还可以使用一个称为 WHERE 子句的条件子句来选择所需的记录。
带有“等于”符号 (=) 的 WHERE 子句可以正常工作,在这种情况下我们希望进行精确匹配。例如“tutorial_author = 'Sanjay'”。但可能会有一些要求,即我们希望过滤出教程作者名称应包含“jay”的所有结果。这可以使用 SQL LIKE Clause 和 WHERE 子句一起处理。
如果 SQL LIKE 子句与 % 字符一起使用,则它将像一个元字符( ) as in UNIX, while listing out all the files or directories at the command prompt. Without a % character, the LIKE clause is very same as the *equal to 符号和 WHERE 子句一起)。
Syntax
以下代码块具有 SELECT 命令的通用 SQL 语法以及 LIKE 子句,以从 MySQL 表中获取数据。
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
-
您可以使用 WHERE 子句指定任何条件。
-
您可以将 LIKE 子句与 WHERE 子句一起使用。
-
您可以使用 LIKE 子句代替 equals to 符号。
-
当 LIKE 与 % 符号一起使用时,它将像元字符搜索一样工作。
-
您可以使用 AND 或 OR 运算符指定多个条件。
-
还可以在 DELETE 或 UPDATE SQL 命令中使用 WHERE…LIKE 子句来指定条件。
Using the LIKE clause at the Command Prompt
这将使用具有 WHERE…LIKE 子句的 SQL SELECT 命令从 MySQL 表中获取选定的数据 – tutorials_tbl 。
Example
以下示例将返回 tutorials_tbl 表中作者名称以 jay 结尾的所有记录 −
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl
→ WHERE tutorial_author LIKE '%jay';
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
1 rows in set (0.01 sec)
mysql>
Using LIKE clause inside PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数使用 Like 子句来选择 MySQL 表中的记录。此函数接受两个参数并在成功时返回 TRUE,在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 使用 Like 子句在 MySQL 表中选择记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试以下示例,以在表中使用 like 子句选择记录 -
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Using Like Clause</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = 'SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl where tutorial_author like "Mah%"';
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
MySQLi - Sorting Results
我们已经见过 SQL SELECT 命令以从 MySQL 表中获取数据。当您选择行时,MySQL 服务器可以按任何顺序自由返回它们,除非您通过说明如何对结果排序来指示它这样做。但是,您可以通过添加 ORDER BY 子句来对结果集进行排序,该子句指定您要排序的列或多列。
Syntax
以下代码块是 SELECT 命令的一个通用 SQL 语法,以及 ORDER BY 子句以对 MySQL 表中的数据进行排序。
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
-
您可以对返回的结果进行任何字段的排序,如果该字段被列出。
-
您可以在多个字段上对结果进行排序。
-
您可以使用关键字 ASC 或 DESC 以升序或降序获取结果。默认情况下,它是升序。
-
您可以以通常方式使用 WHERE…LIKE 子句放置条件。
Using ORDER BY clause at the Command Prompt
这将使用具有 ORDER BY 子句的 SQL SELECT 命令从 MySQL 表中获取数据 – tutorials_tbl 。
Example
尝试以下示例,它以升序返回结果。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from tutorials_tbl ORDER BY tutorial_author ASC
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.42 sec)
mysql>
验证按升序列出的所有作者姓名。
Using ORDER BY clause inside a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数从 MySQL 表中获取排序记录。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 从表中获取排序记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
Example
尝试使用以下示例从表中获取排序记录 -
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Sorting MySQL Table records</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl order by tutorial_title asc";
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Title: %s, Author: %s, Date: %d <br />",
$row["tutorial_id"],
$row["tutorial_title"],
$row["tutorial_author"],
$row["submission_date"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
Output
访问部署在 Apache Web 服务器上的 mysql_example.php, 并验证输出。
Connected successfully.
Id: 5, Title: Apache Tutorial, Author: Suresh, Date: 2021
Id: 2, Title: HTML Tutorial, Author: Mahesh, Date: 2021
Id: 1, Title: MySQL Tutorial, Author: Mahesh, Date: 2021
Id: 3, Title: PHP Tutorial, Author: Mahesh, Date: 2021
MySQLi - Using Joins
在之前的章节中,我们一次从一个表中获取数据。这对于简单的数据获取已经足够了,但是在大多数现实世界的 MySQL 用法中,您通常需要在单个查询中从多个表中获取数据。
您可以在单个 SQL 查询中使用多个表。在 MySQL 中进行连接操作是指将两个或更多个表组合成一个表。
您可以在 SELECT、UPDATE 和 DELETE 语句中使用 JOINS 来连接 MySQL 表。我们还将看到 LEFT JOIN 的一个示例,它不同于简单的 MySQL JOIN。
Using Joins at the Command Prompt
假设我们在 TUTORIALS 中有两个表 tcount_tbl 和 tutorials_tbl 。现在,请查看以下给出的示例 -
Example
以下示例 -
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * FROM tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
| John Poul | 1 |
| Sanjay | 1 |
+-----------------+----------------+
6 rows in set (0.01 sec)
mysql> SELECT * from tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.00 sec)
mysql>
现在,我们可以编写一条 SQL 查询来连接这两个表。该查询将从表 tutorials_tbl 中选择所有作者,并将从 tcount_tbl 中选取相应的教程数量。
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
→ FROM tutorials_tbl a, tcount_tbl b
→ WHERE a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
2 rows in set (0.01 sec)
mysql>
Using Joins in a PHP Script
PHP 使用 mysqli query() 或 mysql_query() 函数来使用联接从 MySQL 表中获取记录。这个函数接收两个参数,并在成功时返回 TRUE,并在失败时返回 FALSE。
Syntax
$mysqli→query($sql,$resultmode)
Sr.No. |
Parameter & Description |
1 |
$sql 必需 - 使用连接从多个表获取记录的 SQL 查询。 |
2 |
$resultmode 可选 - MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 常量,具体取决于所需的行为。默认情况下,使用 MYSQLI_STORE_RESULT。 |
首先使用以下脚本在 MySQL 中创建表并插入两条记录。
create table tcount_tbl(
tutorial_author VARCHAR(40) NOT NULL,
tutorial_count int
);
insert into tcount_tbl values('Mahesh', 3);
insert into tcount_tbl values('Suresh', 1);
Example
尝试以下示例以使用连接获取两个表中的记录。−
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Using joins on MySQL Tables</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
$sql = 'SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
FROM tutorials_tbl a, tcount_tbl b
WHERE a.tutorial_author = b.tutorial_author';
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Id: %s, Author: %s, Count: %d <br />",
$row["tutorial_id"],
$row["tutorial_author"],
$row["tutorial_count"]);
}
} else {
printf('No record found.<br />');
}
mysqli_free_result($result);
$mysqli→close();
?>
</body>
</html>
Output
访问部署在 Apache Web 服务器上的 mysql_example.php, 并验证输出。
Connected successfully.
Id: 1, Author: Mahesh, Count: 3
Id: 2, Author: Mahesh, Count: 3
Id: 3, Author: Mahesh, Count: 3
Id: 5, Author: Suresh, Count: 1
MySQL LEFT JOIN
MySQL 左连接不同于简单连接。MySQL LEFT JOIN 会更加考虑表中左侧的列。
如果我执行 LEFT JOIN ,我将获得所有匹配的记录,并且另外,我将获得连接表左侧中每个不匹配记录的额外记录:从而确保(在我的示例中)每个 AUTHOR 都被提及。
Example
尝试以下示例来了解 LEFT JOIN。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT a.tutorial_id, a.tutorial_author, b.tutorial_count
→ FROM tutorials_tbl a LEFT JOIN tcount_tbl b
→ ON a.tutorial_author = b.tutorial_author;
+-------------+-----------------+----------------+
| tutorial_id | tutorial_author | tutorial_count |
+-------------+-----------------+----------------+
| 1 | John Poul | 1 |
| 2 | Abdul S | NULL |
| 3 | Sanjay | 1 |
+-------------+-----------------+----------------+
3 rows in set (0.02 sec)
您需要做更多的练习以熟悉 JOINS。这是一个稍微有点复杂的 MySQL/SQL 概念,并且在实际操作时会变得更加清晰。
MySQLi - Handling NULL Values
我们已经看到了 SQL SELECT 命令以及 WHERE 子句,用于从 MySQL 表中获取数据,但是当我们尝试给出一个条件时,该条件将字段或列值与 NULL 进行比较,它不能正常工作。
为了处理这种情况,MySQL 提供了三个运算符 -
-
IS NULL - 如果列值为 NULL,则此运算符返回 true。
-
IS NOT NULL - 此运算符在列值不为 NULL 时返回 true。
-
<⇒ - 此运算符比较值,即使对于两个 NULL 值,其也会为 true(与 = 运算符不同)。
涉及 NULL 的条件是特殊的。不能使用 = NULL 或 != NULL 来查找列中的 NULL 值。这种比较始终失败,因为无法判断它们是真还是假。有时,甚至 NULL = NULL 会失败。
要查找存在或不存在 NULL 的列,请使用 IS NULL 或 IS NOT NULL 。
Using NULL values at the Command Prompt
假设 TUTORIALS 数据库中有一个名为 tcount_tbl 的表,它包含两列,即 tutorial_author 和 tutorial_count ,其中 tutorial_count 为 NULL 表示该值未知。
Example
尝试以下示例:
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tcount_tbl
→ (
→ tutorial_author varchar(40) NOT NULL,
→ tutorial_count INT
→ );
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO tcount_tbl
→ (tutorial_author, tutorial_count) values ('mahran', 20);
mysql> INSERT INTO tcount_tbl
→ (tutorial_author, tutorial_count) values ('mahnaz', NULL);
mysql> INSERT INTO tcount_tbl
→ (tutorial_author, tutorial_count) values ('Jen', NULL);
mysql> INSERT INTO tcount_tbl
→ (tutorial_author, tutorial_count) values ('Gill', 20);
mysql> SELECT * from tcount_tbl;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| mahnaz | NULL |
| Jen | NULL |
| Gill | 20 |
+-----------------+----------------+
4 rows in set (0.00 sec)
mysql>
可以看到, = 和 != 不适用于 NULL 值,如下所示:
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count = NULL;
Empty set (0.00 sec)
mysql> SELECT * FROM tcount_tbl WHERE tutorial_count != NULL;
Empty set (0.01 sec)
要查找 tutorial_count 列存在或不存在的记录,应按以下程序中所示编写查询。
mysql> SELECT * FROM tcount_tbl
→ WHERE tutorial_count IS NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahnaz | NULL |
| Jen | NULL |
+-----------------+----------------+
2 rows in set (0.00 sec)
mysql> SELECT * from tcount_tbl
→ WHERE tutorial_count IS NOT NULL;
+-----------------+----------------+
| tutorial_author | tutorial_count |
+-----------------+----------------+
| mahran | 20 |
| Gill | 20 |
+-----------------+----------------+
2 rows in set (0.00 sec)
Handling NULL Values in a PHP Script
可以使用 if…else 条件根据 NULL 值准备查询。
以下示例从外部获取 tutorial_count,然后将其与表中可用值进行比较。
Example
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Handling NULL</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$tutorial_count = null;
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if( isset($tutorial_count )) {
$sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count = ' + $tutorial_count;
} else {
$sql = 'SELECT tutorial_author, tutorial_count
FROM tcount_tbl
WHERE tutorial_count IS NULL';
}
$result = $mysqli→query($sql);
if ($result→num_rows > 0) {
while($row = $result→fetch_assoc()) {
printf("Author: %s, Count: %d <br />",
$row["tutorial_author"],
$row["tutorial_count"]);
}
} else {
printf('No record found.<br />');
}
$mysqli→close();
?>
</body>
</html>
MySQLi - Database Info
Obtaining and Using MySQL Metadata
有三种类型的信息你希望从 MySQL 获得。
-
Information about the result of queries - 这包括受任何SELECT、UPDATE或DELETE语句影响的记录数量。
-
\s9 - 这包括有关表结构和数据库的信息。
-
Information about the MySQL server - 这包括数据库服务器的状态、版本号等。
在MySQL提示符下获取所有这些信息非常容易,但在使用PERL或PHP API时,我们需要显式调用各种API才能获取所有这些信息。
Obtaining the Number of Rows Affected by a Query
现在让我们看看如何获取此信息。
PERL Example
在 DBI 脚本中,受影响的行数由 do( ) 或 execute( ) 命令返回,具体取决于如何执行查询。
# Method 1
# execute $query using do( )
my $count = $dbh→do ($query);
# report 0 rows if an error occurred
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
# Method 2
# execute query using prepare( ) plus execute( )
my $sth = $dbh→prepare ($query);
my $count = $sth→execute ( );
printf "%d rows were affected\n", (defined ($count) ? $count : 0);
Listing Tables and Databases
列出所有数据库以及数据库服务器可用的表非常容易。如果你没有足够的权限,你的结果可能是 null 。
除了在以下代码块中显示的方法外,你还可以使用 SHOW TABLES 或 SHOW DATABASES 查询以在 PHP 或 PERL 中获取表或数据库列表。
PERL Example
# Get all the tables available in current database.
my @tables = $dbh→tables ( );
foreach $table (@tables ){
print "Table Name $table\n";
}
PHP Example
尝试以下示例以获取数据库信息 −
将以下示例复制粘贴为 mysql_example.php:
<html>
<head>
<title>Getting MySQL Database Info</title>
</head>
<body>
<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'root@123';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$tutorial_count = null;
if($mysqli→connect_errno ) {
printf("Connect failed: %s<br />", $mysqli→connect_error);
exit();
}
printf('Connected successfully.<br />');
if ($result = mysqli_query($mysqli, "SELECT DATABASE()")) {
$row = mysqli_fetch_row($result);
printf("Default database is %s<br />", $row[0]);
mysqli_free_result($result);
}
$mysqli→close();
?>
</body>
</html>
Output
访问部署在 Apache Web 服务器上的 mysql_example.php, 并验证输出。
Connected successfully.
Default database is tutorials
Getting Server Metadata
MySQL 中有几个重要命令可以在 MySQL 提示符处执行,也可以使用 PHP 等任何脚本来获取有关数据库服务器的各种重要信息。
Sr.No. |
Command & Description |
1 |
SELECT VERSION( ) 服务器版本字符串 |
2 |
SELECT DATABASE( ) 当前数据库名称(如果没有则为空) |
3 |
SELECT USER( ) Current username |
4 |
SHOW STATUS Server status indicators |
5 |
SHOW VARIABLES Server configuration variables |
MySQLi - Installation
Downloading MySQL
MySQLi 扩展旨在与 MySQL 4.1.13 版或更高版本配合使用,因此必须下载 MySQL。所有 MySQL 下载内容均位于 MySQL Downloads 。选择您需要的 MySQL Community Server 的最新版本号,并尽可能准确地选择您需要的平台。
Installing MySQL on Linux/UNIX
在 Linux 系统上安装 MySQL 的推荐方式是通过 RPM。MySQL AB 使以下 RPM 可在其网站上下载 −
-
MySQL − MySQL 数据库服务器,该服务器管理数据库和表,控制用户访问并处理 SQL 查询。
-
MySQL-client − MySQL 客户端程序,可用于连接到服务器并与之互动。
-
MySQL-devel − 在编译使用 MySQL 的其他程序时派上用场的库和头文件。
-
MySQL-shared − 共享库,用于 MySQL 客户端。
-
MySQL-bench − MySQL 数据库服务器的基准和性能测试工具。
此处列出的 MySQL RPM 都是在 SuSE Linux 系统上构建的,但通常可在其他 Linux 版本上轻松工作。
现在,按以下步骤继续安装 −
-
使用 root 用户登录系统。
-
切换到包含 RPM 的目录 −
-
执行以下命令安装 MySQL 数据库服务器。记住将斜体中的文件名替换为 RPM 的文件名。
[root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
-
这是可选项,但建议以相同的方式安装其余 RPM −
[root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
[root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
Installing MySQL on Windows
现在,在任何版本的 Windows 上进行默认安装比以前容易得多,因为 MySQL 现在已与安装程序很好地打包在一起。只需下载安装程序包,将其解压缩到任何位置,然后运行 setup.exe。
默认安装程序 setup.exe 将引导您完成琐碎的进程,并且默认情况下将把所有内容安装在 C:\mysql 下。
通过从命令提示符中首次启动服务器来测试服务器。转到可能是 C:\mysql\bin 的 mysqld 服务器位置,然后键入 −
mysqld.exe --console
NOTE − 如果在 NT 上,则必须使用 mysqld-nt.exe 而不是 mysqld.exe
如果一切顺利,您会看到一些有关启动和 InnoDB 的消息。如果不是,您可能有权限问题。确保储存数据的目录对数据库进程运行所在的任何用户(可能是 mysql)都是可访问的。
MySQL 不会将自身添加到开始菜单中,并且也没有特别好的 GUI 方式来停止服务器。因此,如果你倾向于通过双击 mysqld 可执行文件来启动服务器,你应记住通过使用 mysqladmin、任务列表、任务管理器或其他 Windows 特定方式手动停止进程。
Use the mysqladmin Utility to Obtain Server Status
使用 mysqladmin 二进制文件检查服务器版本。此二进制文件在 Linux 上的 /usr/bin 中和 Windows 上的 C:\mysql\bin 中可用。
[root@host]# mysqladmin --version
它将在 Linux 上生成以下结果。它可能随你的安装而变化 −
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386
如果您没有收到这样的消息,那么您的安装可能存在一些问题,您需要一些帮助来解决它。
Execute simple SQL commands using MySQL Client
您可以使用 MySQL 客户端通过使用 mysql 命令连接到 MySQL 服务器。此刻,您无需提供任何密码,因为默认情况下将设置为空白。
因此,只需使用以下命令
[root@host]# mysql
它应该会得到一个 mysql> 提示符。现在,您已连接到 MySQL 服务器,并且可以按以下方式在 mysql> 提示符处执行所有 SQL 命令 −
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.13 sec)
Post-installation Steps
MySQL 将一个空白的密码用于根 MySQL 用户。一旦你成功安装了数据库和客户端,你就需要按如下方式设置根密码 −
[root@host]# mysqladmin -u root password "new_password";
现在要连接到你的 MySQL 服务器,你必须使用以下命令 −
[root@host]# mysql -u root -p
Enter password:*******
UNIX 用户还希望将你的 MySQL 目录放在你的 PATH 中,这样你就不必在每次想要使用命令行客户端时输入全部路径。对于 bash,它将是类似下列的内容 −
export PATH = $PATH:/usr/bin:/usr/sbin
MySQLi - Administration
Running and Shutting down MySQL Server
首先检查你的 MySQL 服务器是否正在运行。你可以使用以下命令检查它 −
ps -ef | grep mysqld
如果您的 MySQL 正在运行,那么您将在结果中看到 mysqld 进程。如果服务器没有运行,那么您可以使用以下命令启动服务器:
root@host# cd /usr/bin
./safe_mysqld &
现在,如果您想关闭已经运行的 MySQL 服务器,那么您可以使用以下命令执行此操作:
root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
Setting Up a MySQL User Account
若要向 MySQL 添加新用户,您只需在数据库 mysql 中的 user 表中添加一个新条目。
以下程序是使用密码 guest123; 为新用户 guest 添加 SELECT、INSERT 和 UPDATE 权限的示例,SQL 查询如下:
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host | user | password |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
添加新用户时,请记住使用 MySQL 提供的 PASSWORD() 函数对新密码进行加密。正如您在上面的示例中看到的,密码 mypass 被加密为 6f8c114b58f2ce9e。
注意 FLUSH PRIVILEGES 语句。这会告诉服务器重新加载授予表。如果您不使用它,那么至少在服务器重新启动之前,您将无法使用新用户帐户连接到 MySQL。
您还可以通过在执行 INSERT 查询时将用户表中以下列的值设置为“Y”来为新用户指定其他权限,或者稍后使用 UPDATE 查询更新它们。
-
Select_priv
-
Insert_priv
-
Update_priv
-
Delete_priv
-
Create_priv
-
Drop_priv
-
Reload_priv
-
Shutdown_priv
-
Process_priv
-
File_priv
-
Grant_priv
-
References_priv
-
Index_priv
-
Alter_priv
添加用户帐户的另一种方法是使用 GRANT SQL 命令。以下示例将为名为 TUTORIALS 的特定数据库添加带有密码 zara123 的用户 zara 。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
→ ON TUTORIALS.*
→ TO 'zara'@'localhost'
→ IDENTIFIED BY 'zara123';
这还将在名为 user 的 MySQL 数据库表中创建一个条目。
NOTE − 在 SQL 命令的末尾加上分号 (;) 之前,MySQL 不会终止一个命令。
The /etc/my.cnf File Configuration
在大部分情况下,您不应该触碰此文件。默认情况下,它将具有以下条目:
[mysqld]
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
[mysql.server]
user = mysql
basedir = /var/lib
[safe_mysqld]
err-log = /var/log/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
在这里,您可以为错误日志指定一个不同的目录,否则您不应该更改此表中的任何条目。
Administrative MySQL Command
以下是一些重要的 MySQL 命令的列表,您将随时使用它们来处理 MySQL 数据库:
-
USE Databasename - 这将用于在 MySQL 工作区中选择数据库。
-
SHOW DATABASES - 它将列出 MySQL DBMS 可访问的数据库。
-
SHOW TABLES - 一旦使用 use 命令选择了数据库,则显示数据库中的表格。
-
SHOW COLUMNS FROM tablename: 显示表中的属性、属性类型、键信息、是否允许 NULL、默认值和其他信息。
-
SHOW INDEX FROM tablename - 显示表上所有索引的详细信息,包括 PRIMARY KEY。
-
SHOW TABLE STATUS LIKE tablename\G - 报告 MySQL DBMS 性能和统计数据详细信息。
MySQLi - Data Types
在表格中正确定义字段对于你的数据库的总体优化非常重要。你应该仅使用你真正需要使用的类型和字段大小;如果你知道你仅将使用 2 个字符,请不要定义一个 10 个字符宽的字段。这些类型的字段(或列)也被称为数据类型,根据你将在那些字段中存储的内容。
MySQL 使用许多不同的数据类型,分为三种类别:数值、日期和时间,以及字符串类型。
Numeric Data Types
MySQL 使用所有标准 ANSI SQL 数值数据类型,所以如果你从一个不同的数据库系统来到 MySQL,那么这些定义对你来说看起来将很熟悉。下面的列表显示了常见的数值数据类型和它们的描述 −
-
INT − 可以带符号或不带符号的常规大小整数。如果带符号,允许范围为 -2147483648 至 2147483647。如果无符号,允许范围为 0 至 4294967295。您可以指定不超过 11 位宽。
-
TINYINT − 可以带符号或不带符号的非常小的整数。如果带符号,允许范围为 -128 至 127。如果无符号,允许范围为 0 至 255。您可以指定不超过 4 位宽。
-
SMALLINT − 可以带符号或不带符号的小整数。如果带符号,允许范围为 -32768 至 32767。如果无符号,允许范围为 0 至 65535。您可以指定不超过 5 位宽。
-
MEDIUMINT − 可以带符号或不带符号的中等大小整数。如果带符号,允许范围为 -8388608 至 8388607。如果无符号,允许范围为 0 至 16777215。您可以指定不超过 9 位宽。
-
BIGINT − 可以带符号或不带符号的大整数。如果带符号,允许范围为 -9223372036854775808 至 9223372036854775807。如果无符号,允许范围为 0 至 18446744073709551615。您可以指定不超过 20 位宽。
-
FLOAT(M,D) − 不能为无符号的浮点数。您可以定义显示长度 (M) 和小数位数 (D)。这不是必需的,并会默认为 10,2,其中 2 为小数位数,10 为位数总数(包括小数)。小数精度对于 FLOAT 可达到 24 位数。
-
DOUBLE(M,D) − 不能为无符号的双精度浮点数。您可以定义显示长度 (M) 和小数位数 (D)。这不是必需的,并会默认为 16,4,其中 4 为小数位数。小数精度对于 DOUBLE 可达到 53 位数。REAL 是 DOUBLE 的同义词。
-
*DECIMAL(M,D) * − 一个不能为无符号的已解包浮点数。在已解包的十进制数中,每个十进制值对应一个字节。需要定义显示长度 (M) 和小数位数 (D)。NUMERIC 是 DECIMAL 的同义词。
Date and Time Types
MySQL 的日期和时间数据类型为 −
-
DATE − YYYY-MM-DD 格式的日期,介于 1000-01-01 和 9999-12-31 之间。例如,1973 年 12 月 30 日将存储为 1973-12-30。
-
DATETIME − YYYY-MM-DD HH:MM:SS 格式的日期和时间组合,介于 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间。例如,1973 年 12 月 30 日下午 3:30 将存储为 1973-12-30 15:30:00。
-
*TIMESTAMP * − 1970 年 1 月 1 日午夜与 2037 年的时间戳。这看起来像先前的 DATETIME 格式,只是没有数字之间的连字符;1973 年 12 月 30 日下午 3:30 将存储为 19731230153000 ( YYYYMMDDHHMMSS )。
-
TIME − 以 HH:MM:SS 格式存储时间。
-
YEAR(M) − 以 2 位或 4 位格式存储年份。如果长度指定为 2(例如 YEAR(2)),YEAR 可以是 1970 到 2069 (70 到 69)。如果长度指定为 4,YEAR 可以是 1901 到 2155。默认长度是 4。
String Types
尽管数值和日期类型很有趣,但你将存储的大多数数据将为字符串格式。此列表描述了 MySQLi 中的常见字符串数据类型。
-
CHAR(M) − 长度在 1 到 255 个字符之间的固定长度字符串(例如 CHAR(5)),存储时使用空格右填充至指定长度。不必定义长度,但默认值为 1。
-
VARCHAR(M) − 长度在 1 到 255 个字符之间的可变长度字符串;例如 VARCHAR(25)。创建 VARCHAR 字段时你必须定义一个长度。
-
BLOB or TEXT − 最大长度为 65535 个字符的字段。BLOB 是“二进制大对象”,用于存储大量二进制数据,例如图像或其他类型的文件。定义为 TEXT 的字段也包含大量数据;它们之间的差别在于对存储数据执行的排序和比较对于 BLOB 是区分大小写的,而对于 TEXT 字段则不区分大小写。你不会使用 BLOB 或 TEXT 指定长度。
-
TINYBLOB or TINYTEXT − 最大长度为 255 个字符的 BLOB 或 TEXT 列。对于 TINYBLOB 或 TINYTEXT,无需指定长度。
-
MEDIUMBLOB or MEDIUMTEXT − 最大长度为 16777215 个字符的 BLOB 或 TEXT 列。对于 MEDIUMBLOB 或 MEDIUMTEXT,无需指定长度。
-
LONGBLOB or LONGTEXT − 最大长度为 4294967295 个字符的 BLOB 或 TEXT 列。对于 LONGBLOB 或 LONGTEXT,无需指定长度。
-
*ENUM * − 一个枚举,这是列表的一个花哨术语。在定义 ENUM 时,你正在创建一个项目列表,必须从该列表中选择值(或者它可以为 NULL)。例如,如果你希望你的字段包含“A”或“B”或“C”,那么你将定义你的 ENUM 为 ENUM ('A', 'B', 'C'),并且只有那些值(或 NULL)可以填充该字段。
MySQLi - Regexps
您已使用 LIKE …% 看到 MySQL 模式匹配。MySQL 支持另一种基于正则表达式和 REGEXP 运算符的模式匹配操作。如果您熟悉 PHP 或 PERL,那么对您来说理解起来很简单,因为这种匹配与那些脚本正则表达式非常相似。
以下是可与 REGEXP 运算符一起使用的模式表。
Pattern |
What the pattern matches |
^ |
Beginning of string |
$ |
End of string |
. |
Any single character |
[…] |
方括号内列出的任何字符 |
[^…] |
方括号内未列出的任何字符 |
p1 |
p2 |
p3 |
交替;与模式 p1、p2 或 p3 中的任何一个匹配 |
* |
前一个元素的多个实例 |
+ |
前一个元素的一个或多个实例 |
{n} |
前一个元素的 n 个实例 |
{m,n} |
前一个元素的 m 到 n 个实例 |
Examples
现在,基于上表,您可以设计各种类型的 SQL 查询以满足您的要求。这里我列出一些供您理解。假设我们有一张名为 tutorials_inf 的表,它有一个名为 name 的字段−
查找所有以“sa”开头的名称的查询
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^sa';
示例输出如下所示 −
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
查找所有以“ai”结尾的名称的查询
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'ai$';
示例输出如下所示 −
+----+------+
| id | name |
+----+------+
| 1 | sai |
+----+------+
1 row in set (0.00 sec)
查找包含“a”的所有名称的查询
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP 'a';
示例输出如下所示 −
+----+-------+
| id | name |
+----+-------+
| 1 | sai |
| 3 | ram |
| 4 | johar |
+----+-------+
3 rows in set (0.00 sec)
查找所有以元音开头的名称的查询
mysql> SELECT * FROM tutorials_inf WHERE name REGEXP '^[aeiou]';
MySQLi - Transactions
事务是一组顺序的数据库操作,执行时就好像它是单个工作单元一样。换句话说,除非组内的每个操作都成功,否则事务永远不会完成。如果事务中的任何操作失败,整个事务都将失败。
实际上,你会将许多 SQL 查询组合到一个组中,并将它们全部作为事务的一部分一起执行。
Properties of Transactions
事务具有以下四个标准属性,通常用首字母缩写词 ACID 提到 -
-
Atomicity − 确保工作单元中的所有操作都已成功完成;否则,事务将中止在失败点,并且以前的操作将回滚到其先前状态。
-
Consistency - 确保在成功提交事务后数据库正确更改状态。
-
Isolation − 允许事务独立且透明地相互操作。
-
Durability - 确保已提交事务的结果或影响在系统故障的情况下持续存在。
在 MySQL 中,事务以 BEGIN WORK 语句开始,并以 COMMIT 或 ROLLBACK 语句结束。开始和结束语句之间的 SQLi 命令形成事务的主体。
COMMIT and ROLLBACK
这两个关键字 Commit 和 Rollback 主要用于 MySQL 事务。
-
当成功完成一个事务时,应当发出 COMMIT 命令,以使对所有相关的表所作的更改生效。
-
如果发生故障,应当发出 ROLLBACK 命令,以使事务中引用的每个表返回到其之前的状态。
你可以通过设置名为 AUTOCOMMIT 的会话变量来控制事务的行为。如果 AUTOCOMMIT 设置为 1(默认),则每个 SQL 语句(在事务中或不在事务中)都被视为一个完整的事务,并在完成后默认提交。当 AUTOCOMMIT 设置为 0,即发出 SET AUTOCOMMIT=0 命令时,后续一系列语句就像一个事务,并且在发出显式 COMMIT 语句之前不会提交任何活动。
你可以使用 mysqli_query() 函数在 PHP 中执行这些 SQL 命令。
Generic Example on Transaction
这个事件序列与所使用的编程语言无关;逻辑路径可以在用于创建应用程序的任何语言中创建。
你可以使用 mysqli_query() 函数在 PHP 中执行这些 SQL 命令。
-
通过发出 SQL 命令 BEGIN WORK. 开始事务
-
发出一个或多个 SQL 命令,例如 SELECT、INSERT、UPDATE 或 DELETE。
-
检查是否存在错误并确保一切符合你的要求。
-
如果出现任何错误,则发出 ROLLBACK 命令,否则发出 COMMIT 命令。
Transaction-Safe Table Types in MySQL
你不能直接使用事务,你可以使用它们,但它们并不安全且不能保证。如果你计划在 MySQL 编程中使用事务,则需要以特殊的方式创建表。有许多类型的表格支持事务,但最受欢迎的表格是 InnoDB 。
对 InnoDB 表的支持要求从源代码编译 MySQL 时使用一个特定的编译参数。如果你的 MySQL 版本不支持 InnoDB,请让你的互联网服务提供商构建一个支持 InnoDB 表类型的 MySQL 版本或下载并安装适用于 Windows 或 Linux/UNIX 的 MySQL-Max 二进制分发并使用开发环境中的表类型工作。
如果你的 MySQL 安装支持 InnoDB 表,只需向表创建语句中添加一个 TYPE = InnoDB 定义即可。例如,以下代码创建一个名为 tutorials_innodb 的 InnoDB 表 -
root@host# mysql -u root -p;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_innodb
→ (
→ tutorial_author varchar(40) NOT NULL,
→ tutorial_count INT
→ ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)
查看以下链接以了解更多信息 - InnoDB
您可以使用其他表类型,如 GEMINI 或 BDB ,但它取决于您的安装是否支持这两种类型。
MySQLi - ALTER Command
MySQL ALTER 命令非常有用,当你想更改表格名称、任何表格字段或你想添加或删除表格中的现有列时。
让我们从创建一个名为 tutorials_alter 的表格开始。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table tutorials_alter
→ (
→ i INT,
→ c CHAR(1)
→ );
Query OK, 0 rows affected (0.27 sec)
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.02 sec)
Dropping, Adding or Repositioning a Column
假设您想放弃上面 MySQL 表的现有列 i ,那么您将按照如下所示,使用 DROP 子句和 ALTER 命令 −
mysql> ALTER TABLE tutorials_alter DROP i;
当列是表格中仅剩的一列时, DROP 不会起作用。
要添加列,请使用 ADD 并指定列定义。以下语句将 i 列还原到教程_更改 −
mysql> ALTER TABLE tutorials_alter ADD i INT;
发出此语句后,testalter 将包含与您首次创建表时相同的两列,但结构不会完全相同。这是因为默认情况下会将新列添加到表的末尾。因此,即使 i 最初是 mytbl 中的第一列,现在它也是最后一列了。
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
要指示您要在表的特定位置放置一列,请使用 FIRST 使其成为第一列,或使用 AFTER col_name 指示将新列置于 col_name 之后。试用一下以下 ALTER TABLE 语句,并在每个语句后使用 SHOW COLUMNS 来查看每个语句有什么效果 −
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 限定符仅适用于 ADD 子句。这意味着如果您想重新定位表中现有的列,则必须先将其 DROP,然后在新的位置将其 ADD。
Changing a Column Definition or Name
要更改列的定义,请使用 MODIFY 或 CHANGE 子句以及 ALTER 命令。例如,要将列 c 从 CHAR(1) 更改为 CHAR(10),请这样做 −
mysql> ALTER TABLE tutorials_alter MODIFY c CHAR(10);
使用 CHANGE 时,语法有些不同。在 CHANGE 关键字后面,您命名要更改的列,然后指定新定义,其中包括新名称。试用以下示例:
mysql> ALTER TABLE tutorials_alter CHANGE i j BIGINT;
如果您现在使用 CHANGE 将 j 从 BIGINT 转换回 INT 而无需更改列名,则语句将按预期的那样 −
mysql> ALTER TABLE tutorials_alter CHANGE j j INT;
The Effect of ALTER TABLE on Null and Default Value Attributes −
在 MODIFY 或 CHANGE 列时,您还可以指定列是否可以包含 NULL 值以及其默认值是什么。事实上,如果不这样做,MySQL 会自动为这些属性分配值。
以下示例中,NOT NULL 列的默认值为 100。
mysql> ALTER TABLE tutorials_alter
→ MODIFY j BIGINT NOT NULL DEFAULT 100;
如果您不使用上述命令,那么 MySQL 将填入所有列中的 NULL 值。
Changing a Column’s Default Value
您可以使用 ALTER 命令更改任何列的默认值。试用以下示例。
mysql> ALTER TABLE tutorials_alter ALTER j SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | 1000 | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
您可以使用 DROP 子句和 ALTER 命令从任何列中删除默认约束。
mysql> ALTER TABLE tutorials_alter ALTER j DROP DEFAULT;
mysql> SHOW COLUMNS FROM tutorials_alter;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c | char(10) | YES | | NULL | |
| j | bigint(20) | NO | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
Changing a Table Type
您可以使用 TYPE 子句和 ALTER 命令使用表类型。
要找出表当前的类型,请使用 SHOW TABLE STATUS 语句。
mysql> SHOW TABLE STATUS LIKE 'tutorials_alter'\G
*************************** 1. row ***************************
Name: tutorials_alter
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2017-02-17 11:30:29
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
MySQLi - Indexes
数据库索引是一种数据结构,可以提高表中操作的速度。可以使用一个或多个列创建索引,既可以快速随机查找,也可以有效地对记录访问进行排序。
在创建索引时,应考虑创建 SQL 查询和在这些列上创建或多个索引的列。
实际上,索引也是表的一种类型,它保留主键或索引字段和指向实际表中每条记录的指针。
用户无法看到索引,它们仅用于加速查询,并将由数据库搜索引擎用来非常快速地查找记录。
INSERT 和 UPDATE 语句在具有索引的表上花费更多时间,而 SELECT 语句在这些表上变得快速。原因是在执行插入或更新时,数据库也需要插入或更新索引值。
Simple and Unique Index
可以在表上创建唯一索引。唯一索引意味着,两行不能有相同的索引值。以下是在表上创建索引的语法。
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...);
你可以使用一列或多列来创建索引。例如,我们可以使用 NAME_INDEX 在 tutorials_inf 上创建一个索引。
CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf(name);
你可以在表上创建一个简单索引。只需从查询中省略 UNIQUE 关键字即可创建简单索引。简单索引允许表中有重复值。
如果你想按降序对列中的值进行索引,可以在列名后添加保留字 DESC。
mysql> CREATE UNIQUE INDEX NAME_INDEX ON tutorials_inf (name DESC);
ALTER command to add and drop INDEX
有四类用于向表中添加索引的语句 −
-
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list) − 此语句添加一个主键,这意味着索引值必须唯一且不能为 NULL。
-
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list) - 此语句创建一个索引,其值必须唯一(除了可能多次出现的 NULL 值)。
-
ALTER TABLE tbl_name ADD INDEX index_name (column_list) − 这添加了一个普通索引,其中任何值都可能出现多次。
-
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list) − 这创建了一个特殊的 FULLTEXT 索引,用于文本搜索目的。
以下是将索引添加到现有表中的示例。
mysql> ALTER TABLE tutorials_inf ADD INDEX (id);
你还可以使用 DROP 子句和 ALTER 命令以相同的方式删除主键。尝试以下示例以删除上述创建的索引。
mysql> ALTER TABLE tutorials_inf DROP INDEX (c);
你还可以使用 DROP 子句和 ALTER 命令以相同的方式删除主键。尝试以下示例以删除上述创建的索引。
ALTER Command to add and drop PRIMARY KEY
你也可以添加主键。但请确保主键作用于 NOT NULL 列。
以下为向现有表格添加主键的示例。这将首先使列成为非空,再将其添加为主键。
mysql> ALTER TABLE tutorials_inf MODIFY id INT NOT NULL;
mysql> ALTER TABLE tutorials_inf ADD PRIMARY KEY (id);
您可以使用 ALTER 命令放弃主键,如下所示:
mysql> ALTER TABLE tutorials_inf DROP PRIMARY KEY;
要删除一个不是主键的索引,你必须指定索引名称。
MySQLi - Temporary Tables
在某些情况下,临时表可能对保存临时数据非常有用。应该了解关于临时表的最重要的事情是,在当前客户端会话终止时,这些表将被删除。
如前所述,临时表只会持续到会话结束为止。如果您在 PHP 脚本中运行代码,那么临时表将在脚本执行完毕后自动销毁。如果您通过 MySQL 客户端程序连接到 MySQL 数据库服务器,那么该临时表将一直存在到您关闭客户端或手动销毁表为止。
Example
以下示例展示了临时表的使用方法。相同的代码可以使用 mysqli_query() 函数在 PHP 脚本中。
mysql> CREATE TEMPORARY TABLE SalesSummary (
→ product_name VARCHAR(50) NOT NULL
→ , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
→ , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
→ , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
→ );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO SalesSummary
→ (product_name, total_sales, avg_unit_price, total_units_sold)
→ VALUES
→ ('cucumber', 100.25, 90, 2);
mysql> SELECT * FROM SalesSummary;
+--------------+-------------+----------------+------------------+
| product_name | total_sales | avg_unit_price | total_units_sold |
+--------------+-------------+----------------+------------------+
| cucumber | 100.25 | 90.00 | 2 |
+--------------+-------------+----------------+------------------+
1 row in set (0.00 sec)
当您发出 SHOW TABLES 命令时,您的临时表将不会列在列表中。现在,如果您注销 MySQL 会话,然后发出 SELECT 命令,那么您将发现数据库中没有可用数据。即使您的临时表也不存在。
MySQLi - Clone Tables
可能存在需要一张表的精确副本的情况,而对于 CREATE TABLE … SELECT 来说,因为副本必须包含相同的索引、默认值等,它并不适合你的目的。
你可以执行以下步骤来处理此类情况−
-
使用“SHOW CREATE TABLE”获取“CREATE TABLE”语句,该语句指定源表结构、索引等。
-
修改语句以将表名更改为克隆表的表名,然后执行该语句。通过这种方式,你将获得精确的克隆表。
-
另外,如果还需要复制表内容,请再发布“INSERT INTO… SELECT”语句。
Step 1
获取表的完整结构。
mysql> SHOW CREATE TABLE tutorials_inf \G;
*************************** 1. row ***************************
Table: tutorials_inf
Create Table: CREATE TABLE `tutorials_inf` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `AUTHOR_INDEX` (`name`),
UNIQUE KEY `NAME_INDEX` (`name`),
KEY `id` (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1
1 row in set (0.05 sec)
ERROR: No query specified
MySQLi - Using Sequences
序列是一组按需生成的整数 1, 2, 3, …。在数据库中经常使用序列,因为许多应用程序要求表格中的每一行都包含一个唯一值,而序列提供了一种简单的生成它们的方法。本章介绍如何在 MySQL 中使用序列。
Example
试一试下面的示例。这将创建表格,在表格中插入几行,而无需提供记录 ID,因为它已由 MySQL 自动递增。
mysql>CREATE TABLE tutorials_auto(
id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL,PRIMARY KEY(id));
Query OK, 0 rows affected (0.28 sec)
mysql>INSERT INTO tutorials_auto(id,name) VALUES(NULL,'sai'),(NULL,'ram');
Query OK, 2 rows affected (0.12 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM insect ORDER BY id;
+----+------+
| id | name |
+----+------+
| 1 | sai |
| 2 | ram |
+----+------+
2 rows in set (0.05 sec)
Obtain AUTO_INCREMENT Values
LAST_INSERT_ID() 是一个 SQL 函数,因此您可以从任何理解如何发出 SQL 语句的客户端中使用它。否则,PERL 和 PHP 脚本提供独占功能来检索最后记录的自动递增值。
PERL Example
使用 mysql_insertid 属性来获取查询生成的 AUTO_INCREMENT 值。此属性可通过数据库句柄或语句句柄访问,具体取决于您如何发出查询。以下示例通过数据库句柄引用它:
$dbh→do ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')");
my $seq = $dbh→{mysqli_insertid};
PHP Example
发出生成 AUTO_INCREMENT 值的查询后,通过调用 mysql_insert_id() 来检索值 -
mysql_query ("INSERT INTO tutorials_auto (name,date,origin)
VALUES('moth','2001-09-14','windowsill')", $conn_id);
$seq = mysqli_insert_id ($conn_id);
Renumbering an Existing Sequence
在您从表中删除许多记录且希望重新排序所有记录时,可能会出现这种情况。这可以通过一个简单的技巧来完成,但如果您的表与其他表具有联接,则在执行此操作时应格外小心。
如果您确定对 AUTO_INCREMENT 列重新排序不可避免,那么执行此操作的方法是从表中删除该列,然后重新添加该列。以下示例展示了如何使用此技术重新编号 insect 表中的 id 值 -
mysql> ALTER TABLE tutorials_auto DROP id;
mysql> ALTER TABLE tutorials_auto
→ ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
→ ADD PRIMARY KEY (id);
Starting a Sequence at a Particular Value
默认情况下,MySQLi 将从 1 开始序列,但您还可以在创建表时指定任何其他数字。以下是 MySQL 将从 100 开始序列的示例。
mysql> CREATE TABLE tutorials_auto
→ (
→ id INT UNSIGNED NOT NULL AUTO_INCREMENT = 100,
→ PRIMARY KEY (id),
→ name VARCHAR(30) NOT NULL,
→ );
或者,你可以创建表,然后使用 ALTER TABLE 设置初始序列值。
mysql> ALTER TABLE tutorials_auto AUTO_INCREMENT = 100;
MySQLi - Handling Duplicates
表或结果集有时会包含重复记录。有时允许这样做,但有时需要停止重复记录。有时,需要识别重复记录并将其从表中删除。本章将介绍如何防止重复记录出现在表中,以及如何删除已存在的重复记录。
Preventing Duplicates from Occurring in a Table
你可以在具有适当字段的表上使用 PRIMARY KEY 或 UNIQUE 索引来停止重复记录。我们举一个例子:下表没有这样的索引或主键,因此它将允许 first_name 和 last_name 出现重复记录。
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
若要防止在此表中创建具有相同 first 和 last 名称值的多个记录,请在其定义中添加 PRIMARY KEY。在你这样做的时候,同时有必要声明索引列为 NOT NULL,因为 PRIMARY KEY 不允许 NULL 值 −
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
表中存在唯一索引通常会导致出现错误,如果你向表中插入一条记录,该记录会使索引所定义的列或列中的现有记录重复。
使用 INSERT IGNORE 而不是 INSERT 。如果记录不重复现有记录,MySQL 将照常插入它。如果记录是重复的,IGNORE 关键字告诉 MySQL 在不生成错误的情况下默默地丢弃它。
下面的例子不会出错,同时也不会插入重复的记录。
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
→ VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
→ VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
使用 REPLACE 而不是 INSERT。如果记录是新的,则会像 INSERT 一样插入它。如果它是重复的,则新记录将替换旧记录 −
mysql> REPLACE INTO person_tbl (last_name, first_name)
→ VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
→ VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
应根据你希望施加的重复处理行为选择 INSERT IGNORE 和 REPLACE。INSERT IGNORE 会保留一组重复记录中的第一个,并丢弃其余记录。REPLACE 会保留一组重复记录中的最后一个,并删除任何先前的记录。
强制唯一性的另一种方法是向表中添加 UNIQUE 索引而不是 PRIMARY KEY。
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
Counting and Identifying Duplicates
以下是计算表中带有 first_name 和 last_name 的重复记录的查询。
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
→ FROM person_tbl
→ GROUP BY last_name, first_name
→ HAVING repetitions > 1;
此查询将返回 person_tbl 表中所有重复记录的列表。一般来说,要识别重复值集,请执行以下操作 −
-
确定包含可能重复值的列。
-
在列选择列表中列出那些列,以及 COUNT(*)。
-
还可在 GROUP BY 子句中列出列。
-
添加 HAVING 子句,该子句通过要求组计数大于 1 来消除唯一值。
Eliminating Duplicates from a Query Result:
你可以将 DISTINCT 与 SELECT 语句一起使用,以查找表中可用的唯一记录。
mysql> SELECT DISTINCT last_name, first_name
→ FROM person_tbl
→ ORDER BY last_name;
与 DISTINCT 对应的替代方法是添加一个 GROUP BY 子句,该子句命名你正在选择的列。这将起到删除重复项并仅选择指定列中值唯一组合的效果 −
mysql> SELECT last_name, first_name
→ FROM person_tbl
→ GROUP BY (last_name, first_name);
Removing Duplicates Using Table Replacement
如果你在表中复制记录并且希望从该表中删除所有重复记录,那么这里有一个过程 -
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
→ FROM person_tbl;
→ GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
从表中删除重复记录的一种简单方法是向该表添加 INDEX 或 PRIMAY KEY。即使此表已经可用,你也可以使用此技术来删除重复记录,并且将来你也将安全。
mysql> ALTER IGNORE TABLE person_tbl
→ ADD PRIMARY KEY (last_name, first_name);