MySQL 一个关系型数据库管理系统(RDBMS)
MySQL 注释 单行注释 (--
和 #
)
多行注释 (/* */
)
MySQL连接 使用 MySQL 二进制方式连接
win+R -> cmd
通过D:
切换到D盘(我的mysql安装在D盘)
mysql -u root -p
按照提示输入密码root
(默认),并按下 Enter 键
在登录成功后会出现mysql命令提示窗口,你可以在上面执行任何 SQL 语句
1 2 3 4 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.
以上为登录成功输出结果
列出所有可用的数据库:
选择要使用的数据库:
列出所选数据库中的所有表:
退出mysql命令提示窗口:EXIT 或 QUIT
使用 PHP 脚本连接 mysqli_connect()
函数来连接数据库
1 mysqli_connect(host, username, password, dbname,port, socket);
参数
描述
host
可选。规定主机名或 IP 地址。
username
可选。规定 MySQL 用户名。
password
可选。规定 MySQL 密码。
dbname
可选。规定默认使用的数据库。
port
可选。规定尝试连接到 MySQL 服务器的端口号。
socket
可选。规定 socket 或要使用的已命名 pipe。
mysqli_close()
函数来断开与 MySQL 数据库的链接
1 bool mysqli_close ( mysqli $link )
1 2 3 4 5 6 7 8 9 10 11 12 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysqli_error()); } echo '数据库连接成功!'; mysqli_close($conn); ?>
MySQL 创建数据库 使用 create 命令
1 CREATE DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
[!CAUTION]
上述例子指定该数据库使用的字符集为 utf8mb4
,支持完整的 UTF-8 编码(包括表情符号和其他特殊字符)并设置排序规则为 utf8mb4_general_ci
,表示不区分大小写
为了避免数据库已经存在,执行 CREATE DATABASE 将导致错误:
1 CREATE DATABASE IF NOT EXISTS 数据库名;
使用 mysqladmin 1 mysqladmin -u root -p create 数据库名
如果要在创建数据库时指定字符集和排序规则,可以使用 -default-character-set
和 -default-collation
参数:
1 2 3 mysqladmin -u root -p create 数据库名 \ --default-character-set=utf8mb4 \ --default-collation=utf8mb4_general_ci
如果希望使用 mysqladmin 连接到 MySQL 服务器执行其他管理任务,例如查看服务器状态、重启服务器等,可以使用以下形式的命令:
1 2 mysqladmin -u your_username -p your_command //your_command为希望执行的具体管理命令
例如,要查看 MySQL 服务器的状态:
1 mysqladmin -u root -p status
使用 PHP脚本 PHP 使用 mysqli_query
函数来创建或者删除 MySQL 数据库
1 mysqli_query(connection,query,resultmode);
参数
描述
connection
必需。规定要使用的 MySQL 连接。
query
必需,规定查询字符串。
resultmode
可选。一个常量。可以是下列值中的任意一个:MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接错误: ' . mysqli_error($conn)); } echo '连接成功<br />'; $sql = 'CREATE DATABASE RUNOOB'; $retval = mysqli_query($conn,$sql ); if(! $retval ) { die('创建数据库失败: ' . mysqli_error($conn)); } echo "数据库 RUNOOB 创建成功\n"; mysqli_close($conn); ?>
MySQL 删除数据库 使用drop 命令 1 2 3 DROP DATABASE 数据库名; -- 直接删除数据库,不检查是否存在 或 DROP DATABASE IF EXISTS 数据库名;
使用 mysqladmin 1 mysqladmin -u root -p drop 数据库名
使用 PHP 脚本 PHP使用 mysqli_query
函数来创建或者删除 MySQL 数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } echo '连接成功<br />'; $sql = 'DROP DATABASE RUNOOB'; $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('删除数据库失败: ' . mysqli_error($conn)); } echo "数据库 RUNOOB 删除成功\n"; mysqli_close($conn); ?>
MySQL 选择数据库 从命令提示窗口中 在 MySQL 中
在命令行中
1 mysql -u root -p -D 数据库名
使用 PHP 脚本 1 mysqli_select_db(connection,dbname);
参数
描述
connection
必需。规定要使用的 MySQL 连接。
dbname
必需,规定要使用的默认数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } echo '连接成功'; mysqli_select_db($conn, 'RUNOOB' ); mysqli_close($conn); ?>
MySQL 数据类型 详见
数值类型 整数类型 TINYINT
:存储年龄、数量
INT
或 BIGINT
:主键或用户ID
小数类型 DECIMAL
:需要精确存储的小数,例如货币金额
FLOAT
或DOUBLE
:需要近似存储的小数,例如科学计算结果
日期和时间类型 DATE
:仅存储日期
DATETIME
:存储日期和时间,例如用户注册时间
TIMESTAMP
:带有时区的日期时间(自动更新),例如日志记录时间
TIME
:存储时间部分
字符串类型 CHAR
:数据长度固定,例如存储固定长度的编码
VARCHAR
:数据长度不固定,例如存储用户名、邮箱地址
TEXT
或BLOB
:需要存储大文本或二进制数据时,例如文章内容存储在 TEXT
中,图片存储在 BLOB
中
枚举与集合类型 ENUM
或 TINYINT
:有限的枚举数据(如状态值 active/inactive
)
空间数据类型 MySQL 创建数据表 1 2 3 4 5 CREATE TABLE table_name ( column1 datatype, column2 datatype, ... );
table_name
是要创建的表的名称。
column1
, column2
, … 是表中的列名。
datatype
是每个列的数据类型。
1 2 3 4 5 6 7 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, birthdate DATE, is_active BOOLEAN DEFAULT TRUE );
AUTO_INCREMENT
关键字用于创建一个自增长的列,数值会自动加 1
PRIMARY KEY
用于定义主键(是用来唯一标识数据库表中每一条记录的字段(或字段组合))
NOT NULL
不允许为空
如果希望在创建表时指定数据引擎,字符集和排序规则等,可以使用 CHARACTER SET 和 COLLATE 子句
1 2 3 4 CREATE TABLE mytable ( id INT PRIMARY KEY, name VARCHAR(50) ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
以下例子中我们将在 RUNOOB 数据库中创建数据表 runoob_tbl:
1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;
ENGINE
设置存储引擎,CHARSET
设置编码
1 2 3 4 5 6 7 8 9 10 11 12 13 root@host# mysql -u root -p Enter password:**** mysql> USE RUNOOB; DATABASE changed mysql> CREATE TABLE runoob_tbl( -> runoob_id INT NOT NULL AUTO_INCREMENT, -> runoob_title VARCHAR(100) NOT NULL, -> runoob_author VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( runoob_id ) -> )ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 ROWS affected (0.16 sec) mysql>
MySQL 命令终止符为分号 ;
->
是换行符标识
使用 PHP 脚本创建数据表 使用 PHP 的 mysqli_query()
函数来创建已存在数据库的数据表
1 mysqli_query(connection,query,resultmode);
参数
描述
connection
必需。规定要使用的 MySQL 连接。
query
必需,规定查询字符串。
resultmode
可选。一个常量。可以是下列值中的任意一个:MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } echo '连接成功<br />'; $sql = "CREATE TABLE runoob_tbl( ". "runoob_id INT NOT NULL AUTO_INCREMENT, ". "runoob_title VARCHAR(100) NOT NULL, ". "runoob_author VARCHAR(40) NOT NULL, ". "submission_date DATE, ". "PRIMARY KEY ( runoob_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; "; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('数据表创建失败: ' . mysqli_error($conn)); } echo "数据表创建成功\n"; mysqli_close($conn); ?>
通过命令行查看表结构 show tables;
desc runoob_tbl;
MySQL 删除数据表 通过命令提示符删除数据表 1 DROP TABLE table_name; -- 直接删除表,不检查是否存在
1 DROP TABLE [IF EXISTS] table_name; -- 会检查是否存在,如果存在则删除
如果只是想删除表中的所有数据,但保留表的结构,可以使用 TRUNCATE TABLE
语句:
1 TRUNCATE TABLE table_name;
使用 PHP 脚本删除数据表 1 mysqli_query(connection,query,resultmode);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } echo '连接成功<br />'; $sql = "DROP TABLE runoob_tbl"; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('数据表删除失败: ' . mysqli_error($conn)); } echo "数据表删除成功\n"; mysqli_close($conn); ?>
MySQL 插入数据 MySQL 表中使用 INSERT INTO
语句来插入数据
1 2 INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
table_name
是你要插入数据的表的名称。
column1
, column2
, column3
, … 是表中的列名。
value1
, value2
, value3
, … 是要插入的具体数值(如果数据是字符型,必须使用单引号 ‘ 或者双引号 “ )
如果要插入所有列的数据,可以省略列名:
1 2 INSERT INTO users VALUES (NULL,'test', 'test@runoob.com', '1990-01-01', true);
这里,NULL 是用于自增长列的占位符,表示系统将为 id 列生成一个唯一的值
如果你要插入多行数据,可以在 VALUES 子句中指定多组数值:
1 2 3 4 5 INSERT INTO users (username, email, birthdate, is_active) VALUES ('test1', 'test1@runoob.com', '1985-07-10', true), ('test2', 'test2@runoob.com', '1988-11-25', false), ('test3', 'test3@runoob.com', '1993-05-03', true);
通过命令提示窗口插入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 root@host# mysql -u root -p password; Enter password:******* mysql> USE RUNOOB; DATABASE changed mysql> INSERT INTO runoob_tbl -> (runoob_title, runoob_author, submission_date) -> VALUES -> ("学习 PHP", "菜鸟教程", NOW()); Query OK, 1 ROWS affected, 1 warnings (0.01 sec) mysql> INSERT INTO runoob_tbl -> (runoob_title, runoob_author, submission_date) -> VALUES -> ("学习 MySQL", "菜鸟教程", NOW()); Query OK, 1 ROWS affected, 1 warnings (0.01 sec) mysql> INSERT INTO runoob_tbl -> (runoob_title, runoob_author, submission_date) -> VALUES -> ("JAVA 教程", "RUNOOB.COM", '2016-05-06'); Query OK, 1 ROWS affected (0.00 sec) mysql>
实例中 NOW() 是一个 MySQL 函数,该函数返回日期和时间
查看数据表数据:
1 select * from runoob_tbl;
使用 PHP 脚本插入数据 1 mysqli_query(connection,query,resultmode);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } echo '连接成功<br />'; // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $runoob_title = '学习 Python'; $runoob_author = 'RUNOOB.COM'; $submission_date = '2016-03-06'; $sql = "INSERT INTO runoob_tbl ". "(runoob_title,runoob_author, submission_date) ". "VALUES ". "('$runoob_title','$runoob_author','$submission_date')"; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法插入数据: ' . mysqli_error($conn)); } echo "数据插入成功\n"; mysqli_close($conn); ?>
对于含有中文的数据插入,需要添加 mysqli_query($conn , “set names utf8”); 语句
MySQL 查询数据 MySQL 数据库使用 SELECT 语句来查询数据
1 2 3 4 5 SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column_name [ASC | DESC]] [LIMIT number];
column1
, column2
, … 是你想要选择的列的名称,如果使用 *
表示选择所有列。
table_name
是你要从中查询数据的表的名称。
WHERE condition
是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
ORDER BY column_name [ASC | DESC]
是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。
LIMIT number
是一个可选的子句,用于限制返回的行数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -- 选择所有列的所有行 SELECT * FROM users; -- 选择特定列的所有行 SELECT username, email FROM users; -- 添加 WHERE 子句,选择满足条件的行 SELECT * FROM users WHERE is_active = TRUE; -- 添加 ORDER BY 子句,按照某列的升序排序 SELECT * FROM users ORDER BY birthdate; -- 添加 ORDER BY 子句,按照某列的降序排序 SELECT * FROM users ORDER BY birthdate DESC; -- 添加 LIMIT 子句,限制返回的行数 SELECT * FROM users LIMIT 10;
通过命令提示符获取数据 1 select * from runoob_tbl;
使用 PHP 脚本来获取数据 使用 PHP 函数的 mysqli_query() 及 SQL SELECT 命令来获取数据。该函数用于执行 SQL 命令,然后通过 PHP 函数 mysqli_fetch_array() 来使用或输出所有查询的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 mysqli_fetch_array 测试</h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_title']} </td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['submission_date']} </td> ". "</tr>"; } /*while($row = mysqli_fetch_array($retval, MYSQLI_NUM)) { echo "<tr><td> {$row[0]}</td> ". "<td>{$row[1]} </td> ". "<td>{$row[2]} </td> ". "<td>{$row[3]} </td> ". "</tr>"; }*/ echo '</table>'; // 释放内存 mysqli_free_result($retval); mysqli_close($conn); ?>
[!IMPORTANT]
mysqli_fetch_array($result, $result_type); **$result
**:必需,表示查询的结果集。通常是通过 mysqli_query()
执行查询后得到的。
**$result_type
**:可选,指定返回的数组类型,可以是以下值:
**MYSQLI_ASSOC
**:返回关联数组,列名作为键。
**MYSQLI_NUM
**:返回数字数组,列的索引作为键。
执行完 SELECT 语句后,通过 PHP 函数 mysqli_free_result()
来实现内存的释放
MySQL WHERE 子句 将 WHERE 子句添加到 SELECT 语句中可以有条件地从表中选取数据(过滤查询结果),只返回满足特定条件的行
1 2 3 SELECT column1, column2, ... FROM table_name WHERE condition;
column1
, column2
, … 是你要选择的列的名称,如果使用 *
表示选择所有列。
table_name
是你要从中查询数据的表的名称。
WHERE condition
是用于指定过滤条件的子句。
[!TIP]
查询语句中你可以使用一个或者多个表,表之间使用逗号**,** 分割,并使用WHERE语句来设定查询条件。
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
组合条件(AND、OR):
1 2 3 SELECT * FROM products WHERE category = 'Electronics' AND price > 100.00; SELECT * FROM orders WHERE order_date >= '2023-01-01' OR total_amount > 1000.00;
模糊匹配条件(LIKE):
1 SELECT * FROM customers WHERE first_name LIKE 'J%';
IN 条件:
1 SELECT * FROM countries WHERE country_code IN ('US', 'CA', 'MX');
NOT 条件:
1 SELECT * FROM products WHERE NOT category = 'Clothing';
BETWEEN 条件:
1 SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
从命令提示符中读取数据 1 SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程';
MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的
1 SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';
使用 PHP 脚本读取数据 以下实例将从 runoob_tbl 表中返回使用 runoob_author 字段值为 RUNOOB.COM 的记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); // 读取 runoob_author 为 RUNOOB.COM 的数据 $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl WHERE runoob_author="RUNOOB.COM"'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 MySQL WHERE 子句测试<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_title']} </td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['submission_date']} </td> ". "</tr>"; } echo '</table>'; // 释放内存 mysqli_free_result($retval); mysqli_close($conn); ?>
MySQL UPDATE 更新 使用 UPDATE 命令修改或更新 MySQL 中的数据
1 2 3 UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
table_name
是你要更新数据的表的名称。
column1
, column2
, … 是你要更新的列的名称。
value1
, value2
, … 是新的值,用于替换旧的值。
WHERE condition
是一个可选的子句,用于指定更新的行。如果省略 WHERE
子句,将更新表中的所有行。
通过命令提示符更新数据 1 UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
使用PHP脚本更新数据 不使用 WHERE 子句将会对数据表的全部数据进行更新
以下实例将更新 runoob_id 为 3 的 runoob_title 字段的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'UPDATE runoob_tbl SET runoob_title="学习 Python" WHERE runoob_id=3'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法更新数据: ' . mysqli_error($conn)); } echo '数据更新成功!'; mysqli_close($conn); ?>
MySQL DELETE 语句 用 DELETE FROM 命令来删除 MySQL 数据表中的记录
1 2 DELETE FROM table_name WHERE condition;
从命令行中删除数据 1 DELETE FROM runoob_tbl WHERE runoob_id=3;
使用 PHP 脚本删除数据 以下实例将删除 runoob_tbl 表中 runoob_id 为3 的记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = 'root'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'DELETE FROM runoob_tbl WHERE runoob_id=3'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法删除数据: ' . mysqli_error($conn)); } echo '数据删除成功!'; mysqli_close($conn); ?>
MySQL LIKE 子句 LIKE 子句是在 MySQL 中用于在 WHERE 子句中进行模糊匹配的关键字。它通常与通配符一起使用,用于搜索符合某种模式的字符串
LIKE 子句中使用百分号 **%**字符来表示任意字符,如果没有使用百分号 % , LIKE 子句与等号 = 的效果是一样的
% 通配符表示零个或多个字符。例如,**’a%’** 匹配以字母 ‘a’ 开头的任何字符串
_ 通配符表示一个字符。例如,**’_r%’** 匹配第二个字母为 ‘r’ 的任何字符串
1 2 3 SELECT column1, column2, ... FROM table_name WHERE column_name LIKE pattern;
column1
, column2
, … 是你要选择的列的名称,如果使用 *
表示选择所有列。
table_name
是你要从中查询数据的表的名称。
column_name
是你要应用 LIKE
子句的列的名称。
pattern
是用于匹配的模式,可以包含通配符。
在命令提示符中使用 LIKE 子句 1 SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
在 PHP 脚本中使用 LIKE 子句 以下是我们使用PHP脚本在 runoob_tbl 表中读取 runoob_author 字段中以 COM 为结尾的的所有记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl WHERE runoob_author LIKE "%COM"'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 mysqli_fetch_array 测试<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_title']} </td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['submission_date']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
MySQL UNION 操作符 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行(从表中选取所有不同 值组合在一起)
UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数和对应位置的数据类型必须相同
1 2 3 4 5 6 7 8 SELECT column1, column2, ... FROM table1 WHERE condition1 UNION SELECT column1, column2, ... FROM table2 WHERE condition2 [ORDER BY column1, column2, ...];
ORDER BY
子句是一个可选的子句,用于指定合并后的结果集的排序顺序
使用 UNION ALL 不去除重复行
MySQL ORDER BY(排序) 语句 MySQL ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC )或降序(DESC )排序
1 2 3 SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
可以使用 NULLS FIRST 或 NULLS LAST 处理 NULL 值
在命令提示符中使用 ORDER BY 子句 1 SELECT * from runoob_tbl ORDER BY submission_date ASC;
读取 runoob_tbl 表中所有数据并按 submission_date 字段的升序排列
在 PHP 脚本中使用 ORDER BY 子句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl ORDER BY submission_date ASC'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 MySQL ORDER BY 测试<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_title']} </td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['submission_date']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
1 2 3 4 SELECT column1, aggregate_function(column2) FROM table_name WHERE condition GROUP BY column1;
column1
:指定分组的列。
aggregate_function(column2)
:对分组后的每个组执行的聚合函数。
table_name
:要查询的表名。
condition
:可选,用于筛选结果的条件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `employee_tbl` -- ---------------------------- DROP TABLE IF EXISTS `employee_tbl`; CREATE TABLE `employee_tbl` ( `id` INT(11) NOT NULL, `name` CHAR(10) NOT NULL DEFAULT '', `date` datetime NOT NULL, `signin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `employee_tbl` -- ---------------------------- BEGIN; INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
导入成功后,执行以下 SQL 语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysql> set names utf8; mysql> SELECT * FROM employee_tbl; +----+--------+---------------------+--------+ | id | name | date | signin | +----+--------+---------------------+--------+ | 1 | 小明 | 2016-04-22 15:25:33 | 1 | | 2 | 小王 | 2016-04-20 15:25:47 | 3 | | 3 | 小丽 | 2016-04-19 15:26:02 | 2 | | 4 | 小王 | 2016-04-07 15:26:14 | 4 | | 5 | 小明 | 2016-04-11 15:26:40 | 4 | | 6 | 小明 | 2016-04-04 15:26:54 | 2 | +----+--------+---------------------+--------+ 6 rows in set (0.00 sec)
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录:
1 2 3 4 5 6 7 8 9 10 mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; +--------+----------+ | name | COUNT(*) | +--------+----------+ | 小丽 | 1 | | 小明 | 3 | | 小王 | 2 | +--------+----------+ 3 rows in set (0.01 sec)
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
1 2 3 4 5 6 7 8 9 10 11 mysql> SELECT name, SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------+--------------+ | name | signin_count | +--------+--------------+ | 小丽 | 2 | | 小明 | 7 | | 小王 | 7 | | NULL | 16 | +--------+--------------+ 4 rows in set (0.00 sec)
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
果 a==null,则选择 b;如果 b==null,则选择 c;如果 a!=null,则选择 a;如果 a b c 都为 null ,则返回为 null(没意义)
1 2 3 4 5 6 7 8 9 10 mysql> SELECT coalesce(name, '总数'), SUM(signin) as signin_count FROM employee_tbl GROUP BY name WITH ROLLUP; +--------------------------+--------------+ | coalesce(name, '总数') | signin_count | +--------------------------+--------------+ | 小丽 | 2 | | 小明 | 7 | | 小王 | 7 | | 总数 | 16 | +--------------------------+--------------+ 4 rows in set (0.01 sec)
MySQL 连接的使用 使用 MySQL 的 JOIN 在两个或多个表中查询数据
JOIN 按功能分类 INNER JOIN 返回两个表中满足连接条件的匹配行
1 2 3 SELECT column1, column2, ... FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
table1.column_name = table2.column_name
是连接条件,指定了两个表中用于匹配的列
LEFT JOIN 返回左表的所有行,并包括右表中匹配的行
1 2 3 SELECT column1, column2, ... FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
RIGHT JOIN 返回右表的所有行,并包括左表中匹配的行
1 2 3 SELECT column1, column2, ... FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
在命令提示符中使用 INNER JOIN 如在 RUNOOB 数据库中有两张表 tcount_tbl 和 runoob_tbl
1 SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
或
1 SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
在 PHP 脚本中使用 JOIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); $sql = 'SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author'; mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 MySQL JOIN 测试<h2>'; echo '<table border="1"><tr><td>教程 ID</td><td>作者</td><td>登陆次数</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo "<tr><td> {$row['runoob_id']}</td> ". "<td>{$row['runoob_author']} </td> ". "<td>{$row['runoob_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
MySQL NULL 值处理
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
检查是否为 NULL 1 2 SELECT * FROM 表名 WHERE 键名 IS NULL; SELECT * FROM 表名 WHERE 键名 IS NOT NULL;
处理NULL COALESCE()
函数返回参数中的第一个非 NULL
值
1 SELECT name, COALESCE(age, 0) AS age FROM users;
IFNULL()
函数如果第一个参数为 NULL
,返回第二个参数,否则返回第一个参数
1 SELECT name, IFNULL(age, 18) AS age FROM users;
NULLIF()
函数比较两个参数,如果它们相等则返回 NULL
,否则返回第一个参数
1 2 SELECT NULLIF(5, 5); -- 返回 NULL SELECT NULLIF(5, 10); -- 返回 5
聚合函数的处理 **COUNT(column)
**:忽略 NULL
值,只统计非 NULL
值的行。
**COUNT(\*)
**:统计所有行,包括 NULL
。
SUM()
、AVG()
等 :会忽略 NULL
值,只计算非 NULL
值。
1 SELECT COUNT(age) AS count_age, COUNT(*) AS count_all FROM users;
NULL 排序 在使用 ORDER BY
子句进行排序时,NULL 值默认会被放在排序的最后。如果希望将 NULL 值放在最前面,可以使用 ORDER BY column_name ASC NULLS FIRST
,反之使用 ORDER BY column_name DESC NULLS LAST
使用 <=> 操作符进行 NULL 比较 <=> 操作符是 MySQL 中用于比较两个表达式是否相等的特殊操作符
1 SELECT * FROM employees WHERE commission <=> NULL;
使用 PHP 脚本处理 NULL 值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); if( isset($runoob_count )) { $sql = "SELECT runoob_author, runoob_count FROM runoob_test_tbl WHERE runoob_count = $runoob_count"; } else { $sql = "SELECT runoob_author, runoob_count FROM runoob_test_tbl WHERE runoob_count IS NULL"; } mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } echo '<h2>菜鸟教程 IS NULL 测试<h2>'; echo '<table border="1"><tr><td>作者</td><td>登陆次数</td></tr>'; while($row = mysqli_fetch_array($retval, MYSQL_ASSOC)) { echo "<tr>". "<td>{$row['runoob_author']} </td> ". "<td>{$row['runoob_count']} </td> ". "</tr>"; } echo '</table>'; mysqli_close($conn); ?>
MySQL 正则表达式 MySQL 中使用 REGEXP 和 RLIKE 操作符来进行正则表达式匹配
1 2 3 SELECT column1, column2, ... FROM table_name WHERE column_name REGEXP 'pattern';
column1
, column2
, … 是你要选择的列的名称,如果使用 *
表示选择所有列。
table_name
是你要从中查询数据的表的名称。
column_name
是你要进行正则表达式匹配的列的名称。
'pattern'
是一个正则表达式模式。
\w
:匹配一个字母数字字符(包括下划线)。
\s
:匹配一个空白字符
MySQL 事务 事务是一组SQL语句的执行,它们被视为一个单独的工作单元
事务是必须满足4个条件(ACID):
原子性(A tomicity,或称不可分割性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成
一致性(C onsistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏
隔离性(I solation,又称独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
持久性(D urability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
mysql事务处理 用 BEGIN, ROLLBACK, COMMIT
BEGIN 或 START TRANSACTION :开用于开始一个事务。
ROLLBACK 事务回滚,取消之前的更改。
COMMIT :事务确认,提交事务,使更改永久生效。
SAVEPOINT :用于在事务中设置保存点,以便稍后能够回滚到该点
1 SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT :用于回滚到之前设置的保存点
1 ROLLBACK TO SAVEPOINT savepoint_name;
用 SET 来改变 MySQL 的自动提交模式
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db( $conn, 'RUNOOB' ); mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行 mysqli_begin_transaction($conn); // 开始事务定义 if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚 } if(!mysqli_query($conn, "insert into runoob_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚 } mysqli_commit($conn); //执行事务 mysqli_close($conn); ?>
MySQL ALTER 命令 MySQL 的 ALTER 命令用于修改数据库、表和索引等对象的结构
ALTER 命令允许你添加、修改或删除数据库对象,并且可以用于更改表的列定义、添加约束、创建和删除索引等操作
添加列 1 2 ALTER TABLE 数据表名 ADD COLUMN 列名 新的数据类型;
1 2 ALTER TABLE 数据表名 ADD 列名 新的数据类型 FIRST; ALTER TABLE 数据表名 ADD 列名 新的数据类型 AFTER 表中的列名;
修改列的数据类型 1 2 ALTER TABLE 数据表名 MODIFY COLUMN 列名 新的数据类型;
修改列名 1 2 ALTER TABLE 数据表名 CHANGE COLUMN 旧的列名 新的列名 新的数据类型;
删除列 1 2 ALTER TABLE 数据表名 DROP COLUMN 列名;
添加 PRIMARY KEY 1 2 ALTER TABLE 数据表名 ADD PRIMARY KEY (列名);
添加 FOREIGN KEY 1 2 3 4 ALTER TABLE 数据子表 ADD CONSTRAINT 在子表中添加的外键 //用于关联到数据母表的列 FOREIGN KEY (数据母表的列名) REFERENCES 数据母表 (数据母表的列名);
修改表名 1 2 ALTER TABLE 旧的表名 RENAME TO 新的表名;
MySQL 索引 MySQL 索引是一种数据结构,用于加快数据库查询的速度和性能
普通索引 创建索引 1 2 CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);
修改表结构(添加索引) 1 2 ALTER TABLE table_name ADD INDEX index_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);
创建表的时候直接指定 1 2 3 4 5 6 7 CREATE TABLE table_name ( column1 data_type, column2 data_type, ..., INDEX index_name (column1 [ASC|DESC], column2 [ASC|DESC], ...) );
删除索引的语法 1 DROP INDEX index_name ON table_name;
1 2 ALTER TABLE table_name DROP INDEX index_name;
唯一索引 创建索引 1 2 CREATE UNIQUE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);
修改表结构添加索引 1 2 ALTER table table_name ADD CONSTRAINT unique_constraint_name UNIQUE (column1, column2, ...);
创建表的时候直接指定 1 2 3 4 5 6 CREATE TABLE table_name ( column1 data_type, column2 data_type, ..., CONSTRAINT index_name UNIQUE (column1 [ASC|DESC], column2 [ASC|DESC], ...) );
使用ALTER 命令添加和删除索引
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):该语句添加一个主键,主键列中的值必须唯一,主键的列的列表,可以是一个或多个列,不能包含 NULL 值。 。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
**ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):**该语句指定了索引为 FULLTEXT ,用于全文索引。
使用 ALTER 命令添加和删除主键 主键作用于列上(可以一个列或多个列联合主键),添加主键时,你需要确保该主键默认不为空(NOT NULL)
1 2 ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
1 mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定 PRIMARY KEY,但在删除索引时,你必须知道索引名
显示索引信息 1 SHOW INDEX FROM table_name\G
SHOW INDEX
: 用于显示索引信息的关键字。
FROM table_name
: 指定要查看索引信息的表的名称。
\G
: 格式化输出信息。
MySQL 临时表(待) MySQL 复制表(待) MySQL 元数据(待) MySQL 序列使用(AUTO_INCREMENT)(待) MySQL 处理重复数据(待) MySQL 及 SQL 注入 SQL 注入,就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令
MySQL 导出数据(待) MySQL 导入数据(待) MySQL 函数,运算符,命令大全(待)