Fork me on github

数据库的认识以及操作

数据库的由来 :
1数据只是程序运行的一部分 程序的组件不能放在一台机器上
2数据安全性
3支持并发

数据管理技术的发展历程:
1 人工管理
临时用 临时输入 不保存
2 文件系统管理
有硬盘磁盘等存储介质
3 数据系统管理
i 数据结构化
ii 数据共享,冗余度低,易扩充
iii数据独立性高
iv 数据由DBMS统一管理和控制:数据的安全性保护,完整性检查,并发控制,数据库恢复

数据管理系统的分类:
关系型数据库:sqllite,db2 oracle,access,sql server,mysql key-value
非关系型数据库:MongoDB,Redis,memcache 表结构



sql 的语句:
1:DDL语句 数据库的定义语言 create,drop alter
2:DML语句 数据库的操纵语言 insert delete update select
3:DCL语句 数据库的控制语言grant revoke

sql 的存储引擎:
innodb:支持事务,其设计目标主要面向联机事务处理(OLTP)的应用。其特点是
行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,
如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
myisam:不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是
默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储
引擎是不支持事务的。,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
memory:正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。
它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。
Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
blackhole:黑洞存储引擎,可以应用于主备复制中的分发主库。
sql 库的相关操作(data):
在终端是不分大小写的
未在分行;执行之前均可\c注销命令

系统数据库
information_schema:虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,
如用户表信息,列信息,权限信息,字符信息
mysql:授权库,主要存储系统用户的权限信息
performance_schema:主要收集数据库服务器性能参数,记录处理请求时发生的各种事件,锁等现象
test: mysql数据库系统自动创建的测试数据库

创建数据库
create database 库名;
命名规则:可以由字母、数字、下划线、@、#、$
区分大小写
唯一性,不能使用关键字 create select
不能单独使用数字
最长128位


数据库相关操作(RUD)
查找数据库:show databases; show create database 库名;
查找在哪个数据库下:select database();
选择数据库:use database 库名;
修改数据库名:在innodb引擎中比较复杂
第一种方法:在旧版本5.1.7-5.1.23中rename database olddbname to newdbname
有丢失数据的风险,所以官方不推荐
第二种方法:a:创建需要改成新名的数据库。b:mysqldum 导出改名的旧数据库。
c:确定不需要,删除旧数据库,安全但是数据量大的话会耗时间。
第三种方法:写一个脚本
'''
mysql -uroot -p123456 -e 'create database if not exists new_sakila'
list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='sakila'")

for table in $list_table
do
mysql -uroot -p123456 -e "rename table sakila.$table to new_sakila.$table"
done
'''
数据库表的相关操作(CRUD)
创建表:
create table 表名(字段1 类型[(宽度) 约束条件],字段2 类型[(宽度) 约束条件],...);

创建表的规则:
1不能使用关键字 create select
2同一张表中字段名是不能相同的
3宽度和约束条件可选,字段名和类型是必须的,宽度指的是存储是对存储数据的限制
4最后一个字段后不加逗号


字段的数据类型
整型:tinyint ,smallint,mediumint,int,bigint,有符号位
作用:存储年龄等级ID号码
create table t1(x tinyint);
insert into t1 values(128),(-129);

create table t2(x tinyint unsigned);
insert into t2 values(-1),(256);

create table t3(x int unsigned);
insert into t3 values(4294967296);

create table t4(x int(8));
insert into t4 values(4294967296123);

# 显示时,不够8位用0填充,如果超出8位则正常显示
create table t5(x int(8) unsigned zerofill);
insert into t5 values(4294967296123);

# create table t6(id int(10) unsigned);
# create table t7(id int(11));
对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,
如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

浮点型 float double decimal
作用:记录身高体重薪资
float(255,30)
double(255,30)
decimal(255,30)
字段限制:前一位表示所有的位数,后一位表示小数个数
create table t9(x float(255,30));
create table t10(x double(255,30));
create table t11(x decimal(65,30));

insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
insert into t11 values(1.111111111111111111111111111111);
精度一次上升


字符类型:char和varchar
char:存取速度快但是浪费空间,不会报错,但只会记录到该长度的字符
varchar:存取速度慢但是节省空间,超过长度会报错
create table t10(name char(4)) # 超出四个字符报错,不够四个字符空格补全
create table t11(name varchar(4)) # 超出四个字符报错,不够四个有几个就存几个

