数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问,管理,搜索和复制其包含的数据。
数据库还使用非关系数据源,例如对象或文件。 然而,数据库证明是大数据集的最佳选择,这将遭受缓慢的检索和与其他数据源写入。
关系数据库管理系统或RDBMS将数据存储在各种表中。这些表之间的关系使用主键和外键建立。
RDBMS提供以下功能 -
它们使您能够使用表,列和索引来实现数据源。
它们确保多个表行间引用的完整性。
他们自动更新索引。
他们解释SQL查询和操作从表操作或源数据。
在我们开始讨论MariaDB之前,让我们来看一下与数据库相关的一些术语。
Database - 数据库是由保存相关数据的表组成的数据源。
Table -表,这意味着电子表格,是包含数据的矩阵。
Column - 表示数据元素的列是保存一种类型的数据的结构;例如,送货日期。
Row - 行是对相关数据进行分组的结构;例如,用于客户的数据。它也被称为元组,条目或记录。
Redundancy - 此术语指的是存储数据两次,以加速系统。
Primary Key - 这指的是唯一的标识值。此值不能在表中出现两次,并且只有一个行与其关联。
Foreign Key - 外键用作两个表之间的链接。
Compound Key -复合键,或复合键,是指多个列的关键。它指的是多列由于缺乏独特的质量一列。
Index - 索引实际上与书的索引相同。
Referential Integrity - 此术语指确保所有外键值指向现有行。
MariaDB是由MySQL的原始开发人员创建的MySQL的流行分支。 它源于与MySQL收购Oracle有关的问题。 它支持小数据处理任务和企业需求。 它旨在成为MySQL的替代,只需要简单的卸载MySQL和安装MariaDB。 MariaDB提供与MySQL等相同的功能。
MariaDB的重要特性是 -
所有MariaDB都在GPL,LGPL或BSD下。
MariaDB包括各种存储引擎,包括高性能存储引擎,用于与其他RDBMS数据源一起工作。
MariaDB使用标准和流行的查询语言。
MariaDB在多个操作系统上运行,并支持各种各样的编程语言。
MariaDB提供对PHP的支持,PHP是最流行的Web开发语言之一。
MariaDB提供Galera集群技术。
MariaDB还提供了许多在MySQL中不可用的操作和命令,并消除/取代影响性能的功能。
MariaDB的所有下载都位于官方MariaDB基金会网站的下载部分。 单击所需版本的链接,并显示多个操作系统,体系结构和安装文件类型的下载列表。
如果你熟悉Linux / Unix系统,只需下载源码来构建你的安装。 我们推荐的安装方式是使用分发包。 MariaDB提供用于以下Linux / Unix发行版的软件包 -
以下发行版在其存储库中包含MariaDB软件包 -
按照以下步骤在Ubuntu环境中安装 -
步骤1 - 以root用户身份登录。
步骤2 - 导航到包含MariaDB包的目录。
步骤3 - 使用以下代码导入GnuPG签名密钥 -
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
步骤4 - 将MariaDB添加到sources.list文件。 打开文件,并添加以下代码 -
sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'
步骤5 - 刷新系统以下 -
sudo apt-get update
步骤6 - 安装MariaDB与以下 -
sudo apt-get install mariadb-server
找到并下载自动安装文件(MSI)后,只需双击该文件即可开始安装。 安装向导将指导您完成每个安装步骤和任何必要的设置。
通过从命令提示符启动来测试安装。 导航到安装的位置(通常位于目录中),然后在提示符下键入以下内容:
mysqld.exe --console
如果安装成功,您将看到与启动相关的消息。 如果这没有出现,您可能有权限问题。 确保您的用户帐户可以访问应用程序。 图形客户端可用于在Windows环境中的MariaDB管理。 如果你发现命令行不舒服或麻烦,一定要试试他们。
执行几个简单的任务,以确认MariaDB的功能和安装。
使用管理实用程序获取服务器状态
使用mysqladmin二进制查看服务器版本。
[root@host]# mysqladmin --version
它应显示版本,分发,操作系统和体系结构。 如果您看不到该类型的输出,请检查您的安装是否存在问题。
使用客户端执行简单命令
打开MariaDB的命令提示符。 这应该连接到MariaDB并允许执行命令。 输入一个简单的命令如下 -
mysql> SHOW DATABASES;
成功安装MariaDB后,设置root密码。 全新安装将具有空白密码。 输入以下内容设置新密码 -
mysqladmin -u root password "[enter your password here]";
输入以下内容以使用新凭据连接到服务器 -
mysql -u root -pEnter password:*******
如果您已经在您的Windows系统上安装了MySQL,并且想要升级到MariaDB; 不卸载MySQL并安装MariaDB。 这将导致与现有数据库的冲突。 您必须改为安装MariaDB,然后在Windows安装文件中使用升级向导。
MySQL my.cnf文件的选项应该与MariaDB配合使用。 但是,MariaDB有许多功能,这在MySQL中找不到。
请考虑您的my.cnf文件中的以下冲突 -
MariaDB默认为临时文件使用Aria存储引擎。 如果您有很多临时文件,如果不使用MyISAM表,请修改键缓冲区大小。
如果应用程序频繁连接/断开连接,请更改线程高速缓存大小。
如果使用超过100个连接,请使用线程池。
MySQL和MariaDB本质上是相同的。 但是,有足够的差异来创建升级问题。 查看MariaDB知识库中的更多关键差异。
在本章中,我们将学习如何创建表。 在创建表之前,首先确定其名称,字段名称和字段定义。
以下是表创建的一般语法:
CREATE TABLE table_name (column_name column_type);
查看在PRODUCTS数据库中创建表所使用的命令 -
databaseproducts_ tbl( product_id INT NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, product_manufacturer VARCHAR(40) NOT NULL, submission_date DATE, PRIMARY KEY ( product_id ));
上述示例使用“NOT NULL”作为字段属性,以避免由空值导致的错误。 属性“AUTO_INCREMENT”指示MariaDB将下一个可用值添加到ID字段。 关键字主键将列定义为主键。 多个列以逗号分隔可以定义主键。
创建表的两个主要方法是使用命令提示符和PHP脚本。
使用CREATE TABLE命令执行任务,如下所示 -
root@host# mysql -u root -pEnter password:*******mysql> use PRODUCTS;Database changedmysql> CREATE TABLE products_tbl( -> product_id INT NOT NULL AUTO_INCREMENT, -> product_name VARCHAR(100) NOT NULL, -> product_manufacturer VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( product_id ) -> );mysql> SHOW TABLES;+------------------------+| PRODUCTS |+------------------------+| products_tbl |+------------------------+
确保所有命令都以分号结尾。
PHP为表创建提供mysql_query()。 它的第二个参数包含必要的SQL命令 -
<html> <head> <title>Create a MariaDB Table</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ){ die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = "CREATE TABLE products_tbl( ". "product_id INT NOT NULL AUTO_INCREMENT, ". "product_name VARCHAR(100) NOT NULL, ". "product_manufacturer VARCHAR(40) NOT NULL, ". "submission_date DATE, ". "PRIMARY KEY ( product_id )); "; mysql_select_db( 'PRODUCTS' ); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not create table: ' . mysql_error()); } echo "Table created successfully"; mysql_close($conn); ?> </body></html>
在成功创建表,你会看到下面的输出 -
mysql> Table created successfully
在本章中,我们将学习删除表。
表删除很容易,但记住所有删除的表是不可恢复的。 表删除的一般语法如下 -
DROP TABLE table_name ;
存在执行表删除的两个选项:使用命令提示符或PHP脚本。
在命令提示符下,只需使用DROP TABLE SQL命令 -
root@host# mysql -u root -pEnter password:*******mysql> use PRODUCTS;Database changedmysql> DROP TABLE products_tblmysql> SELECT * from products_tblERROR 1146 (42S02): Table 'products_tbl' doesn't exist
PHP提供mysql_query()用于删除表。 简单地传递它的第二个参数适当的SQL命令 -
<html> <head> <title>Create a MariaDB Table</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = "DROP TABLE products_tbl"; mysql_select_db( 'PRODUCTS' ); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not delete table: ' . mysql_error()); } echo "Table deleted successfully"; mysql_close($conn); ?> </body></html>
成功删除表后,您将看到以下输出 -
mysql> Table deleted successfully
在本章中,我们将学习如何在表中插入数据。
将数据插入表需要INSERT命令。 该命令的一般语法是INSERT,后跟表名,字段和值。
查看下面给出的一般语法 -
INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);
该语句需要对字符串值使用单引号或双引号。 语句的其他选项包括“INSERT ... SET”语句,“INSERT ... SELECT”语句和其他几个选项。
注意 - 出现在语句中的VALUES()函数仅适用于INSERT语句,如果在其他位置使用,则返回NULL。
存在两种执行操作的选项:使用命令行或使用PHP脚本。
在提示时,有许多方法来执行选择操作。 下面给出标准语句 -
belowmysql>INSERT INTO products_tbl (ID_number, Nomenclature) VALUES (12345,“Orbitron 4000”);mysql> SHOW COLUMNS FROM products_tbl;+-------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------------+-------------+------+-----+---------+-------+| ID_number | int(5) | | | | || Nomenclature| char(13) | | | | |+-------------+-------------+------+-----+---------+-------+
您可以插入多行 -
INSERT INTO products VALUES (1, “first row”), (2, “second row”);
您还可以使用SET子句 -
INSERT INTO products SELECT * FROM inventory WHERE status = 'available';
在PHP函数中使用相同的“INSERT INTO ...”语句来执行操作。 您将再次使用mysql_query()函数。
查看下面给出的示例 -
<?php if(isset($_POST['add'])) { $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } if(! get_magic_quotes_gpc() ) { $product_name = addslashes ($_POST['product_name']); $product_manufacturer = addslashes ($_POST['product_name']); } else { $product_name = $_POST['product_name']; $product_manufacturer = $_POST['product_manufacturer']; } $ship_date = $_POST['ship_date']; $sql = "INSERT INTO products_tbl ". "(product_name,product_manufacturer, ship_date) ". "VALUES"."('$product_name','$product_manufacturer','$ship_date')"; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not enter data: ' . mysql_error()); } echo "Entered data successfully"; mysql_close($conn); }?>
成功插入数据后,您将看到以下输出 -
mysql> Entered data successfully
您还将使用insert语句来合作验证语句,例如检查以确保正确的数据输入。 MariaDB包括许多选项,其中一些是自动的。
在尝试运行MariaDB之前,首先确定其当前状态,运行或关闭。 有三个选项用于启动和停止MariaDB -
如果您将MariaDB安装在非标准位置,则可能需要在脚本文件中编辑位置信息。 只需在脚本中添加“停止”参数,即可停止MariaDB。
如果您想在Linux下自动启动它,请将启动脚本添加到init系统中。 每个分发具有不同的过程。 请参阅系统文档。
使用以下代码创建新的帐户。
CREATE USER 'username' @ 'localhost' IDENTIFIED BY 'password';
username字段是你创建的用户名。localhost表示该用户只能本地登录(不能远程登录),password字段是这个用户的密码。
此代码可以在用户表中添加一个没有任何权限的用户。
您还可以选择使用哈希值作为密码
使用以下代码授予用户权限 。
GRANT SELECT, INSERT, UPDATE, DELETE ON database1 TO 'newusername'@'localhost';
其他权限包括MariaDB中可能的每个命令或操作。
授予用户权限后,执行“FLUSH PRIVILEGES”命令刷新授权表,用户才能获取权限。
完成以上操作后就可以使用创建的新的用户了。
在Unix / Linux上构建之后,应该编辑配置文件“/etc/my.conf”以显示如下 -
# Example mysql config file.# You can copy this to one of:# /etc/my.cnf to set global options,# /mysql-data-dir/my.cnf to get server specific options or# ~/my.cnf for user specific options.## One can use all long options that the program supports.# Run the program with --help to get a list of available options# This will be passed to all mysql clients[client]#password = my_password#port = 3306#socket = /tmp/mysql.sock# Here is entries for some specific programs# The following values assume you have at least 32M ram# The MySQL server[mysqld]#port = 3306#socket = /tmp/mysql.socktemp-pool# The following three entries caused mysqld 10.0.1-MariaDB (and possibly other versions) to abort...# skip-locking# set-variable = key_buffer = 16M# set-variable = thread_cache = 4loose-innodb_data_file_path = ibdata1:1000Mloose-mutex-deadlock-detectorgdb######### Fix the two following paths# Where you want to have your databasedata = /path/to/data/dir# Where you have your mysql/MariaDB source + sql/share/englishlanguage = /path/to/src/dir/sql/share/english[mysqldump]quickMariaDB8set-variable = max_allowed_packet=16M[mysql]no-auto-rehash[myisamchk]set-variable = key_buffer = 128M
编辑行"data ="和"language ="以匹配您的环境。
文件修改后,导航到源目录并执行以下操作 -
./scripts/mysql_install_db --srcdir = $PWD --datadir = /path/to/data/dir -- user = $LOGNAME
如果您将datadir添加到配置文件,请忽略“$ PWD”变量。 确保运行10.0.1版本的MariaDB时使用“$ LOGNAME”。
查看以下您将在使用MariaDB时经常使用的重要命令列表:
USE [database name] - 设置当前默认数据库。
SHOW DATABASES - 列出服务器上当前的数据库。
SHOW TABLES - 列出所有非临时表。
SHOW COLUMNS FROM [table name] - 提供与指定表有关的列信息。
SHOW INDEX FROM TABLENAME [table name] - 提供与指定表相关的表索引信息。
SHOW TABLE STATUS LIKE [table name] G - - 提供有关非临时表的信息的表,以及LIKE子句用于获取表名后显示的模式。
在本章中,我们将学习如何从表中选择数据。
SELECT语句检索所选行。 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询。
查看以下一般语法 -
SELECT field, field2,... FROM table_name, table_name2,... WHERE...
SELECT语句提供了多个选项来指定使用的表 -
database_name.table_name
table_name.column_name
database_name.table_name.column_name
所有select语句必须包含一个或多个select表达式。 选择表达式由以下选项之一组成 -
列名。
使用运算符和函数的表达式。
规范"table_name.*"以选择给定表中的所有列。
字符"*"用于从FROM子句中指定的所有表中选择所有列。
可以在执行select语句时使用命令提示符或PHP脚本。
在命令提示符下,执行如下语句:
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl+-------------+---------------+| ID_number | Nomenclature |+-------------+---------------+| 12345 | Orbitron 4000 |+-------------+---------------+
在PHP函数中使用相同的SELECT语句来执行操作。 您将再次使用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 product_id, product_name,product_manufacturer, ship_date FROM products_tbl'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date : {$row['ship_date']} <br>". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
在成功的数据检索,你会看到下面的输出 -
Product ID: 12345Nomenclature: Orbitron 4000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 12346Nomenclature: Orbitron 3000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------mysql> Fetched data successfully
最佳实践建议在每个SELECT语句之后释放游标内存。 PHP为此提供了mysql_free_result()函数。 审查其使用如下所示 -
<?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date FROM products_tbl'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Product ID :{$row[0]} <br> ". "Name: {$row[1]} <br> ". "Manufacturer: {$row[2]} <br> ". "Ship Date : {$row[3]} <br> ". "--------------------------------<br>"; } mysql_free_result($retval); echo "Fetched data successfully"; mysql_close($conn);?>
MariaDB与各种编程语言和框架(如PHP,C#,JavaScript,Ruby on Rails,Django等)合作良好。 PHP仍然是所有可用语言中最受欢迎的语言,因为它的简单性和历史足迹。 本指南将重点介绍与MariaDB合作的PHP。
PHP提供了使用MySQL数据库的一系列功能。 这些函数执行类似访问它或执行操作的任务,它们与MariaDB完全兼容。 只需调用这些函数,就像调用任何其他PHP函数。
您将用于MariaDB的PHP函数符合以下格式 -
mysql_function(value,value,...);
函数的第二部分指定其操作。 本指南中使用的两个功能如下 -
mysqli_connect($connect);mysqli_query($connect,"SQL statement");
以下示例演示了对MariaDB函数的PHP调用的一般语法 -
<html> <head> <title>PHP and MariaDB</title> </head> <body> <?php $retval = mysql_function(value, [value,...]); if( !$retval ) { die ( "Error: Error message here" ); } // MariaDB or PHP Statements ?> </body></html>
在下一节中,我们将使用PHP函数来检查MariaDB的基本任务。
WHERE子句过滤各种语句,如SELECT,UPDATE,DELETE和INSERT。 他们提出了用于指定行动的标准。 它们通常出现在语句中的表名后面,其条件如下。 WHERE子句本质上像一个if语句。
查看下面给出的WHERE子句的一般语法 -
[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]
请注意WHERE子句的以下特性:
它是可选的。
它允许指定任何条件。
它允许通过使用AND或OR运算符来指定多个条件。
区分大小写仅适用于使用LIKE比较的语句。
WHERE子句允许使用以下运算符 -
操作者 |
---|
= != |
> < |
>= <= |
WHERE子句可以在命令提示符或PHP脚本中使用。
在命令提示符下,只需使用标准命令 -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl WHERE product_manufacturer = 'XYZ Corp';+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 12345 | Orbitron 4000 | XYZ Corp |+-------------+----------------+----------------------+| 12346 | Orbitron 3000 | XYZ Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
使用AND条件查看示例 -
SELECT *FROM products_tblWHERE product_name = 'Bun Janshu 3000';AND product_id <= 344;
此示例组合了AND和OR条件
SELECT *FROM products_tblWHERE (product_name = 'Bun Janshu 3000' AND product_id < 344)OR (product_name = 'Bun Janshu 3000');
在使用WHERE子句的操作中应用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl WHERE product_manufacturer = "XYZ Corp"'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date: {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
产品编号:12345命名:Orbitron 4000制造商:XYZ公司交货日期:17年1月1日----------------------------------------------产品编号:12346命名:Orbitron 3000制造商:XYZ公司交货日期:17年1月2日----------------------------------------------产品编号:12347命名:Orbitron 1000制造商:XYZ公司交货日期:17年1月2日----------------------------------------------成功的mysql>读取的数据
与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件。
查看下面给出的示例。
[root@host]# mysql -u root -pEnter password:******
上面给出的代码连接到MariaDB并提供一个命令提示符来执行SQL命令。 输入代码后,将显示一条欢迎消息,指示连接成功,并显示版本号。
Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 122323232 Server version: 5.5.40-MariaDB-log Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
该示例使用根访问权限,但任何具有权限的用户当然可以访问MariaDB提示并执行操作。
通过exit命令断开与MariaDB的连接,如下所示 -
mysql> exit
连接到MariaDB并与之断开连接的另一种方法是使用PHP脚本。 PHP提供了用于打开数据库连接的mysql_connect()函数。 它使用五个可选参数,并在成功连接后返回MariaDB链接标识符,或在失败的连接上返回false。 它还提供了用于关闭数据库连接的mysql_close()函数,它使用单个参数。
查看以下PHP连接脚本语法 -
connection mysql_connect(server,user,passwd,new_link,client_flag);
参数的描述如下 -
S.No | 参数和说明 |
---|---|
1 | server 此可选参数指定运行数据库服务器的主机名。 其默认值为“localhost:.3036”。 |
2 | user 此可选参数指定访问数据库的用户名。 其默认值是服务器的所有者。 |
3 | passwd 此可选参数指定用户的密码。 其默认值为空。 |
4 | new_link 此可选参数指定在使用相同参数的第二次调用mysql_connect()时,而不是新连接,将返回当前连接的标识符。 |
5 | client flags - 客户端的标志 此可选参数使用以下常量值的组合 -
|
请查看下面给出的PHP断开脚本语法 -
bool mysql_close ( resource $link_identifier );
如果省略资源,则最近打开的资源将关闭。 它在成功关闭时返回true,或false。
尝试下面的示例代码连接MariaDB服务器 -
<html> <head> <title>Connect to MariaDB Server</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'guest1'; $dbpass = 'guest1a'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_close($conn); ?> </body></html>
成功连接后,你会看到下面的输出 -
mysql> Connected successfully
UPDATE命令通过更改值来修改现有字段。 它使用SET子句指定要修改的列,并指定分配的新值。 这些值可以是字段的表达式或默认值。 设置默认值需要使用DEFAULT关键字。 该命令还可以使用WHERE子句来指定更新的条件和/或ORDER BY子句以特定顺序更新。
查看以下一般语法 -
UPDATE table_name SET field=new_value, field2=new_value2,...[WHERE ...]
从命令提示符或使用PHP脚本执行UPDATE命令。
在命令提示符下,只需使用标准commandroot -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> UPDATE products_tbl SET nomenclature = 'Fiber Blaster 300Z' WHERE ID_number = 112;mysql> SELECT * from products_tbl WHERE ID_number='112';+-------------+---------------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+---------------------+----------------------+| 112 | Fiber Blaster 300Z | XYZ Corp |+-------------+---------------------+----------------------+
在UPDATE命令语句中使用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 = ‘UPDATE products_tbl SET product_name = ”Fiber Blaster 300z” WHERE product_id = 112’; mysql_select_db(‘PRODUCTS’); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die(‘Could not update data: ‘ . mysql_error()); } echo “Updated data successfully”; mysql_close($conn);?>
成功数据更新后,您将看到以下输出 -
mysql> Updated data successfully
在MariaDB中创建或删除数据库需要通常只授予root用户或管理员的权限。 在这些帐户下,您有两个选项来创建数据库 - mysqladmin二进制文件和PHP脚本。
以下示例演示如何使用mysqladmin脚本创建名为Products的数据库 -
[root@host]# mysqladmin -u root -p create PRODUCTSEnter password:******
PHP在创建MariaDB数据库时使用mysql_query函数。 该函数使用两个参数,一个可选,并在成功时返回值“true”,否则返回“false”。
查看以下创建数据库脚本语法 -
bool mysql_query( sql, connection );
参数的描述如下 -
S.No | 参数和说明 |
---|---|
1 | SQL 该参数必须由所要执行操作的SQL查询组成。 |
2 | connection 未指定时,此可选参数使用最近使用的连接。 |
尝试下面的示例代码来创建数据库 -
<html> <head> <title>Create a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'CREATE DATABASE PRODUCTS'; $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not create database: ' . mysql_error()); } echo "Database PRODUCTS created successfully"; mysql_close($conn); ?> </body></html>
成功删除后,您将看到以下输出 -
mysql> Database PRODUCTS created successfully mysql> SHOW DATABASES; +-----------------------+ | Database | +-----------------------+ | PRODUCTS | +-----------------------+
DELETE命令从指定的表中删除表行,并返回已删除的数量。 访问使用ROW_COUNT()函数删除的数量。 WHERE子句指定行,如果没有行,则删除所有行。 LIMIT子句控制删除的行数。
在多行的DELETE语句中,它只删除满足条件的那些行; 并且不允许LIMIT和WHERE子句。 DELETE语句允许从不同数据库中的表中删除行,但不允许从表中删除,然后从子查询中的同一个表中进行选择。
查看以下DELETE语法 -
DELETE FROM table_name [WHERE …]
从命令提示符或使用PHP脚本执行DELETE命令。
在命令提示符下,只需使用标准命令 -
root@host# mysql –u root –p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> DELETE FROM products_tbl WHERE product_id=133;mysql> SELECT * from products_tbl WHERE ID_number='133';ERROR 1032 (HY000): Can't find record in 'products_tbl'
在DELETE命令语句中使用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 = 'DELETE FROM products_tbl WHERE product_id = 261'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not delete data: ' . mysql_error()); } echo "Deleted data successfully"; mysql_close($conn);?>
成功删除数据后,您将看到以下输出 -
mysql> Deleted data successfullymysql> SELECT * from products_tbl WHERE ID_number='261';ERROR 1032 (HY000): Can't find record in 'products_tbl'
在MariaDB中创建或删除数据库需要特权,通常仅授予root用户或管理员。 在这些帐户下,您有两个删除数据库的选项:mysqladmin二进制文件和PHP脚本。
请注意,删除的数据库是不可恢复的,因此请谨慎执行此操作。 此外,用于删除的PHP脚本不会提示您在删除之前的确认。
以下示例演示如何使用mysqladmin脚本删除现有数据库 -
[root@host]# mysqladmin -u root -p drop PRODUCTSEnter password:******mysql> DROP PRODUCTSERROR 1008 (HY000): Can't drop database 'PRODUCTS'; database doesn't exist
PHP在删除MariaDB数据库时使用mysql_query函数。 该函数使用两个参数,一个可选,并在成功时返回值“true”,否则返回“false”。
查看以下删除数据库脚本语法 -
bool mysql_query( sql, connection );
参数的说明下面给出 -
S.No | 参数和说明 |
---|---|
1 | SQL 此必需参数由执行操作所需的SQL查询组成。 |
2 | connection 未指定时,此可选参数使用最近使用的连接。 |
尝试下面的示例代码删除数据库 -
<html> <head> <title>Delete a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'DROP DATABASE PRODUCTS'; $retval = mysql_query( $sql, $conn ); if(! $retval ){ die('Could not delete database: ' . mysql_error()); } echo "Database PRODUCTS deleted successfully"; mysql_close($conn); ?> </body></html>
成功删除后,您将看到以下输出 -
mysql> Database PRODUCTS deleted successfully
WHERE子句提供了一种在操作使用完全匹配时检索数据的方法。 在需要具有共享特征的多个结果的情况下,LIKE子句适应宽模式匹配。
LIKE子句测试模式匹配,返回true或false。 用于比较的模式接受以下通配符:"%",其匹配字符数(0或更多); 和"_",它匹配单个字符。 "_"通配符只匹配其集合中的字符,这意味着当使用另一个集合时,它将忽略拉丁字符。 匹配在默认情况下不区分大小写,需要对大小写敏感的附加设置。
NOT LIKE子句允许测试相反的条件,非常类似于非运算符。
如果语句表达式或模式求值为NULL,则结果为NULL。
查看下面给出的一般LIKE子句语法 -
SELECT field, field2,... FROM table_name, table_name2,...WHERE field LIKE condition
在命令提示符或PHP脚本中使用LIKE子句。
在命令提示符下,只需使用标准命令 -
root@host# mysql -u root -p password;Enter password:*******mysql> use TUTORIALS;Database changedmysql> SELECT * from products_tbl WHERE product_manufacturer LIKE 'XYZ%';+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 12345 | Orbitron 4000 | XYZ Corp |+-------------+----------------+----------------------+| 12346 | Orbitron 3000 | XYZ Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
在使用LIKE子句的语句中使用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl WHERE product_manufacturer LIKE "xyz%"'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID:{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date: {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
Product ID: 12345Nomenclature: Orbitron 4000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 12346Nomenclature: Orbitron 3000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------Product ID: 12347Nomenclature: Orbitron 1000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------mysql> Fetched data successfully
连接到MariaDB后,必须选择要使用的数据库,因为许多数据库可能存在。 有两种方法来执行此任务:从命令提示符或通过PHP脚本。
在命令提示符下选择数据库时,只需使用SQL命令'use'
[root@host]# mysql -u root -pEnter password:******mysql> use PRODUCTS;Database changedmysql> SELECT database(); +-------------------------+ | Database | +-------------------------+ | PRODUCTS | +-------------------------+
一旦选择了数据库,所有后续命令将在选定的数据库上操作。
注意 - 所有名称(例如,数据库,表,字段)区分大小写。 确保命令符合正确的大小写。
PHP提供了用于数据库选择的mysql_select_db函数。 该函数使用两个参数,一个可选,并在成功选择时返回值“true”,或者在失败时返回false。
查看以下select数据库脚本语法。
bool mysql_select_db( db_name, connection );
参数的说明下面给出 -
S.No | 参数和说明 |
---|---|
1 | DB_NAME 这需要参数指定要使用的数据库的名称。 |
2 | 连接 如果没有指定,此可选参数使用最近使用的连接。 |
尝试以下示例代码来选择数据库 -
<html> <head> <title>Select a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'guest1'; $dbpass = 'guest1a'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_select_db( 'PRODUCTS' ); mysql_close($conn); ?> </body></html>
成功选择后,您将看到以下输出 -
mysql> Connected successfully
如前面讨论中提到的,ORDER BY子句对语句的结果进行排序。 它指定操作数据的顺序,并包括按升序(ASC)或降序(DESC)顺序排序的选项。 在省略订单规格时,默认顺序为升序。
ORDER BY子句出现在各种各样的语句中,例如DELETE和UPDATE。 它们总是出现在语句的结尾,而不是在子查询中或在set函数之前,因为它们在最终结果表上操作。 您也不能使用整数来标识列。
查看下面给出的ORDER BY子句的一般语法 -
SELECT field, field2,... [or column] FROM table_name, table_name2,...ORDER BY field, field2,... ASC[or DESC]
在命令提示符处或PHP脚本中使用ORDER BY子句。
在命令提示符下,只需使用标准命令 -
root@ host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl ORDER BY product_manufacturer ASC+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 56789 | SuperBlast 400 | LMN Corp |+-------------+----------------+----------------------+| 67891 | Zoomzoom 5000 | QFT Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
在使用ORDER BY子句的语句中再次使用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl ORDER BY product_manufacturer DESC'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date : {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
Product ID: 12347Nomenclature: Orbitron 1000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 67891Nomenclature: Zoomzoom 5000Manufacturer: QFT CorpShip Date: 01/01/17----------------------------------------------Product ID: 56789Nomenclature: SuperBlast 400Manufacturer: LMN CorpShip Date: 01/04/17----------------------------------------------mysql> Fetched data successfully
良好的字段定义对于优化数据库至关重要。 理想的方法要求您专门使用所需类型和大小的字段。 例如,如果你只使用一个字段,五个字符宽,不要定义一个字段,20个字符宽。 字段(或列)类型也称为给定存储在字段中的数据类型的数据类型。
MariaDB数据类型可以分为数字,日期和时间以及字符串值。
MariaDB支持的数字数据类型如下 -
TINYINT - 此数据类型表示落入-128到127的有符号范围内的小整数,以及0到255的无符号范围。
BOOLEAN - 此数据类型将值0与“false”相关联,值1与“true”相关联。
SMALLINT - 此数据类型表示-32768到32768的有符号范围内的整数,以及0到65535的无符号范围。
MEDIUMINT - 此数据类型表示有符号范围-8388608到8388607中的整数,无符号范围0到16777215。
INT(也为INTEGER) - 此数据类型表示正常大小的整数。当标记为unsigned时,范围跨越0到4294967295.当有符号(默认设置)时,范围跨越-2147483648到2147483647.当列设置为ZEROFILL(无符号状态)时,其所有值都由零添加INT值中的M个数字。
BIGINT - 此数据类型表示有符号范围9223372036854775808到9223372036854775807内的整数,无符号范围0到18446744073709551615。
DECIMAL(DEC,NUMERIC,FIXED) - 该数据类型表示精确的定点数,M指定其数字,D指定小数后的数字。 M值不添加“ - ”或小数点。如果D设置为0,则不会出现小数或小数部分,并且该值将舍入为最接近的DECIMAL INSERT。最大允许位数为65,小数位数的最大值为30.默认值M的默认值为10,省略时D为0。
FLOAT - 此数据类型表示值0的小的浮点数或以下范围内的数字 -
-3.402823466E + 38至-1.175494351E-38
1.175494351E-38至3.402823466E + 38
DOUBLE(也是REAL和DOUBLE PRECISION) - 此数据类型表示值0的正常大小的浮点数,或以下范围内的值 -
-1.7976931348623157E + 308至-2.2250738585072014E-308
2.2250738585072014E-308至1.7976931348623157E + 308
BIT - 此数据类型表示位字段,M指定每个值的位数。省略M时,默认值为1.位值可以通过“b'[value]'”应用,其中值表示0和1中的位值。零填充从左边自动发生全长;例如,“10”变为“0010”。
MariaDB支持的日期和时间数据类型如下 -
DATE - 此数据类型表示日期范围“1000-01-01”到“9999-12-31”,并使用“YYYY-MM-DD”日期格式。
TIME - 此数据类型表示“-838:59:59.999999”到“838:59:59.999999”的时间范围。
DATETIME - 此数据类型表示范围“1000-01-01 00:00:00.000000”至“9999-12-31 23:59:59.999999”。它使用“YYYY-MM-DD HH:MM:SS”格式 。
TIMESTAMP - 此数据类型表示“YYYY-MM-DD HH:MM:DD”格式的时间戳。 它主要用于详细描述数据库修改的时间,例如插入或更新。
YEAR - 此数据类型表示4位数格式的年份。 四位数格式允许在1901到2155和0000范围内的值。
MariaDB支持的字符串类型值如下 -
String literals - 此数据类型表示用引号括起来的字符序列。
CHAR - 此数据类型表示包含指定长度的空格的右侧带有固定长度的字符串。 M表示字符的列长度,取值范围为0〜255,缺省值为1。
VARCHAR - 此数据类型表示一个可变长度字符串,M范围(最大列长度)为0到65535。
BINARY - 此数据类型表示二进制字节字符串,M为列长度(以字节为单位)。
VARBINARY - 此数据类型表示可变长度的二进制字节字符串,M为列长度。
TINYBLOB - 此数据类型表示最大长度为255(28 - 1)个字节的blob列。在存储中,每个都使用一个字节长度的前缀,表示值中的字节数量。
BLOB - 此数据类型表示最大长度为65,535(216 - 1)个字节的blob列。在存储中,每个都使用两字节长度的前缀,表示值中的字节数量。
MEDIUMBLOB - 此数据类型表示最大长度为16,777,215(224 - 1)个字节的blob列。在存储中,每个都使用一个三字节长度前缀,表示值中的字节数量。
LONGBLOB - 此数据类型表示最大长度为4,294,967,295(232 - 1)个字节的blob列。在存储中,每个使用四字节长度的前缀,表示值中的字节数量。
TINYTEXT - 此数据类型表示最大长度为255(28 - 1)个字符的文本列。在存储中,每个都使用一个字节长度的前缀,表示值中的字节数量。
TEXT - 此数据类型表示最大长度为65,535(216 - 1)个字符的文本列。在存储中,每个都使用两字节长度的前缀,表示值中的字节数量。
MEDIUMTEXT - 此数据类型表示最大长度为16,777,215(224 - 1)个字符的文本列。在存储中,每个都使用三字节长度前缀,表示值中的字节数量。
LONGTEXT - 此数据类型表示最大长度为4,294,967,295或4GB(232 - 1)个字符的文本列。在存储中,每个使用四字节长度的前缀,表示值中的字节数量。
ENUM - 此数据类型表示一个列表中只有一个值的字符串对象。
SET - 此数据类型表示一个列表中具有零个或多个值的字符串对象,最多包含64个成员。 SET值在内部作为整数值存在。
在之前的讨论和示例中,我们检查了从单个表中检索,或从多个来源检索多个值。 大多数现实世界的数据操作要复杂得多,需要从多个表进行聚合,比较和检索。
JOIN允许将两个或多个表合并到单个对象中。 它们通过SELECT,UPDATE和DELETE语句使用。
使用JOIN查看语句的一般语法如下所示 -
SELECT columnFROM table_name1INNER JOIN table_name2ON table_name1.column = table_name2.column;
注意JOINS的旧语法使用隐式连接和没有关键字。 可以使用WHERE子句来实现联接,但关键字最适合可读性,维护和最佳实践。
JOIN有许多形式,如左连接,右连接或内连接。 各种连接类型基于共享值或特性提供不同类型的聚合。
在命令提示符或PHP脚本中使用JOIN。
在命令提示符下,只需使用标准语句 -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT products.ID_number, products.Nomenclature, inventory.inventory_ct FROM products INNER JOIN inventory ON products.ID_numbeer = inventory.ID_number;+-------------+----------------+-----------------+| ID_number | Nomenclature | Inventory Count |+-------------+----------------+-----------------+| 12345 | Orbitron 4000 | 150 |+-------------+----------------+-----------------+| 12346 | Orbitron 3000 | 200 |+-------------+----------------+-----------------+| 12347 | Orbitron 1000 | 0 |+-------------+----------------+-----------------+
使用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.product_id, a.product_manufacturer, b.product_count FROM products_tbl a, pcount_tbl b WHERE a.product_manufacturer = b.product_manufacturer'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Manufacturer:{$row['product_manufacturer']} <br> ". "Count: {$row['product_count']} <br> ". "Product ID: {$row['product_id']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
ID Number: 12345Nomenclature: Orbitron 4000Inventory Count: 150--------------------------------------ID Number: 12346Nomenclature: Orbitron 3000Inventory Count: 200--------------------------------------ID Number: 12347Nomenclature: Orbitron 1000Inventory Count: 0--------------------------------------mysql> Fetched data successfully
使用NULL值时,请记住它们是未知值。 它们不是空字符串或零,它们是有效值。 在表创建中,列规范允许将它们设置为接受空值,或拒绝它们。 只需使用NULL或NOT NULL子句。 这在缺少记录信息(如ID号)的情况下具有应用。
用户定义的变量的值为NULL,直到显式赋值。 存储的例程参数和局部变量允许将值设置为NULL。 当局部变量没有默认值时,它的值为NULL。
NULL不区分大小写,并具有以下别名 -
标准比较运算符不能与NULL(例如,=,>,> =,<=,<或或!=)一起使用,因为所有与NULL值的比较都返回NULL,而不是true或false。 与NULL或可能包含它的比较必须使用“<=>”(NULL-SAFE)运算符。
其他可用的运营商有 -
IS NULL - 它测试NULL值。
IS NOT NULL - 它确认不存在NULL值。
ISNULL - 在发现NULL值时返回值1,在不存在时返回0。
COALESCE - 返回列表的第一个非NULL值,或者在没有一个值的情况下返回NULL值。
在排序操作中,NULL值具有最低值,因此DESC次序在底部产生NULL值。 MariaDB允许为NULL值设置更高的值。
有两种方法可以做到这一点,如下所示 -
SELECT column1 FROM product_tbl ORDER BY ISNULL(column1), column1;
另一种方式 -
SELECT column1 FROM product_tbl ORDER BY IF(column1 IS NULL, 0, 1), column1 DESC;
当任何参数为NULL时,函数通常输出NULL。 但是,还有专门用于管理NULL值的函数。 他们是 -
IFNULL() - 如果第一个表达式不为NULL,它返回它。 当它求值为NULL时,它返回第二个表达式。
NULLIF() - 当比较的表达式相等时,它返回NULL,否则返回第一个表达式。
像SUM和AVG的函数忽略NULL值。
在声明为NOT NULL的列中插入NULL值时,会发生错误。 在默认SQL模式下,NOT NULL列将根据数据类型插入一个默认值。
当字段是TIMESTAMP,AUTO_INCREMENT或虚拟列时,MariaDB会以不同方式管理NULL值。 插入在AUTO_INCREMENT列中会导致序列中的下一个数字插入到其位置。 在TIMESTAMP字段中,MariaDB分配当前时间戳。 在虚拟列中,本教程后面讨论的主题将分配默认值。
UNIQUE索引可以包含许多NULL值,但是,主键不能为NULL。
当您使用ALTER命令修改列时,如果没有NULL规范,MariaDB会自动分配值。
数据作为业务和操作的基础,并且具有各种可能的威胁(例如,攻击者,系统故障,不良升级和维护错误),备份仍然至关重要。 这些备份采用多种形式,并且存在许多选项用于在这些过程中使用更宽泛的选项来创建它们。 要记住的重要事情是数据库类型,关键信息和所涉及的结构。 此信息确定您的最佳选择。
备份的主要选项包括逻辑备份和物理备份。 逻辑备份保存用于恢复数据的SQL语句。 物理备份包含数据副本。
与物理备份相比,逻辑备份提供了在具有不同配置的另一台机器上恢复数据的灵活性,物理备份通常限于相同的机器和数据库类型。 逻辑备份发生在数据库和表级,物理发生在目录和文件级。
物理备份的大小小于逻辑备份,并且执行和恢复所需的时间也更少。 物理备份还包括日志和配置文件,但逻辑备份不包括。
用于MariaDB备份的主要工具是mysqldump。 它提供逻辑备份和灵活性。 它也证明是小数据库的一个很好的选择。 Mysqldump将数据转储为SQL,CSV,XML和许多其他格式。 其输出不保留存储过程,视图和事件,没有显式指令。
有三个选项mysqldump备份 -
原始数据 - 通过--tab选项将表转储为原始数据文件,该选项还指定文件的目标 -
$ mysqldump -u root -p --no-create-info --tab=/tmp PRODUCTS products_tbl
数据/定义export - 此选项允许将单个或多个表导出到文件,并支持备份主机上的所有现有数据库。 检查将内容或定义导出到文件的示例
$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
传输 - 您还可以将数据库和表输出到另一个主机
$ mysqldump -u root -p database_name | mysql -h other-host.com database_name
导出数据的另一个选项使用SELECT ... INTO OUTFILE语句。 这个简单的选项输出表到一个简单的格式化文本文件 -
mysql> SELECT * FROM products_tbl -> INTO OUTFILE '/tmp/products.txt';
其属性允许将文件格式化为您首选的规范。
请注意本声明的以下质量 -
文件名必须指定输出的所需位置。
您需要MariaDB文件权限才能执行语句。
输出文件名必须是唯一的。
您需要主机上的登录凭据。
在UNIX环境中,输出文件是世界可读的,但其服务器所有权会影响您删除它的能力。 确保您有权限。
CONNECT处理程序允许导出数据。 这证明主要在SELECT ... INTO OUTFILE操作不支持文件格式的情况下有用。
查看以下示例 -
create table productsengine = CONNECT table_type = XML file_name = 'products.htm' header = yesoption_list = 'name=TABLE,coltype = HTML,attribute = border=1;cellpadding = 5'select plugin_name handler, plugin_version version, plugin_authorauthor, plugin_description description, plugin_maturity maturityfrom information_schema.plugins where plugin_type = 'STORAGE ENGINE';
备份的其他选项如下 -
XtraBackup - 此选项针对XtraDB / InnoDB数据库,并与任何存储引擎一起工作。从Percona的官方网站了解有关此工具的更多信息。
Snapshots - 某些文件系统允许快照。该过程包括使用读锁刷新表,装入快照,解锁表,复制快照,然后卸载快照。
LVM - 这种流行的方法使用Perl脚本。它在每个表上获取读取锁并将缓存刷新到磁盘。然后它获取快照并解锁表。有关详细信息,请咨询官方mylvmbackup网站。
TokuBackup - Percona提供的此解决方案提供热备份,考虑到InnoDB备份选项的问题和限制。它生成文件的事务性声音副本,而应用程序继续操作它们。有关详细信息,请咨询Percona网站。
InnoDB使用缓冲池来提高性能。在备份中,配置InnoDB以避免将整个表复制到缓冲池中,因为逻辑备份通常执行全表扫描。
除了LIKE子句提供的模式匹配之外,MariaDB通过REGEXP运算符提供基于正则表达式的匹配。 运算符基于给定模式对字符串表达式执行模式匹配。
MariaDB 10.0.5引入了PCRE Regular Expressions,这大大增加了匹配范围,如递归模式,前瞻断言等等。
查看下面给出的标准REGEXP运算符语法的使用 -
SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';
REGEXP返回1表示模式匹配,或0表示没有模式匹配。
相反的选项以NOT REGEXP的形式存在。 MariaDB还提供REGEXP和NOT REGEXP,RLIKE和NOT RLIKE的同义词,它们是出于兼容性原因而创建的。
比较的模式可以是文字字符串或其他内容,如表列。 在字符串中,它使用C转义语法,所以加倍任何“”字符。 REGEXP也是不区分大小写的,二进制字符串除外。
下面给出了可以使用的可能模式的表格 -
S.No | 图案和说明 |
---|---|
1 | ^ 它匹配字符串的开头。 |
2 | $ 它匹配字符串的结尾。 |
3 | . 它匹配单个字符。 |
4 | [...] 它匹配括号中的任何字符。 |
5 | [^ ...] 它匹配括号中未列出的任何字符。 |
6 | P1 | P2 | P3 它匹配任何模式。 |
7 | * 它匹配前面元素的0个或多个实例。 |
8 | + 它匹配前一个元素的1个或多个实例。 |
9 | {N} 它匹配前面元素的n个实例。 |
10 | {M,N} 它匹配m到前面元素的n个实例。 |
查看下面给出的模式匹配示例 -
以“pr”开头的产品 -
SELECT name FROM product_tbl WHERE name REGEXP '^pr';
以“na”结尾的产品 -
SELECT name FROM product_tbl WHERE name REGEXP 'na$';
以元音开头的产品 -
SELECT name FROM product_tbl WHERE name REGEXP '^[aeiou]';
在本章中,我们将了解各种备份加载方法。 从备份还原数据库是一个简单,有时非常长的过程。
加载数据有三个选项:LOAD DATA语句,mysqlimport和一个简单的mysqldump还原。
LOAD DATA语句用作批量加载器。 查看加载文本文件的使用示例 -
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;
请注意LOAD DATA语句的以下质量:
使用LOCAL关键字可防止MariaDB对主机执行深层搜索,并使用非常具体的路径。
语句假定一种格式,包括由换行符(换行符)终止的行和用制表符分隔的数据值。
使用FIELDS子句可以明确指定行上字段的格式。 使用LINES子句指定行尾。 查看下面的示例。
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl FIELDS TERMINATED BY '|' LINES TERMINATED BY '';
该语句假定数据文件中的列使用表的相同顺序。 如果您需要设置不同的顺序,您可以加载文件如下 -
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl (c, b, a);
mysqlimport工具用作LOAD DATA包装器,允许从命令行进行相同的操作。
加载数据如下 -
$ mysqlimport -u root -p --local database_name source_file.txt
指定格式如下 -
$ mysqlimport -u root -p --local --fields-terminated-by="|" --lines-terminated-by="" database_name source_file.txt
使用--columns选项指定列顺序 -
$ mysqlimport -u root -p --local --columns=c,b,a database_name source_file.txt
使用mysqldump还原需要这个简单的语句将转储文件加载回主机 -
shell> mysql database_name < source_file.sql
在LOAD DATA语句中,引号和特殊字符可能无法正确解释。 语句采用不带引号的值,并将反斜线视为转义字符。 使用FIELDS子句指定格式。 指向带有“ENCLOSED BY BY”的引号,这将导致从数据值中去除引号。 使用“ESCAPED BY”更改转义。
事务是顺序组操作。 它们作为单个单元运行,并且直到组中的所有操作都成功执行时才终止。 组中的单个故障会导致整个事务失败,并导致对数据库没有影响。
事务符合ACID(原子性,一致性,隔离和耐久性) -
原子性 - 它通过中止故障和回滚更改来确保所有操作的成功。
一致性 - 它确保数据库对成功的事务应用更改。
隔离 - 它使事务的独立事务操作。
持久性 - 它确保在系统故障的情况下成功事务的持久性。
在事务语句的开头是START TRANSACTION语句,后跟COMMIT和ROLLBACK语句 -
START TRANSACTION - 开始事务。
COMMIT - 保存对数据的更改。
ROLLBACK - 结束事务,销毁任何更改。
事务成功时执行COMMIT,失败时执行ROLLBACK。
注 - 有些语句会导致隐式提交,并且在事务中使用时也会导致错误。 这样的语句的示例包括但不限于CREATE,ALTER和DROP。
MariaDB事务还包括SAVEPOINT和LOCK TABLES等选项。 SAVEPOINT设置一个恢复点以利用ROLLBACK。 LOCK TABLES允许在会话期间控制对表的访问,以防止在某些时间段内进行修改。
AUTOCOMMIT变量提供对事务的控制。 设置为1会强制所有操作都被视为成功事务,而设置为0会导致持久性更改只发生在显式COMMIT语句上。
事务语句的一般结构包括从START TRANSACTION开始。 下一步是插入一个或多个命令/操作,插入用于检查错误的语句,插入ROLLBACK语句以管理发现的任何错误,最后插入COMMIT语句以对成功的操作应用更改。
查看下面给出的示例 -
START TRANSACTION;SELECT name FROM products WHERE manufacturer = 'XYZ Corp';UPDATE spring_products SET item = name;COMMIT;
本章包含最常用功能的列表,提供定义,说明和示例。
最常用的聚合函数如下 -
S.No | 名称与描述 |
---|---|
1 | COUNT 它对记录总数进行统计。 示例 - SELECT COUNT(*)FROM customer_table; |
2 | MIN 它揭示了一组记录的最小值。 示例 - SELECT组织,MIN(帐户)FROM合同GROUP BY组织; |
3 | MAX 它揭示了一组记录的最大值。 示例 - SELECT组织,MAX(account_size)FROM合同GROUP BY组织; |
4 | AVG 它计算一组的记录的平均值。 示例 -选择AVG(account_size)FROM合同; |
5 | SUM 它计算一组记录的总和。 示例 - SELECT SUM(account_size)FROM合同; |
TIMESTAMPDIFF函数提供了一种计算年龄 -
SELECT CURDATE() AS today;SELECT ID, DOB, TIMESTAMPDIFF(YEAR,DOB,'2015-07-01') AS age FROM officer_info;
CONCAT函数在连接操作后返回结果字符串。 您可以使用一个或多个参数。 检查其语法如下 -
SELECT CONCAT(item, item,...);
查看以下示例 -
SELECT CONCAT('Ram', 'bu', 'tan');Output:Rambutan
以下是重要的日期函数 -
S.No | 名称与描述 |
---|---|
1 | CURDATE() 它以yyyy-mm-dd或yyyymmdd格式返回日期。 示例 - SELECT CURDATE(); |
2 | DATE() 它以多种格式返回日期。 示例-CREATE TABLE product_release_tbl(x DATE); |
3 | CURTIME() 它以HH:MM:SS或HHMMSS.uuuuuu格式返回时间。 示例 - SELECT CURTIME(); |
4 | DATE_SUB() 它从指定的日期增加或减少天数。 示例 - SELECT DATE_SUB('2016-02-08',INTERVAL 60 DAY); |
5 | DATEDIFF() 它确定两个日期之间的天数。 示例 - SELECT DATEDIFF('2016-01-01 23:59:59','2016-01-03'); |
6 | DATE ADD() 它增加或减去日期和时间的任何时间单位。 示例 - SELECT DATE_ADD('2016-01-04 23:59:59',INTERVAL 22 SECOND); |
7 | EXTRACT() 它从日期中提取单位。 示例 - SELECT EXTRACT(YPAR FROM'2016-01-08'); |
8 | NOW() 它以yyyy-mm-dd hh:mm:ss或yyyymmddhhmmss.uuuuuu格式返回当前日期和时间。 示例 - SELECT NOW(); |
9 | DATE FORMAT() 它根据指定的格式字符串格式化日期。 示例 - SELECT DATE_FORMAT('2016-01-09 20:20:00','%W%M%Y'); |
以下是一些重要的时间函数 -
它返回日期的秒数。S.No | 名称与描述 |
---|---|
1 | HOUR() 它返回时间的小时或已过去的小时数。 示例 - SELECT HOUR('19:17:09'); |
2 | LOCALTIME() 它的作用就像NOW()。 |
3 | MICROSECOND() 它返回时间的微秒。 示例 - SELECT MICROSECOND('16:30:00.543876'); |
4 | MINUTE() 它返回时间的分钟。 示例 - SELECT MINUTE('2016-05-22 17:22:01'); |
5 |
SECOND() 它返回日期的秒数。 示例 - SELECT SECOND('2016-03-12 16:30:04.000001'); |
6 | TIME_FORMAT() 它根据指定的格式字符串格式化时间。 示例 - SELECT TIME_FORMAT('22:02:20','%H%k%h%I%l'); |
7 | TIMESTAMP() 它为活动提供了格式为yyyy-mm-dd hh:mm:dd的时间戳。 示例 - CREATE TABLE orders_(ID INT,tmst TIMESTAMP); |
下面给出了一些重要的数字函数在MariaDB -
S.No | 名称与描述 |
---|---|
1 | TRUNCATE() 它返回一个截断的数字到小数位数指定。 示例 - SELECT TRUNCATE(101.222,1); |
2 | COS() 它返回x弧度的余弦。 示例 - SELECT COS(PI()); |
3 | CEILING() 它返回不小于x的最小整数。 示例 - SELECT CEILING(2.11); |
4 | DEGREES() 它将弧度转换为度。 示例 - SELECT DEGREES(PI()); |
5 | DIV() 它执行整数除法。 示例 - SELECT 100 DIV 4; |
6 | EXP() 它返回e的x的幂。 示例 - SELECT EXP(2); |
7 | FLOOR() 它返回不超过x的最大整数。 示例 - SELECT FLOOR(2.01); |
8 | LN() 它返回x的自然对数。 示例 - SELECT LN(3); |
9 | LOG() 它返回给定基数的自然对数或对数。 示例 - SELECT LOG(3); |
10 | SQRT() 它返回平方根。 示例 - SELECT SQRT(16); |
下面给出了重要的字符串函数 -
S.No | 名称与描述 |
---|---|
1 | INSTR() 它返回一个子串的第一个实例的位置。 示例 - SELECT INSTR('rambutan','tan'); |
2 | RIGHT() 它返回最右边的字符串字符。 示例 - SELECT RIGHT('rambutan',3); |
3 | LENGTH() 它返回字符串的字节长度。 示例 - SELECT LENGTH('rambutan'); |
4 | LOCATE() 它返回一个子串的第一个实例的位置。 示例 - SELECT LOCATE('tan','rambutan'); |
5 | INSERT() 它返回一个字符串,在某个位置有一个指定的子字符串,被修改。 示例 - SELECT INSERT('ramputan',4,1,'b'); |
6 | LEFT() 它返回最左边的字符。 示例 - SELECT LEFT('rambutan',3); |
7 | UPPER() 它将字符更改为大写。 示例 - SELECT UPPER(lastname); |
8 | LOWER() 它将字符更改为小写。 示例 - SELECT LOWER(lastname); |
9 | STRCMP() 它比较字符串,当他们相等,则返回0。 示例 -选择STRCMP('蛋','奶酪'); |
10 | REPLACE() 它在替换字符后返回一个字符串。 示例 - SELECT REPLACE('sully','l','n'); |
11 | REVERSE() 它反转字符串中的字符。 示例 - SELECT REVERSE('racecar'); |
12 | REPEAT() 它返回一个字符串,重复给定字符x次。 示例 - SELECT REPEAT('ha',10); |
13 | SUBSTRING() 它从字符串返回一个子串,从位置x开始。 示例 - SELECT SUBSTRING('rambutan',3); |
14 | TRIM() 它从字符串中删除尾随/前导字符。 示例 - SELECT TRIM(LEADING'_'FROM'_rambutan'); |
ALTER命令提供了一种方法来更改现有表的结构,这意味着删除或添加列,修改索引,更改数据类型或更改名称等修改。 ALTER还会在元数据锁定处于活动状态时等待应用更改。
ALTER与DROP配对会删除现有列。 但是,如果列是唯一的剩余列,它将失败。
查看下面给出的示例 -
mysql> ALTER TABLE products_tbl DROP version_num;
使用ALTER ... ADD语句添加列 -
mysql> ALTER TABLE products_tbl ADD discontinued CHAR(1);
使用关键字FIRST和AFTER指定列的位置 -
ALTER TABLE products_tbl ADD discontinued CHAR(1) FIRST;ALTER TABLE products_tbl ADD discontinued CHAR(1) AFTER quantity;
注意FIRST和AFTER关键字只适用于ALTER ... ADD语句。 此外,您必须删除一个表,然后添加它,以重新定位它。
使用ALTER语句中的MODIFY或CHANGE子句更改列定义或名称。 这些子句具有类似的效果,但是使用明显不同的语法。
查看下面给出的CHANGE示例 -
mysql> ALTER TABLE products_tbl CHANGE discontinued status CHAR(4);
在使用CHANGE的语句中,指定原始列,然后指定将替换它的新列。 查看下面的MODIFY示例 -
mysql> ALTER TABLE products_tbl MODIFY discontinued CHAR(4);
ALTER命令还允许更改默认值。 查看示例 -
mysql> ALTER TABLE products_tbl ALTER discontinued SET DEFAULT N;
您还可以使用它通过将其与DROP子句配对来删除默认约束 -
mysql> ALTER TABLE products_tbl ALTER discontinued DROP DEFAULT;
使用TYPE子句更改表类型 -
mysql> ALTER TABLE products_tbl TYPE = INNODB;
重命名具有RENAME关键字的表 -
mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;
索引是用于加速记录检索的工具。 索引为索引列中的每个值生成一个条目。
有四种类型的索引 -
Primary(一条记录表示所有记录)
Unique(一条记录表示多个记录)
Plain
Full-Text(允许文本搜索中的许多选项)。
术语“密钥”和“索引”在该用法中是相同的。
索引与一个或多个列关联,并支持快速搜索和高效的记录组织。 创建索引时,请考虑查询中经常使用的列。 然后在它们上创建一个或多个索引。 此外,将索引视为基本的主键表。
虽然索引加速搜索或SELECT语句,但由于对表和索引执行操作,它们使插入和更新拖动。
您可以通过CREATE TABLE ... INDEX语句或CREATE INDEX语句创建索引。 支持可读性,维护和最佳实践的最佳选项是CREATE INDEX。
查看下面给出的Index的一般语法 -
CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;
回顾一个使用的例子 -
CREATE UNIQUE INDEX top_sellers ON products_tbl product;
可以使用DROP INDEX或ALTER TABLE ... DROP删除索引。 支持可读性,维护和最佳实践的最佳选项是DROP INDEX。
查看下面给出的Drop Index的一般语法 -
DROP INDEX index_name ON table_name;
回顾一个使用的例子 -
DROP INDEX top_sellers ON product_tbl;
使用ALTER TABLE语句重命名索引。 查看下面给出的一般语法 -
ALTER TABLE table_name DROP INDEX index_name, ADD INDEX new_index_name;
回顾一个使用的例子 -
ALTER TABLE products_tbl DROP INDEX top_sellers, ADD INDEX top_2016sellers;
您将需要检查和跟踪所有索引。 使用SHOW INDEX列出与给定表相关联的所有现有索引。 您可以使用诸如“ G”之类的选项来设置显示内容的格式,该选项指定垂直格式。
查看以下示例 -
mysql > SHOW INDEX FROM products_tblG
索引被大量使用以优化查询,因为更快地访问记录以及提供的统计信息。 然而,许多用户发现索引维护麻烦。 MariaDB 10.0使存储引擎独立统计表可用,它计算每个存储引擎中每个表的数据统计信息,甚至是未编制索引的列的统计信息。
由于速度或一次性数据,一些操作可能受益于临时表。 临时表的生命期在会话终止时结束,无论是从命令提示符,PHP脚本还是通过客户端程序使用它们。 它也不以典型的方式出现在系统中。 SHOW TABLES命令不会显示包含临时表的列表。
CREATE TABLE语句中的TEMPORARY关键字生成临时表。 查看下面给出的示例 -
mysql>CREATE TEMPORARY TABLE order ( item_name VARCHAR(50) NOT NULL , price DECIMAL(7,2) NOT NULL DEFAULT 0.00 , quantity INT UNSIGNED NOT NULL DEFAULT 0);
在创建临时表时,可以使用LIKE子句克隆现有表,这意味着其所有常规特征。 用于生成临时表的CREATE TABLE语句不会作为TEMPORARY关键字的结果提交事务。
虽然临时表在会话结束时与非临时表脱离,但它们可能有一定的冲突 -
他们有时会与过期会话中的ghost临时表冲突。
它们有时与非临时表的影子名称冲突。
注意 - 临时表允许与现有非临时表具有相同的名称,因为MariaDB将其视为差异引用。
MariaDB需要向用户授予创建临时表的权限。 使用GRANT语句将此权限授予非管理员用户。
GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';
虽然临时表基本上在会话结束时删除,您可以选择删除它们。 删除临时表需要使用TEMPORARY关键字,最佳实践建议在临时表之前删除临时表。
mysql> DROP TABLE order;
某些情况下需要生成现有表的精确副本。 CREATE ... SELECT语句不能产生此输出,因为它忽略了索引和默认值。
复制表的过程如下 -
使用SHOW CREATE TABLE来生成详细描述源表的整个结构的CREATE TABLE语句。
编辑语句以给表一个新名称,并执行它。
如果还需要复制表数据,请使用INSERT INTO ... SELECT语句。
mysql> INSERT INTO inventory_copy_tbl ( product_id,product_name,product_manufacturer,ship_date) SELECT product_id,product_name,product_manufacturer,ship_date, FROM inventory_tbl;
另一种创建副本的方法使用CREATE TABLE AS语句。 该语句复制所有列,列定义,并用源表数据填充副本。
检查其语法如下 -
CREATE TABLE clone_tbl AS SELECT columns FROM original_tbl WHERE conditions];
查看其使用示例如下 -
CREATE TABLE products_copy_tbl AS SELECT * FROM products_tbl;
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。
它不允许在多个查询中使用,只能在其原始查询因为其虚拟(不写入磁盘)性质。 但是,序列表可以通过ALTER命令转换为标准表。 如果删除转换的表,序列表仍然存在。 序列也不能产生负数或以最小/最大值旋转。
使用序列需要安装序列引擎,MariaDB作为插件而不是二进制分发。 使用以下命令安装它 -
INSTALL SONAME "ha_sequence";
安装后,验证它 -
SHOW ENGINESG
请记住,在引擎安装后,您不能创建具有使用序列语法的名称的标准表,但可以创建具有序列语法名称的临时表。
有两种方法创建序列 -
创建表并使用AUTO_INCREMENT属性将列定义为自动递增。
使用现有数据库并使用序列SELECT查询来生成序列。 查询使用seq_ [FROM] _to_ [TO]或seq_ [FROM] _to_ [TO] _step_STEP语法。
最佳实践更喜欢使用第二种方法。 查看下面给出的序列创建的示例 -
SELECT * FROM seq_77_to_99;
序列有很多用途 -
在列中找到缺少的值,以防止操作中的相关问题 -
SELECT myseq.seq FROM seq_22_to_28 myseq LEFT JOIN table1 t ON myseq.seq = x.y WHERE x.y IS NULL;
构造值的组合 -
SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
查找数字的倍数 -
SELECT seq FROM seq_3_to_100_step_4;
如前面的课程所讨论的,MariaDB在某些情况下允许重复记录和表。 由于不同的数据或对象类型,或作为操作对象的唯一寿命或存储的结果,这些重复中的一些事实上不是重复的。 这些副本通常也没有问题。
在某些情况下,重复确实会导致问题,并且它们常常由于隐式动作或MariaDB命令的宽松策略而出现。 有多种方法可以控制此问题,查找重复项,删除重复项,并防止重复创建。
有四个关键方法来管理重复 -
使用JOIN关联,并用临时表删除他们。
使用INSERT ... ON DUPLICATE KEY UPDATE在发现重复时更新。
使用DISTINCT修剪SELECT语句的结果并删除重复的。
使用INSERT IGNORE停止插入重复项。
只需像内部联接那样执行半连接,然后删除使用临时表找到的重复。
当INSERT ... ON DUPLICATE KEY UPDATE发现重复的唯一或主键时,它执行更新。 发现多个唯一键时,它只更新第一个。 因此,不要在具有多个唯一索引的表上使用它。
查看以下示例,该示例显示在插入到填充字段时在包含索引值的表中发生的情况 -
INSERT INTO add_dupl VALUES (1,'Apple');ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
注意 - 如果没有找到任何键,INSERT ... ON DUPLICATE KEY UPDATE语句的执行方式与正常的insert语句相似。
DISTINCT子句从结果中删除重复项。 DISTINCT子句的一般语法如下 -
SELECT DISTINCT fieldsFROM table[WHERE conditions];
注 - 带有DISTINCT子句的语句的结果 -
当使用一个表达式时,它为它返回唯一的值。
当使用多个表达式时,它返回唯一的组合。
它不会忽略NULL值; 因此,结果还包含NULL作为唯一值。
使用单个表达式的DISTINCT子句查看以下语句 -
SELECT DISTINCT product_idFROM productsWHERE product_name = 'DustBlaster 5000';
使用多个表达式查看以下示例 -
SELECT DISTINCT product_name, product_idFROM productsWHERE product_id < 30
INSERT IGNORE语句指示MariaDB在发现重复记录时取消插入。 查看下面给出的使用示例 -
mysql> INSERT IGNORE INTO customer_tbl (LN, FN) VALUES( 'Lex', 'Luther');
另外,注意重复的逻辑。 某些表基于表数据的性质需要重复。 满足您在管理重复记录的策略中的需要。
接受用户输入的简单行为打开了利用的大门。 这个问题主要来自数据的逻辑管理,但幸运的是,很容易避免这些主要缺陷。
SQL注入的机会通常发生在输入诸如名称的数据的用户上,并且代码逻辑无法分析该输入。 相反,代码允许攻击者插入MariaDB语句,该语句将在数据库上运行。
始终考虑用户输入的数据,可疑的,在任何处理之前需要强大的验证。 通过模式匹配执行此验证。 例如,如果期望的输入是用户名,将输入的字符限制为字母数字字符和下划线,并且限制为一定长度。 查看下面给出的示例 -
if(check_match("/^w{8,20}$/", $_GET['user_name'], $matches)) { $result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");} else { echo "Invalid username";}
此外,在创建输入约束时使用REGEXP运算符和LIKE子句。
考虑所有类型的必要的显式控制输入,如 -
控制使用的转义字符。
控制特定的适当数据类型以进行输入。 将输入限制为必需的数据类型和大小。
控制输入数据的语法。 不要允许任何模式外的任何东西。
控制允许的条款。 黑名单SQL关键字。
你可能不知道注入攻击的危险,或者可能认为它们不重要,但它们是安全问题的列表。 此外,考虑这两个条目的效果 -
1=1-or-*
允许任何一个与正确的命令一起输入的代码可能导致揭示数据库上的所有用户数据或删除数据库上的所有数据,并且两种注入都不是特别聪明。 在某些情况下,攻击者甚至不花时间检查孔; 他们用简单的输入执行盲攻击。
另外,考虑由与MariaDB配合的任何编程/脚本语言提供的模式匹配和正则表达式工具,它们提供更多的控制,有时更好的控制。
以下资源包含有关MariaDB的其他信息。 请使用它们获得更多的深入的知识。
MariaDB - MariaDB官方网站
MariaDB Wiki - 维基百科参考MariaDB
要在本页上登记您的网站,请发送电子邮件至contact@tutorialspoint.com
MariaDB是MySQL关系数据库管理系统的一个分支。 MySQL的原始开发人员在Oracle收购MySQL后提出的关注之后创建了MariaDB。 本教程将提供MariaDB的快速介绍,并帮助您实现MariaDB编程和管理的高水平的安慰。
北京时间2017年8月11日MariaDB 10.1.26 发布了。MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可 MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行。下面W3Cschool小编就为大奖带来此次版本更新的具体内容!
Change log:
完整更新内容请查看发行公告
数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问,管理,搜索和复制其包含的数据。
数据库还使用非关系数据源,例如对象或文件。 然而,数据库证明是大数据集的最佳选择,这将遭受缓慢的检索和与其他数据源写入。
关系数据库管理系统或RDBMS将数据存储在各种表中。这些表之间的关系使用主键和外键建立。
RDBMS提供以下功能 -
它们使您能够使用表,列和索引来实现数据源。
它们确保多个表行间引用的完整性。
他们自动更新索引。
他们解释SQL查询和操作从表操作或源数据。
在我们开始讨论MariaDB之前,让我们来看一下与数据库相关的一些术语。
Database - 数据库是由保存相关数据的表组成的数据源。
Table -表,这意味着电子表格,是包含数据的矩阵。
Column - 表示数据元素的列是保存一种类型的数据的结构;例如,送货日期。
Row - 行是对相关数据进行分组的结构;例如,用于客户的数据。它也被称为元组,条目或记录。
Redundancy - 此术语指的是存储数据两次,以加速系统。
Primary Key - 这指的是唯一的标识值。此值不能在表中出现两次,并且只有一个行与其关联。
Foreign Key - 外键用作两个表之间的链接。
Compound Key -复合键,或复合键,是指多个列的关键。它指的是多列由于缺乏独特的质量一列。
Index - 索引实际上与书的索引相同。
Referential Integrity - 此术语指确保所有外键值指向现有行。
MariaDB是由MySQL的原始开发人员创建的MySQL的流行分支。 它源于与MySQL收购Oracle有关的问题。 它支持小数据处理任务和企业需求。 它旨在成为MySQL的替代,只需要简单的卸载MySQL和安装MariaDB。 MariaDB提供与MySQL等相同的功能。
MariaDB的重要特性是 -
所有MariaDB都在GPL,LGPL或BSD下。
MariaDB包括各种存储引擎,包括高性能存储引擎,用于与其他RDBMS数据源一起工作。
MariaDB使用标准和流行的查询语言。
MariaDB在多个操作系统上运行,并支持各种各样的编程语言。
MariaDB提供对PHP的支持,PHP是最流行的Web开发语言之一。
MariaDB提供Galera集群技术。
MariaDB还提供了许多在MySQL中不可用的操作和命令,并消除/取代影响性能的功能。
MariaDB的所有下载都位于官方MariaDB基金会网站的下载部分。 单击所需版本的链接,并显示多个操作系统,体系结构和安装文件类型的下载列表。
如果你熟悉Linux / Unix系统,只需下载源码来构建你的安装。 我们推荐的安装方式是使用分发包。 MariaDB提供用于以下Linux / Unix发行版的软件包 -
以下发行版在其存储库中包含MariaDB软件包 -
按照以下步骤在Ubuntu环境中安装 -
步骤1 - 以root用户身份登录。
步骤2 - 导航到包含MariaDB包的目录。
步骤3 - 使用以下代码导入GnuPG签名密钥 -
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
步骤4 - 将MariaDB添加到sources.list文件。 打开文件,并添加以下代码 -
sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'
步骤5 - 刷新系统以下 -
sudo apt-get update
步骤6 - 安装MariaDB与以下 -
sudo apt-get install mariadb-server
找到并下载自动安装文件(MSI)后,只需双击该文件即可开始安装。 安装向导将指导您完成每个安装步骤和任何必要的设置。
通过从命令提示符启动来测试安装。 导航到安装的位置(通常位于目录中),然后在提示符下键入以下内容:
mysqld.exe --console
如果安装成功,您将看到与启动相关的消息。 如果这没有出现,您可能有权限问题。 确保您的用户帐户可以访问应用程序。 图形客户端可用于在Windows环境中的MariaDB管理。 如果你发现命令行不舒服或麻烦,一定要试试他们。
执行几个简单的任务,以确认MariaDB的功能和安装。
使用管理实用程序获取服务器状态
使用mysqladmin二进制查看服务器版本。
[root@host]# mysqladmin --version
它应显示版本,分发,操作系统和体系结构。 如果您看不到该类型的输出,请检查您的安装是否存在问题。
使用客户端执行简单命令
打开MariaDB的命令提示符。 这应该连接到MariaDB并允许执行命令。 输入一个简单的命令如下 -
mysql> SHOW DATABASES;
成功安装MariaDB后,设置root密码。 全新安装将具有空白密码。 输入以下内容设置新密码 -
mysqladmin -u root password "[enter your password here]";
输入以下内容以使用新凭据连接到服务器 -
mysql -u root -pEnter password:*******
如果您已经在您的Windows系统上安装了MySQL,并且想要升级到MariaDB; 不卸载MySQL并安装MariaDB。 这将导致与现有数据库的冲突。 您必须改为安装MariaDB,然后在Windows安装文件中使用升级向导。
MySQL my.cnf文件的选项应该与MariaDB配合使用。 但是,MariaDB有许多功能,这在MySQL中找不到。
请考虑您的my.cnf文件中的以下冲突 -
MariaDB默认为临时文件使用Aria存储引擎。 如果您有很多临时文件,如果不使用MyISAM表,请修改键缓冲区大小。
如果应用程序频繁连接/断开连接,请更改线程高速缓存大小。
如果使用超过100个连接,请使用线程池。
MySQL和MariaDB本质上是相同的。 但是,有足够的差异来创建升级问题。 查看MariaDB知识库中的更多关键差异。
在本章中,我们将学习如何创建表。 在创建表之前,首先确定其名称,字段名称和字段定义。
以下是表创建的一般语法:
CREATE TABLE table_name (column_name column_type);
查看在PRODUCTS数据库中创建表所使用的命令 -
databaseproducts_ tbl( product_id INT NOT NULL AUTO_INCREMENT, product_name VARCHAR(100) NOT NULL, product_manufacturer VARCHAR(40) NOT NULL, submission_date DATE, PRIMARY KEY ( product_id ));
上述示例使用“NOT NULL”作为字段属性,以避免由空值导致的错误。 属性“AUTO_INCREMENT”指示MariaDB将下一个可用值添加到ID字段。 关键字主键将列定义为主键。 多个列以逗号分隔可以定义主键。
创建表的两个主要方法是使用命令提示符和PHP脚本。
使用CREATE TABLE命令执行任务,如下所示 -
root@host# mysql -u root -pEnter password:*******mysql> use PRODUCTS;Database changedmysql> CREATE TABLE products_tbl( -> product_id INT NOT NULL AUTO_INCREMENT, -> product_name VARCHAR(100) NOT NULL, -> product_manufacturer VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( product_id ) -> );mysql> SHOW TABLES;+------------------------+| PRODUCTS |+------------------------+| products_tbl |+------------------------+
确保所有命令都以分号结尾。
PHP为表创建提供mysql_query()。 它的第二个参数包含必要的SQL命令 -
<html> <head> <title>Create a MariaDB Table</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ){ die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = "CREATE TABLE products_tbl( ". "product_id INT NOT NULL AUTO_INCREMENT, ". "product_name VARCHAR(100) NOT NULL, ". "product_manufacturer VARCHAR(40) NOT NULL, ". "submission_date DATE, ". "PRIMARY KEY ( product_id )); "; mysql_select_db( 'PRODUCTS' ); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not create table: ' . mysql_error()); } echo "Table created successfully"; mysql_close($conn); ?> </body></html>
在成功创建表,你会看到下面的输出 -
mysql> Table created successfully
在本章中,我们将学习删除表。
表删除很容易,但记住所有删除的表是不可恢复的。 表删除的一般语法如下 -
DROP TABLE table_name ;
存在执行表删除的两个选项:使用命令提示符或PHP脚本。
在命令提示符下,只需使用DROP TABLE SQL命令 -
root@host# mysql -u root -pEnter password:*******mysql> use PRODUCTS;Database changedmysql> DROP TABLE products_tblmysql> SELECT * from products_tblERROR 1146 (42S02): Table 'products_tbl' doesn't exist
PHP提供mysql_query()用于删除表。 简单地传递它的第二个参数适当的SQL命令 -
<html> <head> <title>Create a MariaDB Table</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = "DROP TABLE products_tbl"; mysql_select_db( 'PRODUCTS' ); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not delete table: ' . mysql_error()); } echo "Table deleted successfully"; mysql_close($conn); ?> </body></html>
成功删除表后,您将看到以下输出 -
mysql> Table deleted successfully
在本章中,我们将学习如何在表中插入数据。
将数据插入表需要INSERT命令。 该命令的一般语法是INSERT,后跟表名,字段和值。
查看下面给出的一般语法 -
INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);
该语句需要对字符串值使用单引号或双引号。 语句的其他选项包括“INSERT ... SET”语句,“INSERT ... SELECT”语句和其他几个选项。
注意 - 出现在语句中的VALUES()函数仅适用于INSERT语句,如果在其他位置使用,则返回NULL。
存在两种执行操作的选项:使用命令行或使用PHP脚本。
在提示时,有许多方法来执行选择操作。 下面给出标准语句 -
belowmysql>INSERT INTO products_tbl (ID_number, Nomenclature) VALUES (12345,“Orbitron 4000”);mysql> SHOW COLUMNS FROM products_tbl;+-------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------------+-------------+------+-----+---------+-------+| ID_number | int(5) | | | | || Nomenclature| char(13) | | | | |+-------------+-------------+------+-----+---------+-------+
您可以插入多行 -
INSERT INTO products VALUES (1, “first row”), (2, “second row”);
您还可以使用SET子句 -
INSERT INTO products SELECT * FROM inventory WHERE status = 'available';
在PHP函数中使用相同的“INSERT INTO ...”语句来执行操作。 您将再次使用mysql_query()函数。
查看下面给出的示例 -
<?php if(isset($_POST['add'])) { $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } if(! get_magic_quotes_gpc() ) { $product_name = addslashes ($_POST['product_name']); $product_manufacturer = addslashes ($_POST['product_name']); } else { $product_name = $_POST['product_name']; $product_manufacturer = $_POST['product_manufacturer']; } $ship_date = $_POST['ship_date']; $sql = "INSERT INTO products_tbl ". "(product_name,product_manufacturer, ship_date) ". "VALUES"."('$product_name','$product_manufacturer','$ship_date')"; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not enter data: ' . mysql_error()); } echo "Entered data successfully"; mysql_close($conn); }?>
成功插入数据后,您将看到以下输出 -
mysql> Entered data successfully
您还将使用insert语句来合作验证语句,例如检查以确保正确的数据输入。 MariaDB包括许多选项,其中一些是自动的。
在尝试运行MariaDB之前,首先确定其当前状态,运行或关闭。 有三个选项用于启动和停止MariaDB -
如果您将MariaDB安装在非标准位置,则可能需要在脚本文件中编辑位置信息。 只需在脚本中添加“停止”参数,即可停止MariaDB。
如果您想在Linux下自动启动它,请将启动脚本添加到init系统中。 每个分发具有不同的过程。 请参阅系统文档。
使用以下代码创建新的帐户。
CREATE USER 'username' @ 'localhost' IDENTIFIED BY 'password';
username字段是你创建的用户名。localhost表示该用户只能本地登录(不能远程登录),password字段是这个用户的密码。
此代码可以在用户表中添加一个没有任何权限的用户。
您还可以选择使用哈希值作为密码
使用以下代码授予用户权限 。
GRANT SELECT, INSERT, UPDATE, DELETE ON database1 TO 'newusername'@'localhost';
其他权限包括MariaDB中可能的每个命令或操作。
授予用户权限后,执行“FLUSH PRIVILEGES”命令刷新授权表,用户才能获取权限。
完成以上操作后就可以使用创建的新的用户了。
在Unix / Linux上构建之后,应该编辑配置文件“/etc/my.conf”以显示如下 -
# Example mysql config file.# You can copy this to one of:# /etc/my.cnf to set global options,# /mysql-data-dir/my.cnf to get server specific options or# ~/my.cnf for user specific options.## One can use all long options that the program supports.# Run the program with --help to get a list of available options# This will be passed to all mysql clients[client]#password = my_password#port = 3306#socket = /tmp/mysql.sock# Here is entries for some specific programs# The following values assume you have at least 32M ram# The MySQL server[mysqld]#port = 3306#socket = /tmp/mysql.socktemp-pool# The following three entries caused mysqld 10.0.1-MariaDB (and possibly other versions) to abort...# skip-locking# set-variable = key_buffer = 16M# set-variable = thread_cache = 4loose-innodb_data_file_path = ibdata1:1000Mloose-mutex-deadlock-detectorgdb######### Fix the two following paths# Where you want to have your databasedata = /path/to/data/dir# Where you have your mysql/MariaDB source + sql/share/englishlanguage = /path/to/src/dir/sql/share/english[mysqldump]quickMariaDB8set-variable = max_allowed_packet=16M[mysql]no-auto-rehash[myisamchk]set-variable = key_buffer = 128M
编辑行"data ="和"language ="以匹配您的环境。
文件修改后,导航到源目录并执行以下操作 -
./scripts/mysql_install_db --srcdir = $PWD --datadir = /path/to/data/dir -- user = $LOGNAME
如果您将datadir添加到配置文件,请忽略“$ PWD”变量。 确保运行10.0.1版本的MariaDB时使用“$ LOGNAME”。
查看以下您将在使用MariaDB时经常使用的重要命令列表:
USE [database name] - 设置当前默认数据库。
SHOW DATABASES - 列出服务器上当前的数据库。
SHOW TABLES - 列出所有非临时表。
SHOW COLUMNS FROM [table name] - 提供与指定表有关的列信息。
SHOW INDEX FROM TABLENAME [table name] - 提供与指定表相关的表索引信息。
SHOW TABLE STATUS LIKE [table name] G - - 提供有关非临时表的信息的表,以及LIKE子句用于获取表名后显示的模式。
在本章中,我们将学习如何从表中选择数据。
SELECT语句检索所选行。 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询。
查看以下一般语法 -
SELECT field, field2,... FROM table_name, table_name2,... WHERE...
SELECT语句提供了多个选项来指定使用的表 -
database_name.table_name
table_name.column_name
database_name.table_name.column_name
所有select语句必须包含一个或多个select表达式。 选择表达式由以下选项之一组成 -
列名。
使用运算符和函数的表达式。
规范"table_name.*"以选择给定表中的所有列。
字符"*"用于从FROM子句中指定的所有表中选择所有列。
可以在执行select语句时使用命令提示符或PHP脚本。
在命令提示符下,执行如下语句:
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl+-------------+---------------+| ID_number | Nomenclature |+-------------+---------------+| 12345 | Orbitron 4000 |+-------------+---------------+
在PHP函数中使用相同的SELECT语句来执行操作。 您将再次使用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 product_id, product_name,product_manufacturer, ship_date FROM products_tbl'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date : {$row['ship_date']} <br>". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
在成功的数据检索,你会看到下面的输出 -
Product ID: 12345Nomenclature: Orbitron 4000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 12346Nomenclature: Orbitron 3000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------mysql> Fetched data successfully
最佳实践建议在每个SELECT语句之后释放游标内存。 PHP为此提供了mysql_free_result()函数。 审查其使用如下所示 -
<?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date FROM products_tbl'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_NUM)) { echo "Product ID :{$row[0]} <br> ". "Name: {$row[1]} <br> ". "Manufacturer: {$row[2]} <br> ". "Ship Date : {$row[3]} <br> ". "--------------------------------<br>"; } mysql_free_result($retval); echo "Fetched data successfully"; mysql_close($conn);?>
MariaDB与各种编程语言和框架(如PHP,C#,JavaScript,Ruby on Rails,Django等)合作良好。 PHP仍然是所有可用语言中最受欢迎的语言,因为它的简单性和历史足迹。 本指南将重点介绍与MariaDB合作的PHP。
PHP提供了使用MySQL数据库的一系列功能。 这些函数执行类似访问它或执行操作的任务,它们与MariaDB完全兼容。 只需调用这些函数,就像调用任何其他PHP函数。
您将用于MariaDB的PHP函数符合以下格式 -
mysql_function(value,value,...);
函数的第二部分指定其操作。 本指南中使用的两个功能如下 -
mysqli_connect($connect);mysqli_query($connect,"SQL statement");
以下示例演示了对MariaDB函数的PHP调用的一般语法 -
<html> <head> <title>PHP and MariaDB</title> </head> <body> <?php $retval = mysql_function(value, [value,...]); if( !$retval ) { die ( "Error: Error message here" ); } // MariaDB or PHP Statements ?> </body></html>
在下一节中,我们将使用PHP函数来检查MariaDB的基本任务。
WHERE子句过滤各种语句,如SELECT,UPDATE,DELETE和INSERT。 他们提出了用于指定行动的标准。 它们通常出现在语句中的表名后面,其条件如下。 WHERE子句本质上像一个if语句。
查看下面给出的WHERE子句的一般语法 -
[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]
请注意WHERE子句的以下特性:
它是可选的。
它允许指定任何条件。
它允许通过使用AND或OR运算符来指定多个条件。
区分大小写仅适用于使用LIKE比较的语句。
WHERE子句允许使用以下运算符 -
操作者 |
---|
= != |
> < |
>= <= |
WHERE子句可以在命令提示符或PHP脚本中使用。
在命令提示符下,只需使用标准命令 -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl WHERE product_manufacturer = 'XYZ Corp';+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 12345 | Orbitron 4000 | XYZ Corp |+-------------+----------------+----------------------+| 12346 | Orbitron 3000 | XYZ Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
使用AND条件查看示例 -
SELECT *FROM products_tblWHERE product_name = 'Bun Janshu 3000';AND product_id <= 344;
此示例组合了AND和OR条件
SELECT *FROM products_tblWHERE (product_name = 'Bun Janshu 3000' AND product_id < 344)OR (product_name = 'Bun Janshu 3000');
在使用WHERE子句的操作中应用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl WHERE product_manufacturer = "XYZ Corp"'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date: {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
产品编号:12345命名:Orbitron 4000制造商:XYZ公司交货日期:17年1月1日----------------------------------------------产品编号:12346命名:Orbitron 3000制造商:XYZ公司交货日期:17年1月2日----------------------------------------------产品编号:12347命名:Orbitron 1000制造商:XYZ公司交货日期:17年1月2日----------------------------------------------成功的mysql>读取的数据
与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件。
查看下面给出的示例。
[root@host]# mysql -u root -pEnter password:******
上面给出的代码连接到MariaDB并提供一个命令提示符来执行SQL命令。 输入代码后,将显示一条欢迎消息,指示连接成功,并显示版本号。
Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 122323232 Server version: 5.5.40-MariaDB-log Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>
该示例使用根访问权限,但任何具有权限的用户当然可以访问MariaDB提示并执行操作。
通过exit命令断开与MariaDB的连接,如下所示 -
mysql> exit
连接到MariaDB并与之断开连接的另一种方法是使用PHP脚本。 PHP提供了用于打开数据库连接的mysql_connect()函数。 它使用五个可选参数,并在成功连接后返回MariaDB链接标识符,或在失败的连接上返回false。 它还提供了用于关闭数据库连接的mysql_close()函数,它使用单个参数。
查看以下PHP连接脚本语法 -
connection mysql_connect(server,user,passwd,new_link,client_flag);
参数的描述如下 -
S.No | 参数和说明 |
---|---|
1 | server 此可选参数指定运行数据库服务器的主机名。 其默认值为“localhost:.3036”。 |
2 | user 此可选参数指定访问数据库的用户名。 其默认值是服务器的所有者。 |
3 | passwd 此可选参数指定用户的密码。 其默认值为空。 |
4 | new_link 此可选参数指定在使用相同参数的第二次调用mysql_connect()时,而不是新连接,将返回当前连接的标识符。 |
5 | client flags - 客户端的标志 此可选参数使用以下常量值的组合 -
|
请查看下面给出的PHP断开脚本语法 -
bool mysql_close ( resource $link_identifier );
如果省略资源,则最近打开的资源将关闭。 它在成功关闭时返回true,或false。
尝试下面的示例代码连接MariaDB服务器 -
<html> <head> <title>Connect to MariaDB Server</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'guest1'; $dbpass = 'guest1a'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_close($conn); ?> </body></html>
成功连接后,你会看到下面的输出 -
mysql> Connected successfully
UPDATE命令通过更改值来修改现有字段。 它使用SET子句指定要修改的列,并指定分配的新值。 这些值可以是字段的表达式或默认值。 设置默认值需要使用DEFAULT关键字。 该命令还可以使用WHERE子句来指定更新的条件和/或ORDER BY子句以特定顺序更新。
查看以下一般语法 -
UPDATE table_name SET field=new_value, field2=new_value2,...[WHERE ...]
从命令提示符或使用PHP脚本执行UPDATE命令。
在命令提示符下,只需使用标准commandroot -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> UPDATE products_tbl SET nomenclature = 'Fiber Blaster 300Z' WHERE ID_number = 112;mysql> SELECT * from products_tbl WHERE ID_number='112';+-------------+---------------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+---------------------+----------------------+| 112 | Fiber Blaster 300Z | XYZ Corp |+-------------+---------------------+----------------------+
在UPDATE命令语句中使用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 = ‘UPDATE products_tbl SET product_name = ”Fiber Blaster 300z” WHERE product_id = 112’; mysql_select_db(‘PRODUCTS’); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die(‘Could not update data: ‘ . mysql_error()); } echo “Updated data successfully”; mysql_close($conn);?>
成功数据更新后,您将看到以下输出 -
mysql> Updated data successfully
在MariaDB中创建或删除数据库需要通常只授予root用户或管理员的权限。 在这些帐户下,您有两个选项来创建数据库 - mysqladmin二进制文件和PHP脚本。
以下示例演示如何使用mysqladmin脚本创建名为Products的数据库 -
[root@host]# mysqladmin -u root -p create PRODUCTSEnter password:******
PHP在创建MariaDB数据库时使用mysql_query函数。 该函数使用两个参数,一个可选,并在成功时返回值“true”,否则返回“false”。
查看以下创建数据库脚本语法 -
bool mysql_query( sql, connection );
参数的描述如下 -
S.No | 参数和说明 |
---|---|
1 | SQL 该参数必须由所要执行操作的SQL查询组成。 |
2 | connection 未指定时,此可选参数使用最近使用的连接。 |
尝试下面的示例代码来创建数据库 -
<html> <head> <title>Create a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'CREATE DATABASE PRODUCTS'; $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not create database: ' . mysql_error()); } echo "Database PRODUCTS created successfully"; mysql_close($conn); ?> </body></html>
成功删除后,您将看到以下输出 -
mysql> Database PRODUCTS created successfully mysql> SHOW DATABASES; +-----------------------+ | Database | +-----------------------+ | PRODUCTS | +-----------------------+
DELETE命令从指定的表中删除表行,并返回已删除的数量。 访问使用ROW_COUNT()函数删除的数量。 WHERE子句指定行,如果没有行,则删除所有行。 LIMIT子句控制删除的行数。
在多行的DELETE语句中,它只删除满足条件的那些行; 并且不允许LIMIT和WHERE子句。 DELETE语句允许从不同数据库中的表中删除行,但不允许从表中删除,然后从子查询中的同一个表中进行选择。
查看以下DELETE语法 -
DELETE FROM table_name [WHERE …]
从命令提示符或使用PHP脚本执行DELETE命令。
在命令提示符下,只需使用标准命令 -
root@host# mysql –u root –p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> DELETE FROM products_tbl WHERE product_id=133;mysql> SELECT * from products_tbl WHERE ID_number='133';ERROR 1032 (HY000): Can't find record in 'products_tbl'
在DELETE命令语句中使用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 = 'DELETE FROM products_tbl WHERE product_id = 261'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not delete data: ' . mysql_error()); } echo "Deleted data successfully"; mysql_close($conn);?>
成功删除数据后,您将看到以下输出 -
mysql> Deleted data successfullymysql> SELECT * from products_tbl WHERE ID_number='261';ERROR 1032 (HY000): Can't find record in 'products_tbl'
在MariaDB中创建或删除数据库需要特权,通常仅授予root用户或管理员。 在这些帐户下,您有两个删除数据库的选项:mysqladmin二进制文件和PHP脚本。
请注意,删除的数据库是不可恢复的,因此请谨慎执行此操作。 此外,用于删除的PHP脚本不会提示您在删除之前的确认。
以下示例演示如何使用mysqladmin脚本删除现有数据库 -
[root@host]# mysqladmin -u root -p drop PRODUCTSEnter password:******mysql> DROP PRODUCTSERROR 1008 (HY000): Can't drop database 'PRODUCTS'; database doesn't exist
PHP在删除MariaDB数据库时使用mysql_query函数。 该函数使用两个参数,一个可选,并在成功时返回值“true”,否则返回“false”。
查看以下删除数据库脚本语法 -
bool mysql_query( sql, connection );
参数的说明下面给出 -
S.No | 参数和说明 |
---|---|
1 | SQL 此必需参数由执行操作所需的SQL查询组成。 |
2 | connection 未指定时,此可选参数使用最近使用的连接。 |
尝试下面的示例代码删除数据库 -
<html> <head> <title>Delete a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'root'; $dbpass = 'rootpassword'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully<br />'; $sql = 'DROP DATABASE PRODUCTS'; $retval = mysql_query( $sql, $conn ); if(! $retval ){ die('Could not delete database: ' . mysql_error()); } echo "Database PRODUCTS deleted successfully"; mysql_close($conn); ?> </body></html>
成功删除后,您将看到以下输出 -
mysql> Database PRODUCTS deleted successfully
WHERE子句提供了一种在操作使用完全匹配时检索数据的方法。 在需要具有共享特征的多个结果的情况下,LIKE子句适应宽模式匹配。
LIKE子句测试模式匹配,返回true或false。 用于比较的模式接受以下通配符:"%",其匹配字符数(0或更多); 和"_",它匹配单个字符。 "_"通配符只匹配其集合中的字符,这意味着当使用另一个集合时,它将忽略拉丁字符。 匹配在默认情况下不区分大小写,需要对大小写敏感的附加设置。
NOT LIKE子句允许测试相反的条件,非常类似于非运算符。
如果语句表达式或模式求值为NULL,则结果为NULL。
查看下面给出的一般LIKE子句语法 -
SELECT field, field2,... FROM table_name, table_name2,...WHERE field LIKE condition
在命令提示符或PHP脚本中使用LIKE子句。
在命令提示符下,只需使用标准命令 -
root@host# mysql -u root -p password;Enter password:*******mysql> use TUTORIALS;Database changedmysql> SELECT * from products_tbl WHERE product_manufacturer LIKE 'XYZ%';+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 12345 | Orbitron 4000 | XYZ Corp |+-------------+----------------+----------------------+| 12346 | Orbitron 3000 | XYZ Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
在使用LIKE子句的语句中使用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl WHERE product_manufacturer LIKE "xyz%"'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID:{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date: {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
Product ID: 12345Nomenclature: Orbitron 4000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 12346Nomenclature: Orbitron 3000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------Product ID: 12347Nomenclature: Orbitron 1000Manufacturer: XYZ CorpShip Date: 01/02/17----------------------------------------------mysql> Fetched data successfully
连接到MariaDB后,必须选择要使用的数据库,因为许多数据库可能存在。 有两种方法来执行此任务:从命令提示符或通过PHP脚本。
在命令提示符下选择数据库时,只需使用SQL命令'use'
[root@host]# mysql -u root -pEnter password:******mysql> use PRODUCTS;Database changedmysql> SELECT database(); +-------------------------+ | Database | +-------------------------+ | PRODUCTS | +-------------------------+
一旦选择了数据库,所有后续命令将在选定的数据库上操作。
注意 - 所有名称(例如,数据库,表,字段)区分大小写。 确保命令符合正确的大小写。
PHP提供了用于数据库选择的mysql_select_db函数。 该函数使用两个参数,一个可选,并在成功选择时返回值“true”,或者在失败时返回false。
查看以下select数据库脚本语法。
bool mysql_select_db( db_name, connection );
参数的说明下面给出 -
S.No | 参数和说明 |
---|---|
1 | DB_NAME 这需要参数指定要使用的数据库的名称。 |
2 | 连接 如果没有指定,此可选参数使用最近使用的连接。 |
尝试以下示例代码来选择数据库 -
<html> <head> <title>Select a MariaDB Database</title> </head> <body> <?php $dbhost = 'localhost:3036'; $dbuser = 'guest1'; $dbpass = 'guest1a'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_select_db( 'PRODUCTS' ); mysql_close($conn); ?> </body></html>
成功选择后,您将看到以下输出 -
mysql> Connected successfully
如前面讨论中提到的,ORDER BY子句对语句的结果进行排序。 它指定操作数据的顺序,并包括按升序(ASC)或降序(DESC)顺序排序的选项。 在省略订单规格时,默认顺序为升序。
ORDER BY子句出现在各种各样的语句中,例如DELETE和UPDATE。 它们总是出现在语句的结尾,而不是在子查询中或在set函数之前,因为它们在最终结果表上操作。 您也不能使用整数来标识列。
查看下面给出的ORDER BY子句的一般语法 -
SELECT field, field2,... [or column] FROM table_name, table_name2,...ORDER BY field, field2,... ASC[or DESC]
在命令提示符处或PHP脚本中使用ORDER BY子句。
在命令提示符下,只需使用标准命令 -
root@ host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT * from products_tbl ORDER BY product_manufacturer ASC+-------------+----------------+----------------------+| ID_number | Nomenclature | product_manufacturer |+-------------+----------------+----------------------+| 56789 | SuperBlast 400 | LMN Corp |+-------------+----------------+----------------------+| 67891 | Zoomzoom 5000 | QFT Corp |+-------------+----------------+----------------------+| 12347 | Orbitron 1000 | XYZ Corp |+-------------+----------------+----------------------+
在使用ORDER BY子句的语句中再次使用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 product_id, product_name, product_manufacturer, ship_date FROM products_tbl ORDER BY product_manufacturer DESC'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Product ID :{$row['product_id']} <br> ". "Name: {$row['product_name']} <br> ". "Manufacturer: {$row['product_manufacturer']} <br> ". "Ship Date : {$row['ship_date']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
Product ID: 12347Nomenclature: Orbitron 1000Manufacturer: XYZ CorpShip Date: 01/01/17----------------------------------------------Product ID: 67891Nomenclature: Zoomzoom 5000Manufacturer: QFT CorpShip Date: 01/01/17----------------------------------------------Product ID: 56789Nomenclature: SuperBlast 400Manufacturer: LMN CorpShip Date: 01/04/17----------------------------------------------mysql> Fetched data successfully
良好的字段定义对于优化数据库至关重要。 理想的方法要求您专门使用所需类型和大小的字段。 例如,如果你只使用一个字段,五个字符宽,不要定义一个字段,20个字符宽。 字段(或列)类型也称为给定存储在字段中的数据类型的数据类型。
MariaDB数据类型可以分为数字,日期和时间以及字符串值。
MariaDB支持的数字数据类型如下 -
TINYINT - 此数据类型表示落入-128到127的有符号范围内的小整数,以及0到255的无符号范围。
BOOLEAN - 此数据类型将值0与“false”相关联,值1与“true”相关联。
SMALLINT - 此数据类型表示-32768到32768的有符号范围内的整数,以及0到65535的无符号范围。
MEDIUMINT - 此数据类型表示有符号范围-8388608到8388607中的整数,无符号范围0到16777215。
INT(也为INTEGER) - 此数据类型表示正常大小的整数。当标记为unsigned时,范围跨越0到4294967295.当有符号(默认设置)时,范围跨越-2147483648到2147483647.当列设置为ZEROFILL(无符号状态)时,其所有值都由零添加INT值中的M个数字。
BIGINT - 此数据类型表示有符号范围9223372036854775808到9223372036854775807内的整数,无符号范围0到18446744073709551615。
DECIMAL(DEC,NUMERIC,FIXED) - 该数据类型表示精确的定点数,M指定其数字,D指定小数后的数字。 M值不添加“ - ”或小数点。如果D设置为0,则不会出现小数或小数部分,并且该值将舍入为最接近的DECIMAL INSERT。最大允许位数为65,小数位数的最大值为30.默认值M的默认值为10,省略时D为0。
FLOAT - 此数据类型表示值0的小的浮点数或以下范围内的数字 -
-3.402823466E + 38至-1.175494351E-38
1.175494351E-38至3.402823466E + 38
DOUBLE(也是REAL和DOUBLE PRECISION) - 此数据类型表示值0的正常大小的浮点数,或以下范围内的值 -
-1.7976931348623157E + 308至-2.2250738585072014E-308
2.2250738585072014E-308至1.7976931348623157E + 308
BIT - 此数据类型表示位字段,M指定每个值的位数。省略M时,默认值为1.位值可以通过“b'[value]'”应用,其中值表示0和1中的位值。零填充从左边自动发生全长;例如,“10”变为“0010”。
MariaDB支持的日期和时间数据类型如下 -
DATE - 此数据类型表示日期范围“1000-01-01”到“9999-12-31”,并使用“YYYY-MM-DD”日期格式。
TIME - 此数据类型表示“-838:59:59.999999”到“838:59:59.999999”的时间范围。
DATETIME - 此数据类型表示范围“1000-01-01 00:00:00.000000”至“9999-12-31 23:59:59.999999”。它使用“YYYY-MM-DD HH:MM:SS”格式 。
TIMESTAMP - 此数据类型表示“YYYY-MM-DD HH:MM:DD”格式的时间戳。 它主要用于详细描述数据库修改的时间,例如插入或更新。
YEAR - 此数据类型表示4位数格式的年份。 四位数格式允许在1901到2155和0000范围内的值。
MariaDB支持的字符串类型值如下 -
String literals - 此数据类型表示用引号括起来的字符序列。
CHAR - 此数据类型表示包含指定长度的空格的右侧带有固定长度的字符串。 M表示字符的列长度,取值范围为0〜255,缺省值为1。
VARCHAR - 此数据类型表示一个可变长度字符串,M范围(最大列长度)为0到65535。
BINARY - 此数据类型表示二进制字节字符串,M为列长度(以字节为单位)。
VARBINARY - 此数据类型表示可变长度的二进制字节字符串,M为列长度。
TINYBLOB - 此数据类型表示最大长度为255(28 - 1)个字节的blob列。在存储中,每个都使用一个字节长度的前缀,表示值中的字节数量。
BLOB - 此数据类型表示最大长度为65,535(216 - 1)个字节的blob列。在存储中,每个都使用两字节长度的前缀,表示值中的字节数量。
MEDIUMBLOB - 此数据类型表示最大长度为16,777,215(224 - 1)个字节的blob列。在存储中,每个都使用一个三字节长度前缀,表示值中的字节数量。
LONGBLOB - 此数据类型表示最大长度为4,294,967,295(232 - 1)个字节的blob列。在存储中,每个使用四字节长度的前缀,表示值中的字节数量。
TINYTEXT - 此数据类型表示最大长度为255(28 - 1)个字符的文本列。在存储中,每个都使用一个字节长度的前缀,表示值中的字节数量。
TEXT - 此数据类型表示最大长度为65,535(216 - 1)个字符的文本列。在存储中,每个都使用两字节长度的前缀,表示值中的字节数量。
MEDIUMTEXT - 此数据类型表示最大长度为16,777,215(224 - 1)个字符的文本列。在存储中,每个都使用三字节长度前缀,表示值中的字节数量。
LONGTEXT - 此数据类型表示最大长度为4,294,967,295或4GB(232 - 1)个字符的文本列。在存储中,每个使用四字节长度的前缀,表示值中的字节数量。
ENUM - 此数据类型表示一个列表中只有一个值的字符串对象。
SET - 此数据类型表示一个列表中具有零个或多个值的字符串对象,最多包含64个成员。 SET值在内部作为整数值存在。
在之前的讨论和示例中,我们检查了从单个表中检索,或从多个来源检索多个值。 大多数现实世界的数据操作要复杂得多,需要从多个表进行聚合,比较和检索。
JOIN允许将两个或多个表合并到单个对象中。 它们通过SELECT,UPDATE和DELETE语句使用。
使用JOIN查看语句的一般语法如下所示 -
SELECT columnFROM table_name1INNER JOIN table_name2ON table_name1.column = table_name2.column;
注意JOINS的旧语法使用隐式连接和没有关键字。 可以使用WHERE子句来实现联接,但关键字最适合可读性,维护和最佳实践。
JOIN有许多形式,如左连接,右连接或内连接。 各种连接类型基于共享值或特性提供不同类型的聚合。
在命令提示符或PHP脚本中使用JOIN。
在命令提示符下,只需使用标准语句 -
root@host# mysql -u root -p password;Enter password:*******mysql> use PRODUCTS;Database changedmysql> SELECT products.ID_number, products.Nomenclature, inventory.inventory_ct FROM products INNER JOIN inventory ON products.ID_numbeer = inventory.ID_number;+-------------+----------------+-----------------+| ID_number | Nomenclature | Inventory Count |+-------------+----------------+-----------------+| 12345 | Orbitron 4000 | 150 |+-------------+----------------+-----------------+| 12346 | Orbitron 3000 | 200 |+-------------+----------------+-----------------+| 12347 | Orbitron 1000 | 0 |+-------------+----------------+-----------------+
使用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.product_id, a.product_manufacturer, b.product_count FROM products_tbl a, pcount_tbl b WHERE a.product_manufacturer = b.product_manufacturer'; mysql_select_db('PRODUCTS'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not get data: ' . mysql_error()); } while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) { echo "Manufacturer:{$row['product_manufacturer']} <br> ". "Count: {$row['product_count']} <br> ". "Product ID: {$row['product_id']} <br> ". "--------------------------------<br>"; } echo "Fetched data successfully"; mysql_close($conn);?>
成功的数据检索后,您将看到以下输出 -
ID Number: 12345Nomenclature: Orbitron 4000Inventory Count: 150--------------------------------------ID Number: 12346Nomenclature: Orbitron 3000Inventory Count: 200--------------------------------------ID Number: 12347Nomenclature: Orbitron 1000Inventory Count: 0--------------------------------------mysql> Fetched data successfully
使用NULL值时,请记住它们是未知值。 它们不是空字符串或零,它们是有效值。 在表创建中,列规范允许将它们设置为接受空值,或拒绝它们。 只需使用NULL或NOT NULL子句。 这在缺少记录信息(如ID号)的情况下具有应用。
用户定义的变量的值为NULL,直到显式赋值。 存储的例程参数和局部变量允许将值设置为NULL。 当局部变量没有默认值时,它的值为NULL。
NULL不区分大小写,并具有以下别名 -
标准比较运算符不能与NULL(例如,=,>,> =,<=,<或或!=)一起使用,因为所有与NULL值的比较都返回NULL,而不是true或false。 与NULL或可能包含它的比较必须使用“<=>”(NULL-SAFE)运算符。
其他可用的运营商有 -
IS NULL - 它测试NULL值。
IS NOT NULL - 它确认不存在NULL值。
ISNULL - 在发现NULL值时返回值1,在不存在时返回0。
COALESCE - 返回列表的第一个非NULL值,或者在没有一个值的情况下返回NULL值。
在排序操作中,NULL值具有最低值,因此DESC次序在底部产生NULL值。 MariaDB允许为NULL值设置更高的值。
有两种方法可以做到这一点,如下所示 -
SELECT column1 FROM product_tbl ORDER BY ISNULL(column1), column1;
另一种方式 -
SELECT column1 FROM product_tbl ORDER BY IF(column1 IS NULL, 0, 1), column1 DESC;
当任何参数为NULL时,函数通常输出NULL。 但是,还有专门用于管理NULL值的函数。 他们是 -
IFNULL() - 如果第一个表达式不为NULL,它返回它。 当它求值为NULL时,它返回第二个表达式。
NULLIF() - 当比较的表达式相等时,它返回NULL,否则返回第一个表达式。
像SUM和AVG的函数忽略NULL值。
在声明为NOT NULL的列中插入NULL值时,会发生错误。 在默认SQL模式下,NOT NULL列将根据数据类型插入一个默认值。
当字段是TIMESTAMP,AUTO_INCREMENT或虚拟列时,MariaDB会以不同方式管理NULL值。 插入在AUTO_INCREMENT列中会导致序列中的下一个数字插入到其位置。 在TIMESTAMP字段中,MariaDB分配当前时间戳。 在虚拟列中,本教程后面讨论的主题将分配默认值。
UNIQUE索引可以包含许多NULL值,但是,主键不能为NULL。
当您使用ALTER命令修改列时,如果没有NULL规范,MariaDB会自动分配值。
数据作为业务和操作的基础,并且具有各种可能的威胁(例如,攻击者,系统故障,不良升级和维护错误),备份仍然至关重要。 这些备份采用多种形式,并且存在许多选项用于在这些过程中使用更宽泛的选项来创建它们。 要记住的重要事情是数据库类型,关键信息和所涉及的结构。 此信息确定您的最佳选择。
备份的主要选项包括逻辑备份和物理备份。 逻辑备份保存用于恢复数据的SQL语句。 物理备份包含数据副本。
与物理备份相比,逻辑备份提供了在具有不同配置的另一台机器上恢复数据的灵活性,物理备份通常限于相同的机器和数据库类型。 逻辑备份发生在数据库和表级,物理发生在目录和文件级。
物理备份的大小小于逻辑备份,并且执行和恢复所需的时间也更少。 物理备份还包括日志和配置文件,但逻辑备份不包括。
用于MariaDB备份的主要工具是mysqldump。 它提供逻辑备份和灵活性。 它也证明是小数据库的一个很好的选择。 Mysqldump将数据转储为SQL,CSV,XML和许多其他格式。 其输出不保留存储过程,视图和事件,没有显式指令。
有三个选项mysqldump备份 -
原始数据 - 通过--tab选项将表转储为原始数据文件,该选项还指定文件的目标 -
$ mysqldump -u root -p --no-create-info --tab=/tmp PRODUCTS products_tbl
数据/定义export - 此选项允许将单个或多个表导出到文件,并支持备份主机上的所有现有数据库。 检查将内容或定义导出到文件的示例
$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
传输 - 您还可以将数据库和表输出到另一个主机
$ mysqldump -u root -p database_name | mysql -h other-host.com database_name
导出数据的另一个选项使用SELECT ... INTO OUTFILE语句。 这个简单的选项输出表到一个简单的格式化文本文件 -
mysql> SELECT * FROM products_tbl -> INTO OUTFILE '/tmp/products.txt';
其属性允许将文件格式化为您首选的规范。
请注意本声明的以下质量 -
文件名必须指定输出的所需位置。
您需要MariaDB文件权限才能执行语句。
输出文件名必须是唯一的。
您需要主机上的登录凭据。
在UNIX环境中,输出文件是世界可读的,但其服务器所有权会影响您删除它的能力。 确保您有权限。
CONNECT处理程序允许导出数据。 这证明主要在SELECT ... INTO OUTFILE操作不支持文件格式的情况下有用。
查看以下示例 -
create table productsengine = CONNECT table_type = XML file_name = 'products.htm' header = yesoption_list = 'name=TABLE,coltype = HTML,attribute = border=1;cellpadding = 5'select plugin_name handler, plugin_version version, plugin_authorauthor, plugin_description description, plugin_maturity maturityfrom information_schema.plugins where plugin_type = 'STORAGE ENGINE';
备份的其他选项如下 -
XtraBackup - 此选项针对XtraDB / InnoDB数据库,并与任何存储引擎一起工作。从Percona的官方网站了解有关此工具的更多信息。
Snapshots - 某些文件系统允许快照。该过程包括使用读锁刷新表,装入快照,解锁表,复制快照,然后卸载快照。
LVM - 这种流行的方法使用Perl脚本。它在每个表上获取读取锁并将缓存刷新到磁盘。然后它获取快照并解锁表。有关详细信息,请咨询官方mylvmbackup网站。
TokuBackup - Percona提供的此解决方案提供热备份,考虑到InnoDB备份选项的问题和限制。它生成文件的事务性声音副本,而应用程序继续操作它们。有关详细信息,请咨询Percona网站。
InnoDB使用缓冲池来提高性能。在备份中,配置InnoDB以避免将整个表复制到缓冲池中,因为逻辑备份通常执行全表扫描。
除了LIKE子句提供的模式匹配之外,MariaDB通过REGEXP运算符提供基于正则表达式的匹配。 运算符基于给定模式对字符串表达式执行模式匹配。
MariaDB 10.0.5引入了PCRE Regular Expressions,这大大增加了匹配范围,如递归模式,前瞻断言等等。
查看下面给出的标准REGEXP运算符语法的使用 -
SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';
REGEXP返回1表示模式匹配,或0表示没有模式匹配。
相反的选项以NOT REGEXP的形式存在。 MariaDB还提供REGEXP和NOT REGEXP,RLIKE和NOT RLIKE的同义词,它们是出于兼容性原因而创建的。
比较的模式可以是文字字符串或其他内容,如表列。 在字符串中,它使用C转义语法,所以加倍任何“”字符。 REGEXP也是不区分大小写的,二进制字符串除外。
下面给出了可以使用的可能模式的表格 -
S.No | 图案和说明 |
---|---|
1 | ^ 它匹配字符串的开头。 |
2 | $ 它匹配字符串的结尾。 |
3 | . 它匹配单个字符。 |
4 | [...] 它匹配括号中的任何字符。 |
5 | [^ ...] 它匹配括号中未列出的任何字符。 |
6 | P1 | P2 | P3 它匹配任何模式。 |
7 | * 它匹配前面元素的0个或多个实例。 |
8 | + 它匹配前一个元素的1个或多个实例。 |
9 | {N} 它匹配前面元素的n个实例。 |
10 | {M,N} 它匹配m到前面元素的n个实例。 |
查看下面给出的模式匹配示例 -
以“pr”开头的产品 -
SELECT name FROM product_tbl WHERE name REGEXP '^pr';
以“na”结尾的产品 -
SELECT name FROM product_tbl WHERE name REGEXP 'na$';
以元音开头的产品 -
SELECT name FROM product_tbl WHERE name REGEXP '^[aeiou]';
在本章中,我们将了解各种备份加载方法。 从备份还原数据库是一个简单,有时非常长的过程。
加载数据有三个选项:LOAD DATA语句,mysqlimport和一个简单的mysqldump还原。
LOAD DATA语句用作批量加载器。 查看加载文本文件的使用示例 -
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;
请注意LOAD DATA语句的以下质量:
使用LOCAL关键字可防止MariaDB对主机执行深层搜索,并使用非常具体的路径。
语句假定一种格式,包括由换行符(换行符)终止的行和用制表符分隔的数据值。
使用FIELDS子句可以明确指定行上字段的格式。 使用LINES子句指定行尾。 查看下面的示例。
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl FIELDS TERMINATED BY '|' LINES TERMINATED BY '';
该语句假定数据文件中的列使用表的相同顺序。 如果您需要设置不同的顺序,您可以加载文件如下 -
mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl (c, b, a);
mysqlimport工具用作LOAD DATA包装器,允许从命令行进行相同的操作。
加载数据如下 -
$ mysqlimport -u root -p --local database_name source_file.txt
指定格式如下 -
$ mysqlimport -u root -p --local --fields-terminated-by="|" --lines-terminated-by="" database_name source_file.txt
使用--columns选项指定列顺序 -
$ mysqlimport -u root -p --local --columns=c,b,a database_name source_file.txt
使用mysqldump还原需要这个简单的语句将转储文件加载回主机 -
shell> mysql database_name < source_file.sql
在LOAD DATA语句中,引号和特殊字符可能无法正确解释。 语句采用不带引号的值,并将反斜线视为转义字符。 使用FIELDS子句指定格式。 指向带有“ENCLOSED BY BY”的引号,这将导致从数据值中去除引号。 使用“ESCAPED BY”更改转义。
事务是顺序组操作。 它们作为单个单元运行,并且直到组中的所有操作都成功执行时才终止。 组中的单个故障会导致整个事务失败,并导致对数据库没有影响。
事务符合ACID(原子性,一致性,隔离和耐久性) -
原子性 - 它通过中止故障和回滚更改来确保所有操作的成功。
一致性 - 它确保数据库对成功的事务应用更改。
隔离 - 它使事务的独立事务操作。
持久性 - 它确保在系统故障的情况下成功事务的持久性。
在事务语句的开头是START TRANSACTION语句,后跟COMMIT和ROLLBACK语句 -
START TRANSACTION - 开始事务。
COMMIT - 保存对数据的更改。
ROLLBACK - 结束事务,销毁任何更改。
事务成功时执行COMMIT,失败时执行ROLLBACK。
注 - 有些语句会导致隐式提交,并且在事务中使用时也会导致错误。 这样的语句的示例包括但不限于CREATE,ALTER和DROP。
MariaDB事务还包括SAVEPOINT和LOCK TABLES等选项。 SAVEPOINT设置一个恢复点以利用ROLLBACK。 LOCK TABLES允许在会话期间控制对表的访问,以防止在某些时间段内进行修改。
AUTOCOMMIT变量提供对事务的控制。 设置为1会强制所有操作都被视为成功事务,而设置为0会导致持久性更改只发生在显式COMMIT语句上。
事务语句的一般结构包括从START TRANSACTION开始。 下一步是插入一个或多个命令/操作,插入用于检查错误的语句,插入ROLLBACK语句以管理发现的任何错误,最后插入COMMIT语句以对成功的操作应用更改。
查看下面给出的示例 -
START TRANSACTION;SELECT name FROM products WHERE manufacturer = 'XYZ Corp';UPDATE spring_products SET item = name;COMMIT;
本章包含最常用功能的列表,提供定义,说明和示例。
最常用的聚合函数如下 -
S.No | 名称与描述 |
---|---|
1 | COUNT 它对记录总数进行统计。 示例 - SELECT COUNT(*)FROM customer_table; |
2 | MIN 它揭示了一组记录的最小值。 示例 - SELECT组织,MIN(帐户)FROM合同GROUP BY组织; |
3 | MAX 它揭示了一组记录的最大值。 示例 - SELECT组织,MAX(account_size)FROM合同GROUP BY组织; |
4 | AVG 它计算一组的记录的平均值。 示例 -选择AVG(account_size)FROM合同; |
5 | SUM 它计算一组记录的总和。 示例 - SELECT SUM(account_size)FROM合同; |
TIMESTAMPDIFF函数提供了一种计算年龄 -
SELECT CURDATE() AS today;SELECT ID, DOB, TIMESTAMPDIFF(YEAR,DOB,'2015-07-01') AS age FROM officer_info;
CONCAT函数在连接操作后返回结果字符串。 您可以使用一个或多个参数。 检查其语法如下 -
SELECT CONCAT(item, item,...);
查看以下示例 -
SELECT CONCAT('Ram', 'bu', 'tan');Output:Rambutan
以下是重要的日期函数 -
S.No | 名称与描述 |
---|---|
1 | CURDATE() 它以yyyy-mm-dd或yyyymmdd格式返回日期。 示例 - SELECT CURDATE(); |
2 | DATE() 它以多种格式返回日期。 示例-CREATE TABLE product_release_tbl(x DATE); |
3 | CURTIME() 它以HH:MM:SS或HHMMSS.uuuuuu格式返回时间。 示例 - SELECT CURTIME(); |
4 | DATE_SUB() 它从指定的日期增加或减少天数。 示例 - SELECT DATE_SUB('2016-02-08',INTERVAL 60 DAY); |
5 | DATEDIFF() 它确定两个日期之间的天数。 示例 - SELECT DATEDIFF('2016-01-01 23:59:59','2016-01-03'); |
6 | DATE ADD() 它增加或减去日期和时间的任何时间单位。 示例 - SELECT DATE_ADD('2016-01-04 23:59:59',INTERVAL 22 SECOND); |
7 | EXTRACT() 它从日期中提取单位。 示例 - SELECT EXTRACT(YPAR FROM'2016-01-08'); |
8 | NOW() 它以yyyy-mm-dd hh:mm:ss或yyyymmddhhmmss.uuuuuu格式返回当前日期和时间。 示例 - SELECT NOW(); |
9 | DATE FORMAT() 它根据指定的格式字符串格式化日期。 示例 - SELECT DATE_FORMAT('2016-01-09 20:20:00','%W%M%Y'); |
以下是一些重要的时间函数 -
它返回日期的秒数。S.No | 名称与描述 |
---|---|
1 | HOUR() 它返回时间的小时或已过去的小时数。 示例 - SELECT HOUR('19:17:09'); |
2 | LOCALTIME() 它的作用就像NOW()。 |
3 | MICROSECOND() 它返回时间的微秒。 示例 - SELECT MICROSECOND('16:30:00.543876'); |
4 | MINUTE() 它返回时间的分钟。 示例 - SELECT MINUTE('2016-05-22 17:22:01'); |
5 |
SECOND() 它返回日期的秒数。 示例 - SELECT SECOND('2016-03-12 16:30:04.000001'); |
6 | TIME_FORMAT() 它根据指定的格式字符串格式化时间。 示例 - SELECT TIME_FORMAT('22:02:20','%H%k%h%I%l'); |
7 | TIMESTAMP() 它为活动提供了格式为yyyy-mm-dd hh:mm:dd的时间戳。 示例 - CREATE TABLE orders_(ID INT,tmst TIMESTAMP); |
下面给出了一些重要的数字函数在MariaDB -
S.No | 名称与描述 |
---|---|
1 | TRUNCATE() 它返回一个截断的数字到小数位数指定。 示例 - SELECT TRUNCATE(101.222,1); |
2 | COS() 它返回x弧度的余弦。 示例 - SELECT COS(PI()); |
3 | CEILING() 它返回不小于x的最小整数。 示例 - SELECT CEILING(2.11); |
4 | DEGREES() 它将弧度转换为度。 示例 - SELECT DEGREES(PI()); |
5 | DIV() 它执行整数除法。 示例 - SELECT 100 DIV 4; |
6 | EXP() 它返回e的x的幂。 示例 - SELECT EXP(2); |
7 | FLOOR() 它返回不超过x的最大整数。 示例 - SELECT FLOOR(2.01); |
8 | LN() 它返回x的自然对数。 示例 - SELECT LN(3); |
9 | LOG() 它返回给定基数的自然对数或对数。 示例 - SELECT LOG(3); |
10 | SQRT() 它返回平方根。 示例 - SELECT SQRT(16); |
下面给出了重要的字符串函数 -
S.No | 名称与描述 |
---|---|
1 | INSTR() 它返回一个子串的第一个实例的位置。 示例 - SELECT INSTR('rambutan','tan'); |
2 | RIGHT() 它返回最右边的字符串字符。 示例 - SELECT RIGHT('rambutan',3); |
3 | LENGTH() 它返回字符串的字节长度。 示例 - SELECT LENGTH('rambutan'); |
4 | LOCATE() 它返回一个子串的第一个实例的位置。 示例 - SELECT LOCATE('tan','rambutan'); |
5 | INSERT() 它返回一个字符串,在某个位置有一个指定的子字符串,被修改。 示例 - SELECT INSERT('ramputan',4,1,'b'); |
6 | LEFT() 它返回最左边的字符。 示例 - SELECT LEFT('rambutan',3); |
7 | UPPER() 它将字符更改为大写。 示例 - SELECT UPPER(lastname); |
8 | LOWER() 它将字符更改为小写。 示例 - SELECT LOWER(lastname); |
9 | STRCMP() 它比较字符串,当他们相等,则返回0。 示例 -选择STRCMP('蛋','奶酪'); |
10 | REPLACE() 它在替换字符后返回一个字符串。 示例 - SELECT REPLACE('sully','l','n'); |
11 | REVERSE() 它反转字符串中的字符。 示例 - SELECT REVERSE('racecar'); |
12 | REPEAT() 它返回一个字符串,重复给定字符x次。 示例 - SELECT REPEAT('ha',10); |
13 | SUBSTRING() 它从字符串返回一个子串,从位置x开始。 示例 - SELECT SUBSTRING('rambutan',3); |
14 | TRIM() 它从字符串中删除尾随/前导字符。 示例 - SELECT TRIM(LEADING'_'FROM'_rambutan'); |
ALTER命令提供了一种方法来更改现有表的结构,这意味着删除或添加列,修改索引,更改数据类型或更改名称等修改。 ALTER还会在元数据锁定处于活动状态时等待应用更改。
ALTER与DROP配对会删除现有列。 但是,如果列是唯一的剩余列,它将失败。
查看下面给出的示例 -
mysql> ALTER TABLE products_tbl DROP version_num;
使用ALTER ... ADD语句添加列 -
mysql> ALTER TABLE products_tbl ADD discontinued CHAR(1);
使用关键字FIRST和AFTER指定列的位置 -
ALTER TABLE products_tbl ADD discontinued CHAR(1) FIRST;ALTER TABLE products_tbl ADD discontinued CHAR(1) AFTER quantity;
注意FIRST和AFTER关键字只适用于ALTER ... ADD语句。 此外,您必须删除一个表,然后添加它,以重新定位它。
使用ALTER语句中的MODIFY或CHANGE子句更改列定义或名称。 这些子句具有类似的效果,但是使用明显不同的语法。
查看下面给出的CHANGE示例 -
mysql> ALTER TABLE products_tbl CHANGE discontinued status CHAR(4);
在使用CHANGE的语句中,指定原始列,然后指定将替换它的新列。 查看下面的MODIFY示例 -
mysql> ALTER TABLE products_tbl MODIFY discontinued CHAR(4);
ALTER命令还允许更改默认值。 查看示例 -
mysql> ALTER TABLE products_tbl ALTER discontinued SET DEFAULT N;
您还可以使用它通过将其与DROP子句配对来删除默认约束 -
mysql> ALTER TABLE products_tbl ALTER discontinued DROP DEFAULT;
使用TYPE子句更改表类型 -
mysql> ALTER TABLE products_tbl TYPE = INNODB;
重命名具有RENAME关键字的表 -
mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;
索引是用于加速记录检索的工具。 索引为索引列中的每个值生成一个条目。
有四种类型的索引 -
Primary(一条记录表示所有记录)
Unique(一条记录表示多个记录)
Plain
Full-Text(允许文本搜索中的许多选项)。
术语“密钥”和“索引”在该用法中是相同的。
索引与一个或多个列关联,并支持快速搜索和高效的记录组织。 创建索引时,请考虑查询中经常使用的列。 然后在它们上创建一个或多个索引。 此外,将索引视为基本的主键表。
虽然索引加速搜索或SELECT语句,但由于对表和索引执行操作,它们使插入和更新拖动。
您可以通过CREATE TABLE ... INDEX语句或CREATE INDEX语句创建索引。 支持可读性,维护和最佳实践的最佳选项是CREATE INDEX。
查看下面给出的Index的一般语法 -
CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;
回顾一个使用的例子 -
CREATE UNIQUE INDEX top_sellers ON products_tbl product;
可以使用DROP INDEX或ALTER TABLE ... DROP删除索引。 支持可读性,维护和最佳实践的最佳选项是DROP INDEX。
查看下面给出的Drop Index的一般语法 -
DROP INDEX index_name ON table_name;
回顾一个使用的例子 -
DROP INDEX top_sellers ON product_tbl;
使用ALTER TABLE语句重命名索引。 查看下面给出的一般语法 -
ALTER TABLE table_name DROP INDEX index_name, ADD INDEX new_index_name;
回顾一个使用的例子 -
ALTER TABLE products_tbl DROP INDEX top_sellers, ADD INDEX top_2016sellers;
您将需要检查和跟踪所有索引。 使用SHOW INDEX列出与给定表相关联的所有现有索引。 您可以使用诸如“ G”之类的选项来设置显示内容的格式,该选项指定垂直格式。
查看以下示例 -
mysql > SHOW INDEX FROM products_tblG
索引被大量使用以优化查询,因为更快地访问记录以及提供的统计信息。 然而,许多用户发现索引维护麻烦。 MariaDB 10.0使存储引擎独立统计表可用,它计算每个存储引擎中每个表的数据统计信息,甚至是未编制索引的列的统计信息。
由于速度或一次性数据,一些操作可能受益于临时表。 临时表的生命期在会话终止时结束,无论是从命令提示符,PHP脚本还是通过客户端程序使用它们。 它也不以典型的方式出现在系统中。 SHOW TABLES命令不会显示包含临时表的列表。
CREATE TABLE语句中的TEMPORARY关键字生成临时表。 查看下面给出的示例 -
mysql>CREATE TEMPORARY TABLE order ( item_name VARCHAR(50) NOT NULL , price DECIMAL(7,2) NOT NULL DEFAULT 0.00 , quantity INT UNSIGNED NOT NULL DEFAULT 0);
在创建临时表时,可以使用LIKE子句克隆现有表,这意味着其所有常规特征。 用于生成临时表的CREATE TABLE语句不会作为TEMPORARY关键字的结果提交事务。
虽然临时表在会话结束时与非临时表脱离,但它们可能有一定的冲突 -
他们有时会与过期会话中的ghost临时表冲突。
它们有时与非临时表的影子名称冲突。
注意 - 临时表允许与现有非临时表具有相同的名称,因为MariaDB将其视为差异引用。
MariaDB需要向用户授予创建临时表的权限。 使用GRANT语句将此权限授予非管理员用户。
GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';
虽然临时表基本上在会话结束时删除,您可以选择删除它们。 删除临时表需要使用TEMPORARY关键字,最佳实践建议在临时表之前删除临时表。
mysql> DROP TABLE order;
某些情况下需要生成现有表的精确副本。 CREATE ... SELECT语句不能产生此输出,因为它忽略了索引和默认值。
复制表的过程如下 -
使用SHOW CREATE TABLE来生成详细描述源表的整个结构的CREATE TABLE语句。
编辑语句以给表一个新名称,并执行它。
如果还需要复制表数据,请使用INSERT INTO ... SELECT语句。
mysql> INSERT INTO inventory_copy_tbl ( product_id,product_name,product_manufacturer,ship_date) SELECT product_id,product_name,product_manufacturer,ship_date, FROM inventory_tbl;
另一种创建副本的方法使用CREATE TABLE AS语句。 该语句复制所有列,列定义,并用源表数据填充副本。
检查其语法如下 -
CREATE TABLE clone_tbl AS SELECT columns FROM original_tbl WHERE conditions];
查看其使用示例如下 -
CREATE TABLE products_copy_tbl AS SELECT * FROM products_tbl;
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。
它不允许在多个查询中使用,只能在其原始查询因为其虚拟(不写入磁盘)性质。 但是,序列表可以通过ALTER命令转换为标准表。 如果删除转换的表,序列表仍然存在。 序列也不能产生负数或以最小/最大值旋转。
使用序列需要安装序列引擎,MariaDB作为插件而不是二进制分发。 使用以下命令安装它 -
INSTALL SONAME "ha_sequence";
安装后,验证它 -
SHOW ENGINESG
请记住,在引擎安装后,您不能创建具有使用序列语法的名称的标准表,但可以创建具有序列语法名称的临时表。
有两种方法创建序列 -
创建表并使用AUTO_INCREMENT属性将列定义为自动递增。
使用现有数据库并使用序列SELECT查询来生成序列。 查询使用seq_ [FROM] _to_ [TO]或seq_ [FROM] _to_ [TO] _step_STEP语法。
最佳实践更喜欢使用第二种方法。 查看下面给出的序列创建的示例 -
SELECT * FROM seq_77_to_99;
序列有很多用途 -
在列中找到缺少的值,以防止操作中的相关问题 -
SELECT myseq.seq FROM seq_22_to_28 myseq LEFT JOIN table1 t ON myseq.seq = x.y WHERE x.y IS NULL;
构造值的组合 -
SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
查找数字的倍数 -
SELECT seq FROM seq_3_to_100_step_4;
如前面的课程所讨论的,MariaDB在某些情况下允许重复记录和表。 由于不同的数据或对象类型,或作为操作对象的唯一寿命或存储的结果,这些重复中的一些事实上不是重复的。 这些副本通常也没有问题。
在某些情况下,重复确实会导致问题,并且它们常常由于隐式动作或MariaDB命令的宽松策略而出现。 有多种方法可以控制此问题,查找重复项,删除重复项,并防止重复创建。
有四个关键方法来管理重复 -
使用JOIN关联,并用临时表删除他们。
使用INSERT ... ON DUPLICATE KEY UPDATE在发现重复时更新。
使用DISTINCT修剪SELECT语句的结果并删除重复的。
使用INSERT IGNORE停止插入重复项。
只需像内部联接那样执行半连接,然后删除使用临时表找到的重复。
当INSERT ... ON DUPLICATE KEY UPDATE发现重复的唯一或主键时,它执行更新。 发现多个唯一键时,它只更新第一个。 因此,不要在具有多个唯一索引的表上使用它。
查看以下示例,该示例显示在插入到填充字段时在包含索引值的表中发生的情况 -
INSERT INTO add_dupl VALUES (1,'Apple');ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
注意 - 如果没有找到任何键,INSERT ... ON DUPLICATE KEY UPDATE语句的执行方式与正常的insert语句相似。
DISTINCT子句从结果中删除重复项。 DISTINCT子句的一般语法如下 -
SELECT DISTINCT fieldsFROM table[WHERE conditions];
注 - 带有DISTINCT子句的语句的结果 -
当使用一个表达式时,它为它返回唯一的值。
当使用多个表达式时,它返回唯一的组合。
它不会忽略NULL值; 因此,结果还包含NULL作为唯一值。
使用单个表达式的DISTINCT子句查看以下语句 -
SELECT DISTINCT product_idFROM productsWHERE product_name = 'DustBlaster 5000';
使用多个表达式查看以下示例 -
SELECT DISTINCT product_name, product_idFROM productsWHERE product_id < 30
INSERT IGNORE语句指示MariaDB在发现重复记录时取消插入。 查看下面给出的使用示例 -
mysql> INSERT IGNORE INTO customer_tbl (LN, FN) VALUES( 'Lex', 'Luther');
另外,注意重复的逻辑。 某些表基于表数据的性质需要重复。 满足您在管理重复记录的策略中的需要。
接受用户输入的简单行为打开了利用的大门。 这个问题主要来自数据的逻辑管理,但幸运的是,很容易避免这些主要缺陷。
SQL注入的机会通常发生在输入诸如名称的数据的用户上,并且代码逻辑无法分析该输入。 相反,代码允许攻击者插入MariaDB语句,该语句将在数据库上运行。
始终考虑用户输入的数据,可疑的,在任何处理之前需要强大的验证。 通过模式匹配执行此验证。 例如,如果期望的输入是用户名,将输入的字符限制为字母数字字符和下划线,并且限制为一定长度。 查看下面给出的示例 -
if(check_match("/^w{8,20}$/", $_GET['user_name'], $matches)) { $result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");} else { echo "Invalid username";}
此外,在创建输入约束时使用REGEXP运算符和LIKE子句。
考虑所有类型的必要的显式控制输入,如 -
控制使用的转义字符。
控制特定的适当数据类型以进行输入。 将输入限制为必需的数据类型和大小。
控制输入数据的语法。 不要允许任何模式外的任何东西。
控制允许的条款。 黑名单SQL关键字。
你可能不知道注入攻击的危险,或者可能认为它们不重要,但它们是安全问题的列表。 此外,考虑这两个条目的效果 -
1=1-or-*
允许任何一个与正确的命令一起输入的代码可能导致揭示数据库上的所有用户数据或删除数据库上的所有数据,并且两种注入都不是特别聪明。 在某些情况下,攻击者甚至不花时间检查孔; 他们用简单的输入执行盲攻击。
另外,考虑由与MariaDB配合的任何编程/脚本语言提供的模式匹配和正则表达式工具,它们提供更多的控制,有时更好的控制。
以下资源包含有关MariaDB的其他信息。 请使用它们获得更多的深入的知识。
MariaDB - MariaDB官方网站
MariaDB Wiki - 维基百科参考MariaDB
要在本页上登记您的网站,请发送电子邮件至contact@tutorialspoint.com
MariaDB是MySQL关系数据库管理系统的一个分支。 MySQL的原始开发人员在Oracle收购MySQL后提出的关注之后创建了MariaDB。 本教程将提供MariaDB的快速介绍,并帮助您实现MariaDB编程和管理的高水平的安慰。
北京时间2017年8月11日MariaDB 10.1.26 发布了。MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可 MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行。下面W3Cschool小编就为大奖带来此次版本更新的具体内容!
Change log:
完整更新内容请查看发行公告