mysql面试常考知识点

该文章借鉴了不一样平台对知识点的描述。java

一、存储引擎的区别

1.1 InnoDB 和MYISAM 存储引擎的区别?

InnoDB:mysql

  • InnoDB 存储引擎支持事务、支持外键、支持非锁定读、行锁设计其设计主要面向OLTP 应用。
  • InnoDB 存储引擎表采用汇集的方式存储,所以每张表的存储顺序都按主键的顺序存放,若是没有指定主键,InnoDB 存储引擎会为每一行生成一个6字节的ROWID并以此做为主键。
  • InnoDB 存储引擎经过MVCC 获的高并发性,并提供了插入缓冲、二次写、自适应哈希索引和预读等高性能高可用功能
  • InnoDB 存储引擎默认隔离级别为REPEATABLE_READ(重复读)并采用next-key locking(间隙锁)来避免幻读

MySIAM:sql

  • MYISAM 存储引擎不支持事务、表锁设计、支持全文索引其设计主要面向OLAP 应用
  • MYISAM 存储引擎表由frm、MYD 和MYI 组成,frm 文件存放表格定义,MYD 用来存放数据文件,MYI 存放索引文件。MYISAM 存储引擎不同凡响的地方在于它的缓冲池只缓存索引文件而不缓存数据文件,数据文件的缓存依赖于操做系统。

操做区别:数据库

  • MYISAM 保存表的具体行数,不带where 是可直接返回。InnoDB 要扫描全表。
  • DELETE 表时,InnoDB 是一行一行的删除,MYISAM 是先drop表,而后重建表
  • InnoDB 跨平台可直接拷贝使用,MYISAM 不行
  • InnoDB 表格很难被压缩,MYISAM 能够

选择:缓存

  • MyISAM相对简单因此在效率上要优于InnoDB。若是系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。
  • InnoDB 更适合系统读少,写多的时候,尤为是高并发场景。

 

二、索引

2.一、什么是索引?你知道Mysql 有哪些索引?

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构安全

(数据库是磁盘文件,磁盘IO 的代价较高,因此采用索引减小IO 次数)服务器

Mysql 中经常使用的索引有B+ 树索引(包括普通索引、惟一索引、主键索引),哈希索引,全文索引,R-TREE 索引(空间索引,主要用于地理空间数据类型,不多使用)网络

Mysql 传统意义上的索引为B+ 树索引,B+ 树索引的本质就是B+ 树在数据库中的实现,因为B+ 树的高扇出性,数据库中的B+ 树的高通常为2-4层,所以查找某一键值的行记录只需2-4次IO,大概0.02~0.04秒。session

(扇出性:是指该模块直接调用的下级模块的个数。扇出大表示模块的复杂度高,须要控制和协调过多的下级模块)

数据结构

B+ 树索引

主要分为汇集索引和辅助索引。

汇集索引是根据每张表的主键建造的一棵B+ 树,叶子节点中存放的是整张表的行记录。一张表只能有一个汇集索引。由于汇集索引在逻辑上是连续的,因此它对于主键的排序查找和范围查找速度很是快。

辅助索引与汇集索引不一样的地方在于,辅助索引不是惟一的,它的叶子节点只包含行记录的部分数据以及对应汇集索引的节点位置。经过辅助索引来查找数据时,先遍历辅助索引找到对应主键索引,再经过主键索引查找对应记录。

在MYISAM 中主键索引和辅助索引都至关上述辅助索引,索引页中存放的是主键和指向数据页的偏移量,数据页中存放的是主键和该主键所属行记录的地址空间。惟一的区别是MYISAM 中主键索引不能重复,辅助索引能够。

从使用上来讲还有联合索引和覆盖索引。

联合索引是指对表上的多个列进行索引。它对对应多个列的指定获取比较快。另一个好处是联合索引对第二个键已经排好序了,因此对两个列的排序获取能够避免多作一次排序操做。

覆盖索引其实更算一种思想,可以从辅助索引中获取信息,就不须要查询汇集索引中的数据。使用辅助索引的好处在于辅助索引包含的信息少,因此大小远小于汇集索引,所以能够大大减小IO 操做。

哈希索引是一种自适应的索引,数据库会根据表的使用状况自动生成哈希索引,咱们人为是没办法干预的。

InnoDB 储存引擎采用的哈希函数为除法散列方式,采用的冲突处理方法为链地址法。它指定查询的速度很快,可是范围查询就无能为力了。

全文索引用于实现关键词搜索。但它只能根据空格分词,所以不支持中文。

2.二、索引的优缺点?那些状况适合建索引那些状况不适合建索引?

索引的优势:

  • 经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性。
  • 能够大大加快 数据的检索速度,这也是建立索引的最主要的缘由。
  • 能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义。
  • 在使用分组和排序 子句进行数据检索时,一样能够显著减小查询中分组和排序的时间。
  • 经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。

索引的缺点  

  • 建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。
  • 索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大。
  • 当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。

扩展

聚簇索引和非聚簇索引:

哪些状况须要加索引?

  • 在常常须要搜索的列上,能够加快搜索的速度;
  • 在做为主键的列上,强制该列的惟一性和组织表中数据的排列结构;
  • 在常常用在链接的列上,这些列主要是一些外键,能够加快链接的速度;
  • 在常常须要根据范围进行搜索的列上建立索引,由于索引已经排序,其指定的范围是连续的;
  • 在常常须要排序的列上建立索引,由于索引已经排序,这样查询能够利用索引的排序,加快排序查询时间;
  • 在常用在WHERE子句中的列上面建立索引,加快条件的判断速度

哪些状况不须要加索引?

  • 对于那些在查询中不多使用或者参考的列不该该建立索引。这是由于,既然这些列不多使用到,所以有索引或者无索引,并不能提升查询速度。相反,因为增长了索引,反而下降了系统的维护速度和增大了空间需求。
  • 对于那些只有不多数据值的列也不该该增长索引。这是由于,因为这些列的取值不多,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即须要在表中搜索的数据行的比例很大。增长索引,并不能明显加快检索速度。
  • 对于那些定义为text, image和bit数据类型的列不该该增长索引。这是由于,这些列的数据量要么至关大,要么取值不多。
  • 当修改性能远远大于检索性能时,不该该建立索引。这是由于,修改性能和检索性能是互相矛盾的。当增长索引时,会提升检索性能,可是会下降修改性能。当减小索引时,会提升修改性能,下降检索性能。所以,当修改性能远远大于检索性能时,不该该建立索引。

三、事务

3.一、什么是事务,它有哪些特性?说一说事务的隔离级别,分别解决了什么问题?

什么是事务,它有哪些特性?

事务就是一组原子性的操做,这些操做要么所有发生,要么所有不发生。事务把数据库从一种一致性状态转换成另外一种一致性状态。

事务具备ACID 四种特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability):

  • 原子性,指的是事务是一个不可分割的操做,要么全都正确执行,要么全都不执行。
  • 一致性,指的是事务把数据库从一种一致性状态转换成另外一种一致性状态,事务开始前和事务结束后,数据库的完整性约束没有被破坏。
  • 隔离性要求每一个读写事务相互之间是分开的,在事务提交前对其余事务是不可见的
  • 持久性,指的是事务一旦提交,其结果就是永久性的,即便宕机也能恢复。

事务的隔离级别,分别解决了什么问题?

事务有4 个隔离级别,分别是:

  • 读未提交(read uncommit)
  • 读已提交(read commit)
  • 可重复读(repeatable read)
  • 和序列化(serializable)。

隔离级别依次提升,分别解决了脏读、不可重读和幻读。

  1. 脏读:事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据
  2. 不可重复读:事务 A 屡次读取同一数据,事务 B 在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果 不一致。
  3. 幻读:系统管理员A将数据库中全部学生的成绩从具体分数改成ABCDE等级,可是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉同样,这就叫幻读
  4. InnoDB 默认隔离级别为repeatable read,可是经过next-key lock 解决了幻读,保证了ACID。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表

3.2事务的实现原理?事务的分类?使用事务应该注意的问题?

事务的实现原理?

事务是基于重作日志(redo log)文件和回滚日志(undo log)实现的

每提交一个事务必须先将该事务的全部日志写入到重作日志文件进行持久化,数据库就能够经过重作日志来保证事务的原子性和持久性。

每当有修改事务时, 还会产生undo log,若是须要回滚, 则根据undo log反向语句进行逻辑操做,好比insert一条记录就delete一条记录。undo log主要实现数据库的一致性, 还能够用来实现MVCC。

事务的分类?

  • 扁平事务
  • 带有保存点的扁平事务
  • 链事务
  • 嵌套事务
  • 分布式事务

使用事务应该注意的问题?

  • 不要在循环中使用事务(循环提交会致使大量的redo log)
  • 不要使用自动提交
  • 不要使用自动回滚
  • 长事务切分处理

四、SQL优化

4.一、sql优化的通常步骤?

a.经过show status命令了解各SQL执行的频率

show [session|global] status like “Com_%”;
  • session:当前链接执行的统计结果
  • global:上一次数据库启动至今的统计结果

常见的执行参数

  • Com_select:执行查询的次数
  • Com_insert:执行插入的次数
  • Com_update:执行更新的次数
  • Com_delete:执行删除的次数
  • Com_rows_read:执行查询的返回行数(触类旁通:inserted、updated、deleted)
  • Connection:试图链接Mysql 服务器的次数
  • Uptime:服务器工做时间
  • Slow_queries:慢查询次数
    1 mysql> show global status like "
    2 Slow_queries";
    3 +---------------+-------+
    4 | Variable_name | Value |
    5 +---------------+-------+
    6 | Slow_queries  | 0     |
    7 +---------------+-------+
    8 1 row in set

     

b. 定位执行效率最低的sql语句

能够经过两个办法定位效率较低的SQL 语句:

  • 经过慢查询日志定位执行效率低的SQL,可是只能在查询完事后
  • 使用show processlist 命令查看当前Mysql 正在进行的线程,包括线程状态、是否锁表

c.经过EXPLAIN 分析低效SQL 的执行计划

查询到效率低的sql 语句后,能够经过EXPLAIN 分析低效SQL 的执行计划。

mysql> explain select * from comment 
;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | comment | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   92 |      100 | NULL  |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set

mysql> 
  • select_type: 表示select 的类型,常见取值有SIMPLE(简单表,即不使用表链接或者子查询)、PRIMARY、UNION、SUBQUERY等。
  • table: 输出结果集的表
  • type: 表示Mysql 的访问方式(从上到下依次变快)
    • type=all,全表扫描,Mysql 遍历全表来找到匹配的行
    • type=index,Mysql 遍历整个索引来找到匹配的行
    • type=range,索引范围扫面
    • type=ref,使用非惟一索引扫描或惟一索引的前缀扫描
    • type=eq_ref,使用惟一索引
    • type-const/system,单表中最多只有一个匹配行
    • type=NUll,MySQL 不用访问表或者索引就能直接获得结果
  • possible_key: 表示查询时可能用到的索引
  • key: 表示实际用到的索引
  • key_len: 使用到索引字段的长度
  • rows: 扫描行的数量
  • Extra: 执行状况的说明和描述。

d.经过show profile 分析SQL

//默认不开启profile,使用时先开启profile
mysql> set profiling=1;
Query OK, 0 rows affected

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set

//在InnoDB 下获取表行数
mysql> select count(*) from comment;
+----------+
| count(*) |
+----------+
|       92 |
+----------+
1 row in set

// 查开执行时间
mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 |  0.0109785 | select @@profiling           |
|        2 | 0.05502275 | select count(*) from comment |
+----------+------------+------------------------------+
2 rows in set

//具体查开每一步执行时间
mysql> show profile for query 2
;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 9.2E-5   |
| checking permissions | 9E-6     |
| Opening tables       | 2E-5     |
| init                 | 1.8E-5   |
| System lock          | 9E-6     |
| optimizing           | 0.054635 |  //在优化处理耗时最多
| statistics           | 5.6E-5   |
| preparing            | 1.7E-5   |
| executing            | 5E-6     |
| Sending data         | 8E-5     |
| end                  | 5E-6     |
| query end            | 1.5E-5   |
| closing tables       | 9E-6     |
| freeing items        | 3.6E-5   |
| cleaning up          | 1.9E-5   |
+----------------------+----------+
15 rows in set

mysql> 

f. 还能够经过trace 分析优化器如何选择执行计划的(有兴趣能够看一下)

 

4.2经常使用的SQL 的优化

a.对大批量插入数据

  • MYISAM 表

能够经过DISABLE KEY 和 ENABLE KEY 关闭和打开MYISAM 表索引的更新来提升效率。

1 ALTER TABLE table_name DISABLE KEY //在导入数据前关闭索引更新
2 loading the data
3 ALTER TABLE table_name ENABLE KEY //导入完成后开启

 

  • InnoDB 表
    • 按主键顺序导入
    • 关闭惟一性检验,导入后再开启
    • 关闭自动提交,导入后再开启

b.优化INSERT 语句

  • 同一个客户端,应使用多个值表的insert 语句,这种方式能够大大缩减客户端与数据库之间的链接、关闭等消耗。
    insert into table_name values(1,2)(1,3)(1,4)...
  • 从不一样的客户端插入的话,能够采用INSERT DELAYED 语句得到更高的速度。它的意思是让INSERT 语句立刻执行,由于数据都被放在内存的队列中,并无真正写入磁盘。
  • 从文本文件装载一个表时,使用LOAD DATA INFILE 一般比INSERT 快20 倍。
  • 将索引文件和数据文件分放在不一样的磁盘上(利用建表中的选项)。
  • 若是是批量插入,MYISAM 能够经过改变bulk_insert_buffer_size (插入缓存容量大小)变量值提升速度。

c 优化order by 语句

  • 在MySQL 数据库中有两种排序方式:
    • 经过有序索引扫描直接返回有序数据
    • 经过对返回数据进行排序(Filesort 排序)
  • 其中Filesort 会多排一次序,因此在使用order by 语句的时候尽可能用到索引。下面的规则是能够用到索引的状况:
    • where 和 order by 使用相同的索引
    • order by 的顺序和索引的顺序相同
    • order by 的字段都是升序或都是降序
  • 同理用不到索引的状况:
    • order by 的字段混合ASC 和DESC
    • 用于查询行的关键字与ORDER BY 中所使用的不一样
    • 对不一样的关键字使用order by

d. 优化group by 语句

默认状况下group by 语句对分组的数据进行排序操做,若是不须要排序操做能够经过order by null 禁止排序。

e. 优化嵌套语句

若是能够的话,特别是where 中包含索引的状况,用join 语法来代替嵌套语法(in)由于join 不须要在MySQL 的内存中建立临时表。

f. 优化or语句

对于含有or 的查询语句,若是要利用索引,则or 之间的每个条件都必须用到索引,若是没用索引,能够考虑增长索引。不然会全表扫面。

g. 优化分页查询

通常分页查询时,经过建立覆盖索引可以比较好的提升性能。一个常见又头痛的场景是"limit 1000,20" 此时MySQL 排序出前1020 条数据后,只须要返回20条数据,查询和排序的代价都很高。有两种优化方案

  • 在索引上完成排序分页的操做,最后根据主键关联查询须要的内容,让MySQL 扫描尽量少的页面来提升分页操做。
     1 mysql> explain select comment_id,comment_content from comment order by comment_create_time limit 50,5;
     2 +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
     3 | id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
     4 +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
     5 |  1 | SIMPLE      | comment | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   92 |      100 | Using filesort |
     6 +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+----------------+
     7 1 row in set
     8 
     9 mysql> explain select a.comment_id,a.comment_content from comment a inner join(select comment_id from comment order by comment_create_time limit 50,5)b on a.comment_id=b.comment_id ;
    10 +----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
    11 | id | select_type | table      | partitions | type   | possible_keys | key     | key_len | ref          | rows | filtered | Extra          |
    12 +----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
    13 |  1 | PRIMARY     | <derived2> | NULL       | ALL    | NULL          | NULL    | NULL    | NULL         |   55 |      100 | NULL           |
    14 |  1 | PRIMARY     | a          | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | b.comment_id |    1 |      100 | NULL           |
    15 |  2 | DERIVED     | comment    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL         |   92 |      100 | Using filesort |
    16 +----+-------------+------------+------------+--------+---------------+---------+---------+--------------+------+----------+----------------+
    17 3 rows in set
  • 把limit 查询转换成某个位置的查询,limit m,n -> limit n

h. 使用SQL 提示

SQL 提示是优化数据库的一个重要手段,经常使用的SQL 提示:

  • USE INDEX

推荐数据库使用某个索引,可让Mysql 再也不考虑其余可用索引

 1 sql语句 use index(index_name); 

  • IGNORE INDEX

忽视数据库某个索引,可让Mysql 再也不考虑这个索引

 1 sql语句 ignore index(index_name); 

  • FORCE INDEX

强迫数据库使用某个索引,使用use index 数据库仍是可能不用这个索引,可是force index 数据库必须使用这个索引

 1 sql语句 force index(index_name); 

五、sql语句 force index(index_name)

5.一、数据库的三大范式

第一范式:

确保每列的原子性(强调的是列的原子性,即列不可以再分红其余几列).若是每列(或者每一个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则知足第一范式.

例如:顾客表(姓名、编号、地址、……)其中"地址"列还能够细分为国家、省、市、区等。

第二范式:

在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关(一是表必须有一个主键;二是没有包含在主键中的列必须彻底依赖于主键,而不能只依赖于主键的部分)若是一个关系知足第一范式,而且除了主键之外的其它列,都依赖于该主键,则知足第二范式.

例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

第三范式:

在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖).若是一个关系知足第二范式,而且不依赖于除了主键之外的其它列,则知足第三范式.

