MySQL往期文章 | |||
---|---|---|---|
mysql1> 安装与管理,安装,管理 |
| mysql2> PHP语法,mysql连接
| mysql3> 创建数据库,删除数据库,选择数据库
| mysq7> 元数据,序列使用,处理重复数据,及SQL注入,导出数据,导入数据
| | mysql4> 数据类型,创建数据表,删除数据表,插入数据,查询数据
| mysql5> where子句,UPDATE查询,DELETE语句,LIKE子句,排序,Join的使用
| mysql6> Null值处理,正则表达式,事务,ALTER命令,索引,临时表,复制表
| |
MySQL where 子句
我们知道从MySQL表中使用SQL SELECT
语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE
子句添加到 SELECT
语句中。
语法
以下是SQL SELECT
语句使用WHERE
子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
- 查询语句中你可以使用一个或者多个表,表之间使用逗号
(,)
分割,并使用WHERE
语句来设定查询条件。 - 你可以在
WHERE
子句中指定任何条件。 - 你可以使用
AND
或者OR
指定一个或多个条件。 WHERE
子句也可以运用于SQL的DELETE
或者UPDATE
命令。WHERE
子句类似于程序语言中的if
条件,根据 MySQL 表中的字段值来读取指定的数据。
以下为操作符列表,可用于 WHERE
子句中。
下表中实例假定 A为10 B为20
操作符 | 描述 | 实例 |
---|---|---|
= | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
<>, != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
> | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
< | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
>= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
<= | 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
如果我们想再MySQL数据表中读取指定的数据,WHERE
子句是非常有用的。
使用主键来作为 WHERE
子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
从命令提示符中读取数据
我们将在SQL SELECT语句使用WHERE
子句来读取MySQL数据表tutorials_tbl
中的数据:
实例
以下实例将读取tutorials_tbl
表中tutorial_author
字段值为 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
来比较字符串,否则MySQL的WHERE
子句的字符串比较是不区分大小写的。 你可以使用BINARY
关键字来设定WHERE
子句的字符串比较是区分大小写的。
如下实例
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>
使用PHP脚本读取数据
你可以使用PHP函数的mysql_query()
及相同的SQL SELECT
带上 WHERE
子句的命令来获取数据。
该函数用于执行SQL命令,然后通过 PHP 函数 mysql_fetch_array()
来输出所有查询的数据。
实例
以下实例将从 tutorials_tbl
表中返回使用 tutorial_author
字段值为Sanjay
的记录:
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author="Sanjay"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL UPDATE 查询
如果我们需要修改或更新MySQL中的数据,我们可以使用 SQL UPDATE
命令来操作。.
语法
以下是 UPDATE
命令修改 MySQL 数据表数据的通用SQL语法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- 你可以同时更新一个或多个字段。
- 你可以在
WHERE
子句中指定任何条件。 - 你可以在一个单独表中同时更新数据。
当你需要更新数据表中指定行的数据时WHERE
子句是非常有用的。
通过命令提示符更新数据
以下我们将在 SQL UPDATE
命令使用WHERE
子句来更新tutorials_tbl
表中指定的数据:
实例
以下实例将更新数据表中 tutorial_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>
使用PHP脚本更新数据
PHP中使用函数mysql_query()
来执行SQL语句,你可以在SQL UPDATE
语句中使用或者不适用WHERE
子句。
该函数与在mysql>命令提示符中执行SQL语句的效果是一样的。
实例
以下实例将更新 tutorial_id
为3
的 tutorial_title
字段的数据。
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'UPDATE tutorials_tbl
SET tutorial_title="Learning JAVA"
WHERE tutorial_id=3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
?>
MySQL DELETE 语句
你可以使用 SQL 的DELETE FROM
命令来删除 MySQL 数据表中的记录。
你可以在mysql>命令提示符或PHP脚本中执行该命令。
语法
以下是SQL DELETE
语句从MySQL数据表中删除数据的通用语法:
DELETE FROM table_name [WHERE Clause]
- 如果没有指定
WHERE
子句,MySQL表中的所有记录将被删除。 - 你可以在
WHERE
子句中指定任何条件 - 您可以在单个表中一次性删除记录。
当你想删除数据表中指定的记录时WHERE
子句是非常有用的。
从命令行中删除数据
这里我们将在SQL DELETE
命令中使用WHERE
子句来删除MySQL数据表tutorials_tbl
所选的数据。
实例
以下实例将删除 tutorial_tbl
表中tutorial_id
为3
的记录:
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> DELETE FROM tutorials_tbl WHERE tutorial_id=3;
Query OK, 1 row affected (0.23 sec)
mysql>
使用 PHP 脚本删除数据
PHP使用mysql_query()
函数来执行SQL语句, 你可以在SQL DELETE
命令中使用或不使用 WHERE
子句。
该函数与 mysql>命令符执行SQL命令的效果是一样的。
实例
以下PHP实例将删除tutorial_tbl
表中tutorial_id
为3
的记录:
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'DELETE FROM tutorials_tbl
WHERE tutorial_id=3';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not delete data: ' . mysql_error());
}
echo "Deleted data successfully\n";
mysql_close($conn);
?>
MySQL LIKE 子句
我们知道在MySQL中使用SQL SELECT
命令来读取数据, 同时我们可以在SELECT
语句中使用WHERE
子句来获取指定的记录。WHERE
子句中可以使用等号(=)
来设定获取数据的条件,如 "tutorial_author = 'Sanjay'"
。
但是有时候我们需要获取 tutorial_author
字段含有 "jay"
字符的所有记录,这时我们就需要在WHERE
子句中使用 SQL LIKE
子句。SQL LIKE
子句中使用百分号(%)
字符来表示任意字符,类似于UNIX
或正则表达式中的星号(*)
。
如果没有使用百分号(%)
,LIKE
子句与等号(=)
的效果是一样的。
语法
以下是SQL SELECT
语句使用LIKE
子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN table_name1, table_name2...
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
- 你可以在
WHERE
子句中指定任何条件。 - 你可以在
WHERE
子句中使用LIKE
子句。 - 你可以使用
LIKE
子句代替等号(=)
。 LIKE
通常与%
一同使用,类似于一个元字符的搜索。- 你可以使用
AND
或者OR
指定一个或多个条件。 - 你可以在
DELETE
或UPDATE
命令中使用WHERE...LIKE
子句来指定条件。在命令提示符中使用 LIKE 子句
以下我们将在SQL SELECT
命令中使用WHERE...LIKE
子句来从MySQL数据表tutorials_tbl
中读取数据。实例
以下是我们将tutorials_tbl
表中获取tutorial_author
字段中以"jay"
为结尾的的所有记录: ```php 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>
<a name="fhge4"></a>
## 在PHP脚本中使用 LIKE 子句
你可以使用PHP函数的`mysql_query()`及相同的`SQL SELECT` 带上 `WHERE...LIKE `子句的命令来获取数据。<br />该函数用于执行SQL命令,然后通过 PHP 函数` mysql_fetch_array() `来输出所有查询的数据。<br />但是如果是`DELETE`或者`UPDATE`中使用` WHERE...LIKE` 子句的SQL语句,则无需使用`mysql_fetch_array() `函数。
<a name="Ta87Z"></a>
### 实例
以下是我们使用PHP脚本在`tutorials_tbl`表中读取`tutorial_author`字段中以`"jay"`为结尾的的所有记录:
```php
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
WHERE tutorial_author LIKE "%jay%"';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL 排序
我们知道从MySQL表中使用SQL SELECT
语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用MySQL的 ORDER BY
子句来设定你想按哪个字段哪中方式来进行排序,再返回搜索结果。
语法
以下是SQL SELECT
语句使用 ORDER BY
子句将查询数据排序后再返回数据:
SELECT field1, field2,...fieldN table_name1, table_name2...
ORDER BY field1, [field2...] [ASC [DESC]]
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
- 你可以设定多个字段来排序。
- 你可以使用
ASC
或DESC
关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升排列。 - 你可以添加
WHERE...LIKE
子句来设置条件。在命令提示符中使用 ORDER BY 子句
以下将在SQL SELECT
语句中使用ORDER BY
子句来读取MySQL 数据表tutorials_tbl
中的数据:实例
尝试以下实例,结果将按升序排列 ```php 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>
读取 `tutorials_tbl` 表中所有数据并按` tutorial_author` 字段的升序排列。
<a name="l0cCy"></a>
## 在PHP脚本中使用 ORDER BY 子句
你可以使用PHP函数的`mysql_query()`及相同的`SQL SELECT `带上 `ORDER BY `子句的命令来获取数据。 该函数用于执行SQL命令,然后通过 PHP 函数` mysql_fetch_array() `来输出所有查询的数据。
<a name="ofmuw"></a>
### 实例
尝试以下实例,查询后的数据按 `tutorial_author `字段的降序排列后返回。
```php
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$sql = 'SELECT tutorial_id, tutorial_title,
tutorial_author, submission_date
FROM tutorials_tbl
ORDER BY tutorial_author DESC';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "Tutorial ID :{$row['tutorial_id']} <br> ".
"Title: {$row['tutorial_title']} <br> ".
"Author: {$row['tutorial_author']} <br> ".
"Submission Date : {$row['submission_date']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
Mysql Join的使用
在前几章节中,我们已经学会了如果在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。
本章节我们将向大家介绍如何使用MySQL 的JOIN
在两个或多个表中查询数据。
你可以在SELECT
, UPDATE
和 DELETE
语句中使用Mysql 的 join
来联合多表查询。
以下我们将演示MySQL LEFT JOIN
和JOIN
的使用的不同之处。
在命令提示符中使用JOIN
我们在TUTORIALS
数据库中有两张表tcount_tbl
和 tutorials_tbl
。两张数据表数据如下:
实例
尝试以下实例:
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>
接下来我们就使用MySQL的JOIN
来连接以上两张表来读取tutorials_tbl
表中所有tutorial_author
字段在tcount_tbl
表对应的tutorial_count
字段值:
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>
在PHP脚本中使用JOIN
PHP 中使用mysql_query()
函数来执行SQL语句,你可以使用以上的相同的SQL语句作为mysql_query()
函数的参数。
尝试如下实例:
<?php
$dbhost = 'localhost:3036';
$dbuser = 'root';
$dbpass = 'rootpassword';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}
$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';
mysql_select_db('TUTORIALS');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not get data: ' . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
{
echo "Author:{$row['tutorial_author']} <br> ".
"Count: {$row['tutorial_count']} <br> ".
"Tutorial ID: {$row['tutorial_id']} <br> ".
"--------------------------------<br>";
}
echo "Fetched data successfully\n";
mysql_close($conn);
?>
MySQL LEFT JOIN
MySQL left join
与 join
有所不同。 MySQL LEFT JOIN
会读取左边数据表的全部数据,即便右边表无对应数据。
实例
尝试以下实例,理解MySQL 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)
以上实例中使用了LEFT JOIN
,该语句会读取左边的数据表tutorials_tbl
的所有选取的字段数据,即便在右侧表tcount_tbl
中没有对应的tutorial_author
字段值。