黑马程序员——MySQL数据库note

数据库note

  • 一、基础
    • 1.概念
    • 2.数据模型
    • 3.SQL
      • 3.1 DDL
      • 3.2 DML
      • 3.3 DQL
        • 基本查询
        • 条件查询
        • 聚合函数
        • 分组查询
        • 排序查询
        • 分页查询
        • 执行顺序
      • 3.4 DCL
    • 4.函数
    • 5.约束
    • 6.多表查询
      • 6.1 内连接
      • 6.2 外连接
      • 6.3 自连接
      • 6.4 联合查询
      • 6.5 嵌套查询
    • 7.事务
  • 二、进阶
    • 1.存储引擎
    • 2.索引(index)
      • 2.1 概述
      • 2.2 分类
      • 2.3 语法
      • 2.4 SQL性能分析
      • 2.5 索引使用


一、基础

1.概念

  • 数据库(DataBase):存储数据的仓库,数据被有组织地进行存储
  • 数据库管理系统(DataBase Management System):操纵和管理数据库的大型软件
  • SQL(Structured Query Language):操纵关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
    黑马程序员——MySQL数据库note_第1张图片

2.数据模型

  • 关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库
    黑马程序员——MySQL数据库note_第2张图片

3.SQL

SQL通用语法:

  • 语句可以单行或多行,以分号结尾
  • MySQL不区分大小写
  • 注释:-- 或 # 或 /**/

分类:

名称 说明
数据定义语言(Data Definition Language) 定义数据库对象(数据库、表、字段)
数据操作语言(Data Manipulation Language) 对数据库表中的数据进行增删改
数据查询语言 (Data Query Language) 查询数据控表中的记录
数据控制语言(Data Control Language) 创建数据库用户、控制数据库的访问权限

3.1 DDL

  1. 查询
    show databses;
  2. 查询当前数据库
    select databse();
  3. 创建
    create databse [if not exists] 数据库名 [default charset 字符集] [collate 排序规则;
  4. 删除
    drop databse [if exists] 数据库名;
  5. 使用
    use 数据库名;
  • 创建表
 create table 表名(
 	字段1 字段1类型 [comment 字段1注释],
 	...
 	字段n 字段n类型 [comment 字段n注释]
)[comment 注释];

MySQL数据类型
黑马程序员——MySQL数据库note_第3张图片
黑马程序员——MySQL数据库note_第4张图片
黑马程序员——MySQL数据库note_第5张图片

  • 对表查询
  1. 查询当前数据库的所有表
    show tables;
  2. 查询表结构
    desc 表名;
  3. 查询指定表的建表语句
    show create table 表名;

对表修改

  1. 添加字段
    alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];
  2. 修改数据类型
    alter table 表名 modify 字段名 新数据类型(长度)
  3. 修改字段名和字段类型
    alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
  4. 修改表名
    alter table 表名 rename to 新表名;
  5. 删除字段
    alter table 表名 drop 字段名;
  6. 删除表
    drop table [if exists] 表名;
  7. 清空表
    truncate table 表名;

3.2 DML

增加数据

  1. 给指定字段添加数据
    insert into 表名(字段名1,字段名2...) values(值1,值2,...);
  2. 给全部字段添加数据
    insert into 表名 values(值1,值2,...);
  3. 批量添加数据
    insert into 表名(字段名1,字段名2...) values(值1,值2,...),值1,值2,...),值1,值2,...),...;
    insert into 表名 values(值1,值2,...),值1,值2,...),值1,值2,...),...;
  • 插入数据时指定的字段顺序需与值的顺序一致
  • 字符串日期类型需要包含在引号中

修改数据
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];

删除数据
delete from 表名 [where 条件];


3.3 DQL

  • 语法
select
	字段
from
	表名
where
	条件
group by
	分组字段
having
	分组后条件
order by
	排序字段
limit
	分页参数

基本查询

  1. 查询多个字段
    select 字段1,字段2,... from 表名;
    select * from 表名;
  2. 设置别名
    select 字段1 [as 别名1]... from 表名;
    as可省略
  3. 去除重复记录
    select distinct 字段 from 表名;

条件查询

select 字段 from 表名 where 条件;

条件
黑马程序员——MySQL数据库note_第6张图片
黑马程序员——MySQL数据库note_第7张图片

聚合函数

select 聚合函数(字段) from 表名;

  • 将一列数据作为一个整体,进行纵向计算
  • null值不参与所有聚合函数运算

黑马程序员——MySQL数据库note_第8张图片

分组查询

select 字段 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

where与having的区别

  • 执行实际不同:where是分组前进行过滤,不满足where的条件,不参与分组;而having是分组后对结果进行过滤
  • 判断条件不同:where不能对聚合函数进行判断;having可以
    黑马程序员——MySQL数据库note_第9张图片
  • 执行顺序:where > 聚合函数 > having
  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段没有意义

排序查询

select 字段 from 表名 order by 字段1 排序方式1,...;

  • 升序:ACS(默认)
  • 降序:DESC

