mysql中自动增值不连续 mysql自动增长语句_数据库


数据库概述

一、数据库简介

1.什么是数据库

我们可以把它理解为商场里存放货物的仓库,仓库中的货物不是杂乱无章的堆放,而是分门别类来陈列的。一个仓库里有多个存储货物的房间,每个房间有多个货架,每个货架有多个隔层用来存放不同的物品。数据库也是一样,它是按照一定的数据结构来组织、存储和管理数据的仓库。


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_02


我们使用数据库可以存储千万级以上的数据量,相对于文件管理来说,数据存储量和运行效率大大提升。同时也可以设置约束条件来保证数据的一致性和完整性,并且可以实现多个用户同时访问、共享数据,通过设置不同用户的访问权限可以保证数据的安全性,所以在企业数据管理中都会使用数据库来组织和存储数据

2.数据库分类

数据库按照不同的数据结构可以分为关系型数据库和非关系型数据库。

2.1关系型数据库

关系型数据库中存放的是结构化数据集,它是由固定列和任意行构成的二维表结构的数据。

主流的关系型数据库:

  • Oracle:运行稳定、功能齐全、性能超群,适用于大型企业。
  • DB2:速度快、可靠性好、处理海量数据急速高效,适用于大中型企业。
  • MySQL:开源、体积小、速度快,适用于中小型企业。
  • SQL server:全面高效、界面友好易操作,适用于中小型企业。

2.2非关系型数据库

非关系型数据库存放的是非结构化数据集,例如用户的聊天记录、拍摄的图片、录制的视频等等。

常用的非关系型数据库:NOSQL、mongoDB等。

3.表结构的特点

表结构中的表是来源于关系型数据库中的table,关系型数据库中的数据都是以表结构进行存储的,它是数据分析工具中最基本的数据存储结构。


mysql中自动增值不连续 mysql自动增长语句_字段_03


  • 由固定列和任意行构成的表结构的数据集
  • 表中的列称为字段,表中的行称为记录
  • 以字段为基本的存储单位和计算单位
  • 每一个字段必须有字段名,且同一个表中的字段名不能重复
  • 每个字段的数据类型必须一致

二、MySQL简介

1.MySQL发展历程

最早是由瑞典MySQL AB公司开发,仅供内部使用。2000年基于GPL协议开放源码,2008年MySQL AB公司被Sun公司收购,2009年Sun公司又被Oracle公司收购。有了Oracle公司的技术支持,MySQL在2010年以后发布了多个版本,在各方面加强了企业级的特性。

2.数据库、数据库管理系统和SQL之间的关系

  • 数据库:长期存储在计算机内、有组织的、统一管理的相关数据的集合。
  • 数据库管理系统:用于管理数据库的软件,它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
  • SQL:一种结构化查询语言(Structure Query Language),它是国际标准化组织(ISO)采纳的标准数据库语言。


mysql中自动增值不连续 mysql自动增长语句_数据库_04


三、SQL语言

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

1.SQL语言分类

SQL语言按照不同的功能可以分为以下四类:

  • 数据定义语言DDL:用于创建,修改,删除数据库中的各种对象(数据库、表、视图、索引等),常用命令有CREATE,ALTER,DROP
  • 数据操作语言DML:用于操作数据库表中的记录,常用命令有INSERT,UPDATE,DELETE
  • 数据查询语言DQL:用于查询数据库表中的记录,基本结构:SELECT <字段名> FROM <表或视图名> WHERE <查询条件>
  • 数据控制语言DCL:用于定义数据库访问权限和安全级别,常用命令:GRANT,REVOKE

2.SQL书写要求

  • SQL语句可以单行或多行书写,用分号结尾
  • SQL关键字用空格分隔,也可以用缩进来增强语句的可读性
  • SQL对大小写不敏感
  • 可用#或-- 单行注释,用/* */多行注释,注释语句不可执行

数据定义

数据定义语言是对数据库管理系统中的对象进行增删改查的操作。

一、定义数据库

数据库是专门存储数据对象的容器,这里的数据对象包括表、视图、触发器、存储过程等,其中表是最基本的数据对象。

1.创建数据库

在 MySQL 数据库中存储数据对象之前,先要创建好数据库。


create


  • 数据库名称不能与SQL关键字相同
  • 同一个数据库管理系统中的数据库名称不能重复

2.查看数据库

在 MySQL 中,可查看当前用户权限范围以内的数据库。


show


3.选择数据库

在 MySQL 中,use 语句用来完成一个数据库到另一个数据库的跳转。创建数据库之后,该数据库不会自动成为当前数据库,需要用 USE 来指定当前数据库,才能对该数据库及其存储的数据对象执行操作。


use


4.删除数据库

在 MySQL 中,删除数据库的同时会删除数据库中存储的所有对象和数据,因此需谨慎使用。


drop


5.数据库基本结构

因为一个数据库管理系统可以管理多个数据库,一个数据库中可以有多张数据表,一个表中可以有多个字段,因为数据库是以字段为单位进行存储和计算的,所以同一个表中的字段名不可以重复,每个字段的数据类型必须一致,否则是不允许存储的。


mysql中自动增值不连续 mysql自动增长语句_数据_05


那么我们在存储数据之前需要先创建表,创建表需要指定表名、字段名以及每个字段的数据类型和约束条件,其中表名、字段名和数据类型是必须指定的,约束条件可以不指定。

二、数据类型

数据库中每个字段都有适当的数据类型,用于限制或允许该字段中存储的数据。

MySQL中支持三种数据类型:数值型、字符串型、日期和时间型。

不同的数据类型提供不同的取值范围,可以存储的值范围越大,所需的存储空间也会越大。因此应根据

实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。

1.数值型

数值型分为整数型和小数型。


mysql中自动增值不连续 mysql自动增长语句_数据_06


  • int整数型,包括正数和负数,我们可以指定它的最大长度,如果不指定它默认最多存储11位数。
  • float小数型,默认最多存储10位数,其中8位整数2位小数。
  • decimal十进制小数型,适合金额、价格等对精度要求较高的数据存储。默认decimal(10,0),表示最多10位数字,其中0位小数。

2.字符串型

字符串型主要用来存储不能进行数学运算的文本数据,还可以存储图片和声音的二进制数据。


mysql中自动增值不连续 mysql自动增长语句_数据_07


  • char存储定长字符串,可以指定字符长度,如char(10),不论存储数据是否达到10个字节,都会占用10个字节的空间(自动用空格填充),如’abc ',提取数据时需要用trim()去掉多余的空格。因为长度固定,方便程序的存储和查找,存取效率比较高。
  • varchar存储可变长度字符串,可以指定字符长度,如varchar(10),占用实际字符长度的存储空间,如’abc’。
  • text长文本字符串型,最大长度65535,不能指定长度。

3.日期时间型

日期时间型用于存储日期和时间格式的数据。


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_08


  • date为‘yyyy-MM-dd’格式的日期类型。
  • time为‘hh:mm:ss’格式的时间类型。
  • datetime为‘yyyy-MM-dd hh:mm:ss’格式的日期时间型。
  • timestamp为时间戳,表示从1970-01-01 00:00:00到指定日期一共过了多少秒。

在数据库中字符串和日期时间型的数据都需要用引号括起来。

三、约束条件

约束条件是在表和字段上强制执行的数据检验规则,它是为了防止不规范的数据进入数据库,在我们对数据执行插入、修改、删除等一系列操作的时候,数据库管理系统会自动按照指定的约束条件对数据进行监测,它主要是对空值和重复值的检测,来保证数据存储的完整性和准确性。

按照约束的不同功能,MySQL中常用的约束条件有以下六种。

1.主键约束

主键是表中非空不重复的字段,它可以唯一的标识表中的一条记录。作为主键的字段取值不能为空,也不可以重复,并且一张表中只能有一个主键,但是构成主键的字段可以是一个也可以有多个。也就是说主键只能有一个,但是一个主键可以由多个字段构成,当多个字段的取值完全一样的情况下才会违反主键约束。

添加主键约束的方法1:


creat


添加主键约束的方法2:


create


删除主键约束的方法:


alter


2.唯一约束

唯一约束要求指定字段的数据取值不能重复,可以是空值,但是空值也只能出现一次。

添加唯一约束的方法1:


creat


添加唯一约束的方法2:


creat


删除唯一约束的方法:


alter


如果单个字段没有指定唯一约束名,则默认的唯一约束名为字段名。如果是多个字段组合为唯一约束时候,默认的唯一约束名为第一个字段的名称。如果指定了约束名,则删除的时候写约束名。

