MySQL学习——查询示例(二)

用户定义变量的使用

 可以使用MySQL用户定义的变量来存储查询结果,而无需在客户端使用临时变量。以下是一个如何使用用户定义的变量来找到价格最高和最低的商品的示例:

mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;+---------+--------+-------+| article | dealer | price |+---------+--------+-------+|    0003 | D      |  1.25 ||    0004 | D      | 19.95 |+---------+--------+-------+

可以在MySQL中使用用户定义的变量来存储结果,而无需在客户端中使用临时变量。这可以在执行复杂的查询和操作时提供便利,尤其是在需要跨多个语句记住某个值时。

例如,要找到价格最高和最低的商品,您可以使用用户定义的变量来存储这些值。

2 外键的使用

MySQL 支持外键,它允许跨表交叉引用相关数据,并支持外键约束,这有助于保持相关数据的一致性。

外键涉及一个包含初始列值的父表和一个具有列值的子表,这些列值引用父表的列值。外键约束是在子表上定义的。

以下示例通过单列外来关键词关联父表和子表,并展示外键约束如何强制实施引用完整性。

使用以下 SQL 语句创建父表和子表:

CREATE TABLE parent (id INT NOT NULL,PRIMARY KEY (id)) ENGINE=INNODB;CREATE TABLE child (id INT,parent_id INT,INDEX par_ind (parent_id),FOREIGN KEY (parent_id)REFERENCES parent(id)) ENGINE=INNODB;

要向父表中插入一行,您可以使用以下SQL语句

mysql> INSERT INTO parent (id) VALUES ROW(1);

要验证数据是否已成功插入,您可以通过选择父表中的所有行来进行确认。使用以下SQL查询可以实现这一点:

mysql> TABLE parent;+----+|  id |+----+|   1 |+----+

要使用SQL语句向子表中插入一行,并且假设您已经知道要引用的父表的id(在这个例子中,我们假设父表的id是1,这通常是从上一步插入操作后返回的或者通过查询得到的),您可以这样做:

mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1);

由于parent_id值为1在父表中存在,所以之前的插入操作是成功的。这是外键约束的预期行为:只有当子表中的parent_id对应于父表中实际存在的id时,才允许插入或更新操作。

为了展示当尝试插入一个不存在的parent_id时会发生什么,我们可以尝试插入一个具有无效parent_id的记录到子表中。例如,如果父表中没有id为99的记录,以下插入操作将会失败:

mysql> INSERT INTO child (id,parent_id) VALUES ROW(2,2);ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails(`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`)REFERENCES `parent` (`id`))

尝试删除父表中先前插入的行可能会失败,因为存在外键约束。如果子表中还有记录引用了父表中的某个id,那么直接删除父表中的这条记录会违反外来关键词约束。如下所示:

mysql> DELETE FROM parent WHERE id = 1;ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails(`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`)REFERENCES `parent` (`id`))

当父表中的键值被子表引用时,对父表进行的操作(如删除或更新)会受到外键约束的影响。如果在子表中有与父表相匹配的记录,那么操作的结果将取决于FOREIGN KEY子句中ON UPDATE和ON DELETE子句所指定的参照动作。

如果在定义外键约束时省略了ON DELETE和ON UPDATE子句(如当前子表的定义),那么它的行为与指定RESTRICT选项相同。RESTRICT会阻止那些会影响父表中被子表所引用的键值的操作。

为了演示ON DELETE和ON UPDATE参照动作,我们可以先删除当前的子表,然后重新创建它,并在创建时包含带有CASCADE选项的ON UPDATE和ON DELETE子句。CASCADE选项会在删除或更新父表中的记录时,自动删除或更新子表中与之匹配的记录。

DROP TABLE child;CREATE TABLE child (id INT,parent_id INT,INDEX par_ind (parent_id),FOREIGN KEY (parent_id)REFERENCES parent(id)ON UPDATE CASCADEON DELETE CASCADE) ENGINE=INNODB;

要向子表中插入一些行,您可以使用类似于以下的INSERT INTO语句。

mysql> INSERT INTO child (id,parent_id) VALUES ROW(1,1), ROW(2,1), ROW(3,1);

要验证数据是否已成功插入,可以如下所示:

mysql> TABLE child;+------+-----------+| id   | parent_id |+------+-----------+|    1 |         1 ||    2 |         1 ||    3 |         1 |+------+-----------+

要更新父表中的ID,将其从1更改为2,您可以使用以下的SQL UPDATE 语句:

mysql> UPDATE parent SET id = 2 WHERE id = 1;

为了验证父表中的ID是否已成功从1更新为2,您可以通过选择父表中的所有行来检查更新是否生效。以下是一个SQL查询示例,用于检索父表中的所有记录:

mysql> TABLE parent;+----+| id |+----+|  2 |+----+

为了验证ON UPDATE CASCADE参照动作是否已更新了子表,

mysql> TABLE child;+------+-----------+| id   | parent_id |+------+-----------+|    1 |         2 ||    2 |         2 ||    3 |         2 |+------+-----------+

为了正确演示 ON DELETE CASCADE 参照动作,应该从父表中删除具有特定主键值的记录,并观察子表中所有引用该主键的记录是否也被自动删除。如下所示:

mysql> DELETE FROM parent WHERE id = 2;

如果子表中的所有记录都是与 parent_id = 2 相关联的,那么当您在父表中删除对应ID为2的记录时,ON DELETE CASCADE 参照动作确实会导致子表中的所有记录都被删除。这是因为所有子表记录都通过 parent_id 外键依赖于父表中ID为2的记录。

mysql> TABLE child;Empty set (0.00 sec)

3 用两个关键字进行搜索

当在数据库中执行查询时,单个关键词的 OR 操作和 AND 操作通常都可以得到很好的优化。但是,当涉及到在两个不同的关键词上使用 OR 进行搜索时,情况就会变得复杂一些。

SELECT field1_index, field2_index FROM test_tableWHERE field1_index = '1' OR field2_index = '1'

当需要在两个不同的关键词上进行搜索并且这些搜索条件之间使用 OR 连接时,一个有效的策略是使用 UNION 来组合两个单独的 SELECT 语句的输出。这种方法允许每个 SELECT 语句只关注一个关键词,并可以针对该关键词进行优化。

使用 UNION 的好处是,每个单独的 SELECT 都可以利用索引(如果适用),并且每个查询都可以在单独的子查询中独立地进行优化。然后,UNION 操作将两个查询的结果合并成一个结果集,这个结果集满足原始 OR 查询的条件。

SELECT field1_index, field2_indexFROM test_table WHERE field1_index = '1' UNION SELECT field1_index, field2_indexFROM test_table WHERE field2_index = '1';

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式( MPM multi-processing module )Http相关文件Http编译安装httpd常见配置…

【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览

文章目录 1、前言1、FileReader3、window.URL.createObjectURL4、参考链接 1、前言 一般来说,都是 后端返回给前端图片的url,前端直接把这个值插入到 img 的src 里面即可还有一种情况是前端需要预览一下图片,比如:上传头像按钮&a…

【vuejs】 computed 和 watch 的区别和使用场景说明

1. 计算属性 computed 概述 计算属性 computed 是 Vue.js 中一个非常强大的功能,它允许开发者声明性地描述一个值是如何根据组件中其他数据计算得来的。计算属性是基于它们的依赖进行缓存的,只有当依赖发生变化时,计算属性才会重新计算。这使…

显示器与电脑如何分屏显示?

1.点击电脑屏幕右键--显示设置 2、然后找到屏幕---找到多显示器---选择扩展显示器

OpenAI 推出ChatGPT Edu,为高校定制版本

近日,OpenAI 宣布推出 ChatGPT Edu,这是一款专为高校打造的 ChatGPT 版本,旨在帮助学生、教师、研究人员和校园运营部门以负责任的方式部署和使用 AI。 ChatGPT Edu 由 GPT-4o 提供支持,具备强大的文本和图像推理能力,…

PHP 操作日期各种转换

日期操作 一、根据日期生成日期数组 /*** 根据指定日期生成日期数组* param $start_time 开始时间* param $end_time 结束时间* return array 返回数组结果*/ function createDateArr($start_time, $end_time) {$open_start_time $start_time;$open_end_time $end_ti…

Java18新版本特性!

Java 18引入了多项新特性,主要包括默认UTF-8字符集、简单的Web服务器、栈步进API等。Java 18是Oracle在2022年发布的版本,其旨在通过一系列创新特性来提升开发效率与性能。下面将逐一探讨Java 18的主要新特性以及它们对开发者的具体影响: 默认…

7、css3实现边框不停地跑动效果

效果例图&#xff1a; 1、上html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta …

华为Atlas 500 A2小站:如何解决docker的各种报错问题

问题&#xff1a;华为Atlas 500 A2小站&#xff1a;如何解决docker的各种报错问题 在Atlas 500 A2的小站环境搭建中&#xff0c;在使用docker时&#xff0c;如果所有办法都用了&#xff0c;还是报错的话。 如&#xff1a; 报错1&#xff1a;Error response from daemon: Get “…

文明互鉴促发展——2024“国际山地旅游日”主题活动在法国启幕

5月29日&#xff0c;2024“国际山地旅游日”主题活动在法国尼斯市成功举办。中国驻法国使领馆、法国文化旅游部门、地方政府、国际组织、国际山地旅游联盟会员代表、旅游机构、企业、专家、媒体等围绕“文明互鉴的山地旅游”大会主题和“气候变化与山地旅游应对之策”论坛主题展…

GNU Radio实现OFDM Radar

文章目录 前言一、GNU Radio Radar Toolbox编译及安装二、ofdm radar 原理讲解三、GNU Radio 实现 OFDM Radar1、官方提供的 grc①、grc 图②、运行结果 2、修改后的便于后续可实现探测和通信的 grc①、grc 图②、运行结果 四、资源自取 前言 本文使用 GNU Radio 搭建 OFDM Ra…

每日一题29:数据操作之数据重塑

一、每日一题 ---------------------- | Column Name | Type | ---------------------- | product_id | int | | store1 | int | | store2 | int | | store3 | int | ---------------------- 在 SQL 中&#xff0c;这张表的主键是 product…

项目3 构建移动电商服务器集群

项目引入 经过前期加班加点地忙碌&#xff0c;我们的网站顺利上线了&#xff01;年中促销活动也如约而至&#xff0c;虽然公司全体对这次活动进行多方面地准备和“布防”&#xff0c;可是意外还是发生了。就在促销优惠购物活动的当天&#xff0c;猛然增加的用户访问量直接导致浏…

java线程状态介绍

1.新建&#xff08;New&#xff09;: 线程对象已创建&#xff0c;但还没有调用 start() 方法。 2.可运行&#xff08;Runnable&#xff09;: 线程已启动&#xff0c;处于就绪状态&#xff0c;等待 JVM 的线程调度器分配CPU时间。 3.阻塞&#xff08;Blocked&#xff09;: 线程…

利用博弈论改进大模型性能:MIT最新研究解读

引言 在人工智能和大模型的发展过程中&#xff0c;我们常常遇到一个有趣的现象&#xff1a;同一个问题在不同形式下可能得到不同的答案。这种不一致性不仅降低了大模型的可信度&#xff0c;也限制了其在实际应用中的效果。为了应对这一问题&#xff0c;来自MIT的研究人员提出了…

什么是网络拓扑图,常见绘制工具

什么是网络拓扑图 网络拓扑图是一种图形表示方法&#xff0c;用于展示网络中组件的物理或逻辑布局。它显示了网络中的设备、连接以及它们之间的通信路径。网络拓扑图对于理解网络结构、规划网络扩展、诊断问题以及进行日常网络管理至关重要。 网络拓扑图的类型 1. 物理拓扑&…

Element快速入门

Vue组件库Element 1 Element介绍 vue是侧重于VM开发的&#xff0c;主要用于数据绑定到视图的&#xff0c;ElementUI就是一款侧重于V开发的前端框架&#xff0c;主要用于开发美观的页面的。 Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库&…

深入理解 Go 语言中的字符串不可变性与底层实现

文章目录 前言1 字符串类型的数据结构组成2 为什么要这么设计数据结构&#xff1f;3 为什么说字符串类型不可修改&#xff1f;4 如何实现字符串的修改&#xff1f;5 为什么字符串修改的字面量用单引号&#xff1f;6 如何判断字符串的修改新建了一个字符串&#xff1f;7 字符串的…

c基础 - 输入输出

目录 一.scanf() 和 printf() 函数 1.printf 2.scanf 二 . getchar() & putchar() 函数 1.int getchar(void) 2.int putchar(int c) 三. gets() & puts() 函数 一.scanf() 和 printf() 函数 #include <stdio.h> 需要引入头文件,stdio.h 1.printf print…

【动力电池的四种冷却方式】

文章目录 动力电池的四种冷却方式1.自然冷却2.风冷3.液冷4.直冷 动力电池的四种冷却方式 目前动力电池系统的热管理主要可分为四类&#xff0c;自然冷却、风冷、液冷、直冷。其中自然冷却是被动式的热管理方式&#xff0c;而风冷、液冷、直流是主动式的&#xff0c;这三者的主…