数据库学习 2

73 阅读6分钟

数据库的备份

在我们删除一个数据库的时候,往往要像做航天的工程一样,小心谨慎!!! 在我们不是完全确定,或者这个数据库暂时不用时。一定要备份数据库!

  数据库备份指令:mysqldump -u root -p -B 数据库1 数据库2 …… 数据库n > 保存路径.sql
      例如:mysql -u root -p -B db02 db03 > d:\\aak.sql 

这里我就是把db02、db03 两个数据库备份到aak.sql 文件中。

注意事项

1、一定要在dos系统下面以管理员身份执行该命令 2、不要登录mysql , 要在dos系统下面执行。 3、SQLyog 是不行的 ,一定要管理员身份

虽然三条建议看起来是一条,但是实测避坑!!!晕头转向,十几分钟。

如果你数据库很大 , 只想备份一个数据库中的几张表的话,你可以使用
mysql -u root -p -B 数据库 表名1 表名2 > 文件路径.sql;
例如:mysql -u root -p -B db01 users > akk.sql;


数据库的恢复

又是一个晕头转向的晚上终于搞出来了! 我也不知道为啥一次性保存一个数据库,或者保存一个数据库里面的一张表才能恢复成功, 有大佬看到了,麻烦指点一下哈。
插个眼


  恢复数据库指令:source 文件路径.sql;
      例如:source d:\\akk.sql;

请注意:要在mysql命令行下面才能使用哦。即使用DOS系统登录MySQL , 然后使用该命令。
但是好像只能恢复备份一个数据库的sql文件,或者保存一个数据库里面的一张表才能恢复成功。


其实备份的sql文件中存的就是数据和sql语句,所以你可以直接把文件中的语句放在mysql命令行中执行 然后就能恢复数据了,但是我个人觉得一句话可以解决的事情,还是不要复制这么多东西


创建表

基本语法
create table table_name(
field1 datatype
field2 datatype
field3 datatype
)character set 字符集 collate 校对规则 engine 存储引擎


field:指定列名
datatype:指定列类型(字段类型)
character:如不指定则为所在数据库字符集
collate:如不指定则为所在数据库校对规则
engine:引擎

例如:
CREATE TABLE t1(
id INT ,
name VARCHAR(250),
password VARCHAR(250),
birthday DATE )
CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;

要是关键字与数据库表名,字段名冲突了可以使用 ,这个小点点给它,包起来。这种符号就是在Esc 下面 , tab上面的那个符号 。这个可要一定记住了,不然你会怀疑人生为什么一直都是错的!!!

数据库常用的数据类型(列类型)

image.png

因为涉及到的数据类型非常多,所以我不会一一介绍,但是重点使用的会好好的说一下。这个图,因为确实小,标红的是用的比较多的。

整形

首先我们创建表

  CREATE TABLE t2(		# 创建 一张表 
     
     id TINYINT UNSIGNED  # 去掉unsigned 就是有符号的数
     
   )CHARACTER SET utf8 COLLATE utf8_bin;
   
   INSERT INTO t3 VALUES(200); 	# 添加语句插入一组数据
   
   
    # 去掉unsigned 就是那么对于TINYINT 来说就是 -128 --- 127 
    

当然,这跟我们C语言里面学的很像。其他数据类型的范围,也是通过所占字节算出来的。

二进制 bit

我们其实很少用bit , 虽然但是还是不知道二级制数据要用在哪里。但是确实用的少,了解即可。

    #创建一个表
    # bit 范围 1-64 bit , 就是说最大有8个字节, 也就是64bit 。

    CREATE TABLE t3( num  BIT(64));		// 这里面的64是多少比特位的意思

    INSERT INTO t2 VALUES(10);5改变v天机87他人4

    # 数据显示的二进制
    SELECT * FROM t2                  # 查询此表t2
    

image.png

小数(浮点数)

主要的三个类型就是 FLOAT / DOUBLE [UNSIGNED] / DECIMAL[M,D][UNSIGNED]
可以支持更加精确的小数位。M是该数总的位数,D是小数点(标度)后面的尾数。 如果D是0,则值没有小数点或分数部分。 M 最大65 , D 最大是30 。如果D被省略 ,默认是0 。如果M被省略 ,默认是10。

#创建表

CREATE TABLE t06(
        num1 FLOAT,	# 只能存放小数点后4位
        num2 DOUBLE,	# 存放小数点后14位
        num3 DECIMAL(30,20)	# (M , D)  M 是指总共的位数,
                                小数点前+小数点后的位数。 D精确到小数点后多少位
);

# 添加数据
INSERT INTO t06 VALUES(88.123456789123456 , 88.12345678912345 , 88.12345678912345);

SELECT* FROM t06

image.png

如果是需要处理高精度的整数或者是处理高精度的浮点数(浮点数),建议使用DECIMAL。

字符串

CHAR(size) 固定长度 , 最大就是255字符 。

varchar(size) 0 -- 65535 字节 ,但是varchar 需要1-3个字节记录字符串所占[字节]的大小。

varchar 是可变长度字符串,最大的是65535字节 ,如果是utf8编码 , 实际可以存储21844个字符。是可以可用字节不是65535!!! 实际存放字符需要看,字符编码!

# char( 4 ) 和 varchar( 4 ) 这个4 表示的是字符 , 而不是字节
CREATE TABLE t5(
     `name` CHAR(4) );

INSERT INTO t5 VALUES('xyws');

# INSERT INTO t5 VALUES('xywss'); 这样是不行的 ,因为已经规定是存放4 个字符。



# 创建一个表

CREATE TABLE t6(
        `name` VARCHAR(4)
);

INSERT INTO t6 VALUES('xyws');
# INSERT INTO t6 VALUES('xywss'); 这不行的 , 因为 varchar ,已经规定是存4个字符了。

SELECT * FROM t6

这个char 是很容易造成空间浪费的,就比如你规定4个字符,但实际上你只放3个字符,但是还是会用4个字符的空间,因为它是固定。但是我们varchar 就是比较灵活,假设你规定开辟4个字符,它会根据实际情况选择开辟,假如你放了3个字符,那么它就只开辟3个字符的空间。但是varchar本身是需要1-3个字节来记录存放内容长度。

如果是确定的大小,我们可以选择char 。比如我们的身份证号码,手机号等等……,这样查询速度会更快。 但如果是长度不确定那么,建议你使用varchar 。如果varchar还不够的话建议使用TEXT ,MEDIUM TEXT ,LONGTEXT 。他们都是按字节算的范围!

日期

日期数据类型:DATE 年月日
             TIME 时分秒
             DATETIME 年月日 时分秒
             TIMESTAMP  时间戳

CREATE TABLE t7(
birthday DATE ,
job_time DATETIME ,
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
# NOT NULL DEFAULT CURRENT_TIMESTAMP
# ON UPDATE CURRENT_TIMESTAMP
# 这段指令就说 , 不能为空 , 默认的话就是目前时间 .
   
       

小练习

创建一个表
image.png

CREATE TABLE emp(
id INT ,
`name` VARCHAR(64) ,
sex CHAR(1) , 
brithday  DATE , 
entry_date DATETIME , 
job VARCHAR(20) , 
salary  FLOAT , 
`resume` TEXT(500)) CHARSET utf8 COLLATE utf8_bin ;


SELECT * FROM emp;


INSERT INTO emp 
	VALUES(100 , '小妖怪' , '男'  , '2022-10-22' , '2022-10-22 11:11:11' , '
	巡山的' , 3000 , '大王叫我来巡山');

这就是创建一个表 , 字段还蛮多的。 INSERT INTO table_name VAULES("filed_1 , filed_2 , …… filedn"); 是插入VALUES , 也就是添加一个信息。