3.自动增长约束

自动增长约束是要求指定字段的数据取值自动增长,默认是从1开始,每增加一条记录,这个字段的取值就会加1,所以它只适用数值型和日期时间型字段,并且要配合主键一起使用。

添加字段增长约束的方法:


creat


删除自动增长约束的方法:


alter


4.非空约束

非空约束是要求指定字段的取值不能为空值。

非空约束的方法:


creat


删除非空约束的方法:


alter


5.默认约束

默认约束是指在插入新记录的时候,如果没有为指定字段赋值,数据库管理系统会自动为这个字段赋值为默认约束设定的值。

添加默认约束的方法:


creat


删除默认约束的方法:


alter


6.外键约束

外键约束是指一个表中的字段取值依赖于另一个表中字段的值。主键所在的表叫主表,外键所在的表叫从表。每一个外键值必须与主表中的主键值相对应。

添加外键约束的方法:


creat


删除外键约束的方法:


alter


  • 先删除从表再删除主表。
  • 先删除外键约束,再删除表。

7.检查约束(check)

指定需要检查的限定条件


creat


删除检查约束的方法:


alter


四、索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询数据库表中数据。

1.索引的意义

索引用于快速找出在某个字段中有特定值的行。如果不使用索引,MySQL必须从第一条记录开始检索表中的每一条记录,直到找出相关的行,那么表越大,查询数据所花费的时间就越多。如果在表中查询的字段有索引,MySQL能够快速到达一个位置去检索数据文件,而不需要再去查看所有数据,那么将会节省很大一部分查询时间。

2.索引的优缺点

所有MySQL的字段类型都可以添加索引,但是索引也不是越多越好,而是要根据业务数据合理的使用。

2.1优点

  • 通过索引对数据进行检索,大大提高了数据的查询效率

2.2缺点

  • 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引也需要占空间的,创建的索引太多,索引文件也会占用数据库的存储空间。
  • 当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

3.创建索引的原则

需要创建索引的情况:

  • 主外键和唯一约束的字段自动创建索引
  • 频繁作为查询条件的字段应该创建索引
  • 查询中排序的字段应该创建索引
  • 查询中分组或统计的字段应该创建索引

不需要创建索引的情况:

  • 表中记录太少不需要创建索引
  • 需要频繁增删改的字段不适合创建索引
  • where子句中用不到的字段不需要创建索引
  • 重复值较多的字段不需要创建索引

4.索引的结构

索引是在存储引擎中实现的,使用不同的存储引擎,所支持的索引也是不同的。

在mysql中常用两种索引结构BTree和Hash,两种算法检索方式不一样,对查询的作用也不一样。

MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引。


mysql中自动增值不连续 mysql自动增长语句_数据_09


MySQL的InnoDB存储引擎是支持hash索引的,不过我们必须启用,hash索引的创建由InnoDB存储引擎自动优化创建,我们干预不了。

5.索引的类型

索引的类型可以分类以下几种:

  • 普通索引:最基本的索引,没有任何限制
  • 唯一索引:索引字段的取值不能重复,可以有空值,但空值也只能出现一次。
  • 主键索引:索引字段的取值不能为空,也不能重复。
  • 组合索引:一个索引包含多个字段,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
  • 全文索引:通过关键字符,就能找到该字段所属的记录行。仅限MyISAM引擎,且只能在CHAR,VARCHAR,TEXT类型的字段上使用。
  • 空间索引:对空间数据类型(GEOMETRY、POINT、LINESTRING、POLYGON)的字段建立的索引,仅限MyISAM引擎,且要求索引字段的取值不能为空。

6.索引的操作

实际上索引也是一张表,创建索引时,数据库管理系统会在本地磁盘建立索引文件,里面保存了索引字段,并指向实体表的记录。

6.1创建索引

创建表的同时须指定索引名、表名和字段名。


create


自动创建索引:

  • 在表中定义了主键约束时,会自动创建一个对应的主键索引。
  • 在表中定义了外键约束时,会自动创建一个对应的普通索引。
  • 在表中定义了唯一约束时,会自动创建一个对应的唯一索引。

6.2查看索引


show


6.3使用索引

在查询语句中使用索引会大大提升数据的检索速度。

6.4删除索引

删除索引只是删除了表中的索引对象,表中的数据不会被删除。


