SQL:用AI软件来完成sql的触发器的使用

说明:本章主要使用baidu comate 的AI软件来完成 

1.创建表

问题1:帮我创建2个表student与score表,要求student表有id,createDate,userName,phone,age,sex,introduce,
要求score表有id,scoreName,result,studentId(student表的id外键)。
要求student表中插入5条学生信息,都要是中文的。
要求score表中对应studentId插入10条信息,每个学生ID要有2个科目的成绩。
给出DDL与DML语句。

 
AI:下面是DDL(数据定义语言)用于创建studentscore表,以及DML(数据操作语言)用于插入数据的SQL语句。

DDL语句:


-- 创建student表
CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATE NOT NULL,userName VARCHAR(50) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex VARCHAR(10) NOT NULL,introduce TEXT
);-- 创建score表,其中studentId是student表的外键
CREATE TABLE score (id INT PRIMARY KEY AUTO_INCREMENT,scoreName VARCHAR(50) NOT NULL,result DECIMAL(5,2) NOT NULL,studentId INT,FOREIGN KEY (studentId) REFERENCES student(id) ON DELETE CASCADE ON UPDATE CASCADE
);

DML语句:

首先,插入5条学生信息到student表中:


-- 插入5条学生信息
INSERT INTO student (createDate, userName, phone, age, sex, introduce) VALUES
('2023-01-01', '张三', '13800138000', 20, '男', '来自北京,喜欢数学。'),
('2023-02-02', '李四', '13900139000', 21, '女', '来自上海,擅长英语。'),
('2023-03-03', '王五', '13700137000', 22, '男', '来自深圳,喜欢编程。'),
('2023-04-04', '赵六', '13600136000', 19, '女', '来自成都,爱好音乐。'),
('2023-05-05', '孙七', '13500135000', 20, '男', '来自武汉,擅长物理。');

然后,根据student表中的id,向score表中插入对应的成绩信息,每个学生两个科目:


-- 假设已经插入的学生信息中id分别为1, 2, 3, 4, 5-- 插入成绩信息,每个学生两条记录
INSERT INTO score (scoreName, result, studentId) VALUES
('数学', 90.50, 1),
('英语', 85.25, 1),
('语文', 88.75, 2),
('物理', 92.00, 2),
('化学', 78.50, 3),
('生物', 82.25, 3),
('历史', 95.00, 4),
('地理', 89.75, 4),
('政治', 76.50, 5),
('体育', 87.00, 5);

注意:

  • 上述DML语句中插入的id值是根据假设的,实际操作中你需要根据student表实际插入数据后自增生成的id来填写对应的studentId

  • result字段是成绩,这里使用了DECIMAL(5,2)类型来存储,确保可以保存小数且保留两位小数。

  • createDate字段使用的是DATE类型,实际插入时需要按照YYYY-MM-DD的格式提供日期值。

  • introduce字段是文本类型,可以存储较长的介绍信息。

  • 外键约束使用了ON DELETE CASCADE ON UPDATE CASCADE,这表示当student表中的id被删除或更新时,score表中对应的记录也会被级联删除或更新。这有助于保持数据的一致性。

请根据你的数据库环境和实际情况调整上述SQL语句。

2.插入数据

问题2:帮我根据两个DDL创建一个插入信息的存储过程,使用循环先插入10条学生表信息,再根据插入的学生表信息插入100条对应studentId的score成绩, 所有信息随机生成,学生表的自增序号从6开始。不允许使用DECLARE,使用set类声明变量。

AI:根据您的要求,以下是使用SET来声明变量,并使用循环插入学生信息和成绩的存储过程。请注意,MySQL的存储过程不支持直接使用SET来声明循环变量,但可以使用SET来更新变量的值。对于循环,我们将使用REPEAT ... UNTIL结构。

