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

📢博客主页:https://blog.csdn.net/2301_779549673

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 JohnKi 原创,首发于 CSDN🙉

📢未来很长,值得我们全力奔赴更美好的生活✨

文章目录

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

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

cpp 复制代码
// 创建表结构
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 更新

语法:

cpp 复制代码
UPDATE table_name SET column = expr [, column = expr ...]
	[WHERE ...] [ORDER BY ...] [LIMIT ...]

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

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

cpp 复制代码
// 查看原数据
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 分

cpp 复制代码
// 查看原数据
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 分

cpp 复制代码
// 查看原数据
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 倍

cpp 复制代码
// 查看原数据
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 删除数据

语法:

cpp 复制代码
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

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

cpp 复制代码
// 查看原数据
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 删除整张表数据

cpp 复制代码
// 准备测试表
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

cpp 复制代码
// 删除整个表
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 截断表

语法:

cpp 复制代码
TRUNCATE [TABLE] table_name

注意:这个操作慎用

  1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
  2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
    物,所以无法回滚
  3. 会重置 AUTO_INCREMENT 项
cpp 复制代码
// 准备测试表
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)
cpp 复制代码
// 截断整表数据,注意影响行数是 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)
cpp 复制代码
// 再插入一条数据,自增 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)

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

语法:

cpp 复制代码
INSERT INTO table_name [(column [, column ...])] SELECT ...
cpp 复制代码
// 创建原数据表
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)
cpp 复制代码
// 创建一张空表 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: 0

mysql> select * from no_duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
3 rows in set (0.00 sec)
cpp 复制代码
// 通过重命名表,实现原子的去重操作
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 统计班级共有多少同学

cpp 复制代码
// 使用 * 做统计,不受 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 号有多少

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

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

cpp 复制代码
// 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 统计数学成绩总分

cpp 复制代码
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 统计平均总分

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

👥总结

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

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

相关推荐
小猿姐1 小时前
Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云
数据库·mysql·postgresql·开源
百香果果ccc1 小时前
MySQL中的单行函数和聚合函数
数据库·mysql
摸摸陌陌1 小时前
Redis快速入门
数据库·redis·缓存
Elastic 中国社区官方博客2 小时前
Elasticsearch Serverless 中的数据流自动分片
大数据·数据库·elasticsearch·搜索引擎·serverless·时序数据库
Minyy112 小时前
牛客网刷题SQL--高级查询
数据库·sql
ygqygq22 小时前
ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书
mysql·elk·飞书
秋意钟2 小时前
MySQL基本架构
数据库·mysql·架构
朱小勇本勇2 小时前
Qt实现控件拖曳
开发语言·数据库·qt
m0_748245922 小时前
mysql之如何获知版本
数据库·mysql
纯洁的小魔鬼2 小时前
redis 基础
数据库·redis·命令行