linux-mysql
1.安装软件mysql-->apt install mysql-server要是失败了先使用命令apt update。安装完成后使用命令查看是否安装成功service mysql status-->显示数据库信息 service mysql stop-->停止数据库 service mysql start-->开始数据库 service mysql restzrt-->重启数据库
2.mysql是c/s(服务器/客户端)结构,有个服务器端和多个客户端,服务器与客户端连接是tcp连接,其中mysql的端口是3306,上述命令安装的是服务器端。
3.\c可以退出mysql中的语句
4.mysql 清屏 ctrl+l
5.c语言连接数据库(见数据库的资料)以下为连接的测试:(具体参数见资料)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<mysql/mysql.h>
int main()
{
MYSQL mysql_con;//定义mysql的连接句柄
MYSQL * mysql=mysql_init(&mysql_con);//初始化连接句柄
if(mysql==NULL)
{
printf("init err\n");
exit(1);
}
mysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","day1",3306,NULL,0);//连接数据库,这里的mysql与函数里面的mysql和上面初始化的Mysql是一个
if(mysql==NULL)
{
printf("连接失败\n");
exit(1);
}
printf("连接成功\n");
char*sql="insert into Student values(31051224,'田',20)";//添加数据 执行sql语句
if(mysql_query(mysql,sql)!=0)//将sql语句添加到mysql中
{
printf("query err\n");
}
mysql_close(mysql);//关闭连接句柄
exit(0);
}
6.c语言连接数据库后进行增删查改操作(具体参数看资料)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
//创建连接句柄,并初始化
MYSQL mysql_con;
MYSQL* mysql = mysql_init(&mysql_con);
if ( mysql == NULL )
{
printf("init err\n");
exit(1);
}
//连接数据库服务器
mysql = mysql_real_connect(mysql,"127.0.0.1","root","111111","day1",3306,NULL,0);
if( mysql == NULL )
{
printf("连接失败\n");
exit(1);
}
printf("连接成功\n");
//char*sql="insert into Student values(31051286,'王',22)";//插入
//char *sql="update Student set age=66 where id=31051223";//修改
//char *sql="delete from Student where id=31051223";//删除
//char*sql="select * from Student";//查询
char*sql="select name from Student where id=31051266";//查询
//执行sql语句
int n = mysql_query(mysql,sql);
if( n != 0 )
{
printf("执行sql语句失败\n");
exit(1);
}
printf("执行sql语句成功\n");
//-------------------------------查询
//获取结果集-->查询
MYSQL_RES *r = mysql_store_result(mysql);
if ( r == NULL )
{
printf("获取结果集失败\n");
}
//获取结果集有多少条记录-->查询
int num = mysql_num_rows(r);
if ( num == 0 )
{
printf("没有记录\n");
mysql_free_result(r);
exit(1);
}
//打印有多少记录(行)-->查询
printf("共查到%d条记录\n",num);
//获取结果集有多少列-->查询
int count = mysql_field_count(mysql);
//打印有多少列-->查询
printf("每条记录有%d列\n",count);
//循环打印记录
for(int i = 0; i < num; i++ )//行
{
//提取一行记录
MYSQL_ROW row = mysql_fetch_row(r);
//第一列 row[0], 第二列 row[1]-->拿到的是字符串
for(int j = 0; j < count; j++ )//列
{
printf("%s ",row[j]);
}
printf("\n");
}
//释放结果集
mysql_free_result(r);
//-------------------------------
//关闭连接句柄
mysql_close(mysql);
exit(0);
}
7.mysql-->事务(sql语句的集合,这些操作要么都执行,要么都不执行)(一条语句就是一个事物,要执行多条事物语句用begin开始,见资料):例子:转账的例子
事务的四大特性(ACID):
原子性:原子性是指事务中的所有操作要么全部完成,要么全部不完成。事务是一个不可分割的最小单位,不能部分执行。
一致性:一致性是指事务执行前后,数据库的状态必须保持一致。事务必须将数据库从一个合法的状态转换到另一个合法的状态。如果事务违反了数据库的完整性约束(如主键约束、外键约束等),则事务会被撤销。-->举例:假设一个订单表要求订单金额必须大于 0。如果一个事务试图插入一个金额为负的订单,那么这个事务会被拒绝,以保持数据库的一致性。
隔离性:隔离性是指多个事务并发执行时,每个事务都应独立于其他事务,就好像它们是顺序执行的一样。隔离性确保了事务之间的操作不会相互干扰。举例: 假设两个事务同时对同一个账户进行操作:事务 1:从账户 A 减去 100 元。事务 2:从账户 A 减去 200 元。如果没有隔离性,可能会出现以下情况:事务 1 读取账户 A 的金额为 1000 元。事务 2 读取账户 A 的金额为 1000 元。事务 1 减去 100 元,账户 A 的金额变为 900 元。事务 2 减去 200 元,账户 A 的金额变为 800 元。但实际上,账户 A 的金额应该为 700 元。隔离性确保了事务之间的操作不会相互干扰,避免了这种错误。
持久性:指一旦事务提交,其对数据库的更改将永久生效,即使系统发生故障也不会丢失。
隔离级别 :
READ UNCOMMITTED 未提交读
READ COMMITTED 提交读
REPEATABLE READ 可重复读 (默认):多次查询的结果一致:幻读
SERIALIZABLE 可串行化(一个一个搞,不能同时进行)
8.视图(有3个问题,见资料)
9.索引(见资料)能不能给每一列都加上索引:不太好,因为索引底层是B+树,当每次插入数据时,都要修改数据从而改变索引B+树,很耗时间。
10.mysql底层实现: