MySQL学习笔记
MySQL安装文件夹下的相关文件夹和文件的作用
系统数据库
用户数据库
用户数据库是用户根据实际需求创建的数据库
数据类型
详见P56,可以通过下面的命令查看你的数据库版本支持的数据类型
help data types;
# 查看具体的某一种数据类型
help int;
整数类型
浮点数类型、定点数类型
注:这两种数据类型都可存储小数,但定点数类型的精确度更高
位类型
日期和时间类型
备注:如何获取系统当前时间,可以利用select查看相关函数的输出
# curdate返回样例2018-08-18 now返回样例2018-08-18 15:00:30
select curdate(),now();
# 如何进一步获取时间或年份信息,获取时间time(now())返回样例15:00:30,获取年份year(now()),返回样例2018
select curdate(),now(),time(now()),year(now());
字符串类型
char系列字符串类型
备注:如果需要存储少量字符串,则可以选择char类型和varchar类型,置于选择哪一种,则需判断所存储的字符串长度是否经常变化,如果经常变化,则可以选择varchar类型,否则可以选择char类型
text系列字符串类型
备注:如果需要存储大量字符串(存储文章内容的纯文本),则可以选择该系列字符串类型。根据所存储字符串的长度来决定具体选择哪一种字符串类型
注:以上两种类型只能存储字符数据,下面两种类型可以存储二进制数据
binary系列字符串类型
备注:该系列字符串类型可以存储二进制数据(如图片、音乐或视频文件)。如果存储少量二进制数据,可选择该系列类型。至于选择哪一个,如果存储的二进制数据长度经常变化则选择varbinary类型
blob系列字符串类型
备注:该系列可以存储二进制数据。如果需存储大量二进制数据(存储电影等视频文件),则可以选择该系列类型。根据索要存储的二进制数据的长度决定具体选择哪一种类型
表的操作
表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似,都是按照行和列的格式组织的。其中每一行代表唯一一条记录,每一列代表记录中的一个字段。
表中的数据库对象包含列、索引、触发器(详见P65)
表的基本操作包含创建表、查看表、删除表、修改表,主要是针对表的结构进行的操作
创建表
# 这里的属性名即字段名,后面跟字段的数据类型,还可以约束条件,这里没有写
create table table_name(
属性名 数据类型,
属性名 数据类型,
.
.
属性名 数据类型
);
查看表结构
注意不是查看表中存储的数据,而是查看表的定义信息,包含字段、数据类型等
describe table_name;
# 或
desc table_name;
# 另一种查看表的详细结构,包含表名、字段、数据类型、索引、数据库引擎、默认字符类型等
show create table table_name;
删除表
drop table table_name;
修改表
MySQL数据库提供了SQL语句“alter table”来修改表的结构
# 修改表名
alter table old_table_name rename new_table_name;
# 增加字段
# 在表的最后一个位置增加字段
alter table table_name
add 属性名 属性类型;
# 在表的第一个位置增加字段
alter table table_name
add 属性名 属性类型 first;
# 在表的指定字段之后增加字段
alter table table_name
add 属性名 属性类型
after 属性名;
# 删除字段
alter table table_name
drop 属性名;
# 修改字段
# 修改字段的数据类型
alter table table_name
modify 属性名 数据类型;
# 修改字段的名字
alter table table_name
change 旧属性名 新属性名 旧数据类型;
# 同时修改字段的名字和数据类型
alter table table_name
change 旧属性名 新属性名 新数据类型;
# 修改字段的顺序
alter table table_name
modify 属性名1 数据类型 first;
或modify 属性名1 数据类型 after 属性名2;
操作表的约束
如果想针对表中的数据做一些完整性检查操作,可以通过表的约束来完成(说的什么玩意)
# 设置非空约束,该字段对应的数据不能为空
create table table_name(
字段名 数据类型 not null,
...
...
);
# 设置字段的默认值,如果新插入的数据记录该字段没有插入数值即空值,则会使用默认值
create table table_name(
字段名 数据类型 default 默认值,
...
...
);
# UK,设置唯一约束,使该字段上的数据不允许重复
create table table_name(
字段名 数据类型 unique,
...
...
);
# PK,设置主键约束,可以使表中的某个字段唯一的标识所有记录,是为了便于数据库管理系统快速的查找表中的记录,在具体设置主键约束时,必须满足主键字段的值是唯一的、非空的
# 单字段主键
create table table_name(
字段名 数据类型 primary key,
...
...
);
# 多字段主键
create table table_name(
字段名 数据类型,
...
...
constraint 主键约束名 primary key(字段名1,字段名2...)
);
# 设置字段值自动增加,当为数据库表中插入新数据时,字段上的值会自动生成唯一的ID,第一行记录该字段值默认为1,之后新添加的每一行记录该字段的值都会在前一行记录该字段对应的值的基础上加1,所以注意,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。因为该约束会使字段生成唯一的ID,所以该字段也经常会设置成PK主键,一般会同时设置该字段为主键和自增长
create table table_name(
字段名 数据类型 auto_increment,
...
...
);
# FK,设置外键约束
# 外键约束用于构建两个表的两个字段之间的参照关系,例如表一是一个公司的部门表,该表中的字段branch表示部门,该字段下的值是一些部门的名字研发部、营销部之类的,表二是雇员名单,该表有个同样的字段branch或其他名字吧表示该职员所在的部门,那么该字段的值必然是表一branch字段下值的某一个,这时候可以设置表二中的字段branch为外键约束,并参考表一的主键约束字段branch,这样在表二中添加记录时如果员工的部门值不在表一branch字段包含的值中,则会报错
# 注:设置外键约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以设置为null,子表外键中所设置外键字段的数据类型必须与父表中所参考的字段的数据类型一致
# 字段名1表示该子表中需要设置外键约束的字段名,表名是要参考的字段所在的父表的名字,字段名2表示父表中要参考的字段名
create table table_name(
字段名 数据类型,
...
...
constraint 外键约束名 foreign key(字段名1)
reference 表名(字段名2)
);
数据的操作
对数据的操作是指对表中的数据进行插入数据记录、查询数据记录、更新数据记录和删除数据记录
插入数据记录
该操作可以向表中增加新的数据记录(不是更新已经存在的数据记录),MySQL提供了SQL语句“insert into”来实现插入数据记录,包含:插入完整数据记录、插入数据记录一部分、插入多条数据记录、插入查询结果
# 语句1(注意数值和字段要一一对应)
insert into table_name(field1,field2,......,fieldn)
values(value1,value2,......,valuen);
# 语句2(因为是插入完整的记录,所以可以省略字段部分,简洁,我更常用)
insert into table_name values(value1,value2,......,valuen);
有时需要插入部分指定字段的数据记录,适用于该行中没有数值插入的字段有“自动增加”约束或有“默认值”约束,注意这里是插入新的一行数据不是更新指定字段的数据
# fieldn表示表中部分字段的名字,valuen表示要插入的部分数值,注意一一对应
insert into table_name(field1,field2,......,fieldn)
valuse(value1,value2,......,valuen);
除了插入新的数据记录到表中外,还可以将另一个表中的查询结果插入表中
# 字段的个数和数据类型要相同,详见P174
insert into table_name(field1,field2,...,fieldn)
select (field1,field2,...,fieldn)
from table_name2
where...
更新数据记录
该操作可以更新表中已经存在的数据记录中的值,语句“update",包含更新特定数据记录,更新所有数据记录
# condition指定更新满足条件的特定数据记录
update table_name
set field1=value1,
field2=value2
where condition;
详见P180
删除数据记录
详见P184,语句“delete from"
delete from table_name
where condition;
索引的操作
为什么索引速度更快?
DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数
在数据库中,数据库对象表是存储和操作数据的逻辑结构,而数据库对象索引则是一种有效组合数据的方式。通过索引可以快速查到数据库对象表中的特定记录,是一种高性能的常用方式,详见P106
索引的操作包含创建索引、修改索引和删除索引
InnoDB和MyISAM存储引擎支持BTREE(B-树)类型索引
MEMORY支持HASH类型索引
创建和查看索引
可以通过三种方式来创建索引,在创建表时创建索引、在已经存在的表上创建索引和通过SQL语句alter table创建索引
创建和查看普通索引
# 字段名1用来指定索引关联的字段的名称,长度用来指定索引的长度,asc参数用来指定为升序排序,desc参数用来指定为降序排序
create table table_name(
字段名 数据类型,
...
...
index|key 索引名(字段名1 (索引的长度) asc|desc)
);
create index 索引名 on 表名(字段名1 (索引的长度) asc|desc);
alter table table_name
add index|key 索引名(字段名1 (索引的长度) asc|desc);
创建和查看唯一索引
所谓唯一索引,就是在创建索引时,限制索引的值必须是惟一的。当设置表中的某个字段为主键或唯一完整性约束时,系统会自动创建关联该字段的唯一索引
create table table_name(
字段名 数据类型,
...
...
unique index|key 索引名(字段名1 (索引的长度) asc|desc)
);
create unique index 索引名 on 表名(字段名1 (索引的长度) asc|desc);
alter table table_name
add unique index|key 索引名(字段名1 (索引的长度) asc|desc);
创建和查看全文索引
只能在存储引擎为MyISAM的数据库表上创建全文索引,全文索引主要关联的数据类型为char、varchar和text的字段上,以便能够更加快速的查询数据量较大的字符串类型的字段
默认情况下,全文索引的搜索执行方式为不区分大小写,如果全文索引所关联的字段为二进制数据类型,则以区分大小写的方式执行
create table table_name(
字段名 数据类型,
...
...
fulltext index|key 索引名(字段名1 (索引的长度) asc|desc)
);
create fulltext index 索引名 on 表名(字段名1 (索引的长度) asc|desc);
alter table table_name
add fulltext index|key 索引名(字段名1 (索引的长度) asc|desc);
创建和查看多列索引
详见P118
删除索引
drop index index_name on table_name;
视图的操作
视图,本质上是一种虚拟表,其内容与真实表相似,包含一些带有名称的列和行数据。但,视图并不在数据库中以存储的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且具体引用视图时动态生成
视图的特点如下:
视图的操作包括创建视图、查看视图、删除视图和修改视图
创建视图
这里只写出了最基本的创建视图的语法,更多语法详见P132
create view view_name
as 查询语句;
查看视图
# show tables语句查看视图名,返回数据库中所有的表和视图,因为视图时虚拟的表
show tables;
# 查看视图的详细信息,会返回数据库中所有表和视图的详细信息
show table status from database_name \G
# 只查看视图的详细信息
show table status from database_name like "view_name" \G
# 查看视图定义信息
show create view view_name \G
# 查看视图设计信息
describe|desc view_name;
# 通过系统数据库查看,在数据库系统安装成功后会自动创建系统数据库information_schema,在该数据库中存在一个包含视图信息的表格views,可以通过views查看所有关于视图的相关信息
# 注意该语句中table_name是关键字,跟之前语句中的table_name表示表的名字不同
select * from views where table_name='view_name' \G
删除视图
drop view view_name1,...,view_name2;
修改视图
# 方式一,本质是通过先删除再创建视图
create or replace view view_name
as 查询语句;
# 方式二
alter view view_name
as 查询语句;
利用视图操作表
可以通过视图检索(查询)基本表数据和利用视图操作基本表数据(添加数据、删除数据和更新数据)
select * from view_name;
详见P150
单表数据记录查询
详见P191
简单数据记录查询
# 避免重复数据查询
select distinct 字段名 from 表名;
# 修改字段名显示,注意并不是修改表中的字段名,只是在查询的时候以别名显示,方便查看
select field1 as otherfield1 from table_name;
# 注意,这里的as也可以省去不要
# 设置显示格式的数据查询,MySQL数据库提供了connect()来连接字符串
条件数据记录查询
详见P199
注意:
select 字段 from 表名
where condition
limit 起始位置(起始偏移量),显示的行数;
count()函数,统计表中记录的条数
avg()函数,计算字段值的平均值
sum()函数,计算字段值的综合
max()函数,查询字段值的最大值
min()函数,查询字段值的最小值
注意:count(*)可以实现对表中记录进行统计,不管表中字段包含的值是NULL值还是非NULL值
count(字段)可以实现对指定字段进行统计,不包含字段中的NULL值
MySQL事务:
保证数据库记录的更新从一个一致性状态到另一个一致性状态。
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交