信息安全系统设计与实现:第十四章学习笔记
信息安全系统设计与实现:第十四章学习笔记
20191331 lyx
教材学习内容总结
第十四章 MySQL数据库系统
学习目标
通过本章的学习,了解MySQL数据库系统的重要性。通过学习MySQL的命令和处理模式,使用SQL脚本管理数据库。并通过MySQL与C编程结合进行实践。
什么是MySQL
MySQL ( MySQL 2018)是一个关系数据库系统(Codd 1970)。在关系数据库中,数据存储在表中。每个表由多个行和列组成。表中的数据相互关联。表也可能与其他表有关联。关系结构使得可在表上运行查询来检索信息并修改数据库中的数据。关系数据库系统的标准查询语言是SQL(结构化查询语言),包括MySQL。
MySQL是一个开源数据库管理系统,由服务器和客户机组成。在将客户机连接到服务器后,用户可向服务器输入SQL命令,以便创建数据库,删除数据库,存储、组织和检索数据库中的数据。
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的 SQL 语言是用于访问数据库的最常用标准化语言。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
数据库类型和区别
关系型数据库指的是使用关系模型(二维表格模型)来组织数据的数据库。
关系型数据库的优势:
-
采用二维表结构非常贴近正常开发逻辑(关系型数据模型相对层次型数据模型和网状型数据模型等其他模型来说更容易理解);
-
支持通用的SQL(结构化查询语言)语句;
-
丰富的完整性大大减少了数据冗余和数据不一致的问题。并且全部由表结构组成,文件格式一致;
-
可以用SQL句子多个表之间做非常繁杂的查询;
-
关系型数据库提供对事务的支持,能保证系统中事务的正确执行,同时提供事务的恢复、回滚、并发控制和死锁问题的解决。
-
数据存储在磁盘中,安全可靠。
关系型数据库存在的不足:
-
高并发读写能力差:网站类用户的并发性访问非常高,而一台数据库的最大连接数有限,且硬盘 I/O 有限,不能满足很多人同时连接。
-
海量数据情况下读写效率低:对大数据量的表进行读写操作时,需要等待较长的时间等待响应。
-
可扩展性不足:不像web server和app server那样简单的添加硬件和服务节点来拓展性能和负荷工作能力。
-
数据模型灵活度低:关系型数据库的数据模型定义严格,无法快速容纳新的数据类型(需要提前知道需要存储什么样类型的数据)。
非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL。通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定,常用于存储非结构化的数据。
非关系型数据库的优势:
-
非关系型数据库存储数据的格式可以是 key-value 形式、文档形式、图片形式等。使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
-
速度快,效率高。 NoSQL 可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘。
-
海量数据的维护和处理非常轻松,成本低。
-
非关系型数据库具有扩展简单、高并发、高稳定性、成本低廉的优势。
-
可以实现数据的分布式处理。
非关系型数据库存在的不足:
-
非关系型数据库暂时不提供 SQL 支持,学习和使用成本较高。
-
非关系数据库没有事务处理,无法保证数据的完整性和安全性。适合处理海量数据,但是不一定安全。
-
功能没有关系型数据库完善。
-
复杂表关联查询不容易实现。
安装MySQL
实践环境:OpenEuler 20.03 LTS
ubuntu linux
sudo apt-get install mysql-server
OpenEuler
yum install mysql
MySQL初始化成功
使用MySQL
- 连接到MySQL服务器
mysql -u root -p #specify the root user with password
Enter password:
mysql>
连接到MySQL服务器后,即可访问MySQL shell。然后他只接受MySQL命令或MySQL脚本,而不接受普通sh命令。在输入命令时,要注意以下几点
所有的MySQL命令行末尾必须是分号。对于长命令,可在单独行中输入命令短语(按下ENTER键)。
MySQL命令行不区分大小写。但为了清楚和更容易识别,通常使用大写编写MySQL命令,使用小写编写数据库、表、用户名或文本。
- 显示数据库
SHOW DATABASES
命令可显示MySQL中的当前数据库
- 新建数据库
CREATE DATABASE mydb
#创建一个名为mydb的数据库
- 删除数据库
DROP DATABASE mydb
#删除已存在的命名数据库
- 选择数据库
USE dbname
选择一个数据库
- 创建表
CREATE TABLE table_name
命令回在当前数据库中创建一个表
例
DESCRIBE
命令显示表格式和列属性。
- 删除表
DROP TABLE table_name
#删除表
- 数据结构
- 插入行
INSERT INTO table_name VLAUES()
- 删除行
DELETE FROM table_name; #dellte all rows of a table
DELETE FROM table_name WHERE condition; #delete row by condition
- 更新表
UPDATE table_name SET coll=value1,col2=value2…WHERE condition
-
关联表
- 一对一(1-1)关系
- 一对多(1-M)关系
- 多对多关系(M-M)关系
- 自引用关系
C语言简单编程之SQL数据库实践
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASSWD "toor"
#define DB_NAME "db"
#define TABLE_NAME "students"
/*
* 测试的数据表结构很简单, number, grade, sex, score 四个字段, 代表学号、年级、性别、分数
*/
/* 连接mysql */
void mysqldb_connect(MYSQL *mysql)
{
if(!mysql_real_connect(mysql, MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD, DB_NAME, 0, NULL, 0)) {
printf("\nFailed to connect:%s\n", mysql_error(mysql));
} else {
printf("\nConnect sucessfully!\n");
}
}
/* 插入数据 */
void mysqldb_insert(MYSQL *mysql, int number, int grade, char *sex, int score)
{
int t;
char *head = "INSERT INTO ";
char query[120];
char field[48] = "number, grade, sex, score";
char *left = "(";
char *right = ") ";
char *values = "VALUES";
char message[100] = {0};
sprintf(message, "%d, %d, \"%s\", %d", number, grade, sex, score);
/* 拼接sql命令 */
sprintf(query, "%s%s%s%s%s%s%s%s%s", head, TABLE_NAME, left, field, right, values, left, message, right);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
}
else {
printf("\nInsert sucessfully!\n");
}
}
/* 删除数据 */
void mysqldb_delete(MYSQL *mysql, char *field_name, int number)
{
int t;
char *head = "DELETE FROM ";
char query[120];
sprintf(query, "%s%s where %s =%d", head, TABLE_NAME, field_name, number);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("\nFailed to query: %s\n", mysql_error(mysql));
} else {
printf("\nDelete data sucessfully!\n");
}
}
/* 更新数据 */
void mysqldb_update(MYSQL *mysql, char *field_name, int score)
{
int t;
char *head = "UPDATE ";
char query[100];
sprintf(query, "%s%s SET %s=%d", head, TABLE_NAME, field_name, score);
printf("%s\n", query);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to update: %s\n", mysql_error(mysql));
return;
}
printf("\nUpdate data sucessfully!\n");
}
/* 查询数据 */
void mysqldb_query(MYSQL *mysql)
{
int t;
char *head = "SELECT * FROM ";
char query[50] = {0};
MYSQL_RES *res;
MYSQL_ROW row;
sprintf(query, "%s%s", head, TABLE_NAME);
t = mysql_real_query(mysql, query, strlen(query));
if (t) {
printf("Failed to query: %s\n", mysql_error(mysql));
return;
} else {
printf("\nQuery successfully!\n");
}
res = mysql_store_result(mysql);
while (row = mysql_fetch_row(res)) {
for(t = 0; t < mysql_num_fields(res); t++) {
printf("%s\t", row[t]);
}
printf("\n");
}
mysql_free_result(res);
}
/* 断开mysql连接 */
void close_connection(MYSQL *mysql)
{
mysql_close(mysql);
}
int main(int argc, char *argv[])
{
// 准备一组数据
int number = 1;
int grade = 1;
char sex[] = "male";
int score = 100;
// 初始化mysql
MYSQL *mysql = mysql_init(NULL);
if (!mysql) {
printf("\nMysql init failed.\n");
}
// 连接MYSQL
mysqldb_connect(mysql);
// 插入数据
mysqldb_insert(mysql, number, grade, sex, score);
// 更新数据
mysqldb_update(mysql, "score", 99);
// 查询数据
mysqldb_query(mysql);
// 删除数据
mysqldb_delete(mysql, "number", number);
// 断开连接
close_connection(mysql);
return 0;
}
php数据库操作示例
连接数据库
error_reporting(0);
$dbhost = 'localhost'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
die('数据库连接失败');
}
echo '数据库连接成功';
创建数据库
$sql = 'CREATE DATABASE RUNOOB';
$retval = mysqli_query($conn,$sql );
if(! $retval )
{
die('数据库创建失败');
}
echo "数据库创建成功";
创建数据表
$sql = "CREATE TABLE runoob_tbl( ".
"runoob_id INT NOT NULL AUTO_INCREMENT, ".
"runoob_title VARCHAR(100) NOT NULL, ".
"runoob_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( runoob_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('创建数据表失败');
}
echo "创建数据表成功";
插入数据
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$runoob_title = '学习 Python';
$runoob_author = 'RUNOOB.COM';
$submission_date = '2016-03-06';
$sql = "INSERT INTO runoob_tbl ".
"(runoob_title,runoob_author, submission_date) ".
"VALUES ".
"('$runoob_title','$runoob_author','$submission_date')";
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('插入数据失败');
}
echo "数据插入成功";
查询数据
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = 'SELECT runoob_id, runoob_title,
runoob_author, submission_date
FROM runoob_tbl';
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据');
}
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC))
{
echo "{$row['runoob_id']} ".
"{$row['runoob_title']} ".
"{$row['runoob_author']} ".
"{$row['submission_date']} ".
}
参考资料
关系型数据库和非关系型数据库: https://cloud.tencent.com/developer/article/1784274
OpenEuler Mysql配置:https://bbs.huaweicloud.com/forum/thread-141883-1-1.html