drop


五、定义数据表

数据库中的数据是存储在基本表中的,所以需要先创建数据表再添加数据。

1.创建表

创建表的同时指定表名、字段名以及每个字段的数据类型和约束条件。


create


  • <表名>:表名不可与SQL关键字相同,同一个数据库中的表名不可重复。
  • <字段名>:字段名不可与SQL关键字相同,同一个表中的字段名不可重复。
  • <约束条件>:约束条件可以不指定

2.查看表

在当前数据库中可以查看创建好的数据表。


show


创建好数据表之后,可以查看表结构。


describe


  • Null:表示该字段是否可以存储 NULL 值。
  • Key:表示该字段是否已编制索引。PRI 表示主键,UNI 表示 UNIQUE 唯一索引,MUL 表示某个给定值
  • 允许出现多次。
  • Default:表示该字段是否有默认值,如果有,值是什么。
  • Extra:表示可以获取的附加信息,如 AUTO_INCREMENT 等。

3.修改表

为实现数据库中表规范化设计,有时候需要对已经创建的表进行结构修改或调整。

3.1修改表名


alter


3.2修改字段名


alter


3.3修改字段类型


alter


3.4添加新字段


alter


3.5修改字段的排列位置


alter


3.6删除字段


alter


4.删除表

删除表指删除表结构的同时删除表中数据,因此需谨慎使用。


drop


可删除多张表,if exists避免表不存在时报错。

六、定义视图

视图是存储在数据库中的虚拟表,视图中不保存数据,内部封装了一条SELECT语句,数据来源于查询的一个或多个基本表。视图的结构和基本表相同,也是由行和列构成的二维表,也可以进行增删改查的操作。视图中的数据依赖于基本表中的数据,表中数据发生改变,显示在视图中的数据也会改变,同样,在视图中对数据执行增删改的操作,基本表中的数据也会同步更新。

1.视图的作用

为了减少代码的重写,或增加代码的重复利用。所以如果语句只需要用一次或一两句,就没有必要单独写视图。

2.视图的优缺点

2.1优点

  • 简单:简化SQL语句,快速提取数据。视图可以将复杂的查询语句进行封装,用户使用时不需要关心表的结构、连接关系、筛选条件、分组和排序等等,只需要对视图进行简单的查询。
  • 安全:保护数据,根据特定授权分配权限。创建视图时,可以筛选掉一些不希望用户看到的行和列,也可以给视图设置访问权限,让不同级别的用户看到不同的视图,从而提高数据库的数据安全性。

2.2缺点

  • 操作视图会比直接操作基础表要慢,所以我们尽量避免在大型表上创建视图。
  • 尽量不要创建嵌套视图,就是在视图中使用视图。 这样在查询时,会多次重复访问基础表,带来性能损耗。
  • 在视图中只返回所需的信息,尽量不要在视图使用不需要访问的表。
  • 在大型表或者复杂定义的视图,可以使用存储过程代替。
  • 频繁使用的视图,可以使用索引视图来代替。

3.创建视图


create


4.查看视图


desc


5.使用视图


select


6.修改视图

修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。


create


7.更新视图

因为视图本身没有数据,因此对视图中的数据进行的操作最终都体现在基本表中。

更新视图的三种语法:update、insert和delete


update


当然,不是所有的视图都可以更新,有下列内容之一,视图不能做更新:

  • select子句中包含distinct ;
  • select子句中包含组函数 ;
  • select语句中包含group by子句 ;
  • select语句中包含order by子句 ;
  • select语句中包含union 、union all等集合运算符 ;
  • where子句中包含相关子查询 ;
  • from子句中包含多个表 ;
  • 如果视图中有计算列,则不能更新;
  • 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作

8.删除视图

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说基本表中的数据不会被删除。


drop



数据操作

数据操作语言(DML)是对表中记录进行添加(INSERT)、更新(UPDATE)、删除(DELETE)等操作。

一、添加数据

向表中添加数据时,字段名与字段值的数据类型、个数、顺序必须一一对应。

1.手动添加


insert


  • 省略字段名,则默认依次插入所有字段。
  • 批量添加多个表或多个值之间使用逗号分隔。

2.批量导入

本地文件路径中不能含有中文,路径中用’‘或’/’。


load


3.将查询结果添加到已存在的表中

