day1 介绍数据库\安装\基础的命令 day2 数据库的表操做 day3 数据库的数据操做,查询(单表\多表) day4 查询和其余内容的拾遗 day5 索引原理和python操做mysql
软件就是让频繁的人作的事情,交给机器去作了 ------- Eva-jpython
数据库在开发的过程当中占据着什么样的位置? 咱们把数据存储在文件里 #写 write #读 read #改 读->写->删->改 可以更加简单的 使用 存储在文件中的数据 查 一行数据 从userinfo 条件 id = 10 或者 id =1 找500000 得找500000行,文件的太费时,从前日后, 在整个项目中又有什么意义? 数据库: 可以更加简单的 使用 存储在文件中的数据 可以更好的解决并发问题 第一个相对论:即便client 依赖数据库 又是server 提供用户 数据的统一问题
1,alex,alex3714 # 一行内容就是一条数据
2,python,19800,6 months # 一条数据mysql
存储数据的地方,咱们把全部的数据都存储在一个固定的地方,那么这个地方就是数据库程序员
负责管理数据仓库中存储的全部文件中的内容
可以更好(简单 高效 安全)的帮助咱们完成数据的增删改查redis
什么是服务器 : 本质就是一台计算机
当一台计算机上安装了某个软件可以对外提供服务的时候,那么这台机器就成为服务器
数据库服务器
当这台机器上安装的服务是一个数据库的server端的时候,咱们就获得了一台数据库服务器sql
专门帮助咱们管理数据库 而且优化数据库的工做人员mongodb
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 在学校里教学使用的
若是关系很是关联用关系型。 若是不关联,均可以非关系型的
先配置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就对了
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 > select user(); 查看当前用户 set password = password('123'); 给当前用户设置密码 show databases; 查看当前的全部数据库
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 #对全部的项目增删改查 最高的权限了
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 是受权(上面的)
删除方面否则用删库语句,基本上就是delete了
一、DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER 二、DML语句 数据库操纵语言: 插入数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT 三、DCL语句 数据库控制语言: 例如控制用户的访问权限GRANT、REVOKE
(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;
问题: 如何增长字段名?
(*) 增长 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;
操做文件和操做数据: 文件:操做 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
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 只有一个存储引擎
第一种方式 myisam 是5.5以前的默认搜索引擎(由于以前读的多) (由于表级锁,因此限制了其余用户对行的操做) 数据存在硬盘上,村三个文件,表结构,数据,和搜索目录 既不支持事务、也不支持外键、不支持行级锁 只支持表锁 对于只读操做比较多地状况 查询速度相对较快 第二种方式 Innodb 是5.6以后的默认搜索引擎(之后用的多) (由于之后互联网用户多,对库改的并发操做多) 数据存在硬盘上,存两个文件,表结构,( 数据,搜索目录) 支持事务 支持行级锁 支持外键 (支持了这么多,必然加了许多锁,速度就慢了) 第三种方式 Memory 数据存在内存上,存一个文件,表结构(在硬盘上)(快断电消失) 数据容易丢失,但读写速度相对都快(数据字数有限制)
景 200 实现董给景 转200块 董 2000000 赵 3000000 (必须原子性 ,一个动做,保护数据) 开启事务 先查董的余额,减两百,更新到数据库 数据库挂了 再查个人余额,+200 更新到数据库 没加钱 关闭事务
是存储为两个文件的
表结构
数据和搜索目录
外键约束
5.6 版本以上都是,支持事务,提交回滚,崩溃恢复(都不生效), 行级锁 :修改这一行,在这行加锁,不让读 脏数据 表级锁 :修改许多行,在这个表加锁 (多行,行锁加锁去锁浪费时间)
5.5以及下
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 就消失了
检测是否合法 root仍是别的用户
去硬盘上找
有限选这些 解决不了问题再去选别的 数值类型 int float 字符串类型 char varchar 时间类型 datetime set 和 enum类型 enum set
tinyint 1 字节 正数 0-255 负数 -128 ~127 无符号的 int unsigned ; 0-255 (年龄) smallint mediumint int 10位 手机号码不行 bigint 大于10位
精确度 都小数后能表示到30位 可是精确度通常 float(255,30) w- 工资有多少小数 价格够了 float(5,2) 小数2位 5 位精准度 double 位数有限比float精准 数学也不行 9位精准度 小数精确到30位 默认是整数 decimal (65,30)
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无效
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 ; 能够看到数据类型 约束 请求
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类型的默认值是当前时间
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('male' , 'female') 集合,多选,自动剔除不存在的选项,自动去重 set('洗脚','洗头','抽烟','喝酒') create table es(name char(10) , sex enum('male','female') , hobby set('洗脚','洗头','抽烟','喝酒'))
desc 表名; == describe 表名 ;
设置整型无符号 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 的配置有了问题
就是你找到了一我的,人的名字会不会为空或者身份证
create table staff_info(id int,
name char(12) ,
age int,
sex char(6),
phone char(11),
job char(20)
); #字符