数据是事实或观察的结果,它是对客观事物的逻辑归纳,是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等。数据的本身并没有意义,并不能完全表达其内容,只有经过处理解释后才有意义。
数据库是按照数据结构来组织、存储和管理数据的仓库。数据库是长期储存在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。基本特征结构化 易扩展 可共享 独立性高 冗余度小
RDBMS是Relational Database Management System的简称,即关系型数据库管理系统,它是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库,用户通过查询来检索数据库中的数据。RDBMS的特点:
SQL是Structured Query Language的缩写,即结构化查询语言。SQL是一门标准的计算机语言,用于访问和操作数据库,其主要包括数据定义、数据操纵、数据查询和数据控制。SQL已成为RDBMS的标准语言,但不同的RDBMS使用的SQL版本有一些差异,它们都有一些私有扩展。SQL能做什么?
存储引擎,就是如何存储数据、如何更新数据、如何查询数据、如何为存储的数据建立索引等一系列技术的实现方法。show engines;查看mysql支持的存储引擎MyISAM 拥有较快的插入、查询速度,但不支持事务InnoDB 支持ACID事务,支持行级锁,支持外键;MySQL 5.5版本后的默认存储引擎MRG_MYISAM 将一组结构相同的MyISAM表聚合成一个整体,再进行增删改查操作Memory 所有数据存储在内存中,响应快;MySQL重启时数据会全部丢失Archive 归档,且有压缩机制,适用于历史数据归档CSV 逻辑上由逗号分隔数据,会为每张表创建一个.csv文件
在DDL中,对数据库的操作主要有两种:创建和删除。CREATE DATABASE 数据库名 //创建数据库DROP DATABASE 数据库名 //删除数据库show databases;//看一下当前系统有哪些数据库create database mydb;//创建一个名为mydb的数据库drop database mydb//删除一个名为mydb的数据库select database();//查看当前环境在哪个数据库下工作use mydb;//使用mydb数据库
在DDL中,对数据表的操作主要有3种:创建、修改和删除。创建数据表,需要定义的信息主要包括:表名、字段名、字段类型。#MySQL的建表语法CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name [(create_definition,…)] [table_options][select_statement]说明TEMPORARY:表示创建临时表,在当前会话结束后将自动消失IF NOT EXISTS:在建表前,先判断表是否存在,只有该表不存在时才创建create_definition:建表语句的关键部分,用于定义表中各列的属性table_options:表的配置选项,例如:表的默认存储引擎、字符集select_statement:通过select语句建表对于已经存在的表,可以使用alter命令添加、修改、删除字段,也可以对表进行删除操作。show tables;//有那些表已经被创建
drop table contacts;//删除表desc contacts;//查询表字段信息alter table contacts add sex char(1);//添加字段alter table contacts modify sex int;//修改字段alter table contacts drop column sex;//删除字段
在MySQL中使用insert into语句向数据表中插入数据。使用update语句来修改数据表中的数据。使用delete语句来删除数据表中的数据。select * from contacts;//查看内容create table contacts(id int not null auto_increment primary key,name varchar(50),sex tinyint default 1,phone varchar(20));
数据完整性是指存储在数据库中的数据,应该保持一致性和可靠性。关系模型允许定义三类数据约束,它们是实体完整性、参照完整性以及用户定义的完整性约束,其中前两种完整性约束由关系数据库系统自动支持。实体完整性:实体就是现实世界中的某个对象,RDBMS中一行代表一个实体。实体完整性就是保证每一个实体都能被区别域完整性:域完整性主要是对列的输入有要求,通过限制列的数据类型、格式或值的范围来实现参照完整性:主要是表与表之间的关系,可以通过外键来实现用户自定义完整性:借助存储过程和触发器实现实体完整性要求每张表都有唯一标识符,每张表中的主键字段不能为空且不能重复约束方法:唯一性约束、主键约束、标识列域完整性是针对某一具体关系数据库的约束条件,它保证表中某些列不能输入无效的值。域完整性指列的值域的完整性,如数据类型、格式、值域范围、是否允许空值等。约束方法:限制数据类型、检查约束、默认值、非空约束参照完整性要求关系中不允许引用不存在的实体。约束方法:外键约束用户自定义完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。约束方法:规则、存储过程、触发器唯一性约束在MySQL中,可以使用关键字 UNIQUE 实现字段的唯一性约束,从而保证实体的完整性。UNIQUE意味着任何两条数据的同一个字段不能有相同值。一个表中可以有多个 UNIQUE 约束。create table person(id int not null auto_increment primary key comment '主键id',name varchar(30) comment '姓名',id_number varchar(18) unique comment '身份证号');外键约束外键(FOREIGN KEY)约束定义了表之间的一致性关系,用于强制参照完整性。外键约束定义了对同一个表或其他表的列的引用,这些列具有PRIMARY KEY或UNIQUE约束。主表
从表
在插入数据时,必须先向主表插入,再向从表插入。删除数据时正好相反。
不仅如此,命令行工具还可以当成计算器来使用
在SQL中, insert、update、 delete和select后面都能带where子句 ,用于插入、修改、删除或查询指定条件的记录。SQL语句中使用where子句语法
SELECT column_name FROM table_name WHERE column_name运算符value
在where子句中,使用and、or可以把两个或多个过滤条件结合起来。and、or运算符语法
SELECT column_name FROM table_name WHERE condition1 AND condition2 OR condition3
运算符in的使用运算符IN允许我们在WHERE子句中过滤某个字段的多个值where子句使用in语法
SELECT column_name FROM table_name WHERE column_name IN(value1, value2, ..
运算符like的使用在where子句中,有时候我们需要查询包含xxx 字符串的所有记录,这时就需要用到运算符like。where子句使用like语法
SELECT column_name FROM table_name WHERE column_name LIKE ‘%value%’
说明:1、LIKE子句中的%类似于正则表达式中的*,匹配任意0个或多个字符2、LIKE子句中的_匹配任意单个字符3、LIKE子句中如果没有%和_,就相当于运算符=的效果
应用场景:在实际应用中,大多数业务表都会带一个创建时间create_time字段,用于记录每一条数据的产生时间。在向表中插入数据时,就可以在insert语句中使用now()函数。示例如下:insert into user(id, name, create_time) values(1, 'zhangsan', now());
函数date_format()
order by的使用在SQL中,使用order by对查询结果集进行排序,可以按照一列或多列进行排序。#order by语法SELECT column_name1, column_name2FROM table_name1, table_name2ORDER BY column_name, column_name [ASC|DESC]说明:
limit的使用在SELECT语句中使用LIMIT子句来约束要返回的记录数,通常使用LIMIT实现分页。#limit语法SELECT column_name1, column_name2FROM table_name1, table_name2LIMIT [offset,] row_count说明:
group by的使用
从字面上理解,group by表示根据某种规则对数据进行分组,它必须配合聚合函数进行使用,对数据进行分组后可以进行count、sum、avg、max和min等运算。#group by语法SELECT column_name, aggregate_function(column_name)FROM table_nameGROUP BY column_name说明:
group_concat的使用group_concat配合group by一起使用,用于将某一列的值按指定的分隔符进行拼接,MySQL默认的分隔符为逗号。#group_concat语法group_concat([distinct] column_name [order by column_name asc/desc ] [separator '分隔符'])
distinct的使用distinct用于在查询中返回列的唯一不同值(去重复),支持单列或多列。在实际的应用中,表中的某一列含有重复值是很常见的,如employ表的dept列。如果在查询数据时,希望得到某列的所有不同值,可以使用distinct。#distinct语法SELECT DISTINCT column_name, column_nameFROM table_name;素材
表连接在实际工作中,内连接和左连接较多。
子查询in之前的课程中,我们已经学习过运算符 IN,它允许我们在 WHERE 子句中过滤某个字段的多个值。#where子句使用in语法SELECT column_name FROM table_name WHERE column_name IN(value1, value2, …)如果运算符 in 后面的值是来源于某个查询结果,并非是指定的几个值,这时就需要用到子查询。子查询又称为内部查询或嵌套查询,即在 SQL 查询的 WHERE 子句中嵌入查询语句。#子查询in语法SELECT column_name FROM table_nameWHERE column_name IN(SELECT column_name FROM table_name [WHERE]);子查询existsEXISTS是子查询中用于测试内部查询是否返回任何行的布尔运算符。将主查询的数据放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否保留。#where子句使用exists语法SELECT column_name1FROM table_name1WHERE EXISTS (SELECT * FROM table_name2 WHERE condition);
SQL语言按功能用途分为4类,分别是DDL、DML、DQL和DCL。其中,DCL是数据控制语言,主要用于管理用户和权限。在企业中,这部分工作通常是由DBA完成,一般开发人员很少接触。
在命令行中输入ipconfig可以查看自己的IP地址
注意:不能在@前后加空格
忘记root密码的解决方法在MySQL中,如果只是忘记普通用户的密码很好解决,只需要使用root用户登录后重置其密码即可。但是,如果忘记了root用户的密码,该怎么解决?
认识慢查询日志慢查询日志用于记录MySQL数据库中响应时间超过指定阈值的语句。慢查询日志通常也被称之为慢日志,因为它不仅仅只针对SELECT语句,像INSERT、UPDATE、DELETE等语句,只要响应时间超过所设定阈值都会记录在慢查询日志中。如何开启慢查询日志慢查询日志可以通过命令临时设置,也可以修改配置文件永久设置。
explain简介
explain命令可以查看SQL语句的执行计划。当explain与SQL语句一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理语句,包括有关如何联接表以及以何种顺序联接表的信息。
常见的索引种类
索引的使用
复合索引前导列特性在MySQL中,如果创建了复合索引(name, salary, dept),就相当于创建了(name, salary, dept)、(name, salary)和(name)三个索引,这被称为复合索引前导列特性,因此在创建复合索引时应该将最常用作查询条件的列放在最左边,依次递减。
什么是覆盖索引覆盖索引又称之为索引覆盖,即select的数据列只从索引中就能得到,不必读取数据行,也就是只需扫描索引就可以得到查询结果。关于覆盖索引的几点说明:
前面的内容是基础,后面的内容是有提升自己的空间。
什么是事务控制事务(Transaction)是指作为一个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全部失败。事务确保对多个数据的修改作为一个单元来处理。简单来说,如果有不放心的操作,想改回来,利用事务可以撤销固定部分操作。
事务的四个特性如果某个数据库声称支持事务,那么该数据库必须具备ACID四个特性,即Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)。
MySQL的事务控制在默认情况下,MySQL是自动提交事务的,即每一条INSERT、UPDATE、DELETE的SQL语句提交后会立即执行COMMIT操作。所以,要开启一个事务,可以使用start transaction或begin,或者将autocommit的值设置为0。默认情况下,autocommit的值为1,表示自动提交事务。
什么是分区表分区表就是按照某种规则将同一张表的数据分段划分到多个位置存储。对数据的分区存储提高了数据库的性能,被分区存储的数据在物理上是多个文件,但在逻辑上仍然是一个表,对表的任何操作都跟没分区之前一样。在执行增、删、改、查等操作时,数据库会自动找到对应的分区,然后执行操作。注:MySQL从5.1.3开始支持分区(Partition)在MySQL 8.0中,只有InnoDB和NDB两个存储引擎支持分区什么时候分区呢索引如果建的合适 一千万是没什么问题的 如果改表写入比较频繁 那就稍微早点采取分表操作,分不分看业务繁忙程度,看资源使用,看业务需求,不是多少记录多大数据文件来评判的分区表的好处
分区表的四种类型MySQL支持的分区类型包括Range、List、Hash和Key,其中Range最常用。
Range分区ange分区是基于属于一个给定连续区间的列值,把多行分配给分区。
List分区List分区是基于列值匹配一个离散值集合中的某个值来进行选择。
Hash分区Hash分区是基于用户定义的表达式的返回值来进行选择的分区。
Key分区Key分区类似于Hash分区,但这里的Hash Key是由MySQL系统产生的。
OTHER
什么是视图视图是一个虚拟表,其内容由select查询语句定义。和真实的表一样,视图也包含行和列,对视图的操作与对表的操作基本一致。视图中的数据是在使用视图时动态生成,视图中的数据都存储在基表中。视图的本意就是对数据的封装,基本上不会对视图进行增删改等操作。对单表创建视图后,对视图的操作,对原表也会有影响,对原表的操作,对视图也会有影响;对多表创建视图后,对视图的操作,对原表不会有影响,对原表的操作,对视图也会有影响。用处
视图的基本操作
什么是存储过程其类似于编程语言中的方法或函数,存储过程(Stored Procedure)是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程示例
删除存储过程存储过程被创建后,就会一直保存在数据库服务器上,直至被删除。当 MySQL 数据库中存在废弃的存储过程时,我们需要将它从数据库中删除。MySQL 中使用 DROP PROCEDURE 语句来删除数据库中已经存在的存储过程。语法格式如下:DROP PROCEDURE [ IF EXISTS ] <过程名>语法说明如下:过程名:指定要删除的存储过程的名称。IF EXISTS:指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。
问题描述根据传入的用户id和内容发送邮件。测试数据
存储过程实现
什么是触发器触发器(trigger)用于监视某种情况并触发某种操作,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,而是由事件来触发。例如,当对某张表进行insert、delete、update操作时就会触发执行它。存储过程由程序来调用,触发器由事件来触发。也就是说它可以监听表数据的状态,当发生了增删改的时候就会触发相应的操作。这样可以前端的一些业务,由后端的DBA来执行。视图,存储过程和触发器都是对sql语句的一个封装。
给新用户发邮件
什么是预处理从MySQL 4.1开始,就支持预处理语句(Prepared statement),这大大提高了客户端和服务器端数据传输的效率。当创建一个预定义SQL时,客户端向服务器发送一个SQL语句的原型;服务器端接收到这个SQL语句后,解析并存储这个SQL语句的部分执行计划,返回给客户端一个SQL语句处理句柄,以后每次执行这条SQL,客户端都指定使用这个句柄。
预处理的优势高效执行重复SQL:在服务器端只需要解析一次SQL,在服务器端某些优化器的工作只需要执行一次,它会缓存一部分执行计划更加安全:使用预处理语句,无须在应用程序中处理转义,也大大减少了SQL注入和攻击的风险。减少网络开销:对于重复执行的SQL,后续只需要将参数发送到服务器端,而不是整个SQL语句,因此网络开销会更小。预处理的基本使用
什么是查询缓存很多数据库产品都能够缓存查询的执行计划,对于相同类型的SQL就可以跳过SQL解析和执行计划分成阶段。MySQL在某种场景下也可以实现,但是MySQL还有另一种不同的缓存类型:缓存完成的SELECT查询结果,也就是查询缓存。MySQL将缓存存放在一个引用表中,类似于HashMap的数据结构,Key查询SQL语句,Value则是查询结果。当发起查询时,会使用SQL语句去缓存中查询,如果命中则立即返回缓存的结果集。
为什么要复制表,如果对表的操作出现了差错,可以给自己留下后路。只复制表结构create table tableName like someTable;只复制表结构,包括主键、索引,但不会复制表数据只关注表数据create table tableName select * from someTable;复制表的大体结构及全部数据,不会复制主键、索引等完整复制表结构+数据
分两步完成,先复制表结构,再插入数据。
select…into outfile
mysql命令重定向查询结果通常,我们使用mysql命令连接数据库,mysql命令有一个-e选项,可以执行指定的SQL语句,再结合DOS的重定向操作符”>”可以将查询结果导出到文件。
使用mysqldump导出数据(较为常用)mysqldump是MySQL用于转存储数据库的实用程序,它主要产生一个SQL脚本,其中包含创建数据库、创建数据表、插入数据所必需的SQL语句。
备份非常重要,留后路,定时备份更加实用
Linux上实现定时备份MySQL(1)
Linux上实现定时备份MySQL(2)crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于周期性执行任务。
什么是字符集
什么是SQL注入
SQL注入(SQL Injection)是指应用程序对用户输入数据的合法性没有判断、没有过滤,攻击者可以在应用程序中通过表单提交特殊的字符串,该特殊字符串会改变SQL的运行结果,从而在管理员毫不知情的情况下实现非法操作,以此来实现欺骗数据库执行非授权的任意查询。
测试语句
什么是binlog日志MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。万一遇到数据丢失的紧急情况下,可以使用binlog日志进行数据恢复(定时全备份+binlog日志恢复增量数据部分)。可以用show variables like 'log_bin%';使用binlog恢复误删的数据
MySQL审计功能审计是数据库安全中很重要的一个环节,它能够实时记录数据库的操作记录,帮助数据库管理员对数据库异常行为进行分析审核。审计会详细记录谁、在什么时间、执行了什么操作。MySQL社区版没有自带的审计功能或插件,MySQL商业版中有审计功能。