需事先创建表结构,且与select子句的字段类型一一对应。


insert


4.将查询结果添加到新表中


create


二、更新数据

在MySQL中,可以使用update语句来修改、更新表中的数据。


update


  • set子句用于指定表中要修改的字段名及其字段值。每个指定的值可以是表达式,也可以是该字段对应的默认值。如果指定的是默认值,可用关键字default。
  • where子句用于限定表中要修改的行。若不指定,则修改表中所有的行。
  • 修改多个字段值时,set子句的每个值用逗号分开即可。

三.删除数据

在MySQL中,可以使用delete语句来删除表中记录。


delete


where子句表示为删除操作限定删除条件,若省略则代表删除表中的所有行。

清除表中所有记录


truncate


delete与truncate的区别:

  • delete可以添加删除条件删除表中部分数据,truncate只能删除表中全部数据。
  • delete删除表中数据保留表结构,truncate直接把表删除(drop)然后再创建(create)一张新表,执行速度比delete快。

数据查询

数据查询是使用数据查询语言(DQL)从一个或多个表中查询所需的数据,查询结果会通过客户端反馈给用户。

一、虚拟结果集

查询结果是存储在内存中的虚拟结果集,并不是真实存在的表。当用户执行其他命令时,内存中的虚拟结果集就会被释放,想要再次查看就需要再次执行查询命令,所以查询不会修改数据库表中的记录。

基本的查询语句就是SELECT语句,它至少包含两条信息:想查询什么,以及从哪里查询。

1.查询所有字段

在SELECT语句中使用星号 “*” 通配符查询所有字段。


select


一般情况下,除非需要使用表中所有的字段,否则最好不要使用通配符“*”。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的字段通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需的字段名时,可以通过通配符获取。

2.查询部分字段

需要查询部分字段时,用字段名替换通配符“*”。


select


如果不记得字段名,可以使用desc命令查看表结构。

3.查询不重复的记录

在MySQL中需要查询表中不重复的记录时,可以使用distinct关键字过滤重复记录。


select


多个字段去重时,distinct关键字必须位于第一个字段前,多个字段完全一样的情况下,才会过滤。

4.设置别名

通常情况下我们通过计算字段得到的字段名都是比较长的,为了提高查询结果的可读性,我们可以使用as关键字设置别名,使查询语句更简洁。

要保证表别名不能与数据库中的其他表名或关键字重复。

MySQL支持两种别名:列别名和表别名。


select


  • as关键字可省略

4.1列别名

有时字段名称是一些表达式,使查询结果的输出很难理解,可以使用列别名设置描述性名称。

设置别名后可以在group by,having和order by子句中来引用该别名,而不能在WHERE子句中使用列别名。

因为SQL语句的执行顺序:


from


因此在where子句执行的时,设置别名的select子句还没有执行,即该别名还不存在,所以where子句不能使用,order by子句是在select后执行的,可以使用列别名。而group by和having子句虽然也是在select前执行,一般也不能在group by和having子句中使用别名,但是MySQL对此做了扩展。在MySQL5.7.5及之后的版本,ONLY_FULL_GROUP_BY sql mode默认开启,MySQL对标准SQL的扩展生效:

  • 允许在select,having和order by子句中使用没有出现在group by中的字段。此时MySQL会随机选择没有出现在group by中的字段的值。
  • 允许在group by和having子句中使用select中的别名。

4.2表别名

当表名重复引用时,可以使用别名为表添加不同的名称,用于简化和区分

表别名只在执行查询时使用,并不在返回结果中显示。而列别名在客户端的查询结果中显示,显示的结果集中字段名即为字段的别名。

二、条件查询

在 SELECT查询语句中,可以使用 WHERE 子句来指定查询条件,对表中的数据筛选,满足条件的记录会出现在结果集中。


select


<查询条件>是有运算符构成的逻辑判断表达式,结果取值为1或0。

1.常用运算符

  • 算术运算符


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_10


  • 比较运算符


mysql中自动增值不连续 mysql自动增长语句_mysql 设置字段自动增长值_11


  • 逻辑运算符


mysql中自动增值不连续 mysql自动增长语句_数据库_12


  • 运算符优先级


mysql中自动增值不连续 mysql自动增长语句_mysql 设置字段自动增长值_13


2.空值查询

