【MySQL】表的基本查询(下)

ops/2024/12/12 23:23:59/

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 📢前言 - MySQL的基本介绍
  • 🏳️‍🌈三、Update 更新
    • ❤️3.1 将孙悟空同学的数学成绩变更为 80 分
    • 🧡3.2 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
    • 💛3.3 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
    • 💚3.4 将所有同学的语文成绩更新为原来的 2 倍
  • 🏳️‍🌈四、Delete 删除
    • ❤️4.1 删除数据
    • 🧡4.2 截断表
  • 🏳️‍🌈五、插入查询结果
  • 🏳️‍🌈六、聚合函数
    • ❤️6.1 统计班级共有多少同学
    • 🧡6.2 统计班级收集的 qq 号有多少
    • 💛6.3 统计本次考试的数学成绩分数个数
    • 💚6.4 统计数学成绩总分
    • 💙6.5 统计平均总分
  • 👥总结


📢前言 - MySQL的基本介绍

MySQL 表是数据库中存储数据的基本单位,由行和列组成,每一行代表一条唯一的记录,每一列代表记录中的一个域。
在 MySQL 中,数据表主要由以下几个部分组成:数据行、列、索引、主键、外键和约束。

数据行: 也被称为记录,是数据库表中的基本单位。每一行都代表了一条具体的记录,这条记录可能是一个人的详细信息,一个产品的具体参数,或者是一次交易的所有细节。
列:数据库中,我们通常将一类具有相同属性的数据放在同一列中。例如,我们可能有一个名为 “姓名” 的列,用来存储所有人的名字,有一个 “年龄” 的列,用来存储所有人的年龄,等等。列的类型决定了可以存储在其中的数据类型,例如,数字、字符串、日期等。
索引: 索引是数据库中的一种特殊结构,它可以极大地提高数据的查询速度。索引是对数据库表中一个或多个列的值进行排序的一种结构,类似于书籍的目录,可以快速定位到特定的行。索引的创建和使用需要根据实际情况来决定,因为虽然它可以提高查询速度,但是在插入、删除和更新操作时,也会带来额外的开销。
主键: 主键是数据库表中的一个特殊列,它的值对于表内的每一行都是唯一的,常常被用来作为数据的唯一标识。在设计数据库表时,我们需要为每个表选择一个或多个列作为主键。
外键: 外键是用来建立两个表之间关系的,一般是在一个表中创建一个列,这个列的值引用了另一个表的主键。通过外键,我们可以在一个表中引用另一个表中的数据。
约束: 约束是用来保证数据的完整性和一致性的。例如,非空约束可以保证某列的值不能为 NULL,唯一约束可以保证某列的值在整个表中是唯一的,主键约束则同时具有非空约束和唯一约束的特性。
CRUD: Create(创建), Retrieve(读取),Update(更新),Delete(删除)

前文: https://blog.csdn.net/2301_77954967/article/details/144367833?spm=1001.2014.3001.5501

下面是前文用的数据表,这篇文章中也要用

// 创建表结构
mysql> create table exam_result (-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment '同学姓名',-> chinese float default 0.0 comment '语文成绩',-> math float default 0.0 comment '数学成绩',-> english float default 0.0 comment '英语成绩'-> );
Query OK, 0 rows affected (0.02 sec)mysql> desc exam_result;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20)      | NO   |     | NULL    |                |
| chinese | float            | YES  |     | 0       |                |
| math    | float            | YES  |     | 0       |                |
| english | float            | YES  |     | 0       |                |
+---------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)// 插入测试数据
mysql> INSERT INTO exam_result (name, chinese, math, english) VALUES-> ('唐三藏', 67, 98, 56),-> ('孙悟空', 87, 78, 77),-> ('猪悟能', 88, 98, 90),-> ('曹孟德', 82, 84, 67),-> ('刘玄德', 55, 85, 45),-> ('孙权', 70, 73, 78),-> ('宋公明', 75, 65, 30);
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

🏳️‍🌈三、Update 更新

语法:

UPDATE table_name SET column = expr [, column = expr ...][WHERE ...] [ORDER BY ...] [LIMIT ...]

对查询到的结果进行列值更新

❤️3.1 将孙悟空同学的数学成绩变更为 80 分

// 查看原数据
mysql> select name, math from exam_result where name = '孙悟空';
+-----------+------+
| name      | math |
+-----------+------+
| 孙悟空    |   78 |
+-----------+------+
1 row in set (0.00 sec)// 更新数据
mysql> update exam_result set math = 80 where name = '孙悟空';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0// 查看更新后的数据
mysql> select name, math from exam_result where name = '孙悟空';
+-----------+------+
| name      | math |
+-----------+------+
| 孙悟空    |   80 |
+-----------+------+
1 row in set (0.00 sec)

