📢博客主页: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
注意:这个操作慎用
- 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
- 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事
物,所以无法回滚 - 会重置 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: 0
mysql> 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】表的基本查询(下) 做了一个较为详细的介绍,不知道对你有没有帮助呢
觉得博主写得还不错的三连支持下吧!会继续努力的~