文档章节

MySQL(1)

jit-hakase
 jit-hakase
发布于 2017/09/03 17:30
字数 2350
阅读 2
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

MySQL基础

概述

数据库管理系统常用数学模型有 层次模型 网状模型 关系模型 面向对象模型等 其中**关系型数据库管理系统(RDBMS)**占主导地位

RDBMS记录数据的方式是二维表 其中又称字段属性, 又称记录元组.

名词解释

数据库(DB): 按照某种数据结构对数据进行组织, 存储和管理的容器. 数据库管理系统(DBMS): 安装在操作系统之上, 管理和和控制数据库中各种数据库对象的系统软件. SQL(Structured Query Language): 应用最为广泛的关系数据库语言. E-R图: 数据库设计时常用的图模型

范式(NF)

范式是符合某一种级别的关系模式的集合

函数依赖: A决定B, 则B函数依赖于A.

主键: 可以唯一标识

  • 1NF: 表中列不可重复, 都是单一属性, 不可再分.
  • 2NF: 基于1NF, 所有非主键列都函数依赖于主键.
  • 3NF: 基于2NF, 不存在非主键列对任一候选列的函数依赖.
  • BCNF: 基于2NF, 不存在任何列对任一候选列的函数依赖.

存储引擎

MySQL使用插件式存储引擎, 不同的表可以使用不同的存储引擎. 使用命令show engines;查看MySQL支持的存储引擎 常用的存储引擎有MyISAM和InnoDB

InnoDB: 事务安全, 支持外键. MyISAM: 非事务安全, 不支持外键, 但是查询速度很快.

设置默认存储引擎 临时修改: 使用命令 set default_storage_engine=ENGINE 永久修改: 修改my.cnf文件中default-storage-engine参数值

需要执行大量增删改操作, 出于安全考虑, 选择InnoDB更好.

数据类型

整数类型

类型 大小
tinyint 1字节
smallint 2字节
mediumint 3字节
int或integer 4字节
bigint 8字节

使用unsigned关键字能使数字类型变为无符号(非负)

小数类型

类型 大小
float 4字节
double 8字节
demical(len, prec) 由len和prec决定

使用unsigned关键字能使数字类型变为无符号(非负)

demical: 最精确的表示小数的类型 len表示数据的长度(不包括小数点和负号) prec表示表示小数点后数字的位数

字符串类型

类型 大小 适用
char(n) 0-255字符 定长字符串
varchar(n) 0-65 535字节 变长字符串
tinytext 0-255字节 文本字符串
text 0-65 535字节 文本字符串
mediumtext 0-16 777 215字节 文本字符串
longtext 0-4 294 967 295字节 文本字符串

char(n)类型存储的大小为 字符数*单个字符占用的字节 其他类型实际占用的字节数就是字符串实际占用的字节数

二进制类型

类型 大小
bit(n) 0-64位
binary(n) 0-255字节
varbinary(n) 0-65 535字节
tinyblob 0-255字节
blob 0-65 535字节
mediumblob 0-16 777 215字节
longblob 0-4 294 967 295字节

binary(n)占用n个字节, bit(n)占用n个位. 其他类型实际占用的字节数就是二进制实际占用的字节数

日期类型

类型 大小 格式 用途
time 3字节 HH:MM:SS 时间值或持续时间
year 1字节 YYYY 年份值
date 3字节 YYYY-MM-DD 日期值
datetime 8字节 YYYY-MM-DD HH:MM:SS 混合值
timestamp 4字节 YYYY-MM-DD HH:MM:SS 混合值或时间戳

取值范围 time: -838:59:59 ~ 838:59:59 year: 1901 ~ 2155 date: 1000-01-01 ~ 9999-12-31 datetime: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59

填入当前时间 除了timestamp类型可以填入NULL以外, 其他类型必须使用now()函数.

now()函数有一个别名函数curtime() now(n), n<=6, 可以显示更精确的时间 microsecond(now(n)) 用于获取微秒时间

复合类型

enum类型: 从一个集合中取得单个值, 类似单选框. set类型: 从一个集合中取得N个值, 类似复选框.

表示形式: TYPE('VALUE','VALUE',...) 填入set类型数据: 'VALUE,VALUE,...'

使用这两种类型可以实现简单的字符串类型数据的检查约束.

特殊值NULL

公式 结果
null+1 null
null=null null
null!=null null
null is null 1(true)

除了is运算符之外, 无法与null特殊值进行任何有意义的运算.

