学习笔记12——20211303

发布时间 2023-12-03 13:17:03作者: 是TC

一、学习任务

自学教材第14章,提交学习笔记(10分),评分标准如下

1. 知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容 (4分)

“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”

核心是要求GPT:“请你以苏格拉底的方式对我进行提问” 然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”

如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?” GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。

2. 问题与解决思路,遇到问题最先使用chatgpt等AI工具解决,并提供过程截图(3分)

3. 实践过程截图,代码链接(2分)

4. 其他(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(1分)

二、知识总结

14.1MySQL简介

MySQL是一个关系数据库系统,数据以表的形式存储,表由行和列组成,并与其他表关联。关系数据库系统使用SQL(结构化查询语言)进行查询和管理数据,而MySQL是一种开源数据库管理系统。MySQL在服务器和客户端组成的架构中,用户通过输入SQL命令与服务器交互,进行数据库的创建、删除、存储和检索。MySQL和PHP已成为许多数据管理和在线商务网站的主干网络。

14.2安装MySQL

Ubuntu Linux

安装命令:sudo apt-get install mysql-server

配置安全性:运行 mysql_secure_installation,按默认值设置密码等。

Slackware Linux

Slackware预装MySQL,但需要配置。

配置包括设置my.cnf、安装所需数据库、设置系统权限、使rc.mysqld可执行等步骤。

Slackware 14.2使用MariaDB

Slackware 14.2替代MySQL为MariaDB,基本相同,使用mysqld作为守护进程名。

配置步骤包括设置系统权限、使rc.mysqld可执行等。MySQL与编程语言结合

演示如何将MySQL与C编程相结合,以及如何与PHP集成,在动态Web页面中创建和管理数据库。

14.3使用MYSQL

 

14.3.1 连接到 MySQL 服务器

  1. 运行MySQL客户机程序,输入命令mysql连接到默认本地主机上的MySQL服务器。
  2. 使用命令mysql -u root -p指定root用户,并输入密码以连接到MySQL服务器。
  3. 连接成功后,会显示mysql>提示符,表示已进入MySQL shell。

14.3.2 显示数据库

  1. 使用SHOW DATABASES;命令显示当前MySQL中的数据库。
mysql>     SHOW DATABASES;
+------
|Database
+---------
information_schema
mysql
performance_schema
test
4  rows  in  set(0.01  sec)

14.3.3 新建数据库

  1. 使用CREATE DATABASE testdb;命令创建名为testdb的新数据库。
  2. 使用SHOW DATABASES;命令查看新建数据库。

14.3.4 删除数据库

  1. 使用DROP DATABASE testdb;命令删除名为testdb的数据库。
  2. 使用SHOW DATABASES;命令确认数据库已删除。

14.3.5 选择数据库

  1. 使用USE dbname;命令选择特定的数据库,例如USE cs360;

14.3.6 创建表

  1. 使用CREATE TABLE tableName (columnName columnType columnAttribute,...);命令创建表。
  2. 使用SHOW TABLES;命令查看当前数据库中的表。
  3. 使用DESCRIBE tableName;DESC tableName;命令显示表格格式和列属性。

CREATE TABLE [IF NOT EXISTS]  tableName (

columnName columnType columnAttribute,...

PRIMARY    KEY(columnName)

FOREIGN           KEY(columnNmae)REFERENCES           tableName(columnNmae)

)

mysq1>CREATE TABLE students (
student_1d INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name    CHAR(20)
score  INT);

 

14.3.7 删除表

  1. 使用DROP TABLE tableName;命令删除表。
  2. 使用SHOW TABLES;命令确认表已删除。

14.3.8 MySQL 中的数据类型

  1. 数值类型:INT、TINYINT、SMALLINT、FLOAT等。
  2. 字符串类型:CHAR(size)、VARCHAR(size)、TEXT等。
  3. 日期和时间类型:DATE、TIME等。

14.3.9 插入行

  1. 使用INSERT INTO tableName VALUES(value1, value2, ...);命令插入行。
  2. 可以使用SOURCE filename;命令执行包含多个插入命令的脚本文件。

14.3.10 删除行

  1. 使用DELETE FROM tableName WHERE condition;命令删除满足条件的行。
  2. 使用DELETE FROM tableName;命令删除表中所有行。

14.3.11 更新表

    1. 使用UPDATE tableName SET col1=value1, col2=value2, ... WHERE condition;命令更新表中的记录。
    2. 使用SELECT * FROM tableName;命令查看更新后的表

 

14.3.12 修改表

  • 使用ALTER TABLE命令修改表,可添加、删除或修改表中的列,并添加或删除约束条件。
    1. 修改表名:ALTER TABLE table_name RENAME TO new_name;
    2. 添加列:ALTER TABLE table_name ADD column_name datatype;
    3. 删除列:ALTER TABLE table_name DROP column_name datatype;
    4. 修改列数据类型:ALTER TABLE table_name ALTER COLUMN column_name datatype;
-- 添加名为grade的列 ALTER TABLE students ADD grade CHAR(2);
-- 更新grade列的值 UPDATE students SET grade = 'A' WHERE name = 'Walton';

 

-- 通过UPDATE命令分配字母等级 UPDATE students SET grade = 'A' WHERE name = 'Walton';
-- 使用WHERE条件根据分数范围分配字母等级 UPDATE students SET grade = 'A' WHERE score > 80;

 

-- 使用分数范围更新字母等级 UPDATE students SET grade = 'B' WHERE score >= 70 AND score < 80;
UPDATE students SET grade = 'C' WHERE score >= 60 AND score < 70; UPDATE students SET grade = 'D' WHERE score < 60;

14.3.13 关联表

  • 使用主键-外键约束条件定义表关系,包括一对一、一对多、多对多关系。
-- 创建关联表email CREATE TABLE email ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT UNIQUE NOT NULL, email CHAR(40), FOREIGN KEY(student_id) REFERENCES students(student_id) );
-- 插入学生电子邮箱地址 INSERT INTO email VALUES (NULL, 2002, 'walton@wsu.edu');
-- 查询关联表内容 SELECT a.name, b.email FROM students a, email b WHERE a.student_id = b.student_id;

