第六节:数据库
关系和非关系型数据库
关系型数据库:
定义:
关系型数据库基于关系模型,数据存储在表格中,表格由行和列组成。行表示记录,列表示属性。
特点:
- 结构化数据:数据存储在表中,具有固定的结构。
- SQL语言:使用结构化查询语言进行数据查询和操作。
- ACID属性:事务具有原子性、一致性、隔离性和持久性。
- 数据完整性:通过外键和约束确保数据一致性和完整性。
- 复杂查询:支持复杂的查询操作,如多表联结、嵌套查询等。
常见关系型数据库:
- MySQL
- PostgreSQL
- Oracle
- Microsoft SQL Server
- SQLite
非关系型数据库
定义:
非关系型数据库不使用传统的表格结构,而是采用各种数据模型,如文档、键-值、图形和列族存储。
特点:
- 灵活的结构:数据存储结构更灵活,没有固定的schema,可以方便地存储半结构化和非结构化数据。
- 可扩展性:通常更容易水平扩展,适合处理大规模数据和高并发应用。
- CAP理论:根据CAP定理,在分布式系统中往往会在一致性和可用性之间做权衡。
- 性能优化:为特定的应用场景进行了优化,通常在读取和写入性能上有优势。
- 多种数据模型:支持文档存储、键-值存储、图数据库和列族存储等多种模型。
常见的非关系型数据库:
- MongoDB(文档数据库)
- Cassandra(列族存储)
- Redis(键-值存储)
- Neo4j(图数据库)
- Couchbase(文档数据库)
如何选择
- 数据结构:如果数据结构是高度结构化的,关系型数据库可能更合适;如果数据结构灵活或经常变化,非关系型数据库可能更适用。
- 查询需求:如果需要复杂的查询和事务管理,关系型数据库通常表现更好;如果需求侧重于高并发读写和简单查询,非关系型数据库可能更优。
- 扩展性:关系型数据库通常垂直扩展(scale up)较容易,而非关系型数据库水平扩展(scale out)更为方便。
- 一致性和可用性:如果一致性要求高,关系型数据库可能是更好的选择;如果系统需要高可用性和分区容忍度,非关系型数据库更适合。
phpstudy mysql命令行
开启
基础使用
连接
-
连接命令
mysql.exe -uroot -proot
-
查看当前数据库
show databases;
以下命令不以图片展示
- 指定数据库
use mysql;
- 列出当前数据库所有表
show tables;
- 列出表下的列及其内容
desc db;
mysql PHP语法
常用函数:
mysqli_connect()
功能:
mysqli_connect()
用于建立与MySQL数据库服务器的连接。
语法:
$connect = mysqli_connect($hostname, $username, $password, $database);
参数:
$hostname
:数据库服务器的主机名,通常是localhost
。$username
:数据库用户名。$password
:数据库密码。$database
:要连接的数据库名。
示例:
$connect = mysqli_connect("localhost", "root", "password", "mydatabase");
// 检查连接是否成功
if (!$connect) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
mysqli_query()
功能:
mysqli_query()
用于向MySQL数据库发送查询(如 SELECT、INSERT、UPDATE、DELETE 等)。
语法:
$result = mysqli_query($connect, $query);
参数:
$connect
:由mysqli_connect()
返回的连接对象。$query
:包含SQL语句的字符串。
示例:
$sql = "SELECT * FROM users";
$result = mysqli_query($connect, $sql);
// 检查查询是否成功
if (!$result) {
die("Query failed: " . mysqli_error($connect));
}
mysqli_fetch_array()
功能:
mysqli_fetch_array()
用于从查询结果集中获取一行作为关联数组或数字数组,或两者兼有。
语法:
$row = mysqli_fetch_array($result, $resulttype);
参数:
$result
:由mysqli_query()
返回的结果集对象。$resulttype
(可选):可以是MYSQLI_ASSOC
(返回关联数组)、MYSQLI_NUM
(返回数字数组)或MYSQLI_BOTH
(默认,返回关联和数字数组)。
示例:
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
echo "User ID: " . $row["id"] . " - Name: " . $row["name"] . "<br>";
}
mysqli_close()
功能:
mysqli_close()
用于关闭先前用mysqli_connect()
打开的数据库连接。
语法:
mysqli_close($connect);
参数:
$connect
:由mysqli_connect()
返回的连接对象。
示例:
mysqli_close($connect);
echo "Connection closed";
MYSQL语法
mysql创建数据库
一般创建
命令:
CREATE DATABASE 数据库名;
但是如果数据库已经存在会导致错误,可用下面这种办法
CREATE DATABASE IF NOT EXISTS 数据库名;
指定字符集和排序方式:
CREATE DATABASE 数据库名
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
使用 mysqladmin 创建数据库
mysqladmin -u your_username -p create your_database
u
参数用于指定 MySQL 用户名。p
参数表示需要输入密码。create
是执行的操作,表示创建数据库。your_database
是要创建的数据库的名称。
指定字符集和排序方式:
mysqladmin -u your_username -p create your_database \
--default-character-set=utf8mb4 \
--default-collation=utf8mb4_general_ci
PHP脚本创建数据库
mysqli_query 函数:
PHP 使用 mysqli_query 函数来创建或者删除 MySQL 数据库。
该函数有两个参数,在执行成功时返回 TRUE,否则返回 FALSE。
mysqli_query(connection,query,resultmode);
参数 | 描述 |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
query | 必需,规定查询字符串。 |
resultmode | 可选。一个常量。可以是下列值中的任意一个: |
• MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个) | |
• MYSQLI_STORE_RESULT(默认) |
例子:
<?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 = 'CREATE DATABASE RUNOOB';
$retval = mysqli_query($conn,$sql );
if(! $retval )
{
die('创建数据库失败: ' . mysqli_error($conn));
}
echo "数据库 RUNOOB 创建成功\n";
mysqli_close($conn);
?>
mysql删除数据库
drop
DROP DATABASE <database_name>; -- 直接删除数据库,不检查是否存在
或
DROP DATABASE [IF EXISTS] <database_name>; -- 检查是否存在
mysqladmin
mysqladmin -u your_username -p drop your_database
PHP脚本
<?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 DATABASE RUNOOB';
$retval = mysqli_query( $conn, $sql );
if(! $retval ) //没查到库$retval返回false “!false” = true
{
die('删除数据库失败: ' . mysqli_error($conn));
}
echo "数据库 RUNOOB 删除成功\n";
mysqli_close($conn);
?>
选择数据库
在mysql中
USE database_name;
在命令行
mysql -u your_username -p -D your_database
PHP脚本
PHP 提供了函数 mysqli_select_db 来选取一个数据库。函数在执行成功后返回 TRUE ,否则返回 FALSE 。
语法
mysqli_select_db(connection,dbname);
参数 | 描述 |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
dbname | 必需,规定要使用的默认数据库。 |
例子:
<?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数据类型
- 数值
- 日期与时间
- 字符串
- 枚举与集合
- 空间数据
mysql创建数据表
命令行
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
参数说明:
table_name
是你要创建的表的名称。column1
,column2
, … 是表中的列名。datatype
是每个列的数据类型。
例子:
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
);
解析:
id
: 用户 id,整数类型,自增长,作为主键。username
: 用户名,变长字符串,不允许为空。email
: 用户邮箱,变长字符串,不允许为空。birthdate
: 用户的生日,日期类型。is_active
: 用户是否已经激活,布尔类型,默认值为 true。
PHP脚本
使用函数 mysqli_query()
<?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 = "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);
?>
mysql删除表
命令行
DROP TABLE table_name ; -- 直接删除表,不检查是否存在
或
DROP TABLE [IF EXISTS] table_name; -- 检查是否存在
PHP脚本
使用函数mysqli_query()
<?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查询数据
命令行
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
是一个可选的子句,用于限制返回的行数。
例子:
-- 选择所有列的所有行
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;
PHP脚本
使用 PHP 函数的 mysqli_query() 及 SQL SELECT 命令来获取数据。
该函数用于执行 SQL 命令,然后通过 PHP 函数 mysqli_fetch_array() 来使用或输出所有查询的数据。
mysqli_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有 返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。
例子:
<?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';
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);
?>