数据库管理

查看数据库: show databases; 创建数据库: create database DB_NAME; 查看数据库结构: show create database DB_NAME; 选择数据库: use DB_NAME 删除数据库: drop database DB_NAME;

备份与恢复

备份数据库

  1. 停止MYSQL服务 或使用命令flush tables with read lock;设置只读锁 等备份完成之后再使用unlock tables;解锁
  2. 根据表的存储引擎的不同选择将需要的文件进行备份(建议连my.cnf一起备份) MyISAM存储引擎只需备份数据库目录 InnoDB存储引擎不仅要备份数据库目录, 还需备份表空间文件和日志文件. (ibdata1, ib_logfile0, ib_logfile1)

恢复数据库

  1. 停止MYSQL服务
  2. 将备份的数据复制到对应目录

如果新旧MYSQL服务器的数据库目录不同, 还需修改my.cnf中的datadir参数信息.

也可用mysqldump命令生成sql文件用于备份和恢复

表结构管理

查看表: show tables; 创建表: create table TBL_NAME(...); 查看表结构: desc TBL_NAME; 删除表: drop table TBL_NAME

查看表结构也可使用以下命令来查看原生创建命令. show create table TBL_NAME;

创建表

create table TBL_NAME(
	ATTR TYPE [CONSTRAINT],
	...
	ATTR TYPE [CONSTRAINT]
)[OTHER OPTIONS];

使用约束条件(CONSTRAINT)

mysql不支持check约束, 利用其他方法(复合数据类型, 触发器等)实现.

  • primary key: 主键, 唯一标识记录的字段.
  • not null: 字段不能设为NULL
  • default VAR: 设置字段默认值
  • unique: 字段的值在表中唯一
  • auto_increment: 自增长(从1开始, 每次+1.)
  • foreign key: 外键, 指向其他表的主键 外键的级联: 当父表记录发生删除或修改时所执行的操作.
    • cascade: 自动删除或修改子表中对应的记录
    • set null: 将子表中与之对应的外键值设为NULL
    • no action: 若子表存在对应记录, 则删除或修改操作失败
    • restrict: 同no action, 是外键级联的默认值.

外键语法 外键: 约束表与表之间的关系, 外键字段的取值, 是其他表中的主键取值或者NULL. 语法理解: 表A的外键参照表B的主键

constraint 约束名 foreign key 表A字段 references 表B字段 [on delete 级联选项] [on delete 级联选项]

主键约束也可以使用外键的语法, 通常用于多主键的表. 唯一约束也可以使用外键语法.

使用其他选项(OTHER OPTIONS)

  • engine=ENGINE 设置存储引擎
  • default charset=CHARSET 设置默认字符集
  • pack_keys=PACK_TYPE 设置索引关键字压缩类型(仅MyISAM存储引擎有效)

复制表

仅复制表结构 create table TBL_NAME like OLD_TBL_NAME; 复制表结构以及记录 create table TBL_NAME select * from OLD_TBL_NAME;

无法复制表的约束条件和外键关系, 如果要完全复制, 可借助mysqldump工具.

修改表

修改表名

使用以下任意一条语句 rename table OLD_TBL_NAME to NEW_TBL_NAME; alter table OLD_TBL_NAME rename NEW_TBL_NAME;

修改列

删除字段 alter table TBL_NAME drop ATTR; 添加字段 alter table TBL_NAME add NEW_ATTR [CONSTRAINT] [first | after OLD_ATTR]; 修改字段 修改字段名的同时修改数据类型 alter table TBL_NAME change OLD_ATTR NEW_ATTR NEW_TYPE; 仅修改数据类型 alter table TBL_NAME modify ATTR NEW_TYPE;

修改约束条件

添加约束条件 alter table TBL_NAME add constraint 约束名 约束类型 (字段名); 删除约束条件 删除主键约束条件 alter table TBL_NAME drop primary key; 删除外键约束条件 alter table TBL_NAME drop foreign key 外键约束名; 删除唯一性约束条件 alter table TBL_NAME drop index 唯一约束名;

修改其他选项

其他选项包括存储引擎, 默认字符集, 自增字段初始值, 索引关键字压缩类型等 alter table TBL_NAME OTHER_OPTION=NEW_OPTION;

表记录操作

插入新记录(insert)

插入一条记录 insert into TBL_NAME[(ATTR...)] values(VALUE...);

插入批量记录