在数据库中null为未知值,不属于任何数据类型,因此null和任何类型的数据进行运算的结果都为null,我们在进行运算时需要先处理null。

在WHERE子句查询条件中,可以使用is关键字进行空值查询。


select


3.模糊查询

在WHERE子句中,当我们不知道准确的查询条件时,可以使用LIKE关键字和通配符组成比较特定数据的搜索模式对文本字段进行模糊查询。

通配符是用来匹配值的一部分的特殊字符,同时使用LIKE关键字在WHERE子句中构成查询条件。通配符模糊查询只能用于文本字段(字符串),非文本数据类型字段不能使用通配符进行模糊查询。


select


3.1百分号(%)

在模糊查询中,%表示任何字符出现任意次数。

3.2下划线(_)通配符

在模糊匹配中,_只匹配单个字符。

3.3使用通配符的技巧

使用通配符进行模糊查询一般要比其他条件查询耗费更长的处理时间,所以我们要注意使用通配符的方法。

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处,否则搜索起来是非常慢的。
  • 注意通配符的位置。如果放错地方,可能不会返回想要的数据。

三、分组查询

在 SELECT 语句中,允许使用 GROUP BY 子句将查询结果按照一个或多个字段进行分组,字段值相同的为一组,对每个组进行聚合计算,实现数据的分组汇总。


select


  • select 后的字段名应该是分组字段和聚合字段。
  • group by分组字段可以是一个或多个。
  • 如果分组字段中包含有null值,则null值所在的行单独分为一组。

1.组内聚合

分组后需要对每个组内的数据进行聚合运算,可以使用sum、avg、count、max、min函数对数值型数据进行聚合计算,使用max和min函数对日期时间型数据进行聚合,使用group_concat函数对字符串型数据进行分组合并。

2.分组后筛选

在SELECT 语句中,使用GROUP BY子句进行分组后,如果需要对分组后的数据进行筛选,可以使用HANING子句指定筛选条件。


select


HAVING 子句和 WHERE 子句非常相似,都是对数据进行过滤,HAVING 子句支持 WHERE 子句中所有的操作符和语法。

2.1WHERE与HAVING的区别:

  • WHERE 子句不可以使用聚合函数,HAVING 子句中可以包含聚合函数。
  • HAVING 子句是在数据分组后进行过滤,WHERE 子句会在数据分组前进行过滤,WHERE 子句排除的行不包含在分组中。

2.2HAVING 子句中的筛选字段必须是可以出现在分组结果中的字段

四、查询结果排序

SELECT语句查询出的数据如果不进行排序,数据一般将以它在底层表中出现的顺序显示,这可以是数据最初添加到表中的顺序。但是如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定查询出的数据的顺序有意义。

可以使用ORDER BY子句按一个或多个字段对SELECT语句查询出的数据进行排序。


select


按多个列排序时,先按照第一个字段排序,仅在多个行第一个字段值相同时才按照第二个字段进行排序。如果第一个字段值都是唯一的,则不会按照第二个字段排序。

指定排序方向:asc升序,desc降序(没有指定排序方向时,默认是asc升序)

五、限制查询结果数量

在使用SELECT 语句时,往往返回的是所有匹配的行,有些时候我们仅需要返回第一行或者前几行,这时候就需要用到LIMT 子句。


select


  • lmit接受一个或两个数字参数,参数必须是一个整数常量。
  • 第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
  • 如果只给定一个参数,表示返回最大的记录行数目。
  • 初始记录行的偏移量是0(而不是1)。

六、多表查询

随着我们使用数据库的灵活性越来越高,当我们需要的数据在不同的表中时,就需要使用多表查询来检索我们需要的数据。

多表查询分为横向连接查询和纵向合并查询。

1.连接查询

连接查询是通过多张表中共有的关键字段,将多张表连成一张虚拟结果集,来补充字段信息,我们可以按照业务需求检索多张表中的数据。

SQL查询的基本原理:

  • 单表查询:根据where条件过滤表中的记录,然后根据select指定的列返回查询结果。
  • 两表连接查询:使用on条件对两表进行连接形成一张虚拟结果集;然后根据where条件过滤结果集中的记录,再根据select指定的列返回查询结果。
  • 多表连接查询:先对第一个和第二个表按照两表连接查询,然后用用连接后的虚拟结果集和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一张虚拟结果集,然后根据where条件过滤虚拟结果集中的记录,再根据select指定的列返回查询结果。

