数据库37天

数据库

总览

day1 介绍数据库\安装\基础的命令
day2 数据库的表操作
day3 数据库的数据操作,查询(单表\多表)
day4 查询和其他内容的拾遗
day5 索引原理和python操作mysql

软件就是让频繁的人做的事情,交给机器去做了 ------- Eva-j

day1

背景

数据库在开发的过程中占据着什么样的位置?
	我们把数据存储在文件里
		#写 write
		#读 read
		#改 读->写->删->改
		
	能够更加简单的 使用 存储在文件中的数据		
	查 一行数据 从userinfo 条件 id = 10 或者 id =1  找500000 得找500000行,文件的太费时,从前往后,

在整个项目中又有什么意义?
	数据库: 能够更加简单的 使用 存储在文件中的数据
    能够更好的解决并发问题
    	第一个相对论:即使client  依赖数据库    又是server  提供用户
    数据的统一问题

数据

1,alex,alex3714 # 一行内容就是一条数据
2,python,19800,6 months # 一条数据

数据库 DataBase DB

存储数据的地方,我们把所有的数据都存储在一个固定的地方,那么这个地方就是数据库

数据库管理系统 DBMS

负责管理数据仓库中存储的所有文件中的内容
能够更好(简单 高效 安全)的帮助我们完成数据的增删改查

数据库服务器

​ 什么是服务器 : 本质就是一台计算机
​ 当一台计算机上安装了某个软件能够对外提供服务的时候,那么这台机器就成为服务器
​ 数据库服务器
​ 当这台机器上安装的服务是一个数据库的server端的时候,我们就得到了一台数据库服务器

数据库管理员 DBA

​ 专门帮助我们管理数据库 并且优化数据库的工作人员

mysql就是一个DBMS(能够管理硬盘上数据文件的一个软件)

​ 通过一些固定的简单的指令 帮助我们完成从文件中查找对应数据的软件
​ oracle 也是一个DBMS

查 name,id 从 userinfo 条件 age = 83
查 number 从 userinfo 条件 name='wusir'

数据库管理系统的作用:
关系型数据库

​ id name age phone_num 知道一个id(任何一个) 可以找到age(其他) 知道age 找到id name

​ mysql \ oracle\ sql server \ sqlite (学会一个其他的差不多)

非关系型数据库

​ key -value

​ 通过一个找其他所有 而不能通过别的找别的(查找速度非常快)快递订单

​ redis(进程之间的通信 数据库非常火的一个) \ mongodb (之后做的 智能机器人的库)

mysql 开源的软件 - 小公司 各种互联网公司(二次开发之后的mysql)
oracle 付费的 - 金融行业 国企事业单位
sql server 在学校里教学使用的

如果关系非常关联用关系型。 如果不关联,都可以非关系型的

mysql 安装
先配置my.ini    里面的每行没有空格 设置安装目录
加环境变量
安装目录在\bin 文件里
cmd 管理员运行  安装目录\bin\mysqld install    
net start mysql 启动mysql         找不到dir文件,用360修复一下
mysql -uroot -p          
enter pw :        回车   之后进入mysql 就对了 
show variables like '%charac%';   value 都是utf8就对了
mysql卸载
D:\mysql\mysql-5.6.43-winx64\mysqld remove  移出服务
把mysql整个文件都删掉\环境变量也删掉 
重启电脑

环境变量

当我们执行一个系统中的可执行文件的时候
例如 mysql.exe或者 mysqld.exe或者python.exe
如果我们不配环境变量,
那么就需要进入mysql.exe所在的目录去执行
或者带着这个文件的绝对路径去执行
我们经常要执行这些文件
所以把文件的路径添加到环境变量中
就可直接输入文件名来执行程序了

一些命令

mysqld install
	#mysqld.exe install  要安装mysql的server端	  是一个程序而不是一个进程
	
net start mysql 启动server端   
					ftp一样  只有server 运行不了   开启自启动  以后不需要启动了额
mysql -uroot -p 启动client端

重启server
net stop mysql
net start mysql

client端的启动
c://>mysql -uroot 表示没有密码的情况下用root用户登录
c://>mysql -uroot -p 表示使用密码登录
Enter password:输入密码,如果没有密码直接回车
mysql命令行
mysql > select user();    查看当前用户
set password = password('123');   给当前用户设置密码
show databases;    查看当前的所有数据库
			