insert into TBL_NAME[(ATTR...)] values
(VALUE...),
...
(VALUE...);

Oracle数据库不支持插入批量记录

插入查询结果集 insert into TBL_NAME[(ATTR...)] select ...;

向auto_increment字段插入数据时, 最好用NULL值. 向默认值约束字段插入数据时, 可用default关键字 若有外键约束关系, 原则上先给父表插入数据, 再给子表插入数据 即使insert操作执行失败, auto_increment的值也会递增.

更新记录(update)

更新符合条件的记录

update TBL_NAME
set ATTR=VALUE,
...
set ATTR=VALUE
where ...;

删除记录(delete)

删除符合条件的记录 delete from TBL_NAME where ...; 清空表记录 truncate TBL_NAME;

使用truncate会重置自增列的序号

替换记录(replace)

replace语句与insert语句的唯一区别: 当插入新记录时, 若新记录的主键或唯一约束的字段值和旧记录相同, 则旧记录先被删除, 然后再插入新记录, 也就是把deleteinsert合在一起组成了一个原子操作, replace语句也可以使用update的语法格式.

© 著作权归作者所有

上一篇: Linux常用命令
下一篇: 博弈论
jit-hakase
粉丝 3
博文 26
码字总数 30408
作品 0
南京
程序员
私信 提问
加载中

评论(0)

解决centos7 yum安装MySQL rpm包出现conflict problem

[root@localhost mysqlrmp]# rpm -ivh MySQL-server-5.6.37-1.el7.x86_64.rpm 出现如下报错: Preparing... ################################# [100%] file /usr/share/mysql/charsets/REA......

运维天空
2017/12/04
0
0
CentOS6.8下完全干净卸载mysql

来源整理于 https://www.cnblogs.com/wanghuaijun/p/6398240.html 虚拟机CentOS6.8下 先执行命令查看目录是否存在mysql 文件夹: cd /usr/local 再输入ll 若存在 执行删除命令 rm -rf /usr/...

osc_eegg9ccs
2018/07/03
2
0
安装并配置单实例mysql数据库

一、下载介质 http://mirrors.sohu.com/mysql/ http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.40.tar.gz http://dev.mysql.com/downloads/mysql/ http://ftp.ntu.edu.tw/MySQ......

szoracle
04/17
0
0
zabbix 清理历史数据

项目上线不到一个月,zabbix数据居然快100G,监控项太多,数据量太大,zabbix负载重,暂时不想升级硬件,只好内部挖掘下,清除下历史数据;一般保留1个月的数据,zabbix这个项目只是做监控报...

hnxy2001
2016/10/28
0
0
CentOS-7.5 安装 社区版 MySQL-5.7

1、实验环境 服务器类型:VMware虚拟机 服务器操作系统:CentOS-7.5 服务器名称:CentOS-1 服务器IP:192.168.218.128 防火墙+selinux均已关闭 网络连通状况:服务器可以上外网 2、MySQL-5.7...

wx5e86f96956311
04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

认知智能类脑模型之理解技术体系简介道翰天琼

理解层在类脑模型认知层的下层,在学习层的上层。学习和理解本身也 是一体。学习本身包含了理解。这里的理解主要是机器学习之后的深度理解。理解层的核心包含三大部分符号,语言和图像的深度...

jackli2020
35分钟前
17
0
org.json的使用详解

jar下载 基于maven工程的pom文件配置: <!-- https://mvnrepository.com/artifact/org.json/json --><dependency><groupId>org.json</groupId><artifactId>json</artifactId>......

独钓渔
36分钟前
19
0
webpack.04-entry points

https://www.webpackjs.com/concepts/entry-points/ cnpm init -y cnpm i -D webpack webpack-cli 配置文件webpack.config.js module.exports={ mode:'development',//production 生产环......

_qq507570355
43分钟前
16
0
Oracle中如何实现分页+排序? 其中遇到的问题,你,注意了嘛???

分页 + 排序 一.简单分页: 需求:分页查询台账表T_ACCOUNT,每页10条记录 分析:我们在ORACLE进行分页查询,需要用到伪列ROWNUM和嵌套查询 我们首先显示前10条记录,语句如下: select rownu...

煌sir
今天
148
0
使用JavaScript获取当前URL? - Get the current URL with JavaScript?

问题: All I want is to get the website URL. 我想要的只是获取网站URL。 Not the URL as taken from a link. 不是从链接获取的URL。 On the page loading I need to be able to grab the ......

技术盛宴
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部