14.3.14 连接操作

  • 使用连接操作在多个表中检索数据,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和OUTER JOIN。
-- INNER JOIN SELECT * FROM students JOIN email ON students.student_id = email.student_id;
-- LEFT JOIN SELECT * FROM students LEFT JOIN book_order ON students.student_id = book_order.student_id;
-- RIGHT JOIN SELECT * FROM students RIGHT JOIN book_order ON students.student_id = book_order.student_id;

14.3.15 MySQL数据库关系图

  • 使用实体关系图(ERD)或增强/扩展ERD描述表之间的关系,箭头表示连接外键与主键。

14.3.16 MySQL脚本

  • 使用MySQL脚本文件执行数据库操作,可以通过SOURCE命令或批处理模式运行。
-- 创建名为do.sql的脚本文件,包含数据库和表的创建、插入和更新操作
-- 在MySQL中执行脚本文件 mysql> source do.sql; mysql> source do.sql;
# 或者使用批处理模式:mysql -u root -p < do.sql

14.4  C 语言 MySQL 编程

14.4.1  使用C语言构建MySQL客户机程序

思考以下C 程序,它可以打印 libmysqlclient 库版本。

//client.c   file
#include <stdio.h>
#include <my_global.h>
#include <mysql.h>
int main(int argc,char *argc[])
{
printf("MySQL   client   version   is:8s\n",mysql_get_client_info());
}

若要编译程序,可输入

gcc    client.c-I/usr/include/mysql/-1mysqlclient

注意, -I 选项将包含文件路径指定为/ustr/include/mysql,-1选项指定mysqlclient 库。 然后,运行 a.out。它会打印MySQt client version is :version_number, e.g.5.5.53

14.4.2  使 C 语言连接到 MySQL  服务器

下面的C程序 C14.2 显示如何连接到 MySQL 服务器。

//c14.2.c file:connect to MySQL server
#include <stdio.h>
#include <stdlib.h>
#include <my_global.h>
#include <mysql.h>
int main(int argc,char  *argv[])
{
//1.define   a   connection   object
MYSQL     con;
//2.Initialize the connection object
if(   mysql_init(&con))(//return    object    address    printf("Connection   handle
initialized\n");                                                                                                              
)else{
printf("Connection handle initialization failed\n");
exit(1);
}
//3.Connect to MySQL server on localhost
if  (mysql_real_connect(&con,"localhost","root","root_password",
"cs360",3306,NULL,0)){
printf("Connection to remote MySQL server OK\n");
}
else  {
printf("Connection to remote MySQL failed\n")
exit(1);
}



//4.Close  the  connection  when  done
mysql_close(&con);
)

该项目包含4个步骤。

( 1 ) 将MYSQL对象 con定义为连接句柄。它的作用类似于网络编程中的套接字。几乎 所有的 MySQLCAPI 函数都需要这个对象指针作为参数。

(2)调用mysql_init(&con)来初始化 con 对象,这是规定操作。它会返回初始化对象的 地址。大多数其他 MySQLAPI函数会返回0,表示成功,返回非0,表示错误。如果出现错 误,函数

unsigned  int mysql_errno( &con) 返回错误编号。

constant        char         *mysql_error(          &co n)    返回描述错误的字符串。

(3)调用mysql_real_connect(),  以连接到远程服务器。

它可以用于连接到互联网上的任何MySQL服务器,前提是用户可以访问该MySQL服务 器。为简单起见,我们假设MySQL客户机和服务器位于同一台本地主机上。连接到服务器 之后,客户机程序就可以开始访问数据库了,下面将显示数据库。

(4)客户机程序要在退出之前关闭连接。

14.4.3  使用C语言构建MySQL数据库

本节将介绍如何在C语言程序中创建MySQL数据库。

//C14.1.c:build MySQL database in C
#include  <stdio.h>
#include   <stdlib.h>
#include <my_global.h>
#include <mysql.h>


MYSQL     *coni
void error()


//connection  object  pointer

{
printf("errno     =8d      8s\n",mysql_errno(con),mysql_error(con));
mysql_close(con);
exit(1);
}
int  main(int  arge,char  *argv[])


con =mysql_init(NULL);//will allocate and initialize it
if(con                 ==NULL)
error();
printf("connect to mySQL  server on localhost using database cs360\n");
if(mysql_real_connect(con,"localhost","root",NULL,
"cs360",0,NULL,0)==NULL)
error();
printf("connection  to   server  OK\n");
printf("drop   students   table   if   exists\n");
if(mysql_query(con,"DROP TABLE IF EXISTS students"))
error();
printf("create   students   tables   in   cs360\n");
if(mysql_query(con,"CREATE TABLE students(IdINT NOT NULL
PRIMARY       KEY        AUTO_INCREMENT,name        CHAR(20)NOT        NULL,Score       INT)"))
error();
printf("insert   student    records   into   students   table\n");
if(mysql_query(con,"INSERT INTO students VALUES(1001,'Baker',50)"))
error();
if(mysql_query(con,"INSERT INTO students VALUES(1002,'Miller’,65)"))
error();
if(mysql_query(con,"INSERT INTO students VALUES(2001,'Miller',75)"))
error();
if(mysql_query(con,"INSERT INTO students VALUES(2002,'Smith',85)"))
error();
printf("all done\n");
mysql_close(con);
}

连接到MySQL服务器后,程序使用mysql_query()函数对数据库进行操作。mysqL_   queryO 函数的第二个参数与普通MySQL 命令完全相同。它可以用于简单的 MySQL 命令, 但如果参数包含二进制值或null 字节,则不能用于命令。要执行可能包含二进制数据的命 令,程序必须使用mysql_real_query() 函数,如下一个程序所示。

//C14.2 Program:build MySQL database with mysql_real_query()
#include  <stdio.h>
#include   <stdlib.h>
#include  <string.h>
#include <my_global.h>
#include <mysql.h>
 ]akeiller",th","on",";
int        score[]=          {  65,     50,     75,     95,      85):
MYSQL      *coni
void error()
(  printf("errno=8d 8s\n",mysql_errno(con),mysql_error(con));
ose(con)
}
int  main(int  argc,char   *argv[])



(
int   i;
r=b4_]iit(NULL);SLceaoe it con
if(con              ==NULL)
error();
printf("connect to mySQl server on localhost using database cs360\n"); if(mysql_real_connect(con,"localhost","root",NULL,
"cs360",0,NULL,0)==NULL)
error();
printf("connected to server OK\n");
printf("drop  students  table  if  exists\n");
if(mysql_query(con,"DROP TABLE IF EXISTS students"))
error();
printf("create  students  tables  in  cs360\n");
if(mysql_query(con,"CREATE TABLE students(IdINT NOT NULL PRIMARY KEY        AUTO_INCREMENT,name        CHAR(20)NOT        NULL,score        INT)"))
error();
printf("insert student records into students table\n");
for(i=0;i<N;i++){
printf("id=%8d  name=810s,score=84d\n",id[i],name[i],score[i]);
sprintf(buf,"INSERT INTO students VALUES(%d,1%s',%d);",
id[i],name[i],score[i]);
1E(mysql_real_query(con,buf,strlen(buf)))
error();
}
printf("all    done\n");
mysql_close(con);
}

14.4.4  使C语言检索MySQL查询结果

MySQL查询会返回结果,例如 SELECT,DESCRIBE等。结果是一组列和行。MySQ L CAPI 提供了两种从 MySQL服务器获取结果集的方法 一次性获取所有行或逐行获取。函数 mysql_store_result() 用于一次性从 MySQL服务器获取一组行并将其存储在本地内 存中。它的用法是

MYSQLRES            *mysql_store_result(MYSQL             *mysql);

函数mysql_use_result() 用于启动逐行结果集检索。

MYSQL_RES         *mysql_use_regult(MYSQL          *mysq1);

每次使用返回结果的 MySQL 语句调用 mysql_query()或 mysql_real_query)之后,可调 用其中一个函数来检索结果集。这两个函数都会返回用MYSQL_RES  类型的对象表示的结 果集。其他 API 函数使用返回的结果集对象来获取列和行集。当不再需要结果集时,使用 mysql_free_result()函数来释放结果对象资源。

 

三、苏格拉底问答

 

 

 

 四、实验代码