From 540f0c8ddf3a07d075bfd39814215e518ec6a180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:02:01 +0000 Subject: [PATCH 01/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/=E4=BA=8B=E5=8A=A1-2024-10-17.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\272\213\345\212\241-2024-10-17.md" | 109 ------------------ 1 file changed, 109 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" "b/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" deleted file mode 100644 index 176b6fa..0000000 --- "a/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" +++ /dev/null @@ -1,109 +0,0 @@ -# 事务 - -## 1.分析 - -### 需求 - -```sql -## 练习题: -1, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; -2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; -3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; -4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; - -5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 - 提醒.要考虑转出金额不足的情况 -``` - -### 数据来源 - -``` --- 准备数据 -DROP DATABASE IF EXISTS transaction_db; -create database if not exists transaction_db; -use transaction_db; - -## 要操作的表结构与数据 -create table bank( - id int primary key auto_increment , - username varchar(10), - money int -); - -INSERT INTO `bank` VALUES (1, '张三', 100); -INSERT INTO `bank` VALUES (2, '李四', 200); -``` - -## 2.SQL - -任务I - -```sql -## 练习题: -1, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; -SET @@autocommit = 0; -SELECT @@autocommit; - -START TRANSACTION; -SELECT * FROM bank; -INSERT INTO bank VALUES (3,'yuwuchuji',100); -ROLLBACK; - -SELECT * FROM bank; -2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; - -START TRANSACTION; -UPDATE bank SET money = 5000 WHERE username = '李四'; -SELECT * FROM bank; -ROLLBACK; - -SELECT * FROM bank; -3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; -START TRANSACTION; -UPDATE bank SET money = 5000 WHERE username = '李四'; -COMMIT; - -SELECT * FROM bank; - -4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; -START TRANSACTION; -UPDATE bank SET money = 666 WHERE username = '张三'; -SAVEPOINT s1; -INSERT INTO bank (username,money) VALUES ('yuwuchuji',888888); -SAVEPOINT s2; -ROLLBACK TO s1; - -SELECT * FROM bank; -``` - -任务II - -```sql -5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 - 提醒.要考虑转出金额不足的情况 - -DROP PROCEDURE IF EXISTS transfer; - -CREATE PROCEDURE IF NOT EXISTS transfer(inuser INT, outuser INT,usermoney DECIMAL(10,2)) -BEGIN -DECLARE statu VARCHAR(255) DEFAULT('失败'); -DECLARE outmoney DECIMAL(10,2) DEFAULT(0); -SELECT money into outmoney FROM bank WHERE id = outuser; -START TRANSACTION; -IF usermoney > outmoney THEN - SET statu = '金额不足'; -ELSE - UPDATE bank SET money = money - usermoney WHERE id = outuser; - UPDATE bank SET money = money + usermoney WHERE id = inuser; - SET statu = '转账成功'; -END IF; - -SELECT statu; -SELECT * FROM bank; -END ; - -CALL transfer(1,2,100); -``` - -## 3.末尾 - -- Gitee From 293f4d48925cab734b2bea8248a186aaeb47747a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:02:20 +0000 Subject: [PATCH 02/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\344\272\213\345\212\241-2024-10-17.md" | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" "b/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" new file mode 100644 index 0000000..d63e8f3 --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\344\272\213\345\212\241-2024-10-17.md" @@ -0,0 +1,110 @@ +# 事务 + +## 1.分析 + +### 需求 + +```sql +## 练习题: +1, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; +2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; +3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; +4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; + +5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 + 提醒.要考虑转出金额不足的情况 +``` + +### 数据来源 + +``` +-- 准备数据 +DROP DATABASE IF EXISTS transaction_db; +create database if not exists transaction_db; +use transaction_db; + +## 要操作的表结构与数据 +create table bank( + id int primary key auto_increment , + username varchar(10), + money int +); + +INSERT INTO `bank` VALUES (1, '张三', 100); +INSERT INTO `bank` VALUES (2, '李四', 200); +``` + +## 2.SQL + +### 任务I + +```sql +## 练习题: +1, 手动关闭系统全局的全动提交。查询表内容,新增一个自己的帐号,和金额,最后回滚。再查询表内容; +SET @@autocommit = 0; +SELECT @@autocommit; + +START TRANSACTION; +SELECT * FROM bank; +INSERT INTO bank VALUES (3,'yuwuchuji',100); +ROLLBACK; + +SELECT * FROM bank; +2,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,回滚事务,再查询表内容; + +START TRANSACTION; +UPDATE bank SET money = 5000 WHERE username = '李四'; +SELECT * FROM bank; +ROLLBACK; + +SELECT * FROM bank; +3,用 START TRANSACTION 开启事务,查询表内容,把李四的金额改成5000,提交事务,再查询表内容; +START TRANSACTION; +UPDATE bank SET money = 5000 WHERE username = '李四'; +COMMIT; + +SELECT * FROM bank; + +4,用 START TRANSACTION 开启事务,查询表内容,把张三的金额改成666,设置保存点s1,用自己姓名添加个新账户,金额888888,设置保存s2,回滚到s1保存点,再查询表内容; +START TRANSACTION; +UPDATE bank SET money = 666 WHERE username = '张三'; +SAVEPOINT s1; +INSERT INTO bank (username,money) VALUES ('yuwuchuji',888888); +SAVEPOINT s2; +ROLLBACK TO s1; + +SELECT * FROM bank; +``` + +### 任务II + +```sql +5,[作业]创建一个实现银行转账业务的存储函数transfer(),传入合适的参数如转出账户编号,转入账户编号,转账金额,返回是否转账成功。 + 提醒.要考虑转出金额不足的情况 + +DROP PROCEDURE IF EXISTS transfer; + +CREATE PROCEDURE IF NOT EXISTS transfer(inuser INT, outuser INT,usermoney DECIMAL(10,2)) +BEGIN +DECLARE statu VARCHAR(255) DEFAULT('失败'); +DECLARE outmoney DECIMAL(10,2) DEFAULT(0); +SELECT money into outmoney FROM bank WHERE id = outuser; +START TRANSACTION; +IF usermoney > outmoney THEN + SET statu = '金额不足'; +ELSE + UPDATE bank SET money = money - usermoney WHERE id = outuser; + UPDATE bank SET money = money + usermoney WHERE id = inuser; + SET statu = '转账成功'; +END IF; + +SELECT statu; +SELECT * FROM bank; +END ; + +CALL transfer(1,2,100); +``` + +## 3.末尾 + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee From acc4fb577607fb5956018eade08b5a5dee24ab37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:05:00 +0000 Subject: [PATCH 03/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- ...34\344\270\232\346\250\241\346\235\277.md" | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" "b/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" new file mode 100644 index 0000000..8d0c91d --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" @@ -0,0 +1,35 @@ +# 事务 + +## 1.分析 + +### 需求 + +```sql + +``` + +### 数据来源 + +``` + +``` + +## 2.SQL + +### 任务I + +```sql + +``` + +### 任务II + +```sql + +``` + +## 3.末尾 + + + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee From fb98d1d1b882acb004b0fe973214a000d7509a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:06:06 +0000 Subject: [PATCH 04/18] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20=E5=88=98?= =?UTF-8?q?=E6=96=87=E8=BE=89/=E8=AF=BE=E4=BB=B6=20=E4=B8=BA=20=E5=88=98?= =?UTF-8?q?=E6=96=87=E8=BE=89/=E5=85=B6=E4=BB=96=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...47\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" | 0 ...46\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" | 0 ...350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" | 0 ...6\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" | 0 ...345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" => "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" (100%) rename "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" => "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" (100%) rename "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" => "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" (100%) rename "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" => "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" (100%) rename "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" => "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" (100%) diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" similarity index 100% rename from "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" rename to "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/04 MySQL \344\270\255\347\232\204\344\272\213\345\212\241\347\256\241\347\220\206.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" similarity index 100% rename from "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" rename to "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\344\270\264\346\227\266\344\275\234\344\270\232\346\250\241\346\235\277.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" similarity index 100% rename from "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" rename to "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\345\255\230\345\202\250\350\277\207\347\250\213\350\257\276\344\273\266-2024-09-24.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" similarity index 100% rename from "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" rename to "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\346\255\243\347\241\256\347\232\204\346\257\217\346\227\245\344\270\200\346\265\213\347\275\221\347\253\231.url" diff --git "a/\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" similarity index 100% rename from "\345\210\230\346\226\207\350\276\211/\350\257\276\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" rename to "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\350\247\206\345\233\276-\345\217\202\350\200\203\347\255\224\346\241\210-2024-09-23.md" -- Gitee From 5d8c17da1b7e54421c5717a8ce8138f1edc5c7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:11:19 +0000 Subject: [PATCH 05/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/Mysql-50-untiy.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mysql-50-untiy.md" | 199 ------------------ 1 file changed, 199 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/Mysql-50-untiy.md" diff --git "a/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy.md" "b/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy.md" deleted file mode 100644 index 890633b..0000000 --- "a/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy.md" +++ /dev/null @@ -1,199 +0,0 @@ -# Mysql-50-untiy - -## 1.分析 - -### 需求 - -``` -# 01 查询“01”课程比“02”课程成绩高的学生的信息及课程分数 - -# 02 查询“01”课程比“02”课程成绩低的学生的信息及课程分数(题目 1 是成绩高) - -# 03 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 - -# 04 查询平均成绩小于 60 分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的) - -# 05 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 - -# 06 查询“李”姓老师的数量 - -# 07 查询学过张三老师授课的同学的信息 - -# 08 找出没有学过张三老师课程的学生 - -# 09 查询学过编号为 01,并且学过编号为 02 课程的学生信息 - -# 10 查询学过 01 课程,但是没有学过 02 课程的学生信息(注意和上面9题目的区别) - -# 11 查询没有学完全部课程的同学的信息 - -# 12 查询至少有一门课与学号为 01 的同学所学相同的同学的信息 - -# 13 查询和 01 同学学习的课程完全相同的同学的信息 - -# 14 查询没有修过张三老师讲授的任何一门课程的学生姓名 - -# 15 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 - -# 16 检索 01 课程分数小于 60,按分数降序排列的学生信息 - -# 17 按平均成绩从高到低(降序)显示所有学生的所有课程的成绩以及平均成绩 - -# 18 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格 率,中等率,优良率,优秀率;及格:>=60,中等为:70-80,优良为:80-90,优秀为:>=90 - -# 19 按照各科成绩进行排序,并且显示排名 - -# 20 查询学生的总成绩,并进行排名 - -# 21 查询不同老师所教不同课程平均分从高到低显示 - -# 22 查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩 - -# 23 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60] 及所占百分比 - -# 24 查询学生的平均成绩及名次 - -# 25 查询各科成绩前三名的记录 - -# 26 查询每门课被选修的学生数 - -# 27 查询出只有两门课程的全部学生的学号和姓名 - -# 28 查询男女生人数 - -# 29 查询名字中含有 风 字的学生信息 - -# 30 查询同名同性的学生名单,并统计同名人数 - -# 31 查询 1990 年出生的学生信息 - -# 32 查询每门课程的平均成绩,结果按平均成绩降序排列;平均成绩相同时,按课程编号 c_id 升序排列 - -# 33 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 - -# 34 查询课程名称为数学,且分数低于 60 的学生姓名和分数 - -# 35 查询所有学生的课程及分数情况 - -# 36 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数 - -# 37 查询不及格的课程 - -# 38 查询课程编号为 01 且课程成绩大于等于 80 的学生的学号和姓名 - -# 39 每门课程的学生人数 - -# 40 查询选修“张三”老师所授课程的学生中,成绩最高的学生信息及其成绩 - -# 41 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 - -# 42 查询每门功成绩最好的前两名 - -# 43 统计每门课程的学生选修人数(超过 5 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列, 若人数相同,按课程号升序排列 - -# 44 检索至少选修两门课程的学生学号 - -# 45 查询选修了全部课程的学生信息 - -# 46 查询各学生的年龄:按照出生日期来算,当前月日 < 出生年月的月日则,年龄减 1 - -# 47 查询本周过生日的学生 - -# 48 查询下周过生日的学生 - -# 49 查询本月过生的同学 - -# 50 查询下月过生的同学 - -``` - - - -### 数据来源 - -```sql -DROP DATABASE IF EXISTS data_view; -CREATE DATABASE IF NOT EXISTS data_view; -USE data_view; --- 建 表 --- 学 生 表 -CREATE TABLE `Student`( -`s_id` VARCHAR(20), -`s_name` VARCHAR(20) NOT NULL DEFAULT '', -`s_birth` VARCHAR(20) NOT NULL DEFAULT '', -`s_sex` VARCHAR(10) NOT NULL DEFAULT '', -PRIMARY KEY(`s_id`) -); --- 课程表 -CREATE TABLE `Course`( -`c_id` VARCHAR(20), -`c_name` VARCHAR(20) NOT NULL DEFAULT '', -`t_id` VARCHAR(20) NOT NULL, -PRIMARY KEY(`c_id`) -); --- 教师表 -CREATE TABLE `Teacher`( -`t_id` VARCHAR(20), -`t_name` VARCHAR(20) NOT NULL DEFAULT '', -PRIMARY KEY(`t_id`) -); --- 成绩表 -CREATE TABLE `Score`( -`s_id` VARCHAR(20), -`c_id` VARCHAR(20), -`s_score` INT(3), -PRIMARY KEY(`s_id`,`c_id`) -); - --- 插 入 学 生 表 测 试 数 据 -insert into Student values('01' , '赵雷','1990-01-01','男'); -insert into Student values('02' , '钱电','1990-12-21','男'); -insert into Student values('03' , '孙风','1990-05-20','男'); -insert into Student values('04' , '李云','1990-08-06','男'); -insert into Student values('05' , '周梅','1991-12-01','女'); -insert into Student values('06' , '吴兰','1992-03-01','女'); -insert into Student values('07' , '郑竹','1989-07-01','女'); -insert into Student values('08' , '王菊','1990-01-20','女'); --- 课 程 表 测 试 数 据 -insert into Course values('01' , '语文' , '02'); -insert into Course values('02' , '数学' , '01'); -insert into Course values('03' , '英语' , '03'); --- 教 师 表 测 试 数 据 -insert into Teacher values('01' , '张三'); -insert into Teacher values('02' , '李四'); -insert into Teacher values('03' , '王五'); --- 成 绩 表 测 试 数 据 -insert into Score values('01' , '01' , 80); -insert into Score values('01' , '02' , 90); -insert into Score values('01' , '03' , 99); -insert into Score values('02' , '01' , 70); -insert into Score values('02' , '02' , 60); -insert into Score values('02' , '03' , 80); -insert into Score values('03' , '01' , 80); -insert into Score values('03' , '02' , 80); -insert into Score values('03' , '03' , 80); -insert into Score values('04' , '01' , 50); -insert into Score values('04' , '02' , 30); -insert into Score values('04' , '03' , 20); -insert into Score values('05' , '01' , 76); -insert into Score values('05' , '02' , 87); -insert into Score values('06' , '01' , 31); -insert into Score values('06' , '03' , 34); -insert into Score values('07' , '02' , 89); -insert into Score values('07' , '03' , 98); -``` - -### 参考文献 - -```sql -https://www.cnblogs.com/dataliu/p/15610494.html -``` - -## 2.SQL - -```sql - -``` - -### 3.末尾 - -- Gitee From 1f5e70b691cd98c9ca47c1558d29fcf78e66e664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 00:11:41 +0000 Subject: [PATCH 06/18] =?UTF-8?q?=E6=89=A9=E5=B1=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../Mysql-50-untiy-2024-10-12.md" | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/Mysql-50-untiy-2024-10-12.md" diff --git "a/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy-2024-10-12.md" "b/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy-2024-10-12.md" new file mode 100644 index 0000000..38595f7 --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/Mysql-50-untiy-2024-10-12.md" @@ -0,0 +1,208 @@ +# Mysql-50-untiy + +## 1.分析 + +### 需求 + +``` +# 01 查询“01”课程比“02”课程成绩高的学生的信息及课程分数 + +# 02 查询“01”课程比“02”课程成绩低的学生的信息及课程分数(题目 1 是成绩高) + +# 03 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 + +# 04 查询平均成绩小于 60 分的同学的学生编号和学生姓名和平均成绩(包括有成绩的和无成绩的) + +# 05 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩 + +# 06 查询“李”姓老师的数量 + +# 07 查询学过张三老师授课的同学的信息 + +# 08 找出没有学过张三老师课程的学生 + +# 09 查询学过编号为 01,并且学过编号为 02 课程的学生信息 + +# 10 查询学过 01 课程,但是没有学过 02 课程的学生信息(注意和上面9题目的区别) + +# 11 查询没有学完全部课程的同学的信息 + +# 12 查询至少有一门课与学号为 01 的同学所学相同的同学的信息 + +# 13 查询和 01 同学学习的课程完全相同的同学的信息 + +# 14 查询没有修过张三老师讲授的任何一门课程的学生姓名 + +# 15 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 + +# 16 检索 01 课程分数小于 60,按分数降序排列的学生信息 + +# 17 按平均成绩从高到低(降序)显示所有学生的所有课程的成绩以及平均成绩 + +# 18 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格 率,中等率,优良率,优秀率;及格:>=60,中等为:70-80,优良为:80-90,优秀为:>=90 + +# 19 按照各科成绩进行排序,并且显示排名 + +# 20 查询学生的总成绩,并进行排名 + +# 21 查询不同老师所教不同课程平均分从高到低显示 + +# 22 查询所有课程的成绩第 2 名到第 3 名的学生信息及该课程成绩 + +# 23 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[0-60] 及所占百分比 + +# 24 查询学生的平均成绩及名次 + +# 25 查询各科成绩前三名的记录 + +# 26 查询每门课被选修的学生数 + +# 27 查询出只有两门课程的全部学生的学号和姓名 + +# 28 查询男女生人数 + +# 29 查询名字中含有 风 字的学生信息 + +# 30 查询同名同性的学生名单,并统计同名人数 + +# 31 查询 1990 年出生的学生信息 + +# 32 查询每门课程的平均成绩,结果按平均成绩降序排列;平均成绩相同时,按课程编号 c_id 升序排列 + +# 33 查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩 + +# 34 查询课程名称为数学,且分数低于 60 的学生姓名和分数 + +# 35 查询所有学生的课程及分数情况 + +# 36 查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数 + +# 37 查询不及格的课程 + +# 38 查询课程编号为 01 且课程成绩大于等于 80 的学生的学号和姓名 + +# 39 每门课程的学生人数 + +# 40 查询选修“张三”老师所授课程的学生中,成绩最高的学生信息及其成绩 + +# 41 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 + +# 42 查询每门功成绩最好的前两名 + +# 43 统计每门课程的学生选修人数(超过 5 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列, 若人数相同,按课程号升序排列 + +# 44 检索至少选修两门课程的学生学号 + +# 45 查询选修了全部课程的学生信息 + +# 46 查询各学生的年龄:按照出生日期来算,当前月日 < 出生年月的月日则,年龄减 1 + +# 47 查询本周过生日的学生 + +# 48 查询下周过生日的学生 + +# 49 查询本月过生的同学 + +# 50 查询下月过生的同学 + +``` + + + +### 数据来源 + +```sql +DROP DATABASE IF EXISTS data_view; +CREATE DATABASE IF NOT EXISTS data_view; +USE data_view; +-- 建 表 +-- 学 生 表 +CREATE TABLE `Student`( +`s_id` VARCHAR(20), +`s_name` VARCHAR(20) NOT NULL DEFAULT '', +`s_birth` VARCHAR(20) NOT NULL DEFAULT '', +`s_sex` VARCHAR(10) NOT NULL DEFAULT '', +PRIMARY KEY(`s_id`) +); +-- 课程表 +CREATE TABLE `Course`( +`c_id` VARCHAR(20), +`c_name` VARCHAR(20) NOT NULL DEFAULT '', +`t_id` VARCHAR(20) NOT NULL, +PRIMARY KEY(`c_id`) +); +-- 教师表 +CREATE TABLE `Teacher`( +`t_id` VARCHAR(20), +`t_name` VARCHAR(20) NOT NULL DEFAULT '', +PRIMARY KEY(`t_id`) +); +-- 成绩表 +CREATE TABLE `Score`( +`s_id` VARCHAR(20), +`c_id` VARCHAR(20), +`s_score` INT(3), +PRIMARY KEY(`s_id`,`c_id`) +); + +-- 插 入 学 生 表 测 试 数 据 +insert into Student values('01' , '赵雷','1990-01-01','男'); +insert into Student values('02' , '钱电','1990-12-21','男'); +insert into Student values('03' , '孙风','1990-05-20','男'); +insert into Student values('04' , '李云','1990-08-06','男'); +insert into Student values('05' , '周梅','1991-12-01','女'); +insert into Student values('06' , '吴兰','1992-03-01','女'); +insert into Student values('07' , '郑竹','1989-07-01','女'); +insert into Student values('08' , '王菊','1990-01-20','女'); +-- 课 程 表 测 试 数 据 +insert into Course values('01' , '语文' , '02'); +insert into Course values('02' , '数学' , '01'); +insert into Course values('03' , '英语' , '03'); +-- 教 师 表 测 试 数 据 +insert into Teacher values('01' , '张三'); +insert into Teacher values('02' , '李四'); +insert into Teacher values('03' , '王五'); +-- 成 绩 表 测 试 数 据 +insert into Score values('01' , '01' , 80); +insert into Score values('01' , '02' , 90); +insert into Score values('01' , '03' , 99); +insert into Score values('02' , '01' , 70); +insert into Score values('02' , '02' , 60); +insert into Score values('02' , '03' , 80); +insert into Score values('03' , '01' , 80); +insert into Score values('03' , '02' , 80); +insert into Score values('03' , '03' , 80); +insert into Score values('04' , '01' , 50); +insert into Score values('04' , '02' , 30); +insert into Score values('04' , '03' , 20); +insert into Score values('05' , '01' , 76); +insert into Score values('05' , '02' , 87); +insert into Score values('06' , '01' , 31); +insert into Score values('06' , '03' , 34); +insert into Score values('07' , '02' , 89); +insert into Score values('07' , '03' , 98); +``` + +### 参考文献 + +```sql +https://www.cnblogs.com/dataliu/p/15610494.html +``` + +## 2.SQL + +### 任务I + +```sql + +``` + +### 任务II + +```sql + +``` + +### 3.末尾 + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee From 8500b35c1bbf39cec56f48ee2377081692c5dabc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 02:27:43 +0000 Subject: [PATCH 07/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/CASE-2024-09-29.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CASE-2024-09-29.md" | 117 ------------------ 1 file changed, 117 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" diff --git "a/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" "b/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" deleted file mode 100644 index 2c83c54..0000000 --- "a/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" +++ /dev/null @@ -1,117 +0,0 @@ -# CASE - -## 1.分析 - -2.根据薪资范围增加奖金,使用 `CASE` 语句和循环 - -设计一个存储过程,遍历所有员工,根据薪资范围增加奖金: - -- 薪资 < 10000: 奖金增加 100 -- 薪资在 10000 到 20000 之间: 奖金增加 200 -- 薪资 > 30000 不加 - -最后打印几个员工增加了奖金a - -3. 分组统计全公司各部门的平均工资,人数,及10000以下、10001-20000、20001-30000、30001以上的人数 - - ## 2.SQL代码 - -```sql -### 2. :根据薪资范围增加奖金,使用 `CASE` 语句和循环 - -设计一个存储过程,遍历所有员工,根据薪资范围增加奖金: - -- 薪资 < 10000: 奖金增加 100 -- 薪资在 10000 到 20000 之间: 奖金增加 200 -- 薪资 > 30000 不加 - -最后打印几个员工增加了奖金a -DROP PROCEDURE IF EXISTS addcomm; - -CREATE PROCEDURE addcomm() -BEGIN -SELECT count(u.增加了奖金) 几个员工增加了奖金 FROM (SELECT ename,sal,case WHEN sal+IFNULL(comm,0)<10000 THEN sal+100 WHEN sal+IFNULL(comm,0) BETWEEN 10000 AND 20000 THEN sal+200 WHEN sal+IFNULL(comm,0)>30000 THEN sal END AS 增加了奖金 FROM emp) u ; -END; -CALL addcomm; - - -DROP PROCEDURE IF EXISTS LoopThroughTableWhileSimple; - -DELIMITER // -CREATE PROCEDURE LoopThroughTableWhileSimple() -BEGIN - DECLARE done INT DEFAULT FALSE; - DECLARE current_id INT DEFAULT 1001; - DECLARE max_id INT; - - SELECT MAX(empno) INTO max_id FROM emp; - - WHILE current_id <= max_id DO - SELECT ename,sal,case WHEN sal+IFNULL(comm,0)<10000 THEN sal+100 WHEN sal+IFNULL(comm,0) BETWEEN 10000 AND 20000 THEN sal+200 WHEN sal+IFNULL(comm,0)>30000 THEN sal END AS 增加了奖金 FROM emp WHERE empno = current_id; - SET current_id = current_id + 1; - END WHILE; -END // - -DELIMITER ; - -CALL LoopThroughTableWhileSimple; - -====================================================== -DROP PROCEDURE p_119; -CREATE PROCEDURE p_119() -BEGIN -·定义变量存放当前要判断的员工编号 -DECLARE emp_id int; -·—定义变量存放员工的工资 -DECLARE emp_sal decimal(10,2); --定义一个计数器 -DECLARE emp_count int DEFAULT 0; -·定义变量存放员工的奖金 -DECLARE emp_comm decimal(10,2); -·每次从表中找出当前要判断的最小员工编号赋值给emp_id -SELECT MIN(empno) into emp_id FROM emp; -所有员工都要遍历,所以要循环,不知道终点,用1oop -a: loop -—不管哪个员工,都要做的事情,判断emp_id对应的员工的工资是多少 -SELECT sal, ifnull(comm, 0) INTO emp_sal, emp_comm FROM emp WHERE empno = emp_id; - UPDATE emp SET comm = (CASE -WHEN emp_sal < 10000 THEN emp_comm + 100 -WHEN emp_sal >=10000 and emp_sal <=20000 THEN emp_comm +200 -ELSE emp comm -END) -WHERE empno = emp_id; -对比修改前后的奖金有没有变化,有变化就计数器加1 -if emp_comm != (select ifnull(comm, 0) from emp where empno = emp_id) then set emp_count = emp_count +1; end if; -—·更新最小的员工编号 -SELECT MIN(empno) into emp_id FROM emp where empno > emp_id; -if emp_id is null then leave a;end if; -end loop; -select concat('共修改了几个人的',emp_count,'奖金') as 结果; -END; -CALL p 119( ); - -3. 分组统计全公司各部门的平均工资,人数,及10000以下、10001-20000、20001-30000、30001以上的人数 -DROP PROCEDURE IF EXISTS addcomm; - -CREATE PROCEDURE addcomm() -BEGIN - SELECT - d.dname, - AVG(e.sal) AS B平均工资, - COUNT(e.empno) AS 总人数, - SUM(CASE WHEN e.sal <= 10000 THEN 1 ELSE 0 END) AS '10000以下', - SUM(CASE WHEN e.sal BETWEEN 10001 AND 20000 THEN 1 ELSE 0 END) AS '10001-20000', - SUM(CASE WHEN e.sal BETWEEN 20001 AND 30000 THEN 1 ELSE 0 END) AS '20001-30000', - SUM(CASE WHEN e.sal > 30000 THEN 1 ELSE 0 END) AS '30001以上' -FROM - dept d -LEFT JOIN - emp e ON d.deptno = e.deptno -GROUP BY - d.dname ; -END; - -CALL addcomm; -``` - -### 3.末尾 -- Gitee From f6f47494ee87084faeed468b6f258c3b8c8bd8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 02:27:54 +0000 Subject: [PATCH 08/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../CASE-2024-09-29.md" | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" diff --git "a/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" "b/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" new file mode 100644 index 0000000..b82403c --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/CASE-2024-09-29.md" @@ -0,0 +1,197 @@ +# CASE + +## 1.分析 + +### 需求 + +```sql +2.根据薪资范围增加奖金,使用 `CASE` 语句和循环 + +设计一个存储过程,遍历所有员工,根据薪资范围增加奖金: + +- 薪资 < 10000: 奖金增加 100 +- 薪资在 10000 到 20000 之间: 奖金增加 200 +- 薪资 > 30000 不加 + +最后打印几个员工增加了奖金a + +3.分组统计全公司各部门的平均工资,人数,及10000以下、10001-20000、20001-30000、30001以上的人数 +``` + +### 数据来源 + +```sql +-- 准备数据 +DROP DATABASE IF EXISTS case_db; +create database if not exists case_db; +use case_db; + +# 部门表 +create table dept( + deptno int primary key, + dname varchar(20), + loc varchar(20) +); +insert into dept values(10, '教研部','北京'), +(20, '学工部','上海'), +(30, '销售部','广州'), +(40, '财务部','武汉'); + +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int, +-- FOREIGN KEY (mgr) REFERENCES emp(empno), + FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +# 工资等级表 +create table salgrade( + grade int primary key, + losal int, + hisal int +); +insert into salgrade values +(1, 7000, 12000), +(2, 12010, 14000), +(3, 14010, 20000), +(4, 20010, 30000), +(5, 30010, 99990); +``` + + + +## 2.SQL代码 + +### 任务I + +```sql +### 2. :根据薪资范围增加奖金,使用 `CASE` 语句和循环 + +设计一个存储过程,遍历所有员工,根据薪资范围增加奖金: + +- 薪资 < 10000: 奖金增加 100 +- 薪资在 10000 到 20000 之间: 奖金增加 200 +- 薪资 > 30000 不加 + +最后打印几个员工增加了奖金a +DROP PROCEDURE IF EXISTS addcomm; + +CREATE PROCEDURE addcomm() +BEGIN +SELECT count(u.增加了奖金) 几个员工增加了奖金 FROM (SELECT ename,sal,case WHEN sal+IFNULL(comm,0)<10000 THEN sal+100 WHEN sal+IFNULL(comm,0) BETWEEN 10000 AND 20000 THEN sal+200 WHEN sal+IFNULL(comm,0)>30000 THEN sal END AS 增加了奖金 FROM emp) u ; +END; +CALL addcomm; + + +DROP PROCEDURE IF EXISTS LoopThroughTableWhileSimple; + +DELIMITER // +CREATE PROCEDURE LoopThroughTableWhileSimple() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE current_id INT DEFAULT 1001; + DECLARE max_id INT; + + SELECT MAX(empno) INTO max_id FROM emp; + + WHILE current_id <= max_id DO + SELECT ename,sal,case WHEN sal+IFNULL(comm,0)<10000 THEN sal+100 WHEN sal+IFNULL(comm,0) BETWEEN 10000 AND 20000 THEN sal+200 WHEN sal+IFNULL(comm,0)>30000 THEN sal END AS 增加了奖金 FROM emp WHERE empno = current_id; + SET current_id = current_id + 1; + END WHILE; +END // + +DELIMITER ; + +CALL LoopThroughTableWhileSimple; + +====================================================== +DROP PROCEDURE p_119; +CREATE PROCEDURE p_119() +BEGIN +·定义变量存放当前要判断的员工编号 +DECLARE emp_id int; +·—定义变量存放员工的工资 +DECLARE emp_sal decimal(10,2); +-定义一个计数器 +DECLARE emp_count int DEFAULT 0; +·定义变量存放员工的奖金 +DECLARE emp_comm decimal(10,2); +·每次从表中找出当前要判断的最小员工编号赋值给emp_id +SELECT MIN(empno) into emp_id FROM emp; +所有员工都要遍历,所以要循环,不知道终点,用1oop +a: loop +—不管哪个员工,都要做的事情,判断emp_id对应的员工的工资是多少 +SELECT sal, ifnull(comm, 0) INTO emp_sal, emp_comm FROM emp WHERE empno = emp_id; + UPDATE emp SET comm = (CASE +WHEN emp_sal < 10000 THEN emp_comm + 100 +WHEN emp_sal >=10000 and emp_sal <=20000 THEN emp_comm +200 +ELSE emp comm +END) +WHERE empno = emp_id; +对比修改前后的奖金有没有变化,有变化就计数器加1 +if emp_comm != (select ifnull(comm, 0) from emp where empno = emp_id) then set emp_count = emp_count +1; end if; +—·更新最小的员工编号 +SELECT MIN(empno) into emp_id FROM emp where empno > emp_id; +if emp_id is null then leave a;end if; +end loop; +select concat('共修改了几个人的',emp_count,'奖金') as 结果; +END; +CALL p 119( ); + +3. 分组统计全公司各部门的平均工资,人数,及10000以下、10001-20000、20001-30000、30001以上的人数 +DROP PROCEDURE IF EXISTS addcomm; + +CREATE PROCEDURE addcomm() +BEGIN + SELECT + d.dname, + AVG(e.sal) AS B平均工资, + COUNT(e.empno) AS 总人数, + SUM(CASE WHEN e.sal <= 10000 THEN 1 ELSE 0 END) AS '10000以下', + SUM(CASE WHEN e.sal BETWEEN 10001 AND 20000 THEN 1 ELSE 0 END) AS '10001-20000', + SUM(CASE WHEN e.sal BETWEEN 20001 AND 30000 THEN 1 ELSE 0 END) AS '20001-30000', + SUM(CASE WHEN e.sal > 30000 THEN 1 ELSE 0 END) AS '30001以上' +FROM + dept d +LEFT JOIN + emp e ON d.deptno = e.deptno +GROUP BY + d.dname ; +END; + +CALL addcomm; +``` + +### 任务II + +```sql + +``` + + + +## 3.末尾 + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee From ff0b911e5c69f36645e965f4e05c2f70f1fb4199 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:03:24 +0000 Subject: [PATCH 09/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\347\264\242\345\274\225-2024-10-18.md" | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" new file mode 100644 index 0000000..7360c88 --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" @@ -0,0 +1,110 @@ +# 索引 + +## 1.分析 + +### 需求 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +-- 2.查询emp表有哪些索引 +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 4. 删除前面建立的两个索引 +-- 5. 选择两个字段添加一个复合索引 +-- 6. 使用复合索引的字段进行查询 +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +``` + +### 数据来源 + +```sql +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +``` + +## 2.SQL + +### 任务I + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +-- 2.查询emp表有哪些索引 +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 4. 删除前面建立的两个索引 +-- 5. 选择两个字段添加一个复合索引 +-- 6. 使用复合索引的字段进行查询 +``` + +### 任务II + +```sql +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(50) NOT NULL, + age INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +DELIMITER // + +CREATE PROCEDURE GenerateRandomData(IN num_rows INT) +BEGIN + DECLARE i INT DEFAULT 1; + DECLARE random_uname VARCHAR(50); + DECLARE random_age INT; + + WHILE i <= num_rows DO + SET random_uname = CONCAT( + SUBSTRING(MD5(RAND()), 1, FLOOR(1 + RAND() * 10)), + SUBSTRING(MD5(RAND()), 1, FLOOR(5 + RAND() * 10)) + ); + + SET random_age = FLOOR(1 + RAND() * 100); + + INSERT INTO users (uname, age) VALUES (random_uname, random_age); + + SET i = i + 1; + END WHILE; +END // + +DELIMITER ; + +CALL GenerateRandomData(5000000); +``` + +## 3.末尾 + -- Gitee From ef9749fa4b2335ca8bca5885f14206ac9f21a77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:17:29 +0000 Subject: [PATCH 10/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/=E7=B4=A2=E5=BC=95-2024-10-18.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\264\242\345\274\225-2024-10-18.md" | 110 ------------------ 1 file changed, 110 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" deleted file mode 100644 index 7360c88..0000000 --- "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" +++ /dev/null @@ -1,110 +0,0 @@ -# 索引 - -## 1.分析 - -### 需求 - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 --- 2.查询emp表有哪些索引 --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 --- 4. 删除前面建立的两个索引 --- 5. 选择两个字段添加一个复合索引 --- 6. 使用复合索引的字段进行查询 --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 - -``` - -### 数据来源 - -```sql -# 员工表 -create table emp( - empno int primary key, - ename varchar(20), - job varchar(20), - mgr int, - hiredate date, - sal numeric(8,2), - comm numeric(8, 2), - deptno int -); -insert into emp values -(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), -(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), -(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), -(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), -(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), -(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), -(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), -(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), -(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), -(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), -(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), -(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), -(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), -(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); - -``` - -## 2.SQL - -### 任务I - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 --- 2.查询emp表有哪些索引 --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 --- 4. 删除前面建立的两个索引 --- 5. 选择两个字段添加一个复合索引 --- 6. 使用复合索引的字段进行查询 -``` - -### 任务II - -```sql --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 -CREATE TABLE users ( - id INT AUTO_INCREMENT PRIMARY KEY, - uname VARCHAR(50) NOT NULL, - age INT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -DELIMITER // - -CREATE PROCEDURE GenerateRandomData(IN num_rows INT) -BEGIN - DECLARE i INT DEFAULT 1; - DECLARE random_uname VARCHAR(50); - DECLARE random_age INT; - - WHILE i <= num_rows DO - SET random_uname = CONCAT( - SUBSTRING(MD5(RAND()), 1, FLOOR(1 + RAND() * 10)), - SUBSTRING(MD5(RAND()), 1, FLOOR(5 + RAND() * 10)) - ); - - SET random_age = FLOOR(1 + RAND() * 100); - - INSERT INTO users (uname, age) VALUES (random_uname, random_age); - - SET i = i + 1; - END WHILE; -END // - -DELIMITER ; - -CALL GenerateRandomData(5000000); -``` - -## 3.末尾 - -- Gitee From 7b211985fcd5e0351d9b3474389cd3c23824882a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:17:57 +0000 Subject: [PATCH 11/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\347\264\242\345\274\225-2024-10-18.md" | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" new file mode 100644 index 0000000..7b630fc --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" @@ -0,0 +1,119 @@ +# 索引 + +## 1.分析 + +### 需求 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +-- 2.查询emp表有哪些索引 +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 4. 删除前面建立的两个索引 +-- 5. 选择两个字段添加一个复合索引 +-- 6. 使用复合索引的字段进行查询 +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +``` + +### 数据来源 + +```sql +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +``` + +## 2.SQL + +### 任务I + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +ALTER TABLE emp ADD INDEX key_hiredate(hiredate); +ALTER TABLE emp ADD UNIQUE INDEX key_unique(ename) ; +-- 2.查询emp表有哪些索引 +SHOW INDEX FROM emp; +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁'; +-- 4. 删除前面建立的两个索引 +ALTER TABLE emp DROP INDEX key_hiredate; +ALTER TABLE emp DROP INDEX key_unique; +-- 5. 选择两个字段添加一个复合索引 +ALTER TABLE emp ADD INDEX key_unity(ename,job) ; +ALTER TABLE emp DROP INDEX key_unity; +-- 6. 使用复合索引的字段进行查询 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁' AND job = '文员'; +``` + +### 任务II + +```sql +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 +CREATE TABLE users ( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(50) NOT NULL, + age INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +DELIMITER // + +CREATE PROCEDURE GenerateRandomData(IN num_rows INT) +BEGIN + DECLARE i INT DEFAULT 1; + DECLARE random_uname VARCHAR(50); + DECLARE random_age INT; + + WHILE i <= num_rows DO + SET random_uname = CONCAT( + SUBSTRING(MD5(RAND()), 1, FLOOR(1 + RAND() * 10)), + SUBSTRING(MD5(RAND()), 1, FLOOR(5 + RAND() * 10)) + ); + + SET random_age = FLOOR(1 + RAND() * 100); + + INSERT INTO users (uname, age) VALUES (random_uname, random_age); + + SET i = i + 1; + END WHILE; +END // + +DELIMITER ; + +CALL GenerateRandomData(5000000); +``` + +## 3.末尾 + -- Gitee From d571314605b89631c6cc5c4c4bd5c4da664b895e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:18:16 +0000 Subject: [PATCH 12/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\347\264\242\345\274\225.md" | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\347\264\242\345\274\225.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\347\264\242\345\274\225.md" "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\347\264\242\345\274\225.md" new file mode 100644 index 0000000..42055e3 --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\345\205\266\344\273\226\346\226\207\344\273\266/\347\264\242\345\274\225.md" @@ -0,0 +1,80 @@ +MySQL中的索引是提高数据库查询性能的重要机制。以下是关于MySQL索引的相关概念和用法的详细知识点: + +### 1. **索引的概念** +- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 +- **作用**:加速数据检索,优化查询性能,避免全表扫描。 + +### 2. **索引的类型** +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### 3. **创建索引** +使用 `CREATE INDEX` 语句可以创建索引: +```sql +CREATE INDEX index_name ON table_name(column1, column2, ...); +``` +- **示例**: +```sql +CREATE INDEX idx_name ON employees(last_name); +``` +```sql +# 其它方法 +alter table table_name add index idx (xx); +alter table table_c add index idx_c (uname); +-- 建表时 +create table table_b( +id int PRIMARY key auto_increment, +uname varchar(10), +index idx_b (uname) +); +``` +### 4. **索引的使用** +- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 +- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 + +### 5. **索引的选择** +- **选择性**:索引的选择性越高,索引的效果越好。选择性是指索引中唯一值的比例。 +- **列的数据类型**:对于高选择性列(如身份证号、电子邮件等)创建索引更有效。 +- **避免高重复的列**:比如性别列 + +### 6. **索引的优缺点** +- **优点**: + - 提高查询速度。 + - 减少查询所需的IO操作。 + +- **缺点**: + - 增加写入操作的时间(INSERT、UPDATE、DELETE),因为需要维护索引。 + - 增加存储空间的使用。 + +### 7. **查看索引** +使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 + +### 8. **删除索引** +使用 `DROP INDEX` 语句删除索引: +```sql +DROP INDEX index_name ON table_name; +-- 其它 +alter table table_a drop index idx_a; +``` +- **示例**: +```sql +DROP INDEX idx_name ON employees; +``` + +### 9. **使用场景** +- 在需要频繁查询的列上创建索引。 +- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 + + + +### 11. **性能监控** +使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: +```sql +EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; +``` + +复合索引(联合索引),使用要遵循最左原则。(a,b,c) where a=? and b=? 有效, where b=? and c=? 无效 \ No newline at end of file -- Gitee From e3d82831fc616b13c806d368cbadf037566804d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:36:06 +0000 Subject: [PATCH 13/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/SELECT-2024-09-30.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SELECT-2024-09-30.md" | 105 ------------------ 1 file changed, 105 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" diff --git "a/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" "b/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" deleted file mode 100644 index f013c39..0000000 --- "a/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" +++ /dev/null @@ -1,105 +0,0 @@ -# SELECT - -## 1.分析 - -- 查询每个员工的入职日期,并计算他们下一次生日的日期。 -- 查询所有员工的入职日期,并计算他们入职至今的总天数。 - -- 查询所有员工的入职日期,并根据入职年份显示他们的入职年代(例如:2000-2009为'2000s',2010-2019为'2010s')。 -- 查询每个员工的姓名、薪资以及他们的薪资等级,并计算他们如果获得5%的加薪后的薪资。 - -## 2.SQL代码 - -- ### 数据来源 - - ```sql - -- 准备数据 - DROP DATABASE IF EXISTS db_view; - create database if not exists db_view; - use db_view; - - # 部门表 - create table dept( - deptno int primary key, - dname varchar(20), - loc varchar(20) - ); - insert into dept values(10, '教研部','北京'), - (20, '学工部','上海'), - (30, '销售部','广州'), - (40, '财务部','武汉'); - - # 员工表 - create table emp( - empno int primary key, - ename varchar(20), - job varchar(20), - mgr int, - hiredate date, - sal numeric(8,2), - comm numeric(8, 2), - deptno int, - -- FOREIGN KEY (mgr) REFERENCES emp(empno), - FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE - ); - insert into emp values - (1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), - (1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), - (1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), - (1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), - (1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), - (1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), - (1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), - (1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), - (1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), - (1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), - (1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), - (1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), - (1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), - (1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); - - # 工资等级表 - create table salgrade( - grade int primary key, - losal int, - hisal int - ); - insert into salgrade values - (1, 7000, 12000), - (2, 12010, 14000), - (3, 14010, 20000), - (4, 20010, 30000), - (5, 30010, 99990); - ``` - - - -- ### 作业 - - ```sql - - 查询每个员工的入职日期,并计算他们下一次生日的日期。 - SELECT ename,hiredate,DATE_ADD(hiredate,INTERVAL 1 YEAR) hiredate_ad FROM emp; - - - 查询所有员工的入职日期,并计算他们入职至今的总天数。 - SELECT ename,hiredate,DATEDIFF(NOW(),hiredate) 入职至今的总天数 FROM emp; - - - 查询所有员工的入职日期,并根据入职年份显示他们的入职年代(例如:2000-2009为'2000s',2010-2019为'2010s')。 - DROP PROCEDURE IF EXISTS date1; - CREATE PROCEDURE date1() - BEGIN - SELECT hiredate,CASE - WHEN YEAR(hiredate) BETWEEN 2000 AND 2009 THEN '2000s' - WHEN YEAR(hiredate) BETWEEN 2010 AND 2019 THEN '2010s' - ELSE - ' ' - END 入职年代 - FROM emp; - END; - - - - 查询每个员工的姓名、薪资以及他们的薪资等级,并计算他们如果获得5%的加薪后的薪资。 -SELECT em.ename 姓名,sal 薪资,(SELECT grade FROM salgrade sa WHERE em.sal BETWEEN sa.losal AND sa.hisal ) 薪资等级,sal*1.05 加薪后的薪资 FROM emp em; - - ``` - -## 3.末尾 -- Gitee From bbc39cc7fb767f434d146539e484d06c1834d187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 03:37:54 +0000 Subject: [PATCH 14/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../SELECT-2024-09-30.md" | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" diff --git "a/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" "b/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" new file mode 100644 index 0000000..78923d3 --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/SELECT-2024-09-30.md" @@ -0,0 +1,115 @@ +# SELECT + +## 1.分析 + +### 需求 + +```sql +- 查询每个员工的入职日期,并计算他们下一次生日的日期。 +- 查询所有员工的入职日期,并计算他们入职至今的总天数。 + +- 查询所有员工的入职日期,并根据入职年份显示他们的入职年代(例如:2000-2009为'2000s',2010-2019为'2010s')。 +- 查询每个员工的姓名、薪资以及他们的薪资等级,并计算他们如果获得5%的加薪后的薪资。 +``` + +### 数据来源 + +```sql +-- 准备数据 +DROP DATABASE IF EXISTS db_view; +create database if not exists db_view; +use db_view; + +# 部门表 +create table dept( + deptno int primary key, + dname varchar(20), + loc varchar(20) +); +insert into dept values(10, '教研部','北京'), +(20, '学工部','上海'), +(30, '销售部','广州'), +(40, '财务部','武汉'); + +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int, +-- FOREIGN KEY (mgr) REFERENCES emp(empno), + FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +# 工资等级表 +create table salgrade( + grade int primary key, + losal int, + hisal int +); +insert into salgrade values +(1, 7000, 12000), +(2, 12010, 14000), +(3, 14010, 20000), +(4, 20010, 30000), +(5, 30010, 99990); +``` + +## 2.SQL代码 + +### 任务I + +```sql +暂无 +``` + +### 任务II + +```sql +- 查询每个员工的入职日期,并计算他们下一次生日的日期。 +SELECT ename,hiredate,DATE_ADD(hiredate,INTERVAL 1 YEAR) hiredate_ad FROM emp; + +- 查询所有员工的入职日期,并计算他们入职至今的总天数。 +SELECT ename,hiredate,DATEDIFF(NOW(),hiredate) 入职至今的总天数 FROM emp; + +- 查询所有员工的入职日期,并根据入职年份显示他们的入职年代(例如:2000-2009为'2000s',2010-2019为'2010s')。 +DROP PROCEDURE IF EXISTS date1; +CREATE PROCEDURE date1() +BEGIN +SELECT hiredate,CASE + WHEN YEAR(hiredate) BETWEEN 2000 AND 2009 THEN '2000s' + WHEN YEAR(hiredate) BETWEEN 2010 AND 2019 THEN '2010s' + ELSE + ' ' +END 入职年代 + FROM emp; + END; + + +- 查询每个员工的姓名、薪资以及他们的薪资等级,并计算他们如果获得5%的加薪后的薪资。 +SELECT em.ename 姓名,sal 薪资,(SELECT grade FROM salgrade sa WHERE em.sal BETWEEN sa.losal AND sa.hisal ) 薪资等级,sal*1.05 加薪后的薪资 FROM emp em; + +``` + +## 3.末尾 + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee From c67cfadebb0cd900164066d5468ef8260fde82a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 05:49:53 +0000 Subject: [PATCH 15/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/=E7=B4=A2=E5=BC=95-2024-10-18.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\264\242\345\274\225-2024-10-18.md" | 119 ------------------ 1 file changed, 119 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" deleted file mode 100644 index 7b630fc..0000000 --- "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" +++ /dev/null @@ -1,119 +0,0 @@ -# 索引 - -## 1.分析 - -### 需求 - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 --- 2.查询emp表有哪些索引 --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 --- 4. 删除前面建立的两个索引 --- 5. 选择两个字段添加一个复合索引 --- 6. 使用复合索引的字段进行查询 --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 - -``` - -### 数据来源 - -```sql -# 员工表 -create table emp( - empno int primary key, - ename varchar(20), - job varchar(20), - mgr int, - hiredate date, - sal numeric(8,2), - comm numeric(8, 2), - deptno int -); -insert into emp values -(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), -(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), -(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), -(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), -(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), -(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), -(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), -(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), -(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), -(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), -(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), -(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), -(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), -(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); - -``` - -## 2.SQL - -### 任务I - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 -ALTER TABLE emp ADD INDEX key_hiredate(hiredate); -ALTER TABLE emp ADD UNIQUE INDEX key_unique(ename) ; --- 2.查询emp表有哪些索引 -SHOW INDEX FROM emp; --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 -EXPLAIN SELECT * FROM emp WHERE ename = '甘宁'; --- 4. 删除前面建立的两个索引 -ALTER TABLE emp DROP INDEX key_hiredate; -ALTER TABLE emp DROP INDEX key_unique; --- 5. 选择两个字段添加一个复合索引 -ALTER TABLE emp ADD INDEX key_unity(ename,job) ; -ALTER TABLE emp DROP INDEX key_unity; --- 6. 使用复合索引的字段进行查询 -EXPLAIN SELECT * FROM emp WHERE ename = '甘宁' AND job = '文员'; -``` - -### 任务II - -```sql --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 -CREATE TABLE users ( - id INT AUTO_INCREMENT PRIMARY KEY, - uname VARCHAR(50) NOT NULL, - age INT NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -DELIMITER // - -CREATE PROCEDURE GenerateRandomData(IN num_rows INT) -BEGIN - DECLARE i INT DEFAULT 1; - DECLARE random_uname VARCHAR(50); - DECLARE random_age INT; - - WHILE i <= num_rows DO - SET random_uname = CONCAT( - SUBSTRING(MD5(RAND()), 1, FLOOR(1 + RAND() * 10)), - SUBSTRING(MD5(RAND()), 1, FLOOR(5 + RAND() * 10)) - ); - - SET random_age = FLOOR(1 + RAND() * 100); - - INSERT INTO users (uname, age) VALUES (random_uname, random_age); - - SET i = i + 1; - END WHILE; -END // - -DELIMITER ; - -CALL GenerateRandomData(5000000); -``` - -## 3.末尾 - -- Gitee From e11d7be29f9bc1e6914bc09407db52ba0bea9200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 05:50:17 +0000 Subject: [PATCH 16/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\347\264\242\345\274\225-2024-10-18.md" | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" new file mode 100644 index 0000000..d07094d --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" @@ -0,0 +1,195 @@ +# 索引 + +## 1.分析 + +### 需求 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +-- 2.查询emp表有哪些索引 +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 4. 删除前面建立的两个索引 +-- 5. 选择两个字段添加一个复合索引 +-- 6. 使用复合索引的字段进行查询 +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +``` + +### 数据来源 + +```sql +DROP DATABASE IF EXISTS INDEX_db; +CREATE DATABASE IF NOT EXISTS INDEX_db; +USE INDEX_db; + +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +``` + +## 2.SQL + +### 任务I + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +ALTER TABLE emp ADD INDEX key_hiredate(hiredate); +ALTER TABLE emp ADD UNIQUE INDEX key_unique(ename) ; +-- 2.查询emp表有哪些索引 +SHOW INDEX FROM emp; +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁'; +-- 4. 删除前面建立的两个索引 +ALTER TABLE emp DROP INDEX key_hiredate; +ALTER TABLE emp DROP INDEX key_unique; +-- 5. 选择两个字段添加一个复合索引 +ALTER TABLE emp ADD INDEX key_unity(ename,job) ; +ALTER TABLE emp DROP INDEX key_unity; +-- 6. 使用复合索引的字段进行查询 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁' AND job = '文员'; +``` + +### 任务II + +```sql +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +DROP TABLE IF EXISTS random_table; +CREATE TABLE IF NOT EXISTS random_table ( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(255) NOT NULL, + age INT NOT NULL, + created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +DELIMITER $$ +DROP PROCEDURE IF EXISTS random_user; + +CREATE PROCEDURE IF NOT EXISTS random_user(IN num_rows INT) +BEGIN + DECLARE num INT DEFAULT 0; + WHILE num < num_rows DO + INSERT INTO random_table (uname, age) + VALUES (CONCAT('user', FLOOR(RAND() * 1000000) + 1), FLOOR(RAND() * 100) + 1); + SET num = num + 1; + END WHILE; +END$$ + +DELIMITER ; + +CALL random_user(5000000); +``` + +## 3.末尾 + +### 1. **索引的概念** +- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 +- **作用**:加速数据检索,优化查询性能,避免全表扫描。 + +### 2. **索引的类型** +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### 3. **创建索引** +使用 `CREATE INDEX` 语句可以创建索引: +```sql +CREATE INDEX index_name ON table_name(column1, column2, ...); +``` +- **示例**: +```sql +CREATE INDEX idx_name ON employees(last_name); +``` +```sql +# 其它方法 +alter table table_name add index idx (xx); +alter table table_c add index idx_c (uname); +-- 建表时 +create table table_b( +id int PRIMARY key auto_increment, +uname varchar(10), +index idx_b (uname) +); +``` +### 4. **索引的使用** +- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 +- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 + +### 5. **索引的选择** +- **选择性**:索引的选择性越高,索引的效果越好。选择性是指索引中唯一值的比例。 +- **列的数据类型**:对于高选择性列(如身份证号、电子邮件等)创建索引更有效。 +- **避免高重复的列**:比如性别列 + +### 6. **索引的优缺点** +- **优点**: + - 提高查询速度。 + - 减少查询所需的IO操作。 + +- **缺点**: + - 增加写入操作的时间(INSERT、UPDATE、DELETE),因为需要维护索引。 + - 增加存储空间的使用。 + +### 7. **查看索引** +使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 + +### 8. **删除索引** +使用 `DROP INDEX` 语句删除索引: +```sql +DROP INDEX index_name ON table_name; +-- 其它 +alter table table_a drop index idx_a; +``` +- **示例**: +```sql +DROP INDEX idx_name ON employees; +``` + +### 9. **使用场景** +- 在需要频繁查询的列上创建索引。 +- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 + + + +### 11. **性能监控** +使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: +```sql +EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; +``` + +复合索引(联合索引),使用要遵循最左原则。(a,b,c) where a=? and b=? 有效, where b=? and c=? 无效 + -- Gitee From 812561b59aad7269a6dece400d0435c6518db660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 05:59:15 +0000 Subject: [PATCH 17/18] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?= =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89/=E7=B4=A2=E5=BC=95-2024-10-18.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\264\242\345\274\225-2024-10-18.md" | 195 ------------------ 1 file changed, 195 deletions(-) delete mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" deleted file mode 100644 index d07094d..0000000 --- "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" +++ /dev/null @@ -1,195 +0,0 @@ -# 索引 - -## 1.分析 - -### 需求 - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 --- 2.查询emp表有哪些索引 --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 --- 4. 删除前面建立的两个索引 --- 5. 选择两个字段添加一个复合索引 --- 6. 使用复合索引的字段进行查询 --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 - -``` - -### 数据来源 - -```sql -DROP DATABASE IF EXISTS INDEX_db; -CREATE DATABASE IF NOT EXISTS INDEX_db; -USE INDEX_db; - -# 员工表 -create table emp( - empno int primary key, - ename varchar(20), - job varchar(20), - mgr int, - hiredate date, - sal numeric(8,2), - comm numeric(8, 2), - deptno int -); -insert into emp values -(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), -(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), -(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), -(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), -(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), -(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), -(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), -(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), -(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), -(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), -(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), -(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), -(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), -(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); - -``` - -## 2.SQL - -### 任务I - -```sql --- 练习和作业 --- 1.给emp分别建立 普通索引和唯一索引 -ALTER TABLE emp ADD INDEX key_hiredate(hiredate); -ALTER TABLE emp ADD UNIQUE INDEX key_unique(ename) ; --- 2.查询emp表有哪些索引 -SHOW INDEX FROM emp; --- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 -EXPLAIN SELECT * FROM emp WHERE ename = '甘宁'; --- 4. 删除前面建立的两个索引 -ALTER TABLE emp DROP INDEX key_hiredate; -ALTER TABLE emp DROP INDEX key_unique; --- 5. 选择两个字段添加一个复合索引 -ALTER TABLE emp ADD INDEX key_unity(ename,job) ; -ALTER TABLE emp DROP INDEX key_unity; --- 6. 使用复合索引的字段进行查询 -EXPLAIN SELECT * FROM emp WHERE ename = '甘宁' AND job = '文员'; -``` - -### 任务II - -```sql --- 作业 --- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 --- 1. 不用索引查询 一次姓名uname /并记录时间 --- 2. 建立索引查询 一次姓名uname /并记录时间 - -DROP TABLE IF EXISTS random_table; -CREATE TABLE IF NOT EXISTS random_table ( - id INT AUTO_INCREMENT PRIMARY KEY, - uname VARCHAR(255) NOT NULL, - age INT NOT NULL, - created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -DELIMITER $$ -DROP PROCEDURE IF EXISTS random_user; - -CREATE PROCEDURE IF NOT EXISTS random_user(IN num_rows INT) -BEGIN - DECLARE num INT DEFAULT 0; - WHILE num < num_rows DO - INSERT INTO random_table (uname, age) - VALUES (CONCAT('user', FLOOR(RAND() * 1000000) + 1), FLOOR(RAND() * 100) + 1); - SET num = num + 1; - END WHILE; -END$$ - -DELIMITER ; - -CALL random_user(5000000); -``` - -## 3.末尾 - -### 1. **索引的概念** -- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 -- **作用**:加速数据检索,优化查询性能,避免全表扫描。 - -### 2. **索引的类型** -- **单列索引**:只包含单个列的索引。 -- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 -- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 -- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 -- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 -- **空间索引**:用于地理数据类型的索引,加速空间查询。 - -### 3. **创建索引** -使用 `CREATE INDEX` 语句可以创建索引: -```sql -CREATE INDEX index_name ON table_name(column1, column2, ...); -``` -- **示例**: -```sql -CREATE INDEX idx_name ON employees(last_name); -``` -```sql -# 其它方法 -alter table table_name add index idx (xx); -alter table table_c add index idx_c (uname); --- 建表时 -create table table_b( -id int PRIMARY key auto_increment, -uname varchar(10), -index idx_b (uname) -); -``` -### 4. **索引的使用** -- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 -- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 - -### 5. **索引的选择** -- **选择性**:索引的选择性越高,索引的效果越好。选择性是指索引中唯一值的比例。 -- **列的数据类型**:对于高选择性列(如身份证号、电子邮件等)创建索引更有效。 -- **避免高重复的列**:比如性别列 - -### 6. **索引的优缺点** -- **优点**: - - 提高查询速度。 - - 减少查询所需的IO操作。 - -- **缺点**: - - 增加写入操作的时间(INSERT、UPDATE、DELETE),因为需要维护索引。 - - 增加存储空间的使用。 - -### 7. **查看索引** -使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 - -### 8. **删除索引** -使用 `DROP INDEX` 语句删除索引: -```sql -DROP INDEX index_name ON table_name; --- 其它 -alter table table_a drop index idx_a; -``` -- **示例**: -```sql -DROP INDEX idx_name ON employees; -``` - -### 9. **使用场景** -- 在需要频繁查询的列上创建索引。 -- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 - - - -### 11. **性能监控** -使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: -```sql -EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; -``` - -复合索引(联合索引),使用要遵循最左原则。(a,b,c) where a=? and b=? 有效, where b=? and c=? 无效 - -- Gitee From c8e5d8a6b75d8ffd5cf38a82567a1ebee0e5f95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E8=BE=89?= <14279272+yuwuchuji_0@user.noreply.gitee.com> Date: Fri, 18 Oct 2024 06:00:35 +0000 Subject: [PATCH 18/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘文辉 <14279272+yuwuchuji_0@user.noreply.gitee.com> --- .../\347\264\242\345\274\225-2024-10-18.md" | 211 ++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 "\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" diff --git "a/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" new file mode 100644 index 0000000..7f94edc --- /dev/null +++ "b/\345\210\230\346\226\207\350\276\211/\347\264\242\345\274\225-2024-10-18.md" @@ -0,0 +1,211 @@ +# 索引 + +## 1.分析 + +### 需求 + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +-- 2.查询emp表有哪些索引 +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +-- 4. 删除前面建立的两个索引 +-- 5. 选择两个字段添加一个复合索引 +-- 6. 使用复合索引的字段进行查询 +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +``` + +### 数据来源 + +```sql +DROP DATABASE IF EXISTS INDEX_db; +CREATE DATABASE IF NOT EXISTS INDEX_db; +USE INDEX_db; + +# 员工表 +create table emp( + empno int primary key, + ename varchar(20), + job varchar(20), + mgr int, + hiredate date, + sal numeric(8,2), + comm numeric(8, 2), + deptno int +); +insert into emp values +(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20), +(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30), +(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30), +(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20), +(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30), +(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30), +(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10), +(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20), +(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10), +(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30), +(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20), +(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30), +(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20), +(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10); + +``` + +## 2.SQL + +### 任务I + +```sql +-- 练习和作业 +-- 1.给emp分别建立 普通索引和唯一索引 +ALTER TABLE emp ADD INDEX key_hiredate(hiredate); +ALTER TABLE emp ADD UNIQUE INDEX key_unique(ename) ; +-- 2.查询emp表有哪些索引 +SHOW INDEX FROM emp; +-- 3. 使用有索引的字段进行查询,再查看这条语句是否使用到了索引。 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁'; +-- 4. 删除前面建立的两个索引 +ALTER TABLE emp DROP INDEX key_hiredate; +ALTER TABLE emp DROP INDEX key_unique; +-- 5. 选择两个字段添加一个复合索引 +ALTER TABLE emp ADD INDEX key_unity(ename,job) ; +ALTER TABLE emp DROP INDEX key_unity; +-- 6. 使用复合索引的字段进行查询 +EXPLAIN SELECT * FROM emp WHERE ename = '甘宁' AND job = '文员'; +``` + +### 任务II + +```sql +-- 作业 +-- 想办法用自己的电脑,生成500万行数据,id,uname,age 尽量随机,并记录时间。 +-- 1. 不用索引查询 一次姓名uname /并记录时间 +-- 2. 建立索引查询 一次姓名uname /并记录时间 + +DROP TABLE IF EXISTS random_table; +CREATE TABLE IF NOT EXISTS random_table ( + id INT AUTO_INCREMENT PRIMARY KEY, + uname VARCHAR(255) NOT NULL, + age INT NOT NULL, + created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +DELIMITER $$ +DROP PROCEDURE IF EXISTS random_user; + +CREATE PROCEDURE IF NOT EXISTS random_user(IN num_rows INT) +BEGIN + DECLARE num INT DEFAULT 0; + WHILE num < num_rows DO + INSERT INTO random_table (uname, age) + VALUES (CONCAT('user', FLOOR(RAND() * 1000000) + 1), FLOOR(RAND() * 100) + 1); + SET num = num + 1; + END WHILE; +END$$ + +DELIMITER ; + +CALL random_user(5000000); + + + +---------------------------------测试区 +INSERT INTO random_table (uname, age) VALUES ('user610757',45); + +SELECT * FROM random_table WHERE uname = 'user610757'; + +EXPLAIN SELECT * FROM random_table WHERE uname = 'user610757'; + +ALTER TABLE random_table ADD INDEX indname(uname); +EXPLAIN SELECT * FROM random_table WHERE uname = 'user610757'; +ALTER TABLE random_table DROP INDEX indname; + +``` + +## 3.末尾 + +### 1. **索引的概念** +- **定义**:索引是数据库表中一个特殊的数据结构,用于快速查找和访问表中的数据。它类似于书籍的目录。 +- **作用**:加速数据检索,优化查询性能,避免全表扫描。 + +### 2. **索引的类型** +- **单列索引**:只包含单个列的索引。 +- **复合索引**:由多个列组成的索引,用于加速涉及多个列的查询。 +- **唯一索引**:确保索引列中的值是唯一的,不允许重复。 +- **主键索引**:一种特殊的唯一索引,且不允许为空,通常用于唯一标识一行数据。 +- **全文索引**:用于对文本数据进行全文检索,主要用于查找大文本字段中的关键词。 +- **空间索引**:用于地理数据类型的索引,加速空间查询。 + +### 3. **创建索引** +使用 `CREATE INDEX` 语句可以创建索引: +```sql +CREATE INDEX index_name ON table_name(column1, column2, ...); +``` +- **示例**: +```sql +CREATE INDEX idx_name ON employees(last_name); +``` +```sql +# 其它方法 +alter table table_name add index idx (xx); +alter table table_c add index idx_c (uname); +-- 建表时 +create table table_b( +id int PRIMARY key auto_increment, +uname varchar(10), +index idx_b (uname) +); +``` +### 4. **索引的使用** +- **自动创建索引**:在创建主键、唯一约束、外键等时,MySQL会自动创建索引。 +- **查询优化**:使用索引可以加速`SELECT`语句,特别是在`WHERE`、`ORDER BY`、`JOIN`等操作中。 + +### 5. **索引的选择** +- **选择性**:索引的选择性越高,索引的效果越好。选择性是指索引中唯一值的比例。 +- **列的数据类型**:对于高选择性列(如身份证号、电子邮件等)创建索引更有效。 +- **避免高重复的列**:比如性别列 + +### 6. **索引的优缺点** +- **优点**: + - 提高查询速度。 + - 减少查询所需的IO操作。 + +- **缺点**: + - 增加写入操作的时间(INSERT、UPDATE、DELETE),因为需要维护索引。 + - 增加存储空间的使用。 + +### 7. **查看索引** +使用 `SHOW INDEX FROM table_name;` 可以查看表中的索引信息。 + +### 8. **删除索引** +使用 `DROP INDEX` 语句删除索引: +```sql +DROP INDEX index_name ON table_name; +-- 其它 +alter table table_a drop index idx_a; +``` +- **示例**: +```sql +DROP INDEX idx_name ON employees; +``` + +### 9. **使用场景** +- 在需要频繁查询的列上创建索引。 +- 对于大表的经常使用的查询,尤其是涉及到排序和过滤的查询。 + + + +### 11. **性能监控** +使用 `EXPLAIN` 语句可以查看查询的执行计划,分析索引的使用情况: +```sql +EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith'; +``` +复合索引(联合索引),使用要遵循最左原则。(a,b,c) where a=? and b=? 有效, where b=? and c=? 无效 + + + +一切为了更好的就业---Lyy \ No newline at end of file -- Gitee