为了理解第三范式,须要根据Armstrong千米之必定义传递依赖。假设A、B和C是关系R的三个属性,若是A-〉B且B-〉C,则从这些函数依赖中,能够得出A-〉C,如上所述,
依赖A-〉C是传递依赖。

例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,知足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客
编号"相关,"顾客编号"和"订单编号"又相关,最后通过传递依赖,"顾客姓名"也和"订单编号"相关。为了知足第三范式,应去掉"顾客姓名"列,放入客户表中。

 

5.二、 什么是存储过程?有哪些优缺点?

存储过程是一些预编译的SQL语句。

优势:

  • 存储过程是一个预编译的代码块,执行效率比较高
  • 存储过程在服务器端运行,减小客户端的压力
  • 容许模块化程序设计,只须要建立一次过程,之后在程序中就能够调用该过程任意次,相似方法的复用
  • 一个存储过程替代大量T_SQL语句 ,能够下降网络通讯量,提升通讯速率
  • 能够必定程度上确保数据安全,对于没有权限执行存储过程的用户,也可受权他们执行存储过程。

缺点:

  • 可移植性不灵活(由于存储过程依赖于具体的数据库)
  • 不便于调试。
  • 没办法应用缓存。虽然有全局临时表之类的方法能够作缓存,但一样加剧了数据库的负担。若是缓存并发严重,常常要加锁,那效率实在堪忧。
  • 没法适应数据库的切割(水平或垂直切割)。数据库切割以后,存储过程并不清楚数据存储在哪一个数据库中。

5.3 说一说drop、delete与truncate的区别?

  • drop直接删掉表有关的一切(数据/结构/约束…),不会记录日志,为DDL(Data Definition Language,数据库定义语言)操做。
  • truncate 删除表中全部数据(再插入时自增加id又从1开始),该操做也不会记录日志因此比较快,为DDL操做。只能删table。
  • DELETE语句执行删除的过程是每次从表中删除一行,须要记录日志,比较慢,能够加where 语句,为DML(Data Manipulation Language, 数据操纵语言)。能够删table 和view 。
  • 速度上drop > truncate > delete

5.4 什么是视图?以及视图的使用场景有哪些?

  视图是一种虚拟的表,具备和物理表相同的功能,没有物理存储。能够对视图进行增,改,查,操做,试图一般是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得咱们获取数据更容易,相比多表查询。

使用场景:

  • 只但愿用户查看特定信息的列
  • 来源于多个表,能够建立视图提取咱们须要的信息,简化操做。

5.5 超键、候选键、主键、外键分别是什么?

超键:在关系中能惟一标识元组的属性集称为关系模式的超键。一个属性能够为做为一个超键,多个属性组合在一块儿也能够做为一个超键。超键包含候选键和主键。

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以惟一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另外一个表的主键称此表的外键

5.6 Mysql 的几种链接方式?

  • 内链接:inner join on

组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。

  • 左链接:left join on / left outer join on

left join 是left outer join的简写,它的全称是左外链接,是外链接中的一种。
左(外)链接,左表(a_table)的记录将会所有表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

  • 右链接:right join on / right outer join on

right join是right outer join的简写,它的全称是右外链接,是外链接中的一种。
与左(外)链接相反,右(外)链接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会所有表示出来。左表记录不足的地方均为NULL。

  • 全链接

MySQL目前不支持此种方式,能够用其余方式替代解决。

5.7 说一说什么是Mysql 的完整性约束?

完整性约束是对字段进行限制,从而符合该字段达到咱们指望的效果好比字段含有默认值,不能是NULL等, 主要有惟1、自增、主键、外键约束

1 PRIMARY KEY (PK)    标识该字段为该表的主键,能够惟一的标识记录
2 FOREIGN KEY (FK)    标识该字段为该表的外键
3 NOT NULL    标识该字段不能为空
4 UNIQUE KEY (UK)    标识该字段的值是惟一的
5 AUTO_INCREMENT    标识该字段的值自动增加(整数类型,并且为主键)
6 DEFAULT    为该字段设置默认值
7 
8 UNSIGNED 无符号
9 ZEROFILL 使用0填充

 

参考文章:https://blog.csdn.net/qq_36906627/java/article/details/86634518