前端时间弄了一下简单的图书管理系统,今天完善了一下,感觉还可以,就分享一下。
程序设计课给了大作业,然后我们组就选了图书数据管理,刚才是还没想很多。然后后来发觉数据,可以用上数据库,搞黑的人一定要了解数据库,抱着这个心态,我就尝试用mysql和c一起搭建这个管理系统,感觉还八错。
编译环境选的是devc
mysql版本选的是8.0
关于mysql下载安装以及和devc的配置我就暂时不说,如果需要可以留言我在补更一下。

第一步,熟悉mysql语言
mysql数据库的框架是这样
数据库包含着数据表,数据表里面就是一个大的链表,里面包含着数据,可以理解为数据库是大的结构体,里面的变量是数据表,数据表也是结构体,结构体里面的变量就是我们记录的数据。

进入mysql的命令行下
最重要的一点就是mysql每一句命令后面一定要加上;表示命令输入完毕
进入之后默认没有选择数据库

show databases;

显示当前所有的数据库

information_schema |
 | mysql |
 | performance_schema |
 | sys |


这四个是mysql默认的数据库,然后我们需要自己创建数据库

create database test1;


如果返回Query OK, 1 row affected (0.02 sec)表示创建成功
然后再查看一下数据库会发现多了一个test1

use test1;
使用这个数据库,然后会返回Database changed说明当前使用的数据库是test1,接下来就进行数据库操作了,然后创建这个表会默认是个空数据库。所以需要我们创建数据表

show tables;
显示当前所有的数据表,然后现在由于没有表,会返回Empty set (0.03 sec)

create table students;


创建一个数据表,叫students然后会报错ERROR 1113 (42000): A table must have at least 1 column因为mysql创建的数据表里面必须要有至少一个索引,不能创建没有索引的数据表。

create table students( name varchar(20),age int(11));


这是创建一个学生表,里面包含姓名和年龄,如果正确的话会返回Query OK, 0 rows affected, 1 warning (0.08 sec)

这时候在输入show tables;
返回

±----------------+
 | Tables_in_test1 |
 ±----------------+
 | students |
 ±----------------+
 1 row in set (0.00 sec)

但是这样查看有一点不好,看不到表里面有什么,所以我们需要别的命令

select * from students;
这个命令是查询当前数据表里面的所有内容并返回,然后这时却返回Empty set (0.01 sec),因为我们数据表里没有具体的数据,所以不返回,但这个命令之后很有用。

show columns from students;
 ±------±------------±-----±----±--------±------+
 | Field | Type | Null | Key | Default | Extra |
 ±------±------------±-----±----±--------±------+
 | name | varchar(20) | YES | | NULL | |
 | age | int | YES | | NULL | |
 ±------±------------±-----±----±--------±------+
 2 rows in set (0.02 sec)


这个命令是用来专门查找数据表的索引,返回的信息比较全面

接下来就是插入数据
一共有两种模式
第一种是

insert into students values(‘jack’,30);


这种操作是你明确的知道这个表里面的索引并且按照一一对应的原则数据,如果是字符的话一定要用单引号引起来,int等数字类型不需要

另一种就是

insert into students (name,age) values(‘tom’,20);


就是把你需要填写数据的变量名也明确指出,变量名不需要’'但是值需要,而且这种写法可以不用把数据表里面的所有变量名都写出来,可以只选择需要你赋值的若干变量即可,(详细的后面在讲解)

可以查看一下这时的效果
这个时候就需要我们的

select * from students;
 ±-----±-----+
 | name | age |
 ±-----±-----+
 | jack | 30 |
 | tom | 20 |
 ±-----±-----+


看是不是感觉很清爽,很舒服呢

有添加就有删除
delete from students;
这个命令是删除数据表里所有数据
单看这个命令可能感觉语法怪怪的
delete from students where age=30;
如果看到下面这个命令你应该可以理解了吧,from students的后面可以加正值表达式,用where开头,如果age=30在哪里判断为1就删除哪里的。所以这个命令也很好记

emm删除添加,还可以修改

update students set age = 30 where name = ‘john’;
 update students set name = ‘xixi’ where name = ‘john’;


使用update命令,也是可以采用正值表达式
格式就是
update 表名 set 变量名=新的值 where 变量名=旧的值
大家不用担心前后变量名冲突,mysql支持这样修改

虽然刚才的select * from 的命令不错,但是数据多了容易找不到我们需要的,mysql考虑到了这一点,也为我们提供了便利

select * from students where age=30;
 ±-----±-----+
 | name | age |
 ±-----±-----+
 | jack | 30 |
 ±-----±-----+
 1 row in set (0.00 sec)


这时候就只返回年龄为30的老师

当然有时候你可能只需要知道年龄为30的老师叫什么名字,不需要知道年龄
select name from students where age=30;
把刚才的*替换成name就可以了,就不会返回所有的索引,只返回你需要的索引

±-----+
 | name |
 ±-----+
 | jack |
 ±-----+
 1 row in set (0.00 sec)


是不是很人性化

某一天,突然你又想偷偷记录一下学生的成绩是多少,但是现在又没有这个索引,那怎么办呢?难道删除了重新弄了数据表
不,你可以直接添加索引

alter table students add grade int(3) ;

然后查询一下现在的表是什么样子

select * from students;
 ±-----±-----±------+
 | name | age | grade |
 ±-----±-----±------+
 | jack | 30 | NULL |
 | tom | 20 | NULL |
 ±-----±-----±------+
 2 rows in set (0.00 sec)


你发现现在多了一列,叫做成绩,由于之前没有赋值,所以默认为NULL

如果你需要为他们增加成绩,就可以用刚才学的修改命令

update students set grade = 30 where name = ‘jack’;

再看一下发现果然成功了,就是分有点低。。

select * from students;
 ±-----±-----±------+
 | name | age | grade |
 ±-----±-----±------+
 | jack | 30 | 30 |
 | tom | 20 | NULL |
 ±-----±-----±------+
 2 rows in set (0.00 sec)

还记得刚才卖了一个关子吗,现在来解答
mysql的索引里面有很多类型,可以结果情况来使用

比如说我们的学生管理系统,每一个学生都有一个id,从0开始一直增加,难道我们每次还需要算一算这是第几个吗,mysql很好的支持你们

下面增加一个名为id的索引

alter table students add id int(10) AUTO_INCREMENT primary key;


在之前的变量类型和长度定义之后多了一个参数AUTO_INCREMENT就是自增的意思,默认步长为1(就是每次增加1),然后primary key是主键,因为mysql要求自增变量一定是主键,所以就加上了(主键是什么我也不太清楚,感觉没啥。。。作用,对不起)

查看一下

select * from students;
 ±-----±-----±------±—+
 | name | age | grade | id |
 ±-----±-----±------±—+
 | jack | 30 | 30 | 1 |
 | tom | 20 | NULL | 2 |
 ±-----±-----±------±—+
 2 rows in set (0.00 sec)


看这个就不像之前为null,直接帮你扶赋值好了,还挺不错。

导入一个数据库文件(这些命令都是mysql内部的)

source sql文件的路径

显示数据表的详细索引信息

show index from users;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| users |          0 | PRIMARY  |            1 | id          | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.01 sec)

显示数据库中所有表的信息

SHOW TABLE STATUS  FROM library;
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name  | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| book  | InnoDB |      10 | Dynamic    |    5 |           3276 |       16384 |               0 |            0 |         0 |              6 | 2020-05-15 12:46:05 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
| users | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |             13 | 2020-05-07 07:39:26 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
2 rows in set (0.02 sec)

关于mysql自增的坑还有很多,今天先给大家带来一些关于mysql基础语法,然后之后我们就进入c语言如何关联并且使用mysql