🧡3.2 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分

// 查看原数据
mysql> select name, math, chinese from exam_result where name = '曹孟德';
+-----------+------+---------+
| name      | math | chinese |
+-----------+------+---------+
| 曹孟德    |   84 |      82 |
+-----------+------+---------+
1 row in set (0.00 sec)// 更新数据
mysql> update exam_result set math = 60, chinese = 70 where name = '曹孟德';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0// 查看更新后的数据
mysql> select name, math, chinese from exam_result where name = '曹孟德';
+-----------+------+---------+
| name      | math | chinese |
+-----------+------+---------+
| 曹孟德    |   60 |      70 |
+-----------+------+---------+
1 row in set (0.00 sec)

💛3.3 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分

// 查看原数据
mysql> select name, chinese + math + english 总分 from exam_result order by 总分 limit 3;
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 宋公明    |    170 |
| 刘玄德    |    185 |
| 曹孟德    |    197 |
+-----------+--------+
3 rows in set (0.00 sec)// 数据更新,不支持 math += 30 这种语法
mysql> update exam_result set math = math + 30 order by chinese + math + english limit 3;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0// 查看更新后后3名数据,已经不是之前的3位
mysql> select name, chinese + math + english 总分 from exam_result order by 总分 limit 3;
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 宋公明    |    200 |
| 刘玄德    |    215 |
| 唐三藏    |    221 |
+-----------+--------+
3 rows in set (0.00 sec)// 按人名查询
mysql> select name, chinese + math + english 总分 from exam_result where name in ('宋公明', '刘玄德', '曹孟德');
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 曹孟德    |    227 |
| 刘玄德    |    215 |
| 宋公明    |    200 |
+-----------+--------+
3 rows in set (0.00 sec)

💚3.4 将所有同学的语文成绩更新为原来的 2 倍

// 查看原数据
mysql> select name, chinese from exam_result;
+-----------+---------+
| name      | chinese |
+-----------+---------+
| 唐三藏    |      67 |
| 孙悟空    |      87 |
| 猪悟能    |      88 |
| 曹孟德    |      70 |
| 刘玄德    |      55 |
| 孙权      |      70 |
| 宋公明    |      75 |
+-----------+---------+
7 rows in set (0.00 sec)// 数据更新
mysql> update exam_result set chinese = chinese * 2;
Query OK, 7 rows affected (0.01 sec)
Rows matched: 7  Changed: 7  Warnings: 0// 按人名查询
mysql> select name, chinese from exam_result; 
+-----------+---------+
| name      | chinese |
+-----------+---------+
| 唐三藏    |     134 |
| 孙悟空    |     174 |
| 猪悟能    |     176 |
| 曹孟德    |     140 |
| 刘玄德    |     110 |
| 孙权      |     140 |
| 宋公明    |     150 |
+-----------+---------+
7 rows in set (0.00 sec)

🏳️‍🌈四、Delete 删除

❤️4.1 删除数据

语法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

4.1.1 删除孙悟空同学的考试成绩

// 查看原数据
mysql> select * from exam_result where name = '孙悟空';
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  2 | 孙悟空    |     174 |   80 |      77 |
+----+-----------+---------+------+---------+
1 row in set (0.00 sec)// 删除数据
mysql> delete from exam_result where name = '孙悟空';
Query OK, 1 row affected (0.00 sec)// 查看删除结果
mysql> select * from exam_result where name = '孙悟空';
Empty set (0.00 sec)mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 唐三藏    |     134 |   98 |      56 |
|  3 | 猪悟能    |     176 |   98 |      90 |
|  4 | 曹孟德    |     140 |   90 |      67 |
|  5 | 刘玄德    |     110 |  115 |      45 |
|  6 | 孙权      |     140 |   73 |      78 |
|  7 | 宋公明    |     150 |   95 |      30 |
+----+-----------+---------+------+---------+
6 rows in set (0.00 sec)

4.1.2 删除整张表数据

// 准备测试表
mysql> CREATE TABLE for_delete (-> id INT PRIMARY KEY AUTO_INCREMENT,-> name VARCHAR(20)-> );
Query OK, 0 rows affected (0.03 sec)// 插入测试数据
mysql> INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0// 查看测试数据
mysql> select * from for_delete;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+
3 rows in set (0.00 sec)mysql> show create table for_delete;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                      |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| for_delete | CREATE TABLE `for_delete` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

