MySQL学习笔记

MySQL学习笔记

  • 数据库是存储数据库对象的容器,而数据库对象是指存储、管理和使用数据的不同结构形式,主要包含表、视图、存储过程、函数、触发器和事件
  • 参考书籍:《MySQL数据库应用 从入门到精通》
  • 图形化管理软件:SQLyog

MySQL安装文件夹下的相关文件夹和文件的作用

  • bin文件夹:该文件夹下存放着可执行文件
  • include文件夹:该文件夹下存放着头文件
  • lib文件夹:该文件夹下存放着库文件
  • share文件夹:该文件夹下存放着字符集、语言等信息
  • my.ini文件:MySQL软件正在使用的配置文件

系统数据库

  • 系统数据库指安装完MySQL服务后,系统自带的一些数据库,记录一些必要的信息,用户不能直接修改这些数据库,各个数据库的作用如下:
  • information_schema:主要存储系统中的一些数据库对象信息,如用户表信息、列信息、权限信息、字符集信息和分区信息等
  • performance_schema:主要存储数据库服务器性能参数
  • mysql:主要存储系统的用户权限信息
  • sys:我也不知道是啥

用户数据库

用户数据库是用户根据实际需求创建的数据库

数据类型

详见P56,可以通过下面的命令查看你的数据库版本支持的数据类型

help data types;
#
查看具体的某一种数据类型
help int;

整数类型

  • tinyint
  • samllint
  • mediumint
  • intinteger
  • bigint

浮点数类型、定点数类型

  • float
  • double
  • decdecimal(定点数类型)

注:这两种数据类型都可存储小数,但定点数类型的精确度更高

位类型

  • bit

日期和时间类型

  • date 格式:2018-12-31
  • datetime 格式:2018-12-31 23:59:59
  • timestamp 时间串,没看明白,如果需要经常插入或更新日期为当前系统时间,一般选用该类 型。或者如果存储的日期需要让不同时区的用户使用,也可选用该类型,因为只有该类型日期能够与实际时区相对应
  • time 格式:23:59:59
  • year 格式:2018

备注:如何获取系统当前时间,可以利用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(M)
  • varchar(M)

备注:如果需要存储少量字符串,则可以选择char类型和varchar类型,置于选择哪一种,则需判断所存储的字符串长度是否经常变化,如果经常变化,则可以选择varchar类型,否则可以选择char类型

text系列字符串类型

  • tinytext
  • text
  • mediumtext
  • longtext

备注:如果需要存储大量字符串(存储文章内容的纯文本),则可以选择该系列字符串类型。根据所存储字符串的长度来决定具体选择哪一种字符串类型

注:以上两种类型只能存储字符数据,下面两种类型可以存储二进制数据

binary系列字符串类型

  • binary(M)
  • varbinary(M)

备注:该系列字符串类型可以存储二进制数据(如图片、音乐或视频文件)。如果存储少量二进制数据,可选择该系列类型。至于选择哪一个,如果存储的二进制数据长度经常变化则选择varbinary类型

blob系列字符串类型

  • tinyblob
  • blob
  • midiumblob
  • longblob

备注:该系列可以存储二进制数据。如果需存储大量二进制数据(存储电影等视频文件),则可以选择该系列类型。根据索要存储的二进制数据的长度决定具体选择哪一种类型

表的操作

表是包含数据库中所有数据的数据库对象。数据在表中的组织方式与在电子表格中相似,都是按照行和列的格式组织的。其中每一行代表唯一一条记录,每一列代表记录中的一个字段。

表中的数据库对象包含列索引触发器(详见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);  

  • 插入多条完整数据记录或插入多条部分数据记录,详见P171
  • 插入查询结果

除了插入新的数据记录到表中外,还可以将另一个表中的查询结果插入表中

# 字段的个数和数据类型要相同,详见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

索引的操作包含创建索引、修改索引和删除索引

InnoDBMyISAM存储引擎支持BTREEB-树)类型索引

MEMORY支持HASH类型索引

创建和查看索引

可以通过三种方式来创建索引,在创建表时创建索引、在已经存在的表上创建索引和通过SQL语句alter table创建索引

创建和查看普通索引

  • 创建表时创建普通索引,|表示或,两个关键字用哪个都可以

# 字段名1用来指定索引关联的字段的名称,长度用来指定索引的长度,asc参数用来指定为升序排序,desc参数用来指定为降序排序
create table table_name(
 
字段名 数据类型,
  ...
  ...
   
index|key 索引名(字段名1 (索引的长度) asc|desc)
);

  • 在已经存在的表上常见普通索引

create index 索引名 on 表名(字段名1 (索引的长度) asc|desc);

  • 通过SQL语句alter table创建普通索引

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);

  • 通过SQL语句alter table创建唯一索引

alter table table_name
  add unique index|key 索引名(字段名1 (索引的长度) asc|desc);

创建和查看全文索引

只能在存储引擎为MyISAM的数据库表上创建全文索引,全文索引主要关联的数据类型为charvarchartext的字段上,以便能够更加快速的查询数据量较大的字符串类型的字段

默认情况下,全文索引的搜索执行方式为不区分大小写,如果全文索引所关联的字段为二进制数据类型,则以区分大小写的方式执行

  • 创建表时创建全文索引

create table table_name(
 
字段名 数据类型,
  ...
  ...
   
fulltext index|key 索引名(字段名1 (索引的长度) asc|desc)
);

  • 在已经存在的表上常见全文索引

create fulltext index 索引名 on 表名(字段名1 (索引的长度) asc|desc);

  • 通过SQL语句alter table创建全文索引

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

注意:

  • 在使用关键字in进行集合查询时,如果查询的集合中存在NULL,则不会影响查询结果;如果使用关键字not in进行集合查询,如果查询的集合中存在NULL,则不会有任何的查询结果
  • 排序数据记录查询,关键字order by ,此时默认的排序是按升序(asc)进行排序
  • MySQL软件中,如果字段的值为空值(NULL),则该值为最小值。在排序查询时,按最小值处理
  • 按照多字段排序,首先按照第一个字段进行排序,如果遇到值相同的字段则会按照第二个字段进行排序,以此类推
  • 限制数据记录查询数量

select 字段 from 表名
 where condition
     limit 起始位置(起始偏移量),显示的行数;

  • 统计函数和分组数据记录查询

count()函数,统计表中记录的条数

avg()函数,计算字段值的平均值

sum()函数,计算字段值的综合

max()函数,查询字段值的最大值

min()函数,查询字段值的最小值

注意:count(*)可以实现对表中记录进行统计,不管表中字段包含的值是NULL值还是非NULL

       count(字段)可以实现对指定字段进行统计,不包含字段中的NULL

 

MySQL事务:

保证数据库记录的更新从一个一致性状态到另一个一致性状态。

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

  1. MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  2. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  3. 事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足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 开启自动提交

 

 

你可能感兴趣的:(MySQL学习笔记)