暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据库杂货铺 2021-04-12
188

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设置该值,如下所示:



文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论