主流的关系型数据库
- Oracle :运行稳定,可移植性高,功能齐全,性能超群,适用于大型企业
- DB2:速度快,可靠性好,适用于海量数据,恢复性极强,适用于大中型企业
- MySQL:开源、体积小、速度快,适用于中小型企业
- SQL server:全面高效、界面友好易操作,但是不跨平台,适用于中小型企业
MySQL发展历程
最早是由瑞典MySQL AB公司开发,仅供内部使用,2000年基于GPL协议开放源码,2008年MySQL AB公司被Sun 公司收购,2009年Sun公司又被Oracle公司收购,有了Oracle公司的技术支持,MySQL在2010年以后发布了多个版本,在各方面加强了企业级的特性。
MySQL 下载与安装
数据库、数据库管理系统和SQL之间的关系

- 数据库是长期存储在计算机内,有组织的,统一管理的相关数据的集合
- 数据库管理系统是用于管理数据库的软件,它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性
- SQL是一种结构化查询语言(Structure Query Language)它是国际化标准组织(ISO)采纳的标准数据库语言
SQL 分类
- 数据定义语言DDL
- 用来创建、修改、删除数据中的各种对象,包括数据库、表、视图等等
- 用于创建,修改,删除数据库中的各种对象(表、视图、索引等),常用命令有CREATE,ALTER,DROP
- 数据库的增删选查
- 查看数据库:
show databases;- 系统数据库:sys 库:MySQL5.7 增加了 sys 系统数据库,通过这个库可以快速的了解系统的元数据信息。information_schema 库:提供了访问数据库元数据的方式。
- 用户数据库
- 创建数据库:
create database 数据库名称; - 数据库名称不能与SQL关键字相同,也不能重复
- 查看创建好的数据库:
show create database 数据库名称;
alter database test character set utf8;- 选择进入数据库:
use 数据库名称; use test;- 删除数据库:
drop database 数据库名称; drop database test;- 数据库基本结构:

- 数据库:组织、存储和管理相关数据的集合,同一个数据库管理系统中数据库名必须唯一
- 表:由固定列数和任意行数构成的数据集,同一个数据库中表名必须唯一
- 列:一个字段,同一个表中列名必须唯一
- 行:一条记录
- 数据表的增删改查
- 创建表:
create table 表名(字段名1 数据类型1 [约束条件1],字段名2 数据类型2 约束条件2);- 建表之前要先选择进入数据库:
use test;- 建表时可以不指定约束条件,但是必须指定字段的数据类型
- 表名不能与SQL关键字相同,同一个数据库下的表名不能重复
- 查看创建好的表:
show create table 表名; show create table emp;- 查看当前数据库中所有表:
show tables;- 查看表结构:
desc 表名; desc emp;- 修改表:修改数据库中已经存在的数据表的结构
- 修改表名:
- 修改表:修改数据库中已经存在的数据表的结构
alter table 原表名 rename 新表名;- 修改字段名:
alter table 表名 change 原字段名 新字段名 数据类型[ 约束条件];- 修改字段类型:
alter table 表名 modify 字段名 数据类型[ 约束条件];- 添加字段:
alter table 表名 add 新字段名 数据类型 约束条件;- 修改字段的排列位置
- 将某个字段改为第一列:
- 修改字段的排列位置
alter table 表名 modify 字段名 数据类型[ 约束条件] first;- 将某个字段改到另一个字段后面:
alter table 表名 modify 要排序的字段名 数据类型[ 约束条件] after 参照字段;- 删除字段:
alter table 表名 drop 字段名;- 删除数据表:
drop table 表名; drop table emp;- 数据类型
- 数值型
- 数据类型

- 字符串型

- 日期时间型

- 常用数据类型
- 字符串类型和日期时间类型都需要用引号括起来
- int:4字节整数值
- float:单精度浮点型,float(5,2)表示最多5位数,其中有两位小数
- char:固定长度字符串型,如char(10),‘abc ’
- varchar:可变长度字符串型,如varchar(10),‘abc’
- text:长文本字符串型
- date:日期型,‘yyyy-MM-dd’
- time:时间型,‘hh:mm:ss’
- datetime:日期时间型,‘yyyy-MM-dd hh:mm:ss’
- 常用数据类型
- 数据完整性
- 主体完整性
- 主键约束
- 特点
- 能够唯一地标识表中的一条记录
- 非空不重复,要求主键列的数据必须是唯一的,并且不允许为空
- 可以设置单字段主键,也可以设置多字段联合主键
- 添加方法
- 主键约束
- 主体完整性
- 数据完整性
create table 表名(字段1 数据类型 primary key,字段2 数据类型[,…]);
create table 表名(字段1 数据类型,字段2 数据类型[,…], primary key(主键字段));
create table 表名(字段1 数据类型,字段2 数据类型[,…], primary key(主键字段1, 主键字段2[,…]));- 删除方法
alter table 表名 drop primary key;- 唯一约束
- 特点
- 要求该列的值必须是唯一的
- 允许为空,但只能出现一个空值
- 添加方法
- 唯一约束
create table 表名(字段1 数据类型,字段2 数据类型 unique[,…]);- 删除方法
alter table 表名 drop index 唯一约束名;- 如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名。
- 如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称。
- 如果指定了约束名,则删除的时候写约束名。
- 自增字段
- 特点
- 指定字段的数据自动增长
- 配合主键一起使用,并且只适用于整数类型
- 默认从1开始,每增加一条记录,该字段的值会增加1
- 添加方法
create table 表名(字段1 数据类型 primary key auto_increment,字段2 数据类型[,…]);- 设置自增字段的初始值
- 设置自增字段的初始值:
Alter table 表名 auto_increment=n;- 删除方法
alter table 表名 modify 字段名 数据类型[ 约束条件];- 域完整性
- 非空约束
- 特点
- 字段的值不能为空
- 添加方法
- 非空约束
- 域完整性
create table 表名(字段1 数据类型,字段2 数据类型 not null[,…]);- 删除方法
alter table 表名 modify 字段名 数据类型[ 约束条件];- 默认约束
- 特点
- 指定某个字段的默认值,如果新插入一条记录时没有为默认约束字段赋值,那么系统就会自动为这个字段赋值为默认约束设定的值。
- 添加方法
- 默认约束
create table 表名(字段1 数据类型1,字段2 数据类型2 default 默认值[ ,…]);- 删除方法
alter table 表名 modify 字段名 数据类型[ 约束条件] ;- 参照完整性
- 外键约束
- 特点
- 某一表中某字段的值依赖于另一张表中某字段的值
- 主键所在的表为主表,外键所在的表为从表
- 每一个外键值必须与另一个表中的主键值相对应
- 添加方法
- 先创建主键所在的主表,再创建外键所在的从表
- 外键约束
- 参照完整性
creat table 表名(字段名1 数据类型1,字段名2 数据类型2,……, foreign key(字段名) references 主表(主键字段));- 删除方法
alter table 表名 drop foreign key 外键约束名;- 先删除从表,再删除主表。
- 先删除外键约束,再删除表。
- 用户自定义完整性
- 检查约束
- 特点:指定需要检查的限定条件
- 检查约束
- 视图
- 视图是存储在数据库中的虚拟表,视图中不保存数据,内部封装了一条SELECT语句,数据来源于查询的一个或多个基本表。
- 创建视图:
create view 视图名 as select 查询语句;- 查看视图结构:
desc 视图名;- 查询视图中的记录:
select 字段名1[,字段名2,...] from 视图名[ where 筛选条件];- 修改视图:
create [or replace or alter] view 视图名 as select 查询语句;- 删除视图:
drop view 视图名;- 索引
- 索引的意义
- 用于快速找出在某个字段中有特定值的行。
- 如果不使用索引,MySQL必须从第一条记录开始检索表中的每一条记录,直到找出相关的行,那么表越大,查询数据所花费的时间就越多。
- 索引的优缺点
- 优点
- 通过索引对数据进行检索,大大提高了数据的查询效率
- 缺点
- 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
- 索引也需要占空间的,创建的索引太多,索引文件也会占用数据库的存储空间
- 当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度
- 优点
- 索引的分类
- 普通索引
- 一个索引只包含一个字段
- 唯一索引
- 索引字段的取值不能重复,可以有空值,但空值也只能出现一次
- 主键索引
- 索引字段的取值不能为空,也不能重复
- 组合索引
- 一个索引包含多个字段
- 只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
- 全文索引
- 仅限MyISAM引擎,只能在CHAR,VARCHAR,TEXT类型的字段上使用
- 通过关键字符,就能找到该字段所属的记录行
- 空间索引
- 仅限MyISAM引擎
- 对空间数据类型的字段建立的索引,且要求索引字段的取值不能为空
- 普通索引
- 索引的操作
- 创建索引:
- 索引的意义
- 索引
create index 索引名 on 表名(字段名);- 自动创建索引
- 在表中定义了主键约束时,会自动创建一个对应的主键索引
- 在表中定义了外键约束时,会自动创建一个对应的普通索引
- 在表中定义了唯一约束时,会自动创建一个对应的唯一索引
- 查看索引:
- 自动创建索引
show index from 表名;- 删除索引:
drop index 索引名 on 表名;- 创建索引的原则
- 需要创建索引的情况
- 主外键和唯一约束的字段自动创建索引
- 频繁作为查询条件的字段应该创建索引
- 查询中排序的字段应该创建索引
- 查询中分组或统计的字段应该创建索引
- 不需要创建索引的情况
- 表中记录太少不需要创建索引
- 需要频繁增删改的字段不适合创建索引
- where子句中用不到的字段不需要创建索引
- 重复值较多的字段不需要创建索引
- 创建索引的原则
- 数据操作语言DML
- 用来对数据库中的表进行更改操作,比如增加数据、删除数据、修改数据等
- 添加数据
- 字段名与字段值的数据类型、个数、顺序必须一一对应
- 指定字段名插入:
insert into 表名(字段1[,字段2,…]) values(字段值1[,字段值2,…]), (字段值1[,字段值2,…])[,…]);- 字段列的数量和值的数量必须相同,且列和值要对应上
- 不指定字段名插入:
insert into 表名 values(字段值1[,字段值2,…]), (字段值1[,字段值2,…])[,…]);- 需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同
- 批量导入:
load data infile ‘文件路径.csv’into table 表名 fields terminated by ‘,' ignore 1 lines;- 路径中不能有中文,并且要用反斜杠
- 更新数据
update 表名 set 字段名1=字段值1, 字段名2=字段值2,…;- 设置数据库安全权限:
set sqlsafeupdates=0;- 删除数据
delete from 表名[ where 条件字段=条件值];
truncate 表名;- delete和truncate区别
- delete可以添加删除条件删除表中部分数据,truncate只能删除表中全部数据。
- delete删除表中数据保留表结构,truncate直接把表删除(drop)然后再创建一张新表,执行速度比delete快。
- delete和truncate区别
- 数据查询语言DQL
- 用来查询数据库表中的记录,由select 组成的查询语句块
- 用来查询数据库表中的记录,基本结构:
SELECT <字段名> FROM <表或视图名> WHERE <查询条件>- 单表查询
- 虚拟结果集
- select语句执行后服务器会按照要求检索表中数据,并将检索结果发送到客户端,这个以表的形式展示出来的临时结果集,
- 它是存放在内存中,不是在磁盘中的,执行其他操作之后这个结果集就没有了,所以它是临时存在的虚拟结果集,而不是一个真实的表。
- 全表查询
- 全表查询:
- 虚拟结果集
- 单表查询
select * from 表名;- 查询指定列
- 查询指定列:
- 查询指定列
select 字段1[,字段2,…] from 表名;- 查询不重复的数据
- 查询不重复的数据:
- 查询不重复的数据
select distinct 字段名 from 表名;- 设置别名
- 当我们的列名或表名很长的时候,可以使用as关键字给一个列或者表添加别名,增强SQL语句的可读性。
- 设置别名:
- 设置别名
select 字段名 as 列别名 from 原表名 [as ]表别名;- 条件查询
- 条件查询:
- 条件查询
select 字段1[,字段2,…] from 表名 where 筛选条件;- 运算符
- 算术运算符

- 比较运算符

- 逻辑运算符

- 空值查询
- 空值查询:
- 空值查询
select 字段1[,字段2,…] from 表名 where 空值字段 is[ not] null;- 模糊查询
- 模糊查询:
- 模糊查询
select 字段1[,字段2,…] from 表名 where 字符串字段[ not] like 通配符;
- 百分号(%)通配符:匹配0个或多个字符
- 下划线(_)通配符:匹配一个字符
- 聚合运算
- 聚合运算:将多行数据进行聚集计算为一行
- 聚合函数会对null以外的数据进行聚合运算

- 分组查询
- 分组后筛选
- 查询结果排序
- 限制查询结果数量
- select语句书写顺序
- select语句执行顺序
- 多表查询
- 连接查询
- 表之间关系
- 一对一
- 连接查询

- 一对多

- 多对多

- 连接方式
- 内连接
- 按照连接条件连接两个表,返回满足条件的行

select 字段1[,…] from 表1[ inner] join 表2 on 连接条件;
- 左连接

- 结果中除了包括满足连接条件的行外,还包括左表的所有行

select 字段1[,…] from 表1 left join 表2 on 连接条件;- 右连接
- 结果中除了包括满足连接条件的行外,还包括右表的所有行

select 字段1[,…] from 表1 right join 表2 on 连接条件;
- 笛卡尔积
- 假设集合A={a,b},集合B={1,2,3},则两个集合的笛卡尔积为{(a,1),(a,2),(a,3),(b,1),(b,2),(b,3)}
select 字段1[,…] from 表1,表2[,…];
- 消除笛卡尔积:
select 字段1[,…] from 表1,表2[,…] where 筛选条件;- 逐行判断,相等的留下,不相等的排除

- 消除笛卡尔积

- 自连接
- 连接条件
- 等值连接
- 通过设置表别名,将同一张表虚拟为多张表进行连接
- 表1.key=表2.key
- 不等值连接
- 表1.key 比较 表2.key
- 合并查询
- 把多条select语句的查询结果合并为一个结果集

- 被合并的结果集的列数、顺序和数据类型必须完全一致
union去重:select 字段1[,字段2,…] from 表名 union select 字段1[,字段2,…] from 表名;
select * from t1 union select * from t2;
- union all不去重:
select 字段1[,字段2,…] from 表名 union all select 字段1[,字段2,…] from 表名;
select * from t1 union all select * from t2;
- 子查询
- 一个select语句中包含另一个或多个完整的select语句
- 子查询分类
- 标量子查询:返回的结果是一个数据(单行单列)
- 行子查询:返回的结果是一行(单行多列)
- 列子查询:返回的结果是一列(多行单列)
- 表子查询:返回的结果是一张临时表(多行多列)
- 子查询常用操作符
- 子查询

- 常用函数
- 字符串函数
- 常用函数

- 数字函数

- 日期时间函数

- 开窗函数

- 查询结果保存
- 保存到一个新的表:
- 查询结果保存
create table 新表名 as select 查询语句;- 保存为外部文件:
select 查询语句 into outfile 保存路径;- 数据控制语言DCL
- 用来定义数据库的访问权限和安全级别
用来定义数据库访问权限和安全级别,常用命令:GRANT,REVOKE
- 用来定义数据库的访问权限和安全级别
SQL 书写要求
SQL语句可以单行或多行书写,用分号结尾。
SQL关键字用空格分隔,也可以用缩进来增强语句的可读性。
SQL对大小写不敏感。
用#或-- 单行注释,用/* */多行注释,注释语句不可执行。
MySQL 客户端常用工具
- MySQLd
- MySQL 服务核心进程。在 linux 环境下,启动时会被 MySQLd_safe 调用。只有它成功启动, 数据库实例才能正常运作。
- MySQLd_safe
- MySQL 实例的安全启动脚本,在 unix 和 netware 中推荐使用 MySQLd_safe 来启动
- MySQLd 服务器。MySQLd_safe 增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。它是 MySQLd 的守护进程。
- 命令行(CMD)
- 图形化工具(IDE)
- MySQL workbench
- Navicat
- SQLyog
修改密码
存储引擎
- InnoDB:事务型数据库的首选引擎,也是MySQL的默认事务型引擎,支持事务安全表(ACID),支持行锁定和外键
- 使用场景:由于其支持事务处理、外键、支持崩溃修复能力和并发控制。
- 如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。
- 如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
- MyISAM:在Web,数据仓储和其他应用环境下最常使用的存储引擎之一,拥有较高的插入、查询速度,但是不支持事务和外键
- 使用场景:如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。
- MEMORY:将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问
- 使用场景:如果需要该数据库中一个用于查询的临时表。
- ARCHIVE:仅仅支持最基本的插入和查询,它使用zilib压缩率,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用
- 使用场景:由于高压缩和快速插入的特点Archive非常适合作为日志表的存储引擎,但是前提是不经常对该表进行查询操作。
本文介绍了MySQL数据库的发展历程、下载安装,详细讲解了数据库、数据库管理系统与SQL的关系,以及SQL的基本概念和分类。深入探讨了MySQL的数据类型、数据完整性、表的增删改查、索引和存储引擎。此外,还涵盖了SQL的DML和DQL操作,包括数据的添加、更新、删除和查询。最后,提到了MySQL客户端工具和存储引擎的选择。
1083

被折叠的 条评论
为什么被折叠?