查看表结构,会有 AUTO_INCREMENT=n 项,此时为4

// 删除整个表
mysql> delete from for_delete;
Query OK, 3 rows affected (0.00 sec)mysql> select * from for_delete;
Empty set (0.00 sec)mysql> show create table for_delete;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                      |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| for_delete | CREATE TABLE `for_delete` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

AUTO_INCREMENT=n 项,此时仍为4

🧡4.2 截断表

语法:

TRUNCATE [TABLE] table_name

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
    物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项
// 准备测试表
mysql> CREATE TABLE for_truncate (-> id INT PRIMARY KEY AUTO_INCREMENT,-> name VARCHAR(20)-> );
Query OK, 0 rows affected (0.02 sec)// 插入测试数据
mysql> INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0// 查看测试数据
mysql> SELECT * FROM for_truncate;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+
3 rows in set (0.00 sec)
// 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
mysql> truncate for_truncate;
Query OK, 0 rows affected (0.02 sec)// 查看删除结果
mysql> show tables;
+----------------------+
| Tables_in_test_12_10 |
+----------------------+
| exam_result          |
| for_delete           |
| for_truncate         |
| students             |
+----------------------+
4 rows in set (0.00 sec)mysql> select * from for_truncate;
Empty set (0.00 sec)mysql> show create table for_truncate;
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                       |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| for_truncate | CREATE TABLE `for_truncate` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
// 再插入一条数据,自增 id 在重新增长
mysql> insert into for_truncate (name) value ('E');
Query OK, 1 row affected (0.01 sec)// 看数据
mysql> select * from for_truncate;
+----+------+
| id | name |
+----+------+
|  1 | E    |
+----+------+
1 row in set (0.00 sec)// 查看表结构,会有 AUTO_INCREMENT=2 项
mysql> show create table for_truncate;
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table        | Create Table                                                                                                                                                                        |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| for_truncate | CREATE TABLE `for_truncate` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

🏳️‍🌈五、插入查询结果

语法:

INSERT INTO table_name [(column [, column ...])] SELECT ...
// 创建原数据表
mysql> CREATE TABLE duplicate_table (id int, name varchar(20));
Query OK, 0 rows affected (0.01 sec)// 插入测试数据
mysql> INSERT INTO duplicate_table VALUES-> (100, 'aaa'),-> (100, 'aaa'),-> (200, 'bbb'),-> (200, 'bbb'),-> (200, 'bbb'),-> (300, 'ccc');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0// 查看插入数据
mysql> select * from duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  100 | aaa  |
|  200 | bbb  |
|  200 | bbb  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
6 rows in set (0.00 sec)
// 创建一张空表 no_duplicate_table,结构和 duplicate_table 一样
mysql> CREATE TABLE no_duplicate_table LIKE duplicate_table;
Query OK, 0 rows affected (0.02 sec)// 将 duplicate_table 的去重数据插入到 no_duplicate_table
mysql> insert into no_duplicate_table select distinct * from duplicate_table;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> select * from no_duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
3 rows in set (0.00 sec)
// 通过重命名表,实现原子的去重操作
mysql> rename table duplicate_table to old_duplicate_table, no_duplicate_table to duplicate_table;
Query OK, 0 rows affected (0.02 sec)// 查看最终结果
mysql> select * from duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
3 rows in set (0.00 sec)

🏳️‍🌈六、聚合函数

在这里插入图片描述

❤️6.1 统计班级共有多少同学

// 使用 * 做统计,不受 NULL 影响
mysql> SELECT COUNT(*) FROM students;
+----------+
| COUNT(*) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)// 使用表达式做统计
mysql> SELECT COUNT(1) FROM students;
+----------+
| COUNT(1) |
+----------+
|       10 |
+----------+
1 row in set (0.00 sec)mysql> select * from students;
+----+------+-----------+--------+
| id | sn   | name      | qq     |
+----+------+-----------+--------+
|  1 |  123 | 张飞      | 123456 |
|  3 |  130 | 关羽      | 323456 |
| 10 |  125 | 刘备      | 223456 |
| 12 |  141 | 张辽      | 826456 |
| 13 |  150 | 曹操      | 623456 |
| 15 |  158 | 许攸      | 523456 |
| 16 |  164 | 孙权      | 823486 |
| 19 |  133 | 司马懿    | 823456 |
| 20 |  160 | 貂蝉      | 856744 |
| 21 |  161 | 大乔      | 856664 |
+----+------+-----------+--------+
10 rows in set (0.00 sec)

