一.
数据库分类
http://www.jb51.net/article/139219.htm 安装说明
https://www.cnblogs.com/xyabk/p/8967990.html
1. 网络数据库
2. 层级数据库
3. 关系数据库
另一种区分方式:基于介质
存储介质分为两种:磁盘和内存
关系型数据库:存储在磁盘中
非关系型数据库:存储在内存中
关系型数据库
关系数据结构:数据以什么方式存储(二维表)
关系操作集合:关联和管理对应的存储数据(SQL指令)
关系完整性约束:数据内部有对应的关联关系,数据与数据之间也有对应的关联联系
表内约束:对应的具体列只能放对应的数据(不能乱放)
表间约束:(外键)
典型关系型数据库:
小型:Microsoft Access,SQLite
中型:SQL Server,Mysql
大型:Oracle,DB2
二.SQL介绍
1. 数据查询语言DQL 专门用于查询数据select/show
2. 数据操作语言DML 专门用于写数据 insert/update/delete
3. 事务处理语言TPL 专门用于事务安全处理transaction/
4. 数据控制语言DCL 专门用于权限管理grant/revoke
5. 数据定义语言DDL 专门用于结构管理create/drop(alter)
三.Mysql
启动和停止MySQL服务
C/S结构 客户端 服务端
服务端对应的软件Mysqld.exe
1. 通过命令行的形式cmd
net start 服务(Mysql):开启服务
net stop Mysql:关闭服务
2. 系统服务方式
前提:安装MySQL时将其添加到Windows的服务中
(计算机—管理—服务)或命令行 service.msc
找到mysql打开服务
登录和退出MySQL服务
通过客户端mysql与服务器进行连接认证,就可以操作
通常:客户端与服务端不在一台电脑上
登录
1. 找到MySQL.exe(通过cmd如果安装时指定了mysql.exe所在路径为环境变量,就可以直接访问;如果没有,进入到mysql所在路径)
2. 输入对应的服务器地址 -h:host -h[IP 地址/域名]
3. 输入服务器中mysql监听的端口 -P:port -P:3306
4. 输入用户名 -u:username -u:root
5. 输入密码 -p:password -p:root
连接认证基本语法:
mysql.exe/mysql -h主机地址 -P3306 -u用户名 -p密码
例:mysql.exe -hlocalhost -P3306 -uroot -proot
注意:通常端口都可以默认:mysql默认3306
密码的输入可以先输入-p,直接换行,然后以密文方式输如密码
例:mysql -hlocalhost -uroot -p
Enter password:****
退出
断开与服务器的连接
建议使用SQL提供的指令
exit;
\q
quit:
MySQL服务端架构
以下几层:
1. 数据库管理系统(最外层)DBMS 专门管理服务端的所有内容
2. 数据库(第二层):DB 专门用于存取数据的仓库(可以有多个)
3. 二维数据表(第三层):Table 专门用于存储具体实体的数据
4. 字段(第四层)fileld 具体存储某种类型的数据(实际存储单元)
数据库中常用的关键字
row:行
column:列(field)
数据库基本操作
— xxxx (注释)
创建数据库
基本语法:create datebase数据库名字【库选项】
库选项:数据库的相关属性
字符集:charset 字符集 代表当前数据库下的所有表存储的数据默认指定的字符集(如果不指定,采用DBMS默认的UTF-8)
create database 数据库名称 charset 字符集名称;
create database myfatabase charset gbk;
校对集:collate 校对集 随字符集
显示数据库
每当用户通过sql指令创建一个数据库,系统就会产生一个对应的存储数据的文件夹(通常存储在安装目录是data下)
并且每个数据库文件夹下都有一个opt文件,保存的数对应的数据库选项
显示全部
基本语法:show databases;
显示部分、、
基本语法:show databases like ‘匹配模式’;
_:匹配当前位置单个字符
%:匹配指定位置多个字符
显示数据库创建语句
基本语法:show create database 数据库名字;
看到的指令并非原始指令,已经被系统加工过
选择数据库
如果要操作数据必须要进入到对应的数据库才行
基本语法:use 数据库名字
修改数据库
修改数据库 库选项(字符集和校对集)
基本语法:alter database 数据库名字 charset=字符集
mysql5.5之前rename 可修改数据库名字,5.5后不行
删除数据库
基本语法:drop database 数据库名字;
删除虽简单,不要轻易删,做好安全操作,确保数据没问题。
对应的文件夹和opt文件都被删除了
数据表操作
创建数据表
普通创建表
基本语法:create table 表名(字段名 字段类型[字段属性],字段名 字段类型[字段属性], …..)[表选项];
表必须放在数据库下,两种方式将表放在指定数据库下
1. 在数据表名字前面加上数据库名字,用“.”连接 数据库.数据表
create table mydatabase.class(name varchar(10));
2.在创建数据表前进入到某个具体数据库 use 数据库名字;
use database;
create table newtable(name varchar(10));
默认创建到当前所在数据库
表选项,与数据库选项类似
engine:存储引擎,MySQL提供的具体的存储数据方式,默认innodb(5.5以前默认myisam)
charset:字符集,只对当前自己表有效(级别比数据库高)
collate:校对集,只对当前自己表有效
复制已有表结构
从已经存在的表复制(只复制结构,表中有数据不复制)
基本语法:create table新表名 like 表名; 只要使用数据库.表名,就可以在任何数据库下访问其他数据库的表名
use test;(进入test数据库)
create table teacher like mydatabase.teacher;
alter user ‘root’@’localhost’ identified with mysql_native_password by ‘password’
显示数据表
.frm文件代表结构文件(结构文件来自于innodb存储引擎)
ibdata存储所有innodb存储引擎所对应的表数据
显示所有表
基本语法:show tables;
匹配显示表
基本语法:show tables like ‘匹配模式’;
show tables like’c%’;
显示表结构
本质含义:显示表中包含的字段信息(名字,类型,属性等)
describle 表名
desc 表名
show columns from 表名
显示表创建语句
查看数据表创建时的语句(看到的语句已经不是用户之前输入的)
基本语法:show create table 表名;
mysql结束语句
;
\g (前两个字段在上排横着,下面跟对应的数据)
\G (字段在左侧,数据在右侧)有时候更直观
设置表属性
表属性指的就是;engine引擎 ,charset字符集 , collate校对集
基本语法:alter table 表名 表选项 [=]可有可无 所做的修改;
注意:如果数据库已经–确定了,里面有很对数据了,不要轻易修改表选项(字符集影响不大)
修改表结构
修改表名:rename table 旧表名 to 新表名; (数据库中数据表名字通常有前缀,取数据名前两个字母加下划线 例:my_表名)
修改表选项:alter table 表名 表选项 [=] 新值;
新增字段:alter table 表名 add [column] 新字段名 列类型[列属性] [位置first/after 字段名] (默认加到表的最后面)
字段位置:字段想要存放的位置。
first:在某某之间(最前面),第一个字段
after 字段名:放在某个具体的字段后(默认的)
修改字段名
alter table 表名 change 旧字段名 新字段名 字段类型[列属性] [位置属性] (修改名字需要修改字段类型)
修改字段类型(属性):
alter table 表名 modify 字段名 新类型 [新属性] [新位置]
删除字段:alter table 表名 drop 字段名;
删除表结构
基础语法:drop table 表名[,表名2….]; 可同时删除多个表
数据基础操作
插入操作
本质:将数据以SQL的形式存储到指定的数据表(字段)里面。
基本语法(向表中指定字段插入):insert into 表名[(字段列表)] values(对应字段列表)
例:insert into test_mysql1 (name,age) values (‘jack’,11);
注意:后面values中 ,对应的值列表只需与前面的字段列表相对应即可(不一定与表结构完全一致)
字段列表不一定非要有所有的表中字段
向表中所有字段插入:insert into 表名 values (对应表结构) //值列表必须与字段列表一致
查询操作
查询表中全部数据:select * from 表名; *表示匹配表中所有字段
查询表中部分数据:select 字段列表 from 表名; 字段列表使用‘ , ’隔开
简单条件查询:select 字段列表/* from 表名 from 表名 where 字段名=值
例:select name from test_mysql1 where age =33; (mysql中没有==)
删除操作
基本语法:delete from 表名 [where条件] 如果没有where条件,意味着系统会自动删除该表所有数据(慎用)
更新操作
将数据进行修改(通常是修改部分字段数据)
基本语法:update 表名 set 字段名 = 新值 [where条件];
如果没有where 那么 表中所有数据对应字段都会被修改成统一值。
字符集
字符编码
字符在计算机中对应的编码(二进制)
字符集
多个字符集合,常见的有:ASCII字符集,GB2312字符集,Unicode字符集
设置客户端所有字符集
如果直接通过cmd 下的mysql.exe来操作msqld.exe 可能会出错。
原因:
1.用户通过mysql.exe来操作mysqld.exe
2.真正SQL执行是mysqld.exe来执行
3.mysql.exe 将数据传入mysqld.exe 的时候,没有告知其对应的符号规则(字符集),而mysqld也没有能力自己判断,就会使用默认的(字符集)
解决方案:mysql.exe 客户端在进行数据操作之前将自己所使用的字符集告诉mysqld
cmd 下的mysql.exe默认都只有一个字符集:GBK
mysql如何告知mysqld对应字符集的类型是GBK?
快捷方式:set names 字符集;
重新进行数据插入:GBK;
深层原理:客户端,服务端,连接层
mysql.exe 与mysqld.exe 之间关系分为三层:
客户端传入数据给服务端:client:character_set_client
服务端返回数据给客户端:server:character_set_results
客户端与服务端之间的连接:connection(中间层):character_set_connection
set names 字符集 本质:一次性打通三层关系的字符集 ,变得一致。
在系统中有三个变量来记录着这三个关系对应的字符集:show variables like ‘character_set_%’;
修改服务器端对应的值: set 变量名=值;
set charaset_set_client=gbk;
而connection 只是为了方便客户端与服务端进行字符集转换而设,不修改也没有关系。
只要让client:character_set_client 与server:character_set_results字符集一致就可以了
set names gbk;
1.set charaset_set_client=gbk; 为了让服务器识别客户端传来的数据
2.set charaset_set_connection=gbk; 更好的帮助客户端与服务端进行字符集转换
3.set charaset_set_results=gbk; 为了告诉客户端服务端所有的返回的数据字符集
校对集
数据比较的方式
校对集有三种格式:
_bin:binary, 二进制比较,取出二进制位,一位一位的比较,区分大小写
_cs:case sensitive,大小写敏感,区分大小写
_ci:case insensitice ,大小不写敏感,不区分大小写
查看数据库所支持的校对集:
show collation;
校对集应用
只有当数据产生比较的时候,校对集才会生效
默认校对集ci
对比: 使用utf-8的_bin和_ci来验证不同的校对集的效果
1. 创建不同校对集对应的表
create table my_collate_bin(name char(1)) charset utf8 collate utf8_bin;
create table my_collate_ci(name char(1)) charset utf8 collate utf8_general_ci;
2.插入数据:insert into my_collate_bin values (‘a’),(‘b’),(‘c’),(‘d’);
insert into my_collate_ci values (‘a’),(‘b’),(‘c’),(‘d’);
3.比较:根据某个字段进行排序:order by 字段名[asc|desc]
select *from my_collate_bin order by name;
select*from my_collate_ci order by name;
ci不区分大小写,排序不会变化
校对集:必须在有数据之前声明好,有了数据再进行校对集修改,修改无效。
乱码问题
列类型
整型(整数类型)
tinyint迷你整形,系统采用一个字节来保存的整型 一个字节=8bit 最大0-255(-128-127)
smallint小整形,系统采用两个字节来保存的整型,0-65535
mediunint中整型,系统采用三个字节来保存的整型
int整型,系统采用四个字节来保存的整型
bigint,系统采用八个字节来保存的整型
1.创建数据表
mysql> create table my_int(int_1 tinyint,int_2 smallint,int_3 mediumint,int_4 in
t,int_5 bigint) charset utf8;
2. 插入数据(tinyint255错误的,超出范围)
3. 并非没有那么大的空间,而是mysql默认为整型增加负数,实际为-128-127
实际中:根据对应数据范围来选定对应的整形类型,通常使用比较多的是tinyint和int
无符号标识设定
无符号表示:存出数据在当前字段中没有负数(只有整数,区间0-255)
基本语法:在类型后加一个unsigned
tinyint(3)unsigned:表示最长可以显示3位(unsigned 0-255永远不会超过3个长度)
tinyint(4):表示最长可以显示4位(-128-127)
(显示长度)代表了数据是否可以达到指定长度,但不会自动满足到指定长度,如果想要数据显示的时候,保持最高位显示长度,那么还需要给字段增加一个zerofill属性。
zerofill:从左侧开始填充0,(左侧不会改变数值大小),所以负数时不能使用zerofill ,
一旦使用zerofill就相当于确定该字段为unsigned
数据显示时,zerofill会在左侧填充0到指定位,如果不足三位,那么填充到3位,如果已经够了或超出那么不填充。
tinyint(2)
可以指定显示长度,超出长度(不超出范围)不会影响,只会对不够长度的进行补充(显示长度)
小数类型
专门用来存储小数的
浮点型和定点型
浮点型
浮点型能存较大的数,但不精确,利用存储数据的位来存指数
又称精度类型,有可能丢失精度的数据类型,数据有可能不那么准确,尤其是在超出精度长度范围时。
float:有称单精度类型,系统提供4个字节存储数据,但表示的数据范围比整型大,大概10^38,但只能保证大概7个精度以内,超过7位不准确。
double: 双精度,8个字节存储数据,10^308,精度15位左右。
float:表示不指定小数位的浮点数
float(M,D):一共存储M位的有效数字,小数位为D位
float(10,2):整数位8,小数位2
如果插入数据超出精度,精度丢失那么浮点型按四舍五入计算。
用户不能插入数据直接超过指定的整数部分长度,但如果是系统自动进位导致,系统可以承担。
浮点数可以用科学计数法来存储数据。 例:10e5 =10^5
浮点数应用:保存一些数量大,大到可以不用那么精确的数据。
Double:又称双精度,系统用8个字节存储数据,10^308, 但精度只有15位。
定点数
能够保证数据精确的小数(小数部分可能不精确,超出长度四舍五入),整数部分一定精确
decimal:定点数,系统自定根据存储的数据来分配存储的空间。每大概9个数会分配4个字节来进行存储,同时整数和小数部分是分开的。
decimal(M,D):M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30。
定点数如果整数进位超过长度也会报错。
应用:如果涉及到钱的时候有可能使用定点数
日期时间类型
1.date
日期类型:系统使用三个字节来存储数据,对应的格式为:YYY-mm-dd :能表示的范围是1000-01-01到9999-12-12
2.Time
时间类型,能表示某个指定时间,系统提供3个字节来存储 HH:ii:ss 但mysql中 time能表示的范围大得多,从-838:59:59-838:59:59,在mysql中具体的用处是用来描述时间段。
3.datetime
日期时间类型:将前面的data和time合并起来,表示的时间 ,使用8个字节存储数据,YYY-mm-dd HH:ii:ss ,表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59
可以为0值 0000-00-00 00:00:00
4.timestamp
时间戳类型,表示从格林威治时间开始,格式仍然是:YY-mm-dd HH:ii:ss
5.year
年类型:占用一个字节来保存,能保存1900-2155年,但year有两种数据插入方式:0-99和四位数的具体年。