1.前言
在程序开发中,我们时常有这样的需求:存储实时产生的数据。
对于个人开发的小软件来说,一般直接将其存储到文件中即可,但对于像QQ这样的大型软件,这样做显然是不可靠的。
首先,软件读写文件等价于内存与硬盘之间存在数据交换,而硬盘的速度比内存要慢得多,这很影响读写速率、进而影响程序的执行效率。
其次,如果有多个程序都需要访问、修改同一个数据,将其保存在磁盘上进行操作的话很难控制多个读写行为,也就是保持数据的一致性,一旦一个程序先修改了数据,那么另一个程序读到的就是一个修改后的数据,这不一定是预期中的行为。
最后,直接读写文件存储数据,就意味着软件和数据全部都放在了一台机器上,一旦这台机器出了问题,不仅程序直接挂掉,甚至存储的数据都有可能损坏。
而数据库的存在,就可以解决上面一系列的问题。
一般来说,你可以将数据库看作是一个独立的程序,这个程序的唯一作用就是增删改查其内的数据。
我们所有需要对数据库的操作,都需要通过网络连接到数据库这个软件,这个软件内部会自己处理一切麻烦。
所有可以这样说,数据库就是我们程序与硬盘之间存在的一个新介质,我们只通过数据库去操作数据,数据库内部会维护缓存、事务之内的东西保证存取速率、以及数据的一致性。
并且由于我们是通过网络与数据库之间进行交互的,所以此时数据库与程序并不需要存放到一台机器上,一般是将数据库与程序分别放在内网的两台机器上进行网络数据交互。
2.SQL语句
虽然数据库种类繁多,但大部分人和公司其实主要关注的两个点是性能与价格。
而Mysql与PostgreSQL便是其中最受欢迎的两个免费、高性能数据库。
它们两者的主要区别可能就是,Mysql代表过去与现在,而PostgreSQL代表未来。
目前实际上用的最多的数据库,当下仍然是Mysql,但使用PostgreSQL数据库的人已经越来越多了。
因此,你可以随意选择这两种数据库之一进行学习:
由于数据库种类繁多,各个数据库可能都有自己操作数据库的独特语句,这会非常不方便大众迁移数据库,比如从Mysql迁移到PostgreSQL。
所以就出现了SQL语句,它是与数据库无关的标准语法,专用于数据库交互。
也就是说,只要你学习了SQL语句,无论你用什么数据库,都无所谓,它们都是保持一致的。
但要注意的是,SQL语句仅仅只是数据库语法的不完全子集,比如Mysql与PostgreSQL支持大部分SQL语句,但却也存在各自独特的语句,在有需要的时候要单独学习。
而且部分较为复杂的SQL语句并不是所有数据库都支持,在使用不同数据库的时候需要格外注意。
3.操作表
除却sqlite3这种嵌入式数据库例外,其它关系型数据库的基本sql语句都差不多。
首先是创建数据库,一般使用下面这条语句:
CREATE DATABASE database_name;
最后的database_name
要换成你自己的数据库名,注意所有sql语句都是用;
作为结尾的。
注意,我们使用的是数据库软件,我们应该将其看作是一个管理数据库集群、也就是多个数据库的东西,所以进入软件后,我们首先要做的就是创建一个数据库以便于使用。
创建完数据库后,我们还需要选择数据库进行使用。
mysql以及MariaDB使用USE database_name
进行选择。
而PostgreSQL则使用\c database_name
进行选择。
这仅限于需要自行执行sql语句的情况,如果是在我们自己的软件中连接数据库执行sql语句,并不需要选择数据库,因为在连接的时候我们就需要实现选择好要连接哪一个数据库。
有了数据库后,下一步就是往我们的数据库里面创建表了,一个数据库里面可以有很多表。
比如QQ软件的数据库,大概率就会有用户信息表、好友表、群组表、聊天记录表等等等等。
创建表的基本sql语句如下:
CREATE TABLE table_name (
column1_name column1_datatype,
column2_name column2_datatype,
...
);
举个例子,我们现在创建一个用户信息表User:
CREATE TABLE User (
id int,
name text
);
只需要填写表的名字、以及表中的字段即可。
注意字段这里分为了两个部分,前面的id、name为字段的名字,后面的int、text为字段的类型。
这只是最基本的创建表写法,不同数据库所支持的数据类型名称并不完全一致、字段属性的支持同样不完全一致。
但有一些东西是通用的。
首先是主键,当一个属性被设置为主键之后,我们后续通过主键进行索引数据就会提升极大的速度、甚至可以达到千万倍的提升。
比如mysql中创建主键的语句:
CREATE TABLE User (
id int PRIMARY KEY,
name text
);
此时id成为了主键,这意味着id将不可重复、不可为NULL,通过id查找数据的时候速度非常快!
一般主键还会携带自增属性:
CREATE TABLE User (
id int AUTO_INCREMENT PRIMARY KEY,
name text
);
此时后续我们插入数据的时候,即使不传入id字段的值,它也会自动填入、并根据上一条数据id的值进行自增。
字段默认一般是支持为NULL值的,也就是空,此时我们可以添加限制让其不可为NULL:
CREATE TABLE User (
id int AUTO_INCREMENT PRIMARY KEY,
name text NOT NULL
);
如果希望有些字段不填写的时候使用默认值,也可以这样写:
CREATE TABLE User (
id int AUTO_INCREMENT PRIMARY KEY,
name text NOT NULL,
sex int NOT NULL DEFAULT 1
);
使用DEFAULT
关键字即可。
此时在mysql中的效果如下:
注意,在mysql中--
代表注释,上面注释掉的内容为我已经执行过的历史。
创建表后,我们可以查看当前数据库中有哪些表,不同数据库的操作语句不一定相同,这里以mysql为例:
SHOW TABLES;
然后我们还可以查看表的字段结构信息,命令为:
desc table_name
效果如下:
此时我们已经创建好了表,如果需要修改已经创建好的表字段信息,那么可以使用下面系列命令:
为表添加新的字段:
ALTER TABLE table_name ADD COLUMN column_name column_definition;
例如:
ALTER TABLE user ADD COLUMN age int NOT NULL DEFAULT 0;
修改表中的字段:
ALTER TABLE table_name MODIFY COLUMN column_name new_column_definition;
例如:
ALTER TABLE user MODIFY COLUMN age int;
最后是删除表中的字段:
ALTER TABLE user DROP COLUMN age;
除了删除表字段,我们可以删除表:
DROP TABLE table_name;
例如:
DROP TABLE user;