MySQL 基础教程-09 常见查询示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 基础教程-09 常见查询示例相关的知识,希望对你有一定的参考价值。

1. 使用外键

mysql中,InnoDB存储引擎表支持外键约束检查。

如果仅是连接两个表,外键约束并不是必须的。对于InnoDB以外的存储引擎,在定义列时也可以使用REFERENCES tbl_name (col_name)子句,该子句没有实际效果,仅作为定义的列打算引用另一个表中的列的备注。在使用此语法时,请务必认识到:

●MySQL不执行任何检查来确保col_name在tbl_name中实际存在(甚至tbl_name表是否存在也不能保证)。

●MySQL不会对tbl_name执行任何类型的操作,例如,如果对您定义表中的行执行删除操作,tbl_name 中的相应数据并不会被级联删除;换句话说,此语法不会导致任何ON DELETE或ON UPDATE行为。(尽管可以将ON DELETE或ON UPDATE子句作为REFERENCES子句的一部分编写,但它也会被忽略。)

●此语法创建列,但它不创建任何类型的索引或键。

可以使用这样创建的列作为连接列,如下所示:
技术图片

技术图片

以这种方式使用时,REFERENCES子句不会显示在SHOW CREATE TABLE 或DESCRIBE 的输出中:
技术图片
列定义中的这种 REFERENCES 方式使用可以用作注释或“提醒”功能,适用于MyISAM存储引擎中的表。

2.在两个键上搜索

对单个键使用 OR 查询就像 AND 一样,已经做了很好的优化。
棘手一些的情况是,在用 OR 连接两个不同的键上搜索:

技术图片

针对这种情况也已经进行了优化。

还可以通过用一个UNION语句来高效地解决这个问题,该联合将两个单独的SELECT语句的输出组合在一起。

每个SELECT 语句仅在一个键上搜索,这样搜索会被优化!

技术图片

3.统计访问天数

下面的示例演示如何使用位组函数计算用户每月访问网页的天数。
首先创建表,填充数据。
技术图片

示例表包含了表示用户访问页面的年月日的值。要确定每月进行这些访问的天数,请使用以下查询:

技术图片

此查询将返回如下结果:

技术图片

4.使用 AUTO_INCREMENT

AUTO_INCREMENT 属性可以用于给新行生成唯一标识。

技术图片

返回结果:

技术图片

上述语句并没有为自增列分配值,MySQL会自动分配值,也可以显式地将0分配给自增列,系统也会自动分配值,除非启用了NO_AUTO_VALUE_ON_ZERO SQL模式。例如:

技术图片
如果列被声明为 NOT NULL,也可以将空值赋给列,系统也会自动填充值。例如:
技术图片

在自增列中插入任何其他值时,该列将设置为该值并重置序列,以便下一个自动生成的值从最大列值开始按顺序排列。例如:

技术图片

更新现有的自增列值也会重置自动递增序列。

可以用 LAST_INSERT_ID() SQL 函数或者 mysql_insert_id() C API 函数查询最近一次自动生成的自增值。这些函数是特定于连接的,因此它们的返回值不受另一个也在执行插入的连接的影响。

在能满足需要的前提下,请为自增列使用最小的整数类型。当列达到数据类型的上限时,下次生成序列号的尝试将失败。如果可能,请使用UNSIGNED属性以允许更大的范围。例如,如果使用TINYINT,则允许的最大序列号为127。对于TINYINT UNSIGNED,最大值为255。

如果想指定自增值不是从1开始,请使用CREATE TABLE或ALTER TABLE设置该值,如下所示:

技术图片

以上是关于MySQL 基础教程-09 常见查询示例的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础教程DDL语句详细介绍

MySQL 基础教程-07 空值处理与多表查询

MySql基础教程——查询训练

MySQL基础教程---常见函数介绍

MySQL基础教程---创建查询备份数据库

SpringBoot示例教程MySQL与Mybatis基础用法