Linux学习系列(十八):MySQL数据库

数据库

1.mysql

mysql 端口号:3306

service mysql stop

service mysql start

service mysql status

我们是客户端,然后链接服务器,才能对数据库进行操作

在这里插入图片描述

mysql操作
  • 数据库登录和推出
//mysql -u用户名 -h主机地址(省略代表本机) -p密码
{
    mysql -uroot -p
}
    
//数据库退出
{
    exit
    quit
    ctrl+d
}
  • c语言对数据库操作
#include <mysql/mysql.h>//连接数据库使用的头文件和库文件

MYSQL *mysql_init(MYSQL *mysql);//初始化连接句柄
//该方法用来初始化一个连接句柄,如果参数为空,则返回一个指向新分配的连接句柄的指针。如果传递一个已有的结构,它将被重新初始化。出错时返回为NULL。

//连接数据库
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,const char *user, const char *passwd,
							const char *db, unsigned int port,
							const char *unix_socket,
							unsigned long clientflag);
/*参数介绍,其中
mysql是上一步mysql_init方法初始化后返回的指针,
host是主机名,或者连接的服务器IP地址,本地可以使用"localhost",或"127.0.0.1"或"",或
NULL
user是用户名,数据库中添加的用户,管理员是"root",
passwd 是用户的密码,
db 是数据库的名字,
port 是数据库的端口 3306,也可直接写0,意味着使用mysql默认端口,
unix_socket 一般为NULL,表示不使用unix套接字或者管道
clientflag 标志位,一般给0
返回值,失败为NULL,成功与第一个参数值相同。*/

//关闭连接
void mysql_close(MYSQL *mysql);

//执行sql语句
int mysql_query(MYSQL *mysql, const char *q);
/*参数: mysql 是之前连接后返回的指针,
q 是要执行的sql语句,末尾可以没有分号,这个在命令工具中使用不同。
返回值:成功返回0。
注意:如果sql语句中有二进制数据,则应该使用mysql_real_query();*/

//提取结果
MYSQL_RES *mysql_store_result(MYSQL *mysql); 一次性提取所有数据
//MYSQL_RES *mysql_use_result(MYSQL *mysql);一次提取一行数据
/*该方法,是在执行 mysql_query()成功之后调用的,可以立刻保存在客户端中收到的所有数据。它返回一个
指向结果集结构的指针。如果失败返回NULL;*/
    
//获取结果集中有多少行
uint64_t mysql_num_rows(MYSQL_RES *res);
/*只有执行了 mysql_store_result()之后,才可以调用该方法,获取结果集中的行数。如果没有返回行,则
为0;*/

//取出结果集中的一行记录
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*从结果集中取出一行,并把它存放到一个行结构中。当数据用完或者出错时,返回为NULL,通常该方法需要循
环调用。*/

//查看记录行的列数
unsigned int mysql_field_count(MYSQL *mysql);

//释放结果集占用的内存
void mysql_free_result(MYSQL_RES *result);
//执行完sql语句,得到返回的结果集,处理完数据后,需要调用该方法释放存放结果集的内存空间。

//获取错误信息
unsigned int mysql_errno(MYSQL *mysql); //返回错误码
const char *mysql_error(MYSQL *mysql); //返回错误信息描述
sql语言
show databases;

create database "db_name";
select database();//查看 当前使用的是哪个数据库
select user();//查看登录的是哪个用户

use "db_name";//使用该库
drop database "db_name";//删除该库

show tables;
create table "tb_name"(num int auto_increment,id char(10) primary key not null unique,name varchar(30) not null);
insert into "tb_name" values(0,"2021033056","李嘉昌");//0代表按默认自增长,字符"" / ''都可
desc "tb_name";//查看表结构
update "tb_name" set name="小李" where id="2021033056";
delete from name="小李" where id="2021033056";
drop table "tb_name";
alter table 表名 add 列名 类型;//修改表--添加字段
alter table 表名 change 原字段名 新字段名 类型及约束;//修改字段-- 重新命名
alter table 表名 modify 列名 类型及约束;//修改字段-- 不改名字
alter table 表名 drop 列名;//修改表--删除字段

select * from tb_name where ... ;
select 列1, 列2... from 表名;
select 表名.字段 ... from 表名;
select 字段 as 名字 ... from 表名;
select 别名.字段 .... from 表名 as 别名;
select distinct addr from student ;//distinct 修饰后面的字段

> >= < <= !=   and or not   in   not in
    
like %替换多个 _替换一个
select name from student where name like "小%";

空判断: is null
判非空: is not null
    
//order by 字段 , 默认是升序 从小到大 asc, 需要降序从大到小 ,加上 desc 可以对多个字段进行判断
//#查询年龄在18 到24之间的学生,按照年龄从小到大,身高从高到低排序
select * from student where (age between 18 and 34 ) order by age asc, height desc;

//count() 总数, max() 最大值, min() 最小值, sum()求和, avg() 平均值, round()四舍五入
//查询男生有多少人
select count(*) as man_count from student where gender='男';//没有as则无列名

//group by 分组
#计算男生和女生的人数
select gender, count(*) from student group by gender having (count(*) >= 2);
//having 在分组后进行筛选,相当于where

//内连接查询
select T.TNo, TC.TN, TC.CNo
from T,TC
where (T.TNo = TC.TNo) and (TC.TN='刘伟');

//自连接查询
select x.TNo, y.TN, y.CNo
from T as x inner join TC as y
where 
    
//子查询 多条select嵌套

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 约束

    主键 primary key : 物理上存储的顺序

    非空 not null : 此字段不允许填写空值

    唯一unique: 此字段的值不允许重复

    默认default: 当不填写此值时,会使用默认值。如果填写时,以填写的值为准

    外键foreign key : 对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则写成功,如果不存在则写失败。 虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加,修改,删除,查询)时,都会降低数据库的性能。

    auto_increment 表示自动增长

2.用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("mysql init err\n");
        exit(1);
    }

    mysql = mysql_real_connect(mysql,"127.0.0.1","root","111111","stu",3306,NULL,0);
    if(mysql == NULL)
    {
        printf("connect err\n");
        exit(1);
    }

    printf("连接成功\n");

    //char* sql = "insert into student values(1005,'小花',18)";
    char* sql = "select * from student";

    if(mysql_query(mysql,sql) != 0)//执行语句
    {
        printf("query sql err\n");
        exit(1);
    }

    MYSQL_RES *r = mysql_store_result(mysql);//获取结果集

    int row = mysql_num_rows(r);//获取行数,在结果集里

    int col = mysql_field_count(mysql);//获取列数,在链接句柄里(或者说是在连接的数据库里),因为列是固定的

    for(int i=0;i<row;i++)
    {
        MYSQL_ROW res = mysql_fetch_row(r);//获取一行一行的,类似与光标之类的
        for(int j=0;j<col;j++)
        {
            printf("%s ",res[j]);//获取当前行,然后打印对应的列,每一列都是字符串
        }
        printf("\n");
    }
    mysql_free_result(r);//释放结果集占用的内存
    mysql_close(mysql);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lijiachang030718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值