1:什么是数据库?
2:安装,链接,分类
3:mysql的架构
4:服务器,数据库,表关系
5:库操作,表操作
6:表的约束
注:centos7.5的环境
一:什么是数据库?
数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。(来源于百度百科)
二:mysql的基本使用
1:linux下安装mysql及配置
安装方法
2:链接服务器
mysql -h ip -p -port -u root -p
eg:
mysql -h 0.0.0.0 -p 8888 -u root -p
若是在本机使用,mysql -u root -p 即可
3:SQL语言的分类
DDL:定义数据库,
DML:对数据库进行增删查改
DQL:数据查找
DCL:数据库控制语句
三:mysql的架构
mysql也是采用了分层的机制,其客户端将命令传送到服务端,服务端,将其分为链接层,处理层,引擎层
1:链接层:
a:检查客户端是否合法
b:判断链接协议Tcp/ip 或 进程间通信(本机)
c:创建一个线程,每一个线程对一个客户端
2:sql层(处理层)
a:语法检查
b:语义检查,权限等
c:解析预处理,出多种方案
d:优化器,选择一个最优方案,告诉存储引擎你应该在那个地方读取数据
注:mysql还有下面两个
查找缓存,但是现在是补常用的;因为我们并不会连续访问一个数据,导致存储缓存并没有起到作用,但是每次都需要更新,这样就降低了效率。
记录日志:记录操作
3:引擎层
负责存储查找,删除。。
四:服务器,数据库,表关系
1:罗辑关系:
数据库中的存储有两个层级库和表,如何把文件系统极性类比的话,库对应的就是文件夹,表对应的就是文件。
我们可以使用 # vim /etc/my.cn 查看mysql的配置文件
然后我们看到datadir,这对应的就是库所存储的位置
[root@VM_0_11_centos mysql]# cd /var/lib/mysql/
[root@VM_0_11_centos mysql]# ls
aria_log.00000001 ibdata1 ib_logfile1 mysql.sock
aria_log_control ib_logfile0 mysql performance_schema
然后我们在另一个窗口链接数据库,查看
MariaDB [(none)]> show databases;//查看库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
MariaDB [(none)]>
我们可以发现,/var/lib/mysql/里面有三个都是表
然后我们创建一个库
MariaDB [(none)]> create database test1;//创建一个库
Query OK, 1 row affected (0.00 sec)
我们就会发现这里面多了一个test1的1库
[root@VM_0_11_centos mysql]# ls
aria_log.00000001 ibdata1 ib_logfile1 mysql.sock test1
aria_log_control ib_logfile0 mysql
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test1 |
+--------------------+
我们试一下查看表和创建
MariaDB [test1]> use mysql //进入表
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [mysql]> show tables//查看表
+---------------------------+;
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec)
MariaDB [mysql]>
2:物理关系
如上图所示,操作系统将磁盘的扇区分成了块,一个块4k大小,然后mysql将4个块组成一个页,然后64个连续的页组成一个区,若干个可不连续的区组成一个段;这样的一个段就是我们数据库中的表。
五:库操作,表操作
一:库的操作
1:库的创建
Create database db1 //创建一个db1的库,未指定字符集就默认utf8
Create database db2 charset=utf8 //创建utf8字符集的数据库
Create database db1 charset=utf8 collate utf_general_ci //创建utf8字符集的数据库,并且带有校对规则的db3数据库。
2:字符集和校验规则
Show variables like ‘character_set_database’; //查看系统默认字符集
Show variavles like ‘collation_database’; 查看系统默认校验规则
Show charset; //查看系统支持的字符集
3:校验规则对数据库的影响
Utf8_general_ci:不区分大小写
Utf8_bin:区分大小写
4:查看数据库
Show database; //查看数据库
Show create database db1; //查看创建db1的语句
5:修改数据库
对数据库的修改主要是指修改数据库的字符集,校验规则;
Alter database db1 charset=gbk; //把db1的字符集修改为gbk
6:数据库的删除
drop database db1; //删除db1
7:备份和恢复
Mysqldump -p3306 -u root -p 密码 -b 数据库名 > 数据库备份存储的文件路径 //备份库
Mysql> source D:/mysql-5.7.22/mytest.sql; //还原
Mysqldump -u root -p 数据库名 表1 表2 > ./mytest.sql //备份表
Mysqldump -u root -p -B 库1 库2 ... > 数据库存放路径 //备份多个数据库
二:表的操作:
1:创建表
Create table table_name(
Field1 datatype,
Field2 datatype,
Field2 datatype
)character set 字符集 collate 校验规则 engine 存储引擎;
2:查看表结构
Desc 表名 // 查看表结构
3:修改表
Insert into users values(1, ‘a’, ‘b’, ‘1982-01-04’),(2,’b’,’c’,’1984-01-04’); //在users里面添加两条记录
Alter table users add asserts varchar(100) comment ‘图片路径’after birthday; //在users表里添加一个字段用于表示图片保存路径
Alter table users modify name varchar(60); //修改name,将其的名字长度修改为60;
Alter table users drop password; //删除password字段
Alter users rename to employee; //把users的表名改成employee
Alter table employee change name xingming varchar(60);//将name修改为xingming
4:删除表
Drop table t1; //删除t1;
三:数据类型
1:数值类型
Bit:范围1-64,默认为1;
Tinyint:大小和char一样 (分有无符号)
Bool:使用0,1表示真假
Smallint:带符号为-2^15 -> 2 ^15-1 不带不符号为2^16-1;
Int:就是int
Bigint:就是long long
Float(m,d):m为指定长度,d为指定小数位数;占用四个字节
Double(m,d):表示比float更精确的
Delctml(m,d):一样
2:文本,二进制类型
Char(size):固定长度字符串,最大255
Varchar(size):可变长度字符串,最大长度为65535
Blob:二进制数据
Text:大文本,不支持全文索引,不支持默认值
3:时间日期
Date/datetime/timestamp:日期类型(yyyy-mm-dd),(yyyy-mm-dd hh:mm:ss) (时间戳)
4:string类型
Enum:字符串对象,其值来自表创建时在列规定中显示枚举的一列值。
Set:字符串对象
注意:可使用unsigned来说明时无符号的。
六:表的约束
真正的约束字段是数据类型,但是数据类型的约束很单一,需要一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
1:空属性
两个值:null和not null;尽量不要设置为空;空数据无法参加运算
2:默认值:某种数据会经常出现某个具体的值,可以在开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
Eg:
mysql> create table tt10 (
-> name varchar(20) not null,
-> age tinyint unsigned default 0,
-> sex char(2) default '男'
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc tt10;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name | varchar(20) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | 0 | |
| sex | char(2) | YES | | 男 | |
+-------+---------------------+------+-----+---------+-------+
mysql> insert into tt10(name) values('zhangsan');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt10;
+----------+------+------+
| name | age | sex |
+----------+------+------+
| zhangsan | 0 | 男 |
+----------+------+------+
3:列描述;使用comment添加
4:zerofill:1-》00001; 换了一种存储方式
5:主键:primary key是用来唯一的约束字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
创建表的时候直接在字段上指定主键
Eg:
mysql> create table tt13 (
-> id int unsigned primary key comment '学号不能为空',
-> name varchar(20) not null);
Query OK, 0 rows affected (0.00 sec)
mysql> desc tt13;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | | <= key 中 pri表示该字段是
主键
| name | varchar(20) | NO | | NULL | |
+-------+------------------+------+-----+---------+-------+
如果有多个字段作为主键,可以使用复合主键
mysql> create table tt14(
-> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键
-> );
也可以当表创建好之后追加主键
alter table 表名 add primary key(字段列表)
主键约束:主键对应的字段不能重复,一旦重复,操作失败。
删除主键:mysql> alter table tt13 drop primary key;
6:自增长:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作, 得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
Eg:
mysql> create table tt21(
-> id int unsigned primary key auto_increment,
-> name varchar(10) not null default ''
-> );
7:唯一键
用来防止某个不可重复字段的重复情况。可以为空
Eg:
mysql> create table student (
-> id char(10) unique comment '学号,不能重复,但可以为空',
-> name varchar(10)
-> );
8:外键
用于定义主表和从表之间的关系,外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。
语法:foreign key (字段名) references 主表(列)
Eg:
//先创建主表
MariaDB [db1]> create table myclass(
-> id int primary key,
-> name varchar(30) not null comment'班级名'
-> );
//再创建从表
create table stu(
-> id int primary key,
-> name varchar(30) not null comment '学生名',
-> class_id int,
-> foreign key (class_id) references myclass(id)
-> );
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
//插入数据
mysql> insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
//插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
mysql> insert into stu values(102, 'wangwu',30);
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails (mytest.stu, CONSTRAINT stu_ibfk_1
FOREIGN KEY (class_id) REFERENCES myclass (id))