首页 > 技术文章 > MYSQL

xuecaichang 2018-09-11 18:59 原文

 

一.什么是数据库?

文件处理就可以将数据永久存储

问题

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

    

 

 

 

推荐阅读