能不能给一个用户一个root ?

root 用户在mysql 当中相当于管理员用户

其他的程序员想要使用数据库来存储项目数据,不能给他权限最高的管理员用户

比如 : 创建一个eva 账户,Ta可以查看她的文件内容  
		创建一个liu账户,他可以查看他的文件内容   不能看别的  也没管理权删别的
可以创建用户 并且给用户授权
可以创建用户  并且给用户授权
create user 'eva@192.168.16.%';   什么都做不了  没有权限
create user 'eva@192.168.16.%' identified by '123';  带密码登录

既可以给一个已经  存在的用户授权 ,也可以给一个不存在的用户创建并授权
grant  权利 on '数据库名.表名'  to  '用户名@ip地址'  ;
grant  权利 on '数据库名.表名'  to  '用户名@ip地址' identified by '123' ;
	#权利:SELECT  INSERT UPDATE  DELETE  ALL 		#对所有的项目增删改查 最高的权限了
创建一个数据库 s20_day1;
create database s20_day1 ;
连老师的数据库
创建一个stu 用户  密码是123 ip地址是192.168.16 网段的所有机器
能对这个数据s20_day1 做增删改查的所有操作:
grant all on 's20_day1.*' to 'stu@192.168.16.%' identified by '123';
192.168.16.13  
mysql- ustu -h192.168.16.13 -p 
123

# grant all on s20_day1.* to 'stu'@'192.168.16.%' identified by '123';
# 用户名 密码 ip地址
# mysql -u用户名 -hip地址 -p
# 密码
DDL DML DCL

一般用ddl dml。 dcl 是授权(上面的)

删除方面不然用删库语句,基本上就是delete了

1、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
2、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
3、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
ddl语言
文件夹(数据库)的增删改查
(4)
创建数据库:
	  create database 数据库名;				指定编码utf8   ;  默认就是utf8 创建成功
使用数据库:
	 use  库名;
查看所有的数据库:
	show databases;
查看数据库下有哪些表:
	show tables;
改: alter  database  .... 改编码格式
删除: drop database db1:
操作文件(重点)
(*)
创建表:
	create table 表名(字段名 数据类型(长度),字段名2 数据类型(长度),...)
查看表结构:
	desc 表名;
修改表的字段名
	alter table 表名 change name username char(12);   比如:字段名2name  改成username
删除表
	drop table t1;

问题: 如何增加字段名?

dml 语言
数据的增删改查
(*)
增加
    insert into 表名 values (值1,值2,...); 插入一条数据
    insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...); 插入多条数据
    查看数据
    select * from 表名;
    修改数据
    update 表 set 字段名=值 where 条件;
    删除数据
    delete from 表 where 条件;
    
insert into t1 values(1,'alex','ab');
insert into t1 values(1,'alex','ab');
			可以是(1,1,1) 为什么?char 可以给1 不是‘1’也可  id不是主键,可重复如别的东西
            
insert into t1 values(2,'wusir','t123'),(3,'taibai','333');

update t1 set password ='222'   把所有的ab t12 333 都改成了222
update t1 set password = '222' where id =3 ;   改一个
						判断条件用and相连
select * from t1;
delete from t1 where id = 1; 

![没外键所有的都可以重复](E:\Download\qq_download\teacher_huatu_download\s20py\db\day 37\没外键所有的都可以重复.png)

问题:如何更改表名?
操作文件和操作数据:
文件:操作 table 表名;除了desc(查看外)都是table + 表名
数据:操作 动词(into from set * from)表名;
drop 和 delete 的区别
drop table 表名 :  ERROR 1146 (42S02): Table 'day53.xuexi1' doesn't exist
delete from 表名: Empty set (0.00 sec)  
*auto_increment 表示:自增
*primary key 表示:约束(不能重复且不能为空);加速查找
四天后来回顾
为什么要有数据库? 
	之前是存在文件里,但是文件里的值。比如,存储在字典里的,
	字典提取值,需要从前往后,如果是一个后面的值,取值时间长
	列表类那样,从头到尾。
数据库则不是这样
	b树和b+树
		b树,取值慢些,一层层,B+树,三次即可取值,因为快
什么是数据库
	关系型数据库
		mysql sqlserver oracle sql 
		一对多 多对多  
		适合关系型紧密的
	非关系型数据库
		只能一对多  主键  
		redis(不但可以数据库还可以数据传输(socket))  mong(数据库)智能机器人
数据库的下载和安装
	my.ini    改路径
	路径ini 里的 mysqld install
	start net mysql     开启服务端mysql 一次开启,一直适用
	mysql -uroot -p 123		开启客户端mysql  
	
给别的机子权限的指令。
	create day35 @stu 192.168.22.1  
命令行
	show databases;
	use 库名;
	show tables;
	use 表名;
	查看
	select * from 表名;
	增
	insert into(不会)
	改
	删
	drop 表名;
数据库
	ddl
		建库
	dml
	d
		

day38表操作

1. mysql 的存储引擎(innodb,myisam)

id name phone addr ident gender
1
2
3
4
500万行数据    所有年龄大于20的人名
3个文件存:
id name phone addr ident gender  表结构存在一个文件
1 2 3 4  文件   存在另一个文件里
查找的时候会用到的一些目录里存在另一个文件里   (比如年龄)

2 个文件存:  把数据按照目录去存
把1-20放到一块,20-40放一块,  
硬盘   把所有年龄84 的存在一个块 分块目录结构存的  不是一行行存的

所有的数据不存在硬盘而  存在内存 上
经常被打开 丢了也没关系  热数据:1 张表 2000w条新闻

oracle 只有一个存储引擎![目录结构两个文件存](E:\Download\qq_download\teacher_huatu_download\s20py\db\day 37\目录结构两个文件存.png)

1.1 总结

第一种方式 myisam 是5.5之前的默认搜索引擎(因为之前读的多)
						(因为表级锁,所以限制了其他用户对行的操作)
	数据存在硬盘上,村三个文件,表结构,数据,和搜索目录
	既不支持事务、也不支持外键、不支持行级锁
	只支持表锁
	对于只读操作比较多地情况 查询速度相对较快
第二种方式  Innodb 是5.6之后的默认搜索引擎(以后用的多)
				(因为以后互联网用户多,对库改的并发操作多)
	数据存在硬盘上,存两个文件,表结构,( 数据,搜索目录)
	支持事务
	支持行级锁
	支持外键
	(支持了这么多,必然加了许多锁,速度就慢了)
第三种方式 Memory 
	数据存在内存上,存一个文件,表结构(在硬盘上)(快断电消失)
	数据容易丢失,但读写速度相对都快(数据字数有限制)

2 几个需要讲解的关键词

2. 1 事务transaction
景 200         实现董给景  转200块    
董 2000000  
赵 3000000

(必须原子性  ,一个动作,保护数据)
开启事务
先查董的余额,减两百,更新到数据库 
	数据库挂了
再查我的余额,+200 更新到数据库
	没加钱
关闭事务 	
2.21 innodb

是存储为两个文件的

​ 表结构

​ 数据和搜索目录

外键约束

行和表级锁
5.6 版本以上都是,支持事务,提交回滚,崩溃恢复(都不生效),
行级锁  :修改这一行,在这行加锁,不让读 脏数据  
表级锁	 :修改许多行,在这个表加锁 (多行,行锁加锁去锁浪费时间)
2.22 myisam

5.5以及下

2.3 实际显示
 show engines ; 所有的存储引擎
show engines \G;  详细的显示每一行:
show variables like ""   // 查看sql的东西

show variables like "default_storage_engine"; 查看mysql的存储引擎 ```

如果是5.5 以下的可以改这个,成innodb 文件了
#my.ini文件
[mysqld]
default-storage-engine=INNODB

create table t1 value(1,'1')

innodb 
表数据frm
表结构ibd

show create table use2;  可以看表的存储引擎

create table use3 (id int) engine = myisam;
myisam 
frm 村结构
myd   myisam data
myi     myisam index 

memory  创建了  stop start 就消失了
2.4 mysql的工作流程
  1. 检测是否合法 root还是别的用户

  2. 分析优化

  3. 然后存储找数据

  4. 去硬盘上找

2. mysql 支持的数据类型

有限选这些  解决不了问题再去选别的
数值类型
	int 
	float 
字符串类型
	char
	varchar
时间类型
	datetime
set 和 enum类型
	enum
	set 
2.1 int
	tinyint 1 字节   正数 0-255   负数  -128 ~127 
	无符号的 int unsigned ;  0-255  (年龄)
	smallint  mediumint 
	int 10位  手机号码不行  
	bigint  大于10位  
2.2 float
精确度  
都小数后能表示到30位  但是精确度一般
float(255,30) 		w- 工资有多少小数 价格够了  float(5,2)  小数2位  5 位精准度
double    位数有限比float精准 数学也不行				9位精准度
小数精确到30位  默认是整数
decimal (65,30)  
2.21 i系列
i1 
create table i1(id1 int ,id2 tinyint, id3 int unsigned)
insert into t1 values(1,1,1)
insert into t1 values(-1,-1,-1)  不能放  最多到0 warning 显示为0
insert into t1 values(128,128,128)   超过127,tinyint ,得127  
insert into t1 values(2的十位+1,2的十位+1,2的十位+1)   int标识减一
create table i1(id1 int(11) ,id2 int(2), id3 int unsigned)  超过了10位设置11不好用 
			即使写了int ,也可以写进去11111,约束对int无效	
2.22 浮点数系列f系列
create table f1(f float(5,2),d double(5,2),d3 decimal(5,2))
insert into f1 values(4.2, 4.2 , 4.3)  保留4.30   都写4.32533 四舍五入 4.33   
create table f1(f float,d double,d3 decimal)
都可以看到表结构。区别:
show create table f2 ;  存储引-擎 可以看到相关的约束  更多
desc f2 ;    可以看到数据类型 约束  请求
2.3 date
date    0-9999年12-31  YYYY-MM-DD  年月日 (入职)
time    HH:MM:SS 时分秒
year   YYYY   年份  红酒
datetime    年月日时分  0-9。。。。范围多
timestamp   1970 -2038 年 时间太短,企业不希望这么短
create table time1 (y year , d date , t time);
三种都可以
insert into time1 values(now(),now(),now());
insert into time1 values(2010,20200320,111233) ;
insert into time1 values('2019-01-01 12:12:12') ;

create table time2 (dt datetime, ts timestamp);
insert into time2 values (now(),now());
insert into time2 valuse(1969010111212,1969010111212)
insert into time2 valuse(2040010111212,1969010111212)  后面的不行
 dt 能表示时间范围大,可以为空 ,没有默认值 
ts 能表示时间范围小,不能为空, 默认当前时间

create table time2 (dt datetime default current_timestamp, ts timestamp);
	人为设置datetime类型的默认值是当前时间

2.4 字符串

char 能表示的长度小  浪费节省存储空间 ,读写效率快
	定长字符串
    	char(5)  'abc'  'abc  '  'abcde'
varchar 能表示的长度大   65535
	变长字符串
		varchar(5) 'ab'  --> 'ab2'(前面共两个字符的事)  ‘abc’  'abc3'  'abcde'--'abcde5'
        节省内存 查找速度和写入的速度慢  (写和读都需要算)

身份证号:char(18)
手机号码:char(11)
用户名:char(12)  频繁的读取的列,并且长度的 变化不大   
评论: varchar(255)     255个字

longblob    2的十位数方个

create table s1(c char(10) , v varchar(10));
create table s1(c char(255) , v varchar(255));    
insert into s2    显示的时候回去掉所有空格,来对用户造成欺骗。实际上存空格了
enum 和 set
枚举,单选 且自动剔除不存在的选项
	enum('male' , 'female')
集合,多选,自动剔除不存在的选项,自动去重
	set('洗脚','洗头','抽烟','喝酒')
create table es(name char(10) , sex enum('male','female') , hobby set('洗脚','洗头','抽烟','喝酒'))

查看表结构
desc 表名; 
	== describe 表名 ;
	

3. 完整性约束

设置整型无符号 int unsigned 
设置默认值 default 
是否可以为空 not null 
是否唯一  unique 
自增  auto_increment 
主键 primary key 
外键 foreign key 
表结构 : id , name , phone ,sexx 
create table stu1 (
		id int,
		name char(12) not null,
		phone char(11),
		sex enum('male','female')
		);

not null 不生效
可能是mysql 的配置有了问题

​ 就是你找到了一个人,人的名字会不会为空或者身份证

4. 表的创建\删除\修改\查找表结构

​ create table staff_info(id int,

​ name char(12) ,

​ age int,

​ sex char(6),

									 phone char(11),

​ job char(20)

​ ); #字符

5.表与表之间的关系

posted @ 2019-05-15 23:00  learnacode  阅读(162)  评论(0编辑  收藏  举报