DELIMITER //CREATE PROCEDURE InsertStudentsAndScores()
BEGIN-- 设置student表的自增起始值为6ALTER TABLE student AUTO_INCREMENT = 6;-- 初始化变量SET @counter = 0;SET @lastStudentId = 0;-- 插入10条随机学生信息REPEATSET @counter = @counter + 1;INSERT INTO student (createDate, userName, phone, age, sex, introduce)VALUES (CURDATE() - INTERVAL FLOOR(RAND() * 365) DAY, -- 随机日期CONCAT('Student', FLOOR(RAND() * 1000000)), -- 随机用户名CONCAT('1', LPAD(FLOOR(RAND() * 900000000), 9, '0')), -- 随机电话号码FLOOR(RAND() * 100) + 1, -- 随机年龄(1-100)CASE FLOOR(RAND() * 2) WHEN 0 THEN 'Male' ELSE 'Female' END, -- 随机性别CONCAT('This is a random introduction for student ', CONCAT('Student', FLOOR(RAND() * 1000000)), '.') -- 随机介绍);-- 获取最后插入的学生IDSELECT LAST_INSERT_ID() INTO @lastStudentId;UNTIL @counter >= 10 END REPEAT;-- 初始化变量,准备插入成绩SET @counter = 0;-- 插入100条随机成绩信息REPEATSET @counter = @counter + 1;-- 随机选择一个已存在的学生IDSET @studentId = FLOOR(@lastStudentId * RAND()) + 6;IF @studentId > @lastStudentId THENSET @studentId = @lastStudentId; -- 如果随机生成的ID超出了范围,则取最大值END IF;INSERT INTO score (scoreName, result, studentId)VALUES (CONCAT('Score', FLOOR(RAND() * 1000)), -- 随机成绩名称ROUND(RAND() * 100, 2), -- 随机成绩,范围0-100@studentId -- 随机选择的学生ID);UNTIL @counter >= 100 END REPEAT;
END //DELIMITER ;-- 调用存储过程
CALL InsertStudentsAndScores();

在这个存储过程中,我们首先使用ALTER TABLE语句设置student表的自增起始值为6。

接着,使用REPEAT ... UNTIL循环结构来插入10条随机学生信息。在每次循环中,我们更新@counter变量来追踪循环的次数,并使用INSERT INTO语句插入一条随机的学生记录。使用LAST_INSERT_ID()函数获取最后插入的学生ID,并将其保存在@lastStudentId变量中。

然后,我们再次使用REPEAT ... UNTIL循环来插入100条随机成绩信息。在每次循环中,我们随机选择一个已存在的学生ID,并插入一条随机的成绩记录。

最后,通过调用CALL InsertStudentsAndScores();来执行这个存储过程。

请注意,这里的随机电话号码生成逻辑可能不符合实际的电话号码格式要求,您可能需要根据实际情况调整生成电话号码的逻辑。此外,由于随机性,有可能出现同一个学生被关联多条成绩记录的情况,这符合您的要求,但可能不符合某些实际场景。如果需要每个学生恰好有10条成绩记录,那么您需要设计更复杂的逻辑来确保这一点。

3.实现多表联合查询

问题3:帮我创建一个多表联合查询以student为主表,查看学生的所有科目成绩总分。

AI:要创建一个多表联合查询,以student表为主表,查看学生的所有科目成绩总分,你可以使用SQL的JOIN语句配合GROUP BYSUM函数来实现。以下是一个示例查询:

SELECT s.id AS student_id,s.userName AS student_name,SUM(sc.result) AS total_score
FROM student s
JOIN score sc ON s.id = sc.studentId
GROUP BY s.id, s.userName;

这个查询做了以下几件事情:

  1. 使用JOIN语句将student表和score表连接起来,通过studentId字段进行匹配。

  2. 使用SELECT语句选择需要显示的字段,包括学生的ID、姓名和总分。这里使用别名(如student_idstudent_name)使结果更清晰。

  3. 使用SUM(sc.result)计算每个学生的所有科目成绩总分。

  4. 使用GROUP BY语句按学生的ID和姓名对结果进行分组,这样每个学生的总分只会出现一次。

请注意,这个查询假设每个学生可能有多个成绩记录(即score表中可能有多行与同一个studentId相关联)。如果score表中每个学生只有一个成绩记录,那么这个查询仍然有效,但SUM函数在这种情况下其实是多余的,因为它只是对单个值进行求和。

另外,这个查询没有处理没有成绩记录的学生的情况。如果你想要包括那些没有成绩记录的学生,并显示他们的总分为0,你需要使用LEFT JOIN而不是JOIN。这样,即使score表中没有与某个学生ID匹配的记录,该学生仍然会出现在结果集中,但总分将为0。

 

4.触发器的使用

问题4:帮我创建一个修改score表scoreName的触发器,当修改scoreName的时候触发,判断修改的scoreName是否是数学,如果是数学就改成(天书)。
并且给出测试示例。

AI:要创建一个触发器,当score表中的scoreName字段被修改时,检查新值是否为"数学",如果是,则将其改为"天书",你可以按照以下步骤进行:

首先,创建触发器:

DELIMITER //CREATE TRIGGER trg_update_scoreName_to_tianshu
BEFORE UPDATE ON score
FOR EACH ROW
BEGINIF NEW.scoreName = '数学' THENSET NEW.scoreName = '天书';END IF;
END;
//DELIMITER ;

这个触发器使用了BEFORE UPDATE事件,意味着在score表的行被更新之前,触发器会执行其内部的逻辑。如果NEW.scoreName(代表将要被设置的新值)等于"数学",则将其更改为"天书"。

接下来,测试触发器:

首先,插入一些示例数据到score表中:

INSERT INTO score (scoreName, result, studentId) VALUES ('数学', 90.50, 1);
INSERT INTO score (scoreName, result, studentId) VALUES ('英语', 85.25, 1);
INSERT INTO score (scoreName, result, studentId) VALUES ('物理', 78.75, 2);

现在,尝试更新scoreName为"数学"的记录,并查看是否触发器正常工作:

UPDATE score SET scoreName = '数学' WHERE id = 1; -- 假设id为1的记录原本scoreName就是'数学'

执行上述UPDATE语句后,由于触发器的作用,scoreName字段的值不会变成"数学",而是会变成"天书"。

为了验证结果,可以查询score表:

SELECT * FROM score;

你应该能看到id为1的记录的scoreName字段现在是"天书",而不是"数学"。

请注意,如果scoreName字段的值原本就不是"数学",则触发器不会有任何效果,scoreName字段的值将按照UPDATE语句中指定的新值进行更新。

还要确保在创建触发器之前,score表中没有名为trg_update_scoreName_to_tianshu的触发器存在,否则你会得到一个错误,因为MySQL不允许重名的触发器。如果之前已经创建了同名的触发器,你需要先删除它,可以使用以下命令:

DROP TRIGGER IF EXISTS trg_update_scoreName_to_tianshu;

然后再创建新的触发器。

5.游标的使用

问题5:创建一个两个表的综合【游标查询】,要求根据学生姓名进行查询,查询的结果返回两个表的综合信息。

AI:为了创建一个综合两个表的游标查询,并根据学生姓名来检索信息,我们可以使用存储过程结合游标来实现。在这个例子中,我们假设你希望查询学生的信息以及他们所有的成绩(不包含成绩表的id)。

首先,我们需要编写一个存储过程,该过程将接收学生姓名作为参数,并使用游标来遍历查询结果。以下是一个可能的实现:

DELIMITER //CREATE PROCEDURE GetStudentInfoAndScores(IN p_userName VARCHAR(50))
BEGIN-- 声明变量来存储查询结果DECLARE done INT DEFAULT FALSE;DECLARE v_id INT;DECLARE v_createDate DATE;DECLARE v_userName VARCHAR(50);DECLARE v_phone VARCHAR(20);DECLARE v_age INT;DECLARE v_sex VARCHAR(10);DECLARE v_introduce TEXT;DECLARE v_scoreName VARCHAR(50);DECLARE v_result DECIMAL(5,2);-- 声明游标DECLARE cur CURSOR FORSELECT s.id, s.createDate, s.userName, s.phone, s.age, s.sex, s.introduce, sc.scoreName, sc.resultFROM student sJOIN score sc ON s.id = sc.studentIdWHERE s.userName = p_userName;-- 声明NOT FOUND处理程序DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;-- 打开游标OPEN cur;-- 读取游标中的数据read_loop: LOOPFETCH cur INTO v_id, v_createDate, v_userName, v_phone, v_age, v_sex, v_introduce, v_scoreName, v_result;IF done THENLEAVE read_loop;END IF;-- 这里你可以对变量进行进一步的处理,比如打印或返回给调用者SELECT v_id AS student_id, v_createDate AS create_date, v_userName AS student_name, v_phone AS phone, v_age AS age, v_sex AS sex, v_introduce AS introduction, v_scoreName AS score_name, v_result AS result;END LOOP;-- 关闭游标CLOSE cur;
END //DELIMITER ;

现在,我们有了这个存储过程GetStudentInfoAndScores,它接受一个学生姓名作为参数,并返回该学生的所有信息以及他们的成绩。请注意,由于一个学生可能有多个成绩,因此每个学生的信息将会被重复打印,每次打印都附带一个不同的成绩。

要调用这个存储过程并获取结果,你可以这样做:

CALL GetStudentInfoAndScores('目标学生姓名');

请替换'目标学生姓名'为你想要查询的学生的实际姓名。调用存储过程后,你将看到该学生的所有信息以及他们所有的成绩。

注意:这个实现假设每个学生至少有一个成绩记录。如果没有成绩记录,这个学生将不会出现在结果中。如果你希望即使学生没有成绩也显示他们的信息(例如,显示成绩为NULL或空字符串),你应该使用LEFT JOIN而不是JOIN

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

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

相关文章

【高频】redis快的原因

相关问题: 1.为什么Redis能够如此快速地进行数据存储和检索? 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构,例如字符串、哈希表、列表、集合、有…

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/ │ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── tests/ │ ├── __init__.py │ ├── conftest.p…

【Linux】centos7编写C语言程序,补充:使用yum安装软件包组

确保已安装gcc编译器 C语言程序,一般使用gcc进行编译,需确保已安装gcc。 若没有,可以使用yum安装gcc(版本4.8.5),也可以使用SCL源安装gcc(例如:版本9.3)。 安装gcc&am…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

Linux网络编程: udp,tcp协议原理

Linux网络编程: udp,tcp协议原理 一.udp和tcp的介绍1.udp介绍1.udp的特点2.udp的适用场景3.udp效率分析 2.tcp介绍1.tcp的特点2.tcp的适用场景 二.udp协议原理1.udp协议段格式2.udp的缓冲区和全双工通信 三.tcp协议段1.tcp协议段格式2.发送接收缓冲区3.确认应答ACK机制,窗口大小…

Rosetta PyRosetta 源码包 安装包 下载

--- pyrosetta_src.zip包含以下包: | --- PyRosetta4.Debug.python27.ubuntu.release-185.tar.bz2 | --- PyRosetta4.Release.python27.linux.release-215.tar.bz2 | --- PyRosetta4.Release.python38.ubuntu.release-349.tar.bz2 --- pyrosetta_whl.zip包含…

C语言---文件操作

【C语言详解】——文件操作&#xff08;建议收藏&#xff09;_c语言 写文件原理-CSDN博客 一、文件的读取 # define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<errno.h> #include<string.h>int main() {FILE * pffopen("C:\\Users\\zhw\\De…

Java设计模式 _行为型模式_观察者模式

一、观察者模式 1、观察者模式 观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象。 2、实现思路 &#xff08;1&#xff09;、定义被观察者的行为&…

Python Selenium 详解:实现高效的UI自动化测试

落日余辉&#xff0c;深情不及久伴。大家好&#xff0c;在当今软件开发的世界中&#xff0c;自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中&#xff0c;UI自动化测试是不可或缺的一部分&#xff0c;它可以帮助测试团队快速验证用户界面的正确性…

Django学习

1.pycharm社区版创建django PyCharm社区版如何创建Django项目并运行_pycharm社区版打开django-CSDN博客 2.Django TemplateDoesNotExist: rest_framework 当我们使用djangorestframework框架时&#xff0c;首先下载pip install djangorestframework 参考博文Django Templat…

Windows环境编译zlib库

zlib 是一个用来进行数据压缩的开源软件库,由 Jean-loup Gailly 和 Mark Adler 编写。它提供了对 DEFLATE 压缩算法的支持,这种算法广泛用于 gzip 和 PNG 文件格式。 官网地址:链接 本文将使用VS2022+Cmake编译zlib库,操作系统为Windows10,编译好的动态库及静态库见文末链…

MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

算法思路介绍&#xff1a; 1. 数据准备阶段&#xff1a; 生成一个合成数据集 X&#xff0c;其中包含三个簇&#xff0c;每个簇分布在不同的区域。 定义聚类层数 L 和每个层次的子集数量 l。 2. 聚类阶段&#xff1a; 使用K均值聚类算法将初始数据集 X 分成 l 个簇。…

transformers.BertTokenizer入门使用

教程link 示例代码 from transformers import OpenAIGPTLMHeadModel, GPT2LMHeadModel, BertTokenizer import torch tokenizer BertTokenizer.from_pretrained("thu-coai/CDial-GPT_LCCC-large") model OpenAIGPTLMHeadModel.from_pretrained("thu-coai/CD…

Marin说PCB之如何在主板上补偿链路中的走线的等长误差?

一场雨把我困在这里&#xff0c;你冷漠地看我没有穿雨衣淋成落汤鸡。今天刚刚出门时候看天气预报没有雨&#xff0c;于是我就没有带雨衣骑电动车去公司了&#xff0c;谁知道回来的路上被淋成狗了。天气预报就像是女人的脾气那样&#xff0c;不能完全相信的。 好了&#xff0c;我…

编译安装MySQL服务(LAMP2)

目录 1.初始化设置&#xff0c;将安装mysql 所需软件包传到/opt目录下 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;上传软件包到/opt目录 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…

Windows驱动开发系列文章一

文章目录 环境搭建如何调试实时调试非实时调试 环境搭建 基本上按照官方网站安装 VisualStudio/SDK/WDK 这些软件就可以了 详情请参考这个安装链接 如何调试 Windows 调试分为两种&#xff1a;一种是实时调试&#xff0c;一种是非实时调试 实时调试 这个就需要用到Microso…

Flutter 中的 TweenAnimationBuilder 小部件:全面指南

Flutter 中的 TweenAnimationBuilder 小部件&#xff1a;全面指南 在Flutter中&#xff0c;动画是为应用增添活力和吸引力的重要方式。TweenAnimationBuilder是一个功能强大的动画组件&#xff0c;它允许开发者创建基于插值器&#xff08;tween&#xff09;的动画效果。这意味…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…