在这里插入图片描述

分页查询

select 字段 from 表名 limit 起始索引,查询记录数;

  • 起始索引从0开始,*起始索引=(查询页码-1)每页显示记录数
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中用limit
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10

执行顺序

黑马程序员——MySQL数据库note_第10张图片


3.4 DCL

管理用户

  1. 查询用户
    use mysql; select * from user;
  2. 创建用户
    create user '用户名'@'主机名' identified by '密码';
  3. 修改用户密码
    alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
  4. 删除用户
    drop user '用户名'@'主机名';
  • 主机名可以用%通配

权限控制
黑马程序员——MySQL数据库note_第11张图片

  1. 查询权限
    show grants for '用户名'@'主机名';
  2. 授权
    grant 权限 on 数据库名.表名 to '用户名'@'主机名';
  3. 撤销权限
    revoke 权限 on 数据库名.表名 from '用户名'@'主机名';
  • 可以用*表示所有数据库或表

4.函数

  • 函数是指一段可以直接被另一端程序调用的程序或者代码
  1. 字符串函数

黑马程序员——MySQL数据库note_第12张图片
2. 数值函数

黑马程序员——MySQL数据库note_第13张图片
3. 日期函数

黑马程序员——MySQL数据库note_第14张图片
4. 流程函数

黑马程序员——MySQL数据库note_第15张图片


5.约束

  • 作用于表中字段上的规则,用于限制存储在表中的数据
  • 保证数据库中数据的正确性、有效性、完整性

黑马程序员——MySQL数据库note_第16张图片

例子
黑马程序员——MySQL数据库note_第17张图片
黑马程序员——MySQL数据库note_第18张图片

外键:黑马程序员——MySQL数据库note_第19张图片

  • 添加外键:
create table 表名(
	字段名 数据类型,
	...
	[constraint] [外键名称] foreign key(外键字段名) refrences 主键(主键列表名)
);

alter table 表名 add constraint 外键名称 foreign key(外键字段名) refreences 主表(主表列名);
在这里插入图片描述

  • 删除外键
    alter table 表名 drop foreign key 外键名;

  • 外键约束
    黑马程序员——MySQL数据库note_第20张图片
    alter table 表名 add constraint 外键名称 foreign key(外键字段名) refreences 主表(主表列名) on update [外键约束] on delete [外键约束];


6.多表查询

  • 笛卡尔积:两个集合中所有的组合情况(在多表查询中,需要消除无效的字段)

黑马程序员——MySQL数据库note_第21张图片

6.1 内连接

  • 内连接查询的是两张表的交集部分
  • 隐式内连接:
    select 字段 from 表1,表2 where 条件;
  • 显式内连接:
    select 字段 from 表1 [inner] join 表2 on 条件;

黑马程序员——MySQL数据库note_第22张图片

6.2 外连接

  • 左外连接:
    select 字段 from 表1 left [outer] join 表2 on 条件;
  • 右外连接:
    select 字段 from 表1 right [outer] join 表2 on 条件;

6.3 自连接

select 字段 from 表A 别名A join 表A 别名B where 条件;
黑马程序员——MySQL数据库note_第23张图片

6.4 联合查询

  • 将多次查询的结果合并,形成一个新的查询结果集
  • 多张表的列数和字段类型必须一致
select 字段 from 表A
union [all]
select 字段 from 表B;

有all:不去除重复值
没有all:去除重复值

6.5 嵌套查询

  • 子查询可以出现在select、from、where中

  • 列子查询常用的操作符:
    黑马程序员——MySQL数据库note_第24张图片

  • 行子查询常用的操作符:=、<>、in、not in

例子

  • 列子查询:
    黑马程序员——MySQL数据库note_第25张图片
  • 行子查询:
    黑马程序员——MySQL数据库note_第26张图片
  • 表子查询
    黑马程序员——MySQL数据库note_第27张图片
    黑马程序员——MySQL数据库note_第28张图片

7.事务

  • 是一组操作的集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么根本不发生

事务操作

  • 查看事务提交方式
    select @@autocommit;
  • 设置事务提交方式
    set @@autocommit=0;
    (0为手动,1为自动)
  • 开启事务
    start transaction;begin;
  • 提交事务
    commit;
  • 回滚事务
    rollback;

事务的四大特性:

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么不发生
  • 一致性(Consistency):事务完成时必须使所有数据保持一致状态
  • 隔离性(Isolation):数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

并发事务问题

  • 脏读:一个事务读到另一个事务还没有提交的数据
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但在插入数据时又发现该数据已存在

事务隔离级别
黑马程序员——MySQL数据库note_第29张图片
安全性越来越高但性能越来越差

  • 查看事务隔离级别:
    select @@transaction_isolation;
  • 设置事务隔离级别
    set [session|global] transaction isolation level {隔离级别};

二、进阶

1.存储引擎

MySQL体系结构:
黑马程序员——MySQL数据库note_第30张图片
黑马程序员——MySQL数据库note_第31张图片

