MYSQL
一.什么是数据库?
文件处理就可以将数据永久存储
问题
1.管理不方便
2.文件操作效率问题
3.一个程序不太可能仅运行在同一台电脑上
提高计算机性能的方式
1.垂直扩展 指的是更换性能更好的硬件
2.水平扩展 指的就是添加更多的计算机 把任务分配给每一台 (分布式计算)
分布式计算 的好处
1.其中某一台挂了 不会导致整个系统瘫痪 稳定性高
2.理论上性能可以无限扩展
分布式计算其实也是整体
数据需要被共享 这就需要socket技术
共享就存在竞争问题 加锁处理
文件存取效率问题
数据库 本质上就是一套软件 由服务器端 和 客户端组成 C/S B/S
早些年 没有数据库的时候 程序员要想实现功能 得自己写一套socket 并解决上述问题
于是就有了数据库软件公司
目前常见的数据库
关系型数据库
数据与数据之间可以建立关联关系(用户数据和购买信息)
SQLServer
仅支持windows
MySQL
免费 开源 性能也不差 mysql 先后被sun 和 oracle收购
mariaDB mysql的创始人 担忧mysql的未来 于是推出mariaDB 使用起来完全一致
Oracle
目前最牛逼的数据库 收费很高
DB2
IMB 收费的 一般与计算机绑定销售
非关系型数据库
速度贼快
key value 存取
MongoDB
redis
memcache
数据库相关概念
数据 用于记录某事物状态的符号 或 别的形式 数字 音频
age = 20
记录 就是一个事物的典型特征的组合 在文件中体现为一行文本
yyh,20,man,180
表 就是一个一个的文件
库 就是一个文件夹
数据库管理系统(DBMS) 就是一个软件用来管理库的 C/S程序
数据库服务器 运行着DBMS的计算机称为数据库服务器
数据库服务器中存放的是 库(文件加) 表(文件) 表里面是记录(一行数据)
二.设置密码
mysqladmin.exe 用于设置密码
mysqladmin -uroot -p旧密码 password 新密码
破解密码
1.删除存储密码的文件
2.重装mysql
3.可以在启动服务器时 告诉他 让他不要读取密码文件
1.mysqld -skip-grant-tables
2.无密码登录服务器
3.使用update 来更新你的密码 在msyql.user表中
在客户端 update mysql.user set password = password("321") where user = "root" and host="localhost";
4.重启服务 验证新密码
三.安装mysql得到两个程序
1.服务器程序
存取数据时服务器的工作
2.客户端程序
命令服务器来完成存取工作
客户端将命令发送给服务器 服务器解析执行命令 返回客户端要的数据
服务器为了保证数据安全需要进行用户验证
默认有一个root 账户 默认没有密码 不安全
需要修改密码:
在服务器的终端中执行
mysqladmin.exe -u要改的用户名 -p旧密码 password 新密码
在服务器上执行命令时 如果看到Install/Remove of the Service Denied! 说明权限不够得用管理员身份运行
如果忘记密码 要破解 也需要在服务器终端启动mysql服务 并且需要添加跳过授权表的参数
mysql -uroot -padmin 用mysql自带的客户端登录服务器
-u 用户名 -p 密码 -h 服务器的ip -P端口号 在本机上执行客户端不需要指的 -h -P
常见sql命令
show databases;
查看所有数据库名称
use 数据库名称
选择某个数据库 就是进入文件夹
quit or exit 退出客户端
以上的指令 只有两个是在服务器端执行
mysqld
mysqladmin
四. 基本sql语句句
1. 库相关
增
create database mydb charset utf8;
查
show databases;
show create databases mydb;
改
alter database mydb charset gbk
删
drop database mydb;
2. 表相关
增
切换⽂文件夹 (选择数据库)
use mydb;
create table t1 (id int,name char)
查
show tables;
show create table t1; desc t1;
改
改字段
alter table 表名 add | modify | drop | change
add 跟 列列名和类型
modify 跟 列列名 和 类型
drop 跟列列名
change 跟 旧列列名 新列列名 类型改字符编码
alter table 表名 default character set gbk
改名称
rename table tname1 to tname2
删
drop table 表名
创建表的完整语法 create table 表名( 字段名称 数据类型 [(长度)约束条件], 字段名称 数据类型 [(长度)约束条件] ) 必须的:字段名 数据类型 表名 ****** 可选的:长度 约束条件 **** 长度用于设置数据的长度 数据类型也是一种约束条件,约束指的是除了数据类型外的额外的规范 如果添加的数据超过了指定的长度范围,超出范围的就丢弃; 注意: 字段名 和 表名 库名 都不是MySQL的关键字 比如 select from not......******
3. 记录相关
增
nsert into tablename values(data,....),(data)...
查
select id,name from t1; 列列名可⽤用*号表示通配符
改
update 表名 set 列列名 = 值 where 条件 ; 可同时修改多个
字段
⽤用逗号隔开 列列名=值,列列名=值... 没有条件则修改全部
删
delete from 表名 where 条件; 没有条件则删除所有;
truncate table t1; 重建表,清空所有数据;
五.关规范
字段名 表名 库名
由 数字 字⺟母 @ $ # _ 组成不不能纯数字
不不能是关键字
六 表的分类(数据存储引擎)
先说什什么是引擎?
汽⻋车的发动机是不不是引擎? 引擎就是⼀一个系统的核⼼心部分
为什什么需要分类呢? 发动机分类呢? 分柴油 汽油 电动
各⾃自的使⽤用场景不不同
mysql⽀支持的引擎show engines
不不同引擎效果测试
七 数据类型
为什么需要将数据分类?
1 为了描述事物更加准确
2 描述起来更方便
3 节省内存空间
l a 你 utf8 下 五个字节
l a b c unicode 6 个字节
mysql支持的数据类型:
整型: tinyint smallint mediumint int bigint
字节数: 1 2 3 4 8
默认情况下整型是有符号的 需要用一个二进制位存储符号,给整型加上约束 unsigned 来表示无符号,如果超出范围就尽可能保存最大的,例如在无符号下保存256 其实存的是255,如果有符号,例如 tinyint 保存 -1280 其实存的是-128 是最小值
修改严格模式:
以上特性的出现是因为MySQL处于严格模式
查看当前模式 show variables like "sql_mode":
修改为严格模式 set global sql_mode="STRICT_TRANS_TABLES":
严格模式下 如果值超出范围就直接报错,在一些版本中默认的就是严格模式!
在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发个数据库
怎么选择:根据实际情况 来判断,能够保存你的数据的最小类型
长度限制对于整型的意义:
create table t10(id int(1));
insert into t10 value(454555);
select *from t10;
发现这个数也存储成功
说明 这里长度指的不是存储容量限制
而是显示的宽度
如果你的数据超过了显示宽度 有几个显示几个
如果不足 则补全到指定长度 得告诉它用什么来补全
create table t13(id int(10) zerofill);
总结 不是容量限制 而是 显示宽度
要限制显示宽度
1.创建表时 给整型加上宽度
2.加上zerofill约束
浮点型:小数型
float 4个字节,double 8个字节, decimal 不确定(手动指定)
给浮点型设置的的宽度限制
float(m,d)
double(m,d)
decimal(m,d)
长度说明:m表示这个浮点数整体的长度,d表示小数部分的长度
例如:float(5,3)最大值99.999
区别*******
相同点:小数部分最大长度都是30,float和double的最大长度为255
不同点:decimal的整体最大长度为65,精度不同:double比float精度高,decimal是准确的,不会丢失精度
字符型:
分类:1. char 定长字符 2.varchar 变长字符
char 类型的长度是固定的,无论你存储的数据有多长,占用的容量都一样
char(3)存储的数据为"a" 在硬盘保存的数据还是占用3 个字符长度,实际保存的是“a ”
varchar 长度是可变的 存储的数据有多长就占用多长
varchar(3) 储存的数据诶“a”在硬盘保存的数据还是占用1个字符长度,实际保存的是“a”
yxx exx lxx zxx cx wxx char(3)
(1bytes+yx)(1bytes+exx)(1bytes+lx)(1bytes+zxx) varchar(3)
如果是可变长度 则有问题 不知道数据从哪里开始到哪里结束 所以需要有一个位置保存数据的长度
vharchar 能支持的最大长度是65535 用于保存数据长度的数据最长两个bytes
如果是char类型,如果你的数据不足指定的长度,就在后面用空格补齐
验证:
使用一个char_length的函数,可以查看字符的长度
create table t18(a char(4),b varchar(4));
insert into t18 value("x","x");
select char_length(a),char_length(b) from t18;
两个字段的长度都为1
结论:
这是因为MySQL在存储时自动加上空格,对使用者而言是没有意义的,所以 MySQL自动帮你处理
掉空格
我们可以设置sql模式来让它先出原形
set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
设置完成后重启msyql 再次查询长度
注意:
当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除
select *from t19 where name = "yh"
当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
select *from t19 where name like "yh";
% 任意个数的任意字符
_ 1个任意字符
如何选择
char
存取效率高
浪费存储空间
varchar
存取效率低于char
节省存储空间
使用起来感受不到区别 通常用的是char
char和varchar 长度都比较小 最大就是65535
大文本类型:
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT 文本是带有编码
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码
二进制类型: 用于存储多媒体数据 比如视频 但是我们一般不会将多媒体数据存到数据 而是存储文件路径地址
BINARY系列 BINARY VARBINARY 存储二进制数据
注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下
其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
默认的显示宽度,都是在最大值的基础上加1
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok