MySOL基础

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))

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值