目录
- 术语
- SQL语句
- DDL、DML、DCL、约束
- 数据库管理
- 表管理
- 字段类型
- 表设计
- E-R图
- 三范式
- 增删改查表
- SQL语句
- 增删改查
- 多表关联
- 内连接
- 外链接
- 交叉连接
- 联合连接
- 自然连接
- 关键字、函数
- 字段索引
- 表引擎
一、RDBMS 术语
- 数据库:数据库是一些关联表的集合
- 数据表:表示数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格
- 列:一列(数据元素)包含了相同的数据,例如邮政编码的数据
- 行:一行(元组或记录)是一组相关的数据,例如一条用户订阅的数据
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性
- 主键:主键是唯一的,一个数据表中只能包含一个主键。你可以使用主键来查询数据
- 外键:外键用于关联两个表
- 复合键:复合键(组合键)将多个列作为一个索引建,一般用于复合索引
- 索引:使用索引可快速访问数据库中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录
- 参考完整性:参考的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性
二、SQL语句、DDL、DML、DCL、约束
- DDL(Data Definition Languages)语句:数据定义语句
- 这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键词主要包括create、drop、alter等
- DML(Data ManipulationLanguage)语句:数据操纵语句
- 用于添加、删除、更新、查询数据记录,并检查数据完整性,常用的语句关键词主要包括 insert、delete、update、select等
- DCL(Data Control Language)语句:数据控制语句
- 用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke等
- 约束
- 约束是用来限定表中数据准确性、完整性、一致性、联动性的一套规则(作用)。在mysql中,约束保存在informationschema数据库的tableconstraints中
- 约束分类
- NOT NULL(非空约束)
- UNIQUE(唯一约束)
- PRIMARY KEY(主键约束)
- FOREIGN KEY(外键约束,对应的字段只能是主键或唯一约束修饰的字段)
- CHECK(检查约束)
- AUTO_INCREMENT(自动增长)
- ZEROFILL(零充值)
- DEFAULT(默认)
- UNSIGNED(无符号位)
三、创建、删除、选择数据库
- 创建:create database 数据库名;
- 删除:drop database 数据库名;
- 选择:use 数据库名
四.1、mysql表管理-数据类型
- 整数
- tinyint 微小整数 1个字节 -128至127
- smailint 小整数 2个字节 -32768至32767
- int 整数 4个字节
- bigint 大整数 8个字节
- 小数
- 定点数(小数点位数是固定的)
- decimal(p,s)p代表总位数 s代表小数点位数
- 浮点数(小数点位数是不固定的)
- 单精度:float(p,s) 4个字节
- 双精度:double(p,s) 8个字节
- 定点数(小数点位数是固定的)
- 日期、时间
- date(只有日期,没有时间,eg:年月日)
- time(只有时间,没有日期,eg:时分秒)
- datetime (包含日期和时间,eg:年月日时分秒)
- timestamp(包含日期和时间,eg:年月日时分秒毫秒)
- 文本
- char(固定长度文本,eg:char(5))
- varchar(不固定文本,eg:varchar(5))
- text(大文本,无长度)
- 二进制
- bit
四.2 数据库表的设计
- 数据库设计基本步骤
- 需求分析阶段:分析客户的业务和数据处理需求
- 概要设计阶段:设计数据库的E-R模型图,确认需求信息的正确和完整
- 详细设计阶段:将E-R图转换为多张表,进行逻辑设计,并应用数据库设计的三大范式进行审核
- 代码编写阶段:选择具体的数据库进行物理实践,并编写代码实现前后端的数据存储应用
四.3 E-R图
四.4 范式
- 设计关系数据库时,需要遵守不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
- 最初范式定义了规范化的几个级别,范式用以定义具有最小冗余的表结构
- 三范式:
- 第一范式
- 如果每列都是不可再分的最小数据单元(院子单元),则满足第一范式。
- 目标是却表每列的原子性
- 第二范式
- 如果一个关系满足第一范式,并且除了主键以外的其他列,都完全依赖于主键,则满足第二范式。
- 要求每个表只描述一件事
- 第三范式
- 如果一个关系满足第二范式,并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式。
- 要求表中不存在冗余字段
- 第一范式
四.5 MYSQL创建、删除、更新表
- 创建
- 创建表的要素:表名、表属性、字段名、字段属性
- 示例:
create table if not exists 'tablename'( 'id' int unsigned auto_increment, 'title' varchar(100) not null, 'createTime' date, primary key ('id') )engine=InnoDB default charset=utf8;
- 解析:
- auto_increment定义列为自增的属性,一般用于主键,数值会自动增加1
- primary key 关键字用于定义列为主键
- engine 设置存储引擎
- charset 设置编码
- 删除
- 通用语法:
- drop table tablename;
- drop table [if exists] tablename1,tablename2;
- 解析
- 当你不再需要该表时,用drop
- 当你仍要保留该表时,但要删除所有记录时,用truncate
- 当你要删除部分记录时,同delete
- 说明
- dorp table table_name:删除表全部数据和表结构,立刻释放磁盘空间,不管是Innodb和MyISAM
- truncate table table_name:删除表全部数据,保留表结构,立刻释放磁盘空间,不管是Innodb和MyISAM
- delete from table_name:删除表全部数据,表结构不变,对于MyISAM会立刻释放磁盘空间,Innodb不会释放磁盘空间
- delete form table_name where xxx:带条件的删除,表结构不变,不管是Innodb和MyISAM都不会释放磁盘空间
- delete操作以后,使用optimize table table_name 会立刻释放磁盘空间,不管是Innodb和myisam
- delete form 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分的空间
- 通用语法:
- 更新
- 查看表基本结构语句
- desc 表名
- 查看表详细结构语句
- show create table 表名
- 修改表名
- alter table 旧表名 rename to 新表名
- 修改字段的数据类型
- alter table 表名 modify 字段名 数据类型
- 修改字段名
- alter table 表名 change 旧字段名 新字段名 新数据类型
- 添加字段
- alter table 表名 add 新字段名 数据类型
- 添加有完成性约束条件的字段
- alter table 表名 add 新字段名 数据类型 约束
- 在表的第一列添加一个字段
- alter table 表名 add 新字段名 数据类型 first
- 在标的指定列添加一个字段
- alter table 表名 add 新字段名 数据类型 after 字段名
- 删除字段
- alter table 表名 drop 字段名
- 修改字段的排列位置
- alter table 表名modify 字段1 数据类型 first|after 字段2
- 更改表的存储引擎
- alter table 表名 engine=新引擎名
- 删除表的外键约束
- alter table 表名 rop foreign key 外建名
- 删除数据库
- drop table [is exists] 表1,表2,表3, ┅;
- 查看表基本结构语句
五.1 MYSQL增删改查数据命令
- 插入语句 insert into
- 所有列都插入值(列-值同数,同序):insert into 表名 values (值1,值2,值3);
- 为特定的列插入值(可以指定顺序,列-值对应):insert into 表名(字段1,字段2) values (值1,值2);
- 一次性插入多条记录:Insert into 表名(字段1,字段2) values (值1,值2),(值1,值2);
- 删除语句
- 使用delete语句:delete form 表名 [where 条件];如果没有指定where字句,MySQL表中的所有记录将被删除
- 使用truncate语句(不能增加where条件,清空所有数据):truncate table 表名
- 修改语句
- 修改全部数据:update 表名 set 字段名=值;
- 修改特定数据:update 表名 set 字段名=值 where 字段名2=值;
- 多字段条件修改
- update 表名 set 字段名1=值1,字段名2=值2 [where 条件] 可以同时更新一个或多个字段
- eg:
- 当我们需要将字段中的特定字符串批量修改为其他字符串时:
- update 表名 set 字段名=replace(字段名,‘旧字符’,‘新字符’)[where 条件]
- 查询语句
select 字段1,字段2 from 表名 where ... group by ... having ... order by ... 通用语法: select 字段1,字段2 from 表名 where 条件 - 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件 - SELECT 命令可以读取一条或者多条记录 - 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据 - 可以使用 LIMIT 属性来设定返回的记录数 - 可以使用order by 字段 desc/asc进行排序 - 可以使用group by 字段名 进行分组 执行顺序: from指定数据来源 where 指定条件,进行筛选 group by 将数据进行分组 聚合函数 having 筛选分组 order by 排序
五.2 MYSQL常见的关键字、函数
- 关键字
- like 模糊查询
- between 在x和x之间
- order by 排序,升序(asc),降序(desc)
- select 查询
- distinct 去重
- where 对查询数据进行条件约束
= 等于 <>或者!= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于
-
between and 在某个范围内
-
LIKE 搜索某种模式
-
and & or & not 逻辑运算符
-
limit 分页
-
in 规定多个值
-
exists 存在
-
as 别名
-
having 字句(增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用)
-
is null 空值
-
is not null 非空
-
group by 分组(筛选分组结果)
1、在使用group by 字句时,可用having字句为分组统计进一步设置统计条件, having字句与group by字句的关系相当于where字句与select字句之间的关系 2、余where字句的区别是,在having字句中是以聚合函数的统计结果为筛选条件
-
函数
-
聚合函数
-
sum 求和
-
count 统计个数
-
max\min 最大值、最小值
-
avg 平均值
聚合函数 支持的数据类型 描述 sum() 数字 对指定列中的所有非空值求总和 avg() 数字 对指定列中的所有非空值求平均值 min() 数字、字符、datetime 返回指定列中的最小数字、最小的字符串、最早的日期 max() 数字、字符、datetime 返回指定列中的最大数字、最大的字符串、最近的日期 count() 任意基于行的数据类型 统计结果集合中全部记录行的数量
-
-
日期和时间函数
-
返回当前日期
-
curdate()
-
current_date()
-
curdate()+0 可以将当前日期转换为数值型
-
-
返回当前时间
-
curtime()
-
current_time()
-
current_time()+0 可以将当前时间转换为数值型
-
-
返回当前日期和时间
-
current_timestamp()
-
lacaltime()
-
now()
-
sysdate()
-
-
获取月份
-
month(date)
-
monthname(date)
-
-
获取星期
-
dayname(date)
-
dayofweek(date)
-
weekday(date)
-
week(date)
-
weekofyear(date)
-
-
获取天数
-
dayofyear(date)
-
dayofmonth(date)
-
-
获取年、季度、小时、分钟、秒
-
year(date)
-
quarter(date)
-
minute(time)
-
second(time)
-
-
-
数学函数
-
绝对值
-
abs(数值)
-
-
符号
-
sign(数值)
-
-
获取随机数
-
rand(数值)
-
rand
-
-
获取整数的函数
-
ceil(数值)/ceiling(数值)
-
floor(数值)
-
-
四舍五入函数
-
round(数值)
-
round(数值,小数位个数)
-
truncate(数值,小数位个数)
-
-
求余数
-
mod(数值,被除数)
-
-
幂运算函数
-
pow(数值,小数位个数)
-
power(数值,小数位个数)
-
exp(数值)
-
sqrt(数值)
-
-
角度弧度互换函数
-
radians(数值)
-
degrees(数值)
-
-
圆周率函数
-
pi()
-
-
三角函数
-
sin(数值)
-
asin(数值)
-
cos(数值)
-
acos(数值)
-
tan(数值)
-
atan(数值)
-
cot(数值)
-
-
-
字符串函数
-
计算字符数和字符串长度
-
char_length(s) 字符
-
length(s) 字节
-
-
合并字符串函数
-
concat(s1,s2)如果一个字符为空,则值为空
-
concat_ws(分隔符,s2,s3)
-
-
替换字符串函数
-
insert(s1,s1的下标位置,截止数,s2代替字符)
-
replace(s,原字符串,代替字符串)
-
-
截取字符串的函数
-
left(s,左侧个数)
-
right(s,右侧个数)
-
-
重复生成字符串ha函数
-
repeat(s,n)
-
-
大小写转换函数
-
lower(x)大--小
-
lcase(x)大--小
-
upper(x)小--大
-
ucase(x)小--大
-
-
填充字符串的函数
-
lpad(s1,len,s2)
-
rpad(s1,len,s2)
-
-
删除空格函数
-
ltrim(s)
-
rtrim(s)
-
trim(s)
-
-
获取子字符串
-
subsring(s,n,len)
-
mid(s,n,len)
-
-
返回指定位置字符串函数
-
elt(n,s1,s2...)
-
-
返回指定字符串位置
-
field(s,s1,s2...)
-
-
-
系统函数
-
获取mysql数据库版本号
-
version()
-
-
查看当前用户的连接数
-
connection_in()
-
-
查看当前所有数据库
-
database()
-
schema()
-
-
获取用户名的函数
-
user()
-
current_user()
-
system_user()
-
session_user()
-
-
-
五.3 MYSQL多表连接
主要分:内连接(等值连接),外连接(左向外连接,右向外连接),交叉连接,联合连接,自然连接
- 内连接(inner join)
- 有两种,显式和隐式
- 返回连接表中符合连接条件和查询条件的数据行
- 相连接的两张表地位平等
- 所谓的链接表就是数据库在做ch查询形成的中间表
隐式的内连接,没有inner join, 形成的中间表为俩个表的笛卡尔积 from字句后面直接出现多个表名,这种连接方式就是因室内连接 显式的内连接,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积 select * from table1 [inner] join table2 on table1.col = table2.col
- 如果一张表中在另一张表中不存在对应数据,则不做连接
- 外链接
-
外链接可以是左向外连接、右向外链接或全外连接(mysql不支持全外连接)
-
区别
-
outer 关键字是可省略的
-
共同点是都返回符合连接条件和查询条件的数据行
-
不通点:
-
左外链接还返回左表中不符合连接条件但符合查询条件的数据行
-
右外连接还返回右表中不符合连接条件但符合查询条件的数据行
-
全外连接还返回左表中不符合连接条件但符合查询条件的数据行,并且还返回右表中不符合连接条件但符合查询条件的数据行。全外连接实际是左外连接和右外连接的数学集合(去掉重复),即全外=“左外 union 右外”
-
-
在from子句中指定外连接时,可以由下列几组关键字中的一组指定:
-
left join 或 left outer join
-
左向外连接的结果集包括 left outer 子句中指定的做表的所有行,而不仅仅是连接列所匹配的行。
-
如果左表的某行在右表中没有匹配行,则在相关联的结果集合中右表的所有选择列表均为空值
-
-
right join 或 right outer join
-
右向外连接是左向外连接的反向连接
-
将返回右表的所有行
-
如果右表的某行在左表中没有匹配行,则将为左表返回空值
-
-
full join 或 full outer join
-
完整外部连接返回左表和右表的所有行
-
当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值
-
如果表之间没有匹配行,则整个结果集行包含基表的数据值
-
-
-
外连接特点
-
做连接的两个表地位不平等,其中有一张是基础表
-
基础表中的每条数据必须出现,即使另一张表中没有数据与之匹配,也要用null补齐
-
左外连接时左表时基础表,右外连接时右表时基础表
-
语句中先出现的表为“左表”,后出现的表为“右表”
-
-
-
-
交叉连接
- 交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。 - 交叉联接也称作笛卡尔积 - 显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积 - 隐式的交叉连接,没有CROSS JOIN - 显式的交叉连接,使用CROSS JOIN。
-
联合连接(union all)
-
oracle、mysql均不支持
-
在数据分析中排错中比较常用
-
作用与特点
-
可以把多条查询语句所产生的结果集纵向连接为一体
-
有all关键词可以显示全部数据(即重复的也显示出来)
-
列的数量与类型都要兼容
-
-
-
自然连接(natural inner join)
-
sql2标准中定义
-
几乎不用
-
五.4 MYSQL字段索引
- MySQL做一年的建立对于mysql的高效运行是很很重的,索引可以大大提高MySQL的检索速度。
- eg:
- 如果合理的设计且使用索引的mysql是一辆兰博基尼的话,那么没有设计和使用苏欧锦的mysql就是一个脚蹬三轮车
- 索引分:单列索引、组合索引
- 单列索引:即一个索引值包含单个列,一个表可以由多个单列索引,但这不是组合索引。
- 组合索引:即一个索引包含多个列。
- 索引应用:
- 该索引应用在sql查询语句的条件(一般作为where字句的条件)
- 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
- 索引缺点:
- 过多的使用索引将会造成滥用。
- 虽然缩影大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete。
- 因为更新表时,mysql不仅要保存数据,还要保存一下索引文件。
- 建立索引会占用磁盘空间的索引文件。
- 普通索引
- 这是最基本的索引,它没有任何限制
- 创建索引
create index indexName on 表名(字段名(length)); 如果是char,varchar类型,length可以小于字段实际长度; 如果是blob和text类型,必须指定length。
- 修改表结构(添加索引)
alert table 表名 add index indexName(字段名)
- 创建表的时候,指定索引字段
create table 表名( id int not null, 字段名 varchar(16) not null, index [indexName] (字段名(length)) );
- 删除索引
drop index [indexName] on 表名;
- 唯一索引
- 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
- 创建索引
create unique index indexName on mytable(username(length))
- 修改表结构
alter table mytable add unique [indexName] (username(length))
- 创建表的时候直接指定
create table mytable( id int not null, username varchar(16) not null, [indexName] (uesrname(length)) );
- 创建索引
- 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
- 使用alter命令添加和删除索引
- 有四种方式来添加数据表的索引:
- alter table tablename add primary key(columnlist)
- 该语句添加一个逐渐,这意味着索引值必须是唯一的,且不能为null。
- alter table tblname add unique indexname (column_list)
- 这条语句创建索引的值必须是唯一的(除了null外,null可能会出现多次)。
- table tblname add index indexname(column_list)
- 添加普通索引,索引值可出现多次。
- alter table tblname add fulltext indexname(column_list)
- 该语句指定了索引为 fulltext,用于全文索引。
- alter table tablename add primary key(columnlist)
- 有四种方式来添加数据表的索引:
- 使用alter 命令添加和删除主键
- 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(not null)
- alter table testalter_tbl modify i int not null;
- alter table testalter_tbl add primary key(i);
- 你可以使用alter命令删除主键
- alter table testalter_tbl drop primary key;
- 删除主键时只需指定primary key,但在删除索引时,你必须知道索引名。
- 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(not null)
- 显示索引信息
- 可以使用show index 命令来列出表中的相关的索引信息。可以通过添加\G 来格式化输出信息
- show index from table_name \G
- 可以使用show index 命令来列出表中的相关的索引信息。可以通过添加\G 来格式化输出信息
五.5 mysql锁、表引擎
- 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足。
- 在DBMS中,可以按照锁的粒度把数据库锁分为:
- 行级锁(innodb引擎)
- 表级锁(myisam引擎)
- 页级索(bdb引擎)
- 行级锁
- 行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但是加锁的开销最大。行级锁分为共享锁和排它锁。
- 特点:
- 开销大,加锁慢
- 会出现死锁
- 锁粒度最小,发生锁冲突的概率最低,并发度也最高
- 表级锁
- 表级锁是mysql中锁定粒度最大的一种锁,表示多当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。最常用的myisam与innodb都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排它锁)。
- 特点:
- 开销小,加锁快
- 不会出现死锁
- 锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 页级索
- 页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁
- 特点:
- 开销和加锁时间介于表级锁和行级锁之间
- 会出现死锁
- 锁定粒度介于表级锁和行级锁之间,并发度一般