数据库
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);
}