# 验证存储限制
insert into t12 values('hello');
insert into t13 values('hello');
# 验证存储长度
insert into t12 values('a'); #'a '
insert into t13 values('a'); #'a'
select * from t12
select * from t13 # 无法查看真正的结果

select char_length(name) from t12
select char_length(name) from t13 # 仍然无法查看到真正的结果

"""首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
# 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 退出客户端重新登陆
select char_length(x) from t12; #4
select char_length(y) from t13; #1

# 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格


"""
char与varchar的使用区别
"""
name char(5)
# 缺点:浪费空间
# 优点:存取速度都快
egon alex lxx jxx txx

name varchar(5)
# 缺点:存取速度慢
# 优点:节省空间
1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx



严格模式
我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,
只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,
让它仅仅只管理数据即可,这样的情况下就需要设置安全模式
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global # 全局有效

set global sql_mode ='STRICT_TRANS_TABLES'
# 修改完之后退出当前客户端重新登陆即可

时间类型:可以类比时间模块
date:2019-05-01
time:11:11:11
datetime:2019-01-01 11:11:11 (时间长度)
timestamp:2019-01-01 11:11:11 (时间戳1970-2099)
year:2019
都是用字符串来insert
都可以用 insert into 表名(时间类型) values(now())获取当前值
create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');



枚举和集合
enum多选一
set多选多
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
insert into user values(1,'jason','xxx') # 报错
insert into user values(2,'egon','female') # 正确!


create table teacher(
id int,
name char(16),
gender enum('male','female','others'),
hobby set('read','sleep','sanna','dbj')
);
insert into teacher values(1,'egon','male','read,sleep,dbj')


字段的约束条件
primary key主键,auto_increment自增
not full不为空,default默认
unique唯一,unique key
foreign 外键
unsigned无符号,zerofill零补充

not full 和default:
create table user(
id int,
name char(16)
);
insert into user values(1,null) # 可以修改

alter table user modify name char(16) not null;
insert into user(name,id) values(null,2); # 报错 插入数据可以在表名后面指定插入数据对应的字段

create table student(
id int,
name char(16) not null,
gender enum('male','female','others') default 'male'
)
insert into student(id,name) values(1,'jason') # 成功

unique:
# 单列唯一
create table user1(
id int unique,
name char(16)
);
insert into user1 values(1,'jason'),(1,'egon') # 报错
insert into user1 values(1,'jason'),(2,'egon') # 成功

# 联合唯一
create table server(
id int,
ip char(16),
port int,
unique(ip,port)
)
insert into server values(1,'127.0.0.1',8080);
insert into server values(2,'127.0.0.1',8080); # 报错
insert into server values(1,'127.0.0.1',8081);

primary key和auto_increment
# 单从约束角度来说primary key就等价于not null unique
create table t11(id int primary key);
desc t11;
insert into t11 values(1),(1); # 报错
insert into t11 values(1),(2);

# 除了约束之外,它还是innodb引擎组织数据的依据,提升查询效率
"""
强调:
1.一张表中必须有且只有一个主键,如果你没有设置主键,那么会从上到下搜索直到遇到一个非空且唯一的字段自动将其设置为主键
"""
create table t12(
id int,
name char(16),
age int not null unique,
addr char(16) not null unique
)engine=innodb;
desc t12;
"""
2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏字段作为主键,
隐藏意味着你在查询的时候无法根据这个主键字段加速查询了
索引:类似于书的目录,没有主键就相当于一页一页翻着查
3.一张表中通常都应该有一个id字段,并且通常将改id字段作成主键
"""
# 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
create table t18(
ip char(16),
port int,
primary key(ip,port)
);
desc t18;

# 主键id作为数据的编号,每次最好能自动递增
create table t13(
id int primary key auto_increment,
name char(16)
);
insert into t13('jason'),('jason'),('jason'); # id字段自动从1开始递增
# 注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

删除与清空的区别
delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;

如果要清空表,使用truncate tb1;
作用:将整张表重置,id重新从0开始记录
posted @ 2019-05-14 20:26  khan369  阅读(386)  评论(0编辑  收藏  举报