存储引擎

  • 存储数据、建立索引、更新/查询数据等技术的实现方式
  • 存储引擎是基于表的,而非基于库。因此也被叫做表类型
  • 指定存储引擎:在创建表时,在括号外加关键字engine=存储引擎类型;
  • 查看当前数据库支持的存储引擎:show engines;黑马程序员——MySQL数据库note_第32张图片
  1. InnoDB:高可靠性,高性能(是MySQL的默认存储引擎)

特点:

  • DML操作遵循ACID模型,支持事务
  • 行级锁,提高并发访问性能
  • 支持外键foreign key约束,保证数据的完整性和正确性
  • 文件:表名.ibd:每张表对应一个表空间文件,存储表的表结构、数据、索引

黑马程序员——MySQL数据库note_第33张图片

  1. MyISAM:MySQL早期的存储引擎

特点:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

文件:
.MYD:存放表的数据
.MYI:存放表的索引
.sdi:存放表的结构

  1. Memory:表数据存储在内存中。由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或者缓存使用

特点:

  • 内存存放,速度快
  • hash索引(默认)
  • 文件:.sdi:存放表结构信息

黑马程序员——MySQL数据库note_第34张图片

存储引擎的选择:

  • InnoDB:应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含更新、删除等操作
  • MyISAM:应用以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性和并发性要求不高
  • Memory:对表的大小有限制,太大的表无法缓存在内存中,且不能保障数据的安全性

2.索引(index)

2.1 概述

  • 是帮助MySQL高效获取数据有序数据库
    黑马程序员——MySQL数据库note_第35张图片

优点:

  • 提高查询效率和排序效率
    缺点:
  • 占用空间;降低了更新表的速度

MySQL的索引在存储引擎层实现的,不同的存储引擎有不同的存储结构

  • B+Tree索引:最常见的索引类型
  • Hash索引:底层数据结构是用hash表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
  • R-Tree索引(空间索引):用于地理空间数据类型
  • Full-text索引:通过建立倒排索引,快速匹配文档

黑马程序员——MySQL数据库note_第36张图片

Hash索引的特点:

  • 只能用于对等比较(=,in)不支持范围查询(between,<,>,…)
  • 无法利用索引完成排序操作
  • 查询效率高,通常只要一次检索

2.2 分类

黑马程序员——MySQL数据库note_第37张图片
黑马程序员——MySQL数据库note_第38张图片
黑马程序员——MySQL数据库note_第39张图片

黑马程序员——MySQL数据库note_第40张图片

黑马程序员——MySQL数据库note_第41张图片


2.3 语法

  • 创建索引
    create [unique][fulltext] index index_name on table_name(index_col_name,...);
  • 查看索引
    show index from table_name;
  • 删除索引
    drop index index_name on table_name

2.4 SQL性能分析

  1. SQL执行频率
    show global status like 'Com_______';有几个下划线代表几个字符
    黑马程序员——MySQL数据库note_第42张图片

  2. 慢查询日志

  • 记录所有执行时间超过指定参数的所有SQL语句的日志
  • MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息
#开启MySQL慢查询开关
slow_query_log=1;
#设置慢日志的时间
long_query_time=2;
  • 配置完毕后,通过指令查看慢查询日志中的信息/var/lib/mysql/localhost-slow.log
  1. profile详情
  • 了解时间耗费在哪里
  • 通过select @@have_profiling;查看是否支持profile
  • show profiles;查看每一条SQL的耗时情况
  • show profile for query query_id;查看指定query_id的SQL语句各阶段的耗时情况
  • show profile cpu foe query query_id;查看指定query_id的SQL语句的CPU使用情况
  1. explain执行计划
  • explain或desc命令获取MySQL如何执行select语句的信息,包括select语句执行过程中表如何连接和连接的顺序
  • 使用时只需在select前加上关键值explain或desc

各字段的含义

  • id:select查询的序列号,若id相同,执行顺序从上到小;id不同,值越大越先执行
  • select_type:表示select的类型,常见取值有simple、primary、union、subquery等
  • type:表示连接类型,性能由好到坏为NULL、system、const、eq_ref、ref、range、index、all
  • possible_key:显示可能应用在这张表上的索引,一个或多个
  • key:实际用到的索引
  • key_len:表示索引中使用的字节数,是最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好
  • rows:MySQL认为必须要执行查询的行数
  • filter:表示返回结果的行数占需读取行数的百分比,越大越好

2.5 索引使用

  1. 最左前缀法则
  • 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)

  • 联合索引中,出现范围查询(<,>)范围查询右侧的列索引失效,因此在条件允许的情况下尽量使用<=或>=

  1. 索引失效情况
  • 不要在索引列上进行运算操作,索引将失效
  • 字符串类型字段使用时,若不加引号,索引将失效
  • 头部模糊匹配时,索引将失效。(仅仅是尾部模糊匹配,索引不会失效)

你可能感兴趣的:(note,其他)