多表连接的结果通过三个属性决定:

  • 方向性:在外连接中写在前边的表为左表、写在后边的表为右表。
  • 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之分。
  • 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表。

对应关系:

  • 一对一


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_14


  • 一对多或多对一


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_15


  • 多对多


mysql中自动增值不连续 mysql自动增长语句_数据库_16


1.1连接方式

MySQL支持的连接方式:内连接和外连接(左外连接、右外连接)

  • 内连接:按照连接条件,返回两张表中满足条件的记录。
select


mysql中自动增值不连续 mysql自动增长语句_字段_17


表限定符.:如果表1和表2中的字段名相同,则必须使用表限定符.指定引用的是哪个表中的字段。

  • 左连接:按照连接条件,返回两张表中满足条件的记录,以及左表中的所有记录,右表匹配不到显示为null。
select


mysql中自动增值不连续 mysql自动增长语句_mysql 设置字段自动增长值_18


  • 右连接:按照连接条件,返回两张表中满足条件的记录,以及右表中的所有记录,左表匹配不到显示为null。
select


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_19


  • 笛卡尔积连接:两张表中的每一条记录进行笛卡尔积组合,然后根据where条件过滤虚拟结果集中的记录。
select


  • 自连接:通过设置表别名,将一张表虚拟成多张表。

1.2连接条件

等值连接:连接条件是两张表中的关键字段取值相等。

不等值连接:连接条件是两张表中的关键字段取值满足非等值比较运算。

1.3连接规则

一表作为主表可以保证维度的完整性,多表作为主表可以保证度量的准确性。

在没有明确表示需要保证维度完整性的情况下,优先保证度量的准确性,所以将度量值所在的表作为主表。

度量字段通常存在于多表中,因此通常情况下可以将多表作为主表进行外连接。

  • 确定查询的信息在哪几张表
  • 确定表和表之间的对应关系和主附关系
  • 确定表和表之间的连接条件

2.合并查询

纵向合并查询又称为联合查询,它是用union关键字把多条select语句的查询结果合并为一个结果集。

纵向合并的前提是被合并的结果集的字段数量、顺序和数据类型必须完全一致。字段名不一样的情况下,会将第一个结果集的字段名作为合并后的虚拟结果集的字段名。


select


  • union:去重
  • union all:不去重

七、子查询

子查询又称为嵌套查询,它是指在一个select语句中包含另一个或多个完整的select语句。

子查询的语法规则:

  • 子查询需要用圆括号括起来。
  • 子查询最多可以嵌套到32层(个别查询可能会不支持32层嵌套)。
  • 执行顺序由内到外,先执行内部的子查询,再执行外部的主查询。

1.子查询分类

按子查询返回的结果,可分为:

  • 标量子查询:返回的结果是一个数据(单行单列)
  • 行子查询:返回的结果是一行(单行多列)
  • 列子查询:返回的结果是一列(多行单列)
  • 表子查询:返回的结果是一张临时表(多行多列)

按子查询出现的位置,可分为:

  • select子句中:将子查询返回的结果作为主查询的计算字段(标量子查询、列子查询)
  • where或having子句中:将子查询返回的结果作为主查询的筛选条件(标量子查询、行子查询、列子查询)
  • from或join子句中:将子查询返回的结果作为主查询的一张表(表子查询)

2.子查询常用运算符

子查询出现在where或having子句中时,可以使用>、>=、<、<=、=、<>/!=等比较运算符或[not ]in、any/some、all、[not ]exists等操作符进行条件筛选。


mysql中自动增值不连续 mysql自动增长语句_mysql中自动增值不连续_20


3.子查询优化

MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。

子查询虽然很灵活,但是执行效率并不高。执行子查询时,MySQL需要为内层子查询的查询结果建立一个临时表,然后外层主查询在临时表上进行查询和筛选。查询完毕后再撤销这些临时表,这里多了一个创建和销毁临时表的过程。因此,子查询的速度会受到一定的影响,如果查询的数据量比较大,这种影响就会随之增大。

优化方法:可以使用连接查询(join)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。

所有的连接查询都可以替换为子查询,但并不是所有的子查询都可以用连接查询代替。当where子句中需要使用聚合函数作为筛选条件时,只能使用子查询。