2 数据库基础
2.1 什么是数据库
-
本质上,数据库就是一个文件,而且不仅仅是一个普通的文件,他有自己规范的增删查改方式,逻辑,以实现更方便的增删查改,同时,区别于
excel,数据库还为程序员提供了接口,这样程序员就可以实现全自动化地增删查改了 -
放在网络中看,数据库同时还是一个
C/S网络服务,也是方便厂商管理用户数据,比方说用户在自己的设备上做了某些操作,自动执行了某个指令,然后通过网络,服务器中的某个服务接收了这个指令,然后修改了企业服务器中数据库的某个内容
2.2 数据库的基础操作
- 显示数据库列表(创建完的库会放进一个列表里,这个表称为
database表)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
/var/lib/mysql表示数据库的默认存储目录,此时如果我们新开一个会话,切到该目录下
root@iZwz9b2bj2gor4d8h3rlx0Z:/var/lib/mysql# ll -al
total 91612
drwx------ 7 mysql mysql 4096 Apr 20 19:17 ./
drwxr-xr-x 53 root root 4096 Apr 20 18:41 ../
-rw-r----- 1 mysql mysql 56 Apr 20 18:41 auto.cnf
-rw-r----- 1 mysql mysql 180 Apr 20 18:41 binlog.000001
-rw-r----- 1 mysql mysql 404 Apr 20 18:41 binlog.000002
-rw-r----- 1 mysql mysql 614 Apr 21 19:06 binlog.000003
-rw-r----- 1 mysql mysql 48 Apr 20 18:41 binlog.index
-rw------- 1 mysql mysql 1705 Apr 20 18:41 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 client-cert.pem
-rw------- 1 mysql mysql 1705 Apr 20 18:41 client-key.pem
-rw-r--r-- 1 root root 0 Apr 20 18:41 debian-5.7.flag
-rw-r----- 1 mysql mysql 196608 Apr 21 19:08 '#ib_16384_0.dblwr'
-rw-r----- 1 mysql mysql 8585216 Apr 20 18:41 '#ib_16384_1.dblwr'
-rw-r----- 1 mysql mysql 3439 Apr 20 18:41 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Apr 21 19:06 ibdata1
-rw-r----- 1 mysql mysql 12582912 Apr 20 18:42 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 '#innodb_redo'/
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 '#innodb_temp'/
-rw-r----- 1 mysql mysql 8 Apr 20 18:41 iZwz9b2bj2gor4d8h3rlx0Z.pid
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 mysql/
-rw-r----- 1 mysql mysql 26214400 Apr 21 19:06 mysql.ibd
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 performance_schema/
-rw------- 1 mysql mysql 1705 Apr 20 18:41 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Apr 20 18:41 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 server-cert.pem
-rw------- 1 mysql mysql 1705 Apr 20 18:41 server-key.pem
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 sys/
-rw-r----- 1 mysql mysql 16777216 Apr 21 19:08 undo_001
-rw-r----- 1 mysql mysql 16777216 Apr 20 18:44 undo_002
-
不难发现,
database列表的一部分内容也在这个目录里,并且,这个数据库貌似就是一个目录而已 -
是的,其实如果我们新建一个数据库,
mysqld会帮我们自动新建一个目录,并且放一些基础的文件 -
使用以下命令新建数据库
mysql> create database hello;
Query OK, 1 row affected (0.01 sec)
- 此时再查看
database列表和存储目录
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| hello |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
root@iZwz9b2bj2gor4d8h3rlx0Z:/var/lib/mysql# ll -al
total 91616
drwx------ 8 mysql mysql 4096 Apr 21 23:55 ./
drwxr-xr-x 53 root root 4096 Apr 20 18:41 ../
-rw-r----- 1 mysql mysql 56 Apr 20 18:41 auto.cnf
-rw-r----- 1 mysql mysql 180 Apr 20 18:41 binlog.000001
-rw-r----- 1 mysql mysql 404 Apr 20 18:41 binlog.000002
-rw-r----- 1 mysql mysql 802 Apr 21 23:55 binlog.000003
-rw-r----- 1 mysql mysql 48 Apr 20 18:41 binlog.index
-rw------- 1 mysql mysql 1705 Apr 20 18:41 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 client-cert.pem
-rw------- 1 mysql mysql 1705 Apr 20 18:41 client-key.pem
-rw-r--r-- 1 root root 0 Apr 20 18:41 debian-5.7.flag
drwxr-x--- 2 mysql mysql 4096 Apr 21 23:55 hello/
-rw-r----- 1 mysql mysql 196608 Apr 21 23:55 '#ib_16384_0.dblwr'
-rw-r----- 1 mysql mysql 8585216 Apr 20 18:41 '#ib_16384_1.dblwr'
-rw-r----- 1 mysql mysql 3439 Apr 20 18:41 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Apr 21 23:55 ibdata1
-rw-r----- 1 mysql mysql 12582912 Apr 20 18:42 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 '#innodb_redo'/
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 '#innodb_temp'/
-rw-r----- 1 mysql mysql 8 Apr 20 18:41 iZwz9b2bj2gor4d8h3rlx0Z.pid
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 mysql/
-rw-r----- 1 mysql mysql 26214400 Apr 21 23:55 mysql.ibd
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 performance_schema/
-rw------- 1 mysql mysql 1705 Apr 20 18:41 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Apr 20 18:41 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 20 18:41 server-cert.pem
-rw------- 1 mysql mysql 1705 Apr 20 18:41 server-key.pem
drwxr-x--- 2 mysql mysql 4096 Apr 20 18:41 sys/
-rw-r----- 1 mysql mysql 16777216 Apr 21 19:08 undo_001
-rw-r----- 1 mysql mysql 16777216 Apr 21 23:55 undo_002
-
你能发现这里多了个
hello的目录 -
使用数据库操作(和Excel操作类似,我们要使用页面上的某个或者某几个格子,需要先选中,这里就是选择上该数据库)
use hello;
- 创建数据库表(注意,这里是创建表而不是创建数据库),有点相像是结构体的写法,其实吧,这本质上就是类似于
excel中写一个表头
create table hero( name varchar(64), gender varchar(64) );
- 数据库的插入操作
mysql> insert into hero (name, gender) values ('guzhangjiqiren', 'wuzhuangzhishengji');
Query OK, 1 row affected (0.01 sec)
mysql> insert into hero (name, gender) values ('chujun', 'cixiaogui');
Query OK, 1 row affected (0.00 sec)
- 其实就类似于在
excel中这样做
- 数据库的查询操作(从
student表中全部查询)
mysql> select * from hero;
+----------------+--------------------+
| name | gender |
+----------------+--------------------+
| guzhangjiqiren | wuzhuangzhishengji |
| chujun | cixiaogui |
+----------------+--------------------+
2 rows in set (0.00 sec)
- 注意事项:
- 一条可执行语句的结尾的标志是
; - 和C语言类似,行的末尾不一定得有
;,如果没打;输入了回车,mysql会等待你继续输入内容,直到你输入了;
- 一条可执行语句的结尾的标志是
2.4 服务器,数据库,表 之间的关系
- 本质上,所谓数据库服务器的核心,即在于数据库的服务端,类似于
mysqld,每个mysqld下可能维护了不止一个数据库(虽然绝大部分场景下,单个库就已经够用了),每个库也不仅仅只有一个表,我们在软件上的不同页面获取的数据,有可能来自于不同的表
2.5 mysql的架构
- 这里我们主要谈论的是服务端的架构
2.5.1 client端
- 在用户角度,访问数据库的途径主要有三种
- 通过命令行访问数据库: 即我们现在使用的Linux的
mysql,就只能通过命令行式的访问 - 通过GUI界面访问数据库: 例如微软家的
sql_server,就允许用户在图形化界面下访问 - 通过其他语言连接服务来访问数据库: 例如C++,C,python,都可以通过连接服务访问
- 通过命令行访问数据库: 即我们现在使用的Linux的
2.5.2 服务端
- 连接池: 主要用于检测用户身份和权限,以及安全性检测等,还可以将用户信息维护到连接池中,方便用户下次访问
- 服务层: 主要进行词法语法分析,对语句进行优化和缓存等
- 存储引擎层: 有点类似于不同数据结构的思想,即对于不同的数据,选择一个合适的存储方式很重要,不同数据对于增删查改效率,存储空间大小等等有不同的需求,所以对于不同的数据,就可以选择不同的存储引擎,以不同方式访问文件系统层的数据
- 文件系统层: 就是操作系统的文件系统层,存储引擎会沟通文件系统层,来进行增删查改
- 所以本质上,
mysql就是在操作系统的文件系统上做文章,帮我们更好地管理数据
2.5.3 存储引擎
-
存储引擎是支持热插拔的,即我可以选择不要某个引擎,临时更改某个库使用的存储引擎,像插拔U盘一样方便
-
存储引擎有点类似于驱动程序,即类似于操作系统中的
device_struct,也是被一个结构体维护起来 -
不同的数据库程序对于存储引擎的支持可能不太一样,但常用的存储引擎其实就两个,即
InnoDB和MyISAM,一般都支持的
2.5.4 查看mysql支持的存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
2.6 SQL的分类
- DDL(Data Definition Languages): 数据定义语言,即对于表的大体框架的增删查改,这些语句一般会修改表的结构,同时也伴随着修改表的内容,类似于定义链表中的节点,或者说规定该表的表头,例如我们刚刚接触过的
create,drop,alter - DML(Data Manipulation Language): 数据操纵语句,即修改表的具体内容,这些语句一般无法直接更改表的结构,只能修改其内容,相对于DDL来说,DML能修改更为细致的内容,例如对于某行某列的针对性修改,类似于修改链表节点的具体的值,例如
insert,delete,update,select(select语句包含在DQL(数据查询语言),DQL又属于DML) - DCL(Data Control Language): 数据控制语句,用于控制数据的访问权限和访问级别,例如
grant,revoke,commit