🧡6.2 统计班级收集的 qq 号有多少

//  NULL 不会计入结果
mysql> SELECT COUNT(qq) FROM students;
+-----------+
| COUNT(qq) |
+-----------+
|        10 |
+-----------+
1 row in set (0.00 sec)

💛6.3 统计本次考试的数学成绩分数个数

// COUNT(math) 统计的是全部成绩
mysql> SELECT COUNT(math) FROM exam_result;
+-------------+
| COUNT(math) |
+-------------+
|           6 |
+-------------+
1 row in set (0.00 sec)// COUNT(DISTINCT math) 统计的是去重成绩数量
mysql> SELECT COUNT(DISTINCT math) FROM exam_result;
+----------------------+
| COUNT(DISTINCT math) |
+----------------------+
|                    5 |
+----------------------+
1 row in set (0.00 sec)mysql> select math from exam_result;
+------+
| math |
+------+
|   98 |
|   98 |
|   90 |
|  115 |
|   73 |
|   95 |
+------+
6 rows in set (0.00 sec)

💚6.4 统计数学成绩总分

mysql> SELECT SUM(math) FROM exam_result;
+-----------+
| SUM(math) |
+-----------+
|       569 |
+-----------+
1 row in set (0.00 sec)// 不及格 < 60 的总分,没有结果,返回 NULL
mysql> SELECT SUM(math) FROM exam_result WHERE math < 60;
+-----------+
| SUM(math) |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)

💙6.5 统计平均总分

mysql> SELECT AVG(chinese + math + english) 平均总分 FROM exam_result;
+--------------+
| 平均总分     |
+--------------+
|        297.5 |
+--------------+
1 row in set (0.00 sec)

👥总结

本篇博文对 【MySQL】表的基本查询(下) 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

请添加图片描述


http://www.ppmy.cn/ops/141373.html

相关文章

零基础如何使用ChatGPT快速学习Python

引言 AI编程时代来临&#xff0c;没有编程基础可以快速上车享受时代的红利吗&#xff1f;答案是肯定的。本文旨在介绍零基础如何利用ChatGPT快速学习Python编程语言&#xff0c;开启AI编程之路。解决的问题包括&#xff1a;传统学习方式效率低、缺乏互动性以及学习资源质量参差…

Python虚拟环境管理工具:virtualenv

Python虚拟环境管理工具&#xff1a;virtualenv 前言1. 什么是Python虚拟环境&#xff1f;为什么需要虚拟环境&#xff1f; 2. virtualenv概述安装 virtualenv创建虚拟环境激活虚拟环境在Windows上&#xff1a;在Linux/MacOS上&#xff1a; 安装依赖退出虚拟环境 3. virtualenv…

2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测

前言 随着人工智能技术的快速发展&#xff0c;大语言模型(LLM)已经成为了技术领域最热门的话题。本文将详细对比目前主流的大语言模型&#xff0c;帮助大家选择最适合的工具。 一、OpenAI GPT系列 1. GPT-4 核心优势&#xff1a; 多模态理解能力强 逻辑推理能力出色 创造…

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…

【前端知识】React简单入门

React语法介绍 概述一、产生背景与发展历程二、主要特点三、技术细节四、应用场景与优势五、学习与实践 JSX语法一、JSX的基本概念二、JSX的基本使用三、JSX中的JavaScript表达式四、JSX的条件渲染五、JSX的列表渲染六、JSX的样式处理七、JSX的其他注意事项 基础语法一、基础概…

关于tomcat如何设置自启动的设置

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明 1.1 硬件环境1.2 软件环境 二、Windows 下的设置服务自启 2.1 服务的注册2.2 开启自启 三、MacOS下设置服务自…

【Java基础知识】final和static

一、final final 关键字是 Java 中的一个修饰符&#xff0c;用于表示某个变量、方法或者类不能被修改。 final 可以用于修饰类、方法和变量&#xff08;局部变量&#xff0c;成员变量&#xff09;。 1、数据&#xff1a; 声明数据为常量&#xff0c;可以是编译时常量&#xf…

虚幻引擎的工程目录结构

虚幻引擎的工程目录结构如下&#xff1a; .idea/.vs&#xff1a;用于IDE&#xff08;如IntelliJ IDEA或Visual Studio&#xff09;的项目配置文件&#xff0c;包含工程设置和解决方案文件。 Binaries&#xff1a;存放编译后的可执行文件和相关的动态链接库&#xff08;DLL&…