【MySQL速通篇001】MySQL主键,自增列,各类索引,外键及变种,分组,连表,数据行操作等知识点 2

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL速通篇001】MySQL主键,自增列,各类索引,外键及变种,分组,连表,数据行操作等知识点

🍀七、数据行操作补充

✨7.1、增操作

向表的某一行插入数据

insert into 表名(列名1, 列名2) values('行一内容', '行一内容'), ('行二内容', '行二内容')

向表的多行插入数据

insert into 表名(列名1, 列名2) values('行一内容', '行一内容'), ('行二内容', '行二内容')

向某一张表中插入另一张表中的内容

insert into 表一(name,age) select name,age from 表二;

✨7.2、删操作

假设我创建了一张表叫【tb1】其中列名有【name】列和【id】列

# 删除表
delect from tb1
# 带条件的删除
# 把id不等于2的行删除
delete from tb1 where id !=2 
delete from tb1 where id =2 
delete from tb1 where id > 2 
delete from tb1 where id >=2 
# 把id > 2,并且name='alex'的数据行删除
delete from tb1 where id >=2 or name='alex'

✨7.3、改操作

同样的使用上面删操作的表

# 把tb1表中的id > 2,并且name='XX'的数据行,的名字设为'alex',其他的不变
update tb1 set name='alex' where id>12 and name='xx'
update tb1 set name='alex',age=19 where id>12 and name='xx'

✨7.4、查操作

基础的查操作

# 查看表中所有数据
select * from tb1;
# 查看表中id,name列的数据     
select id,name from tb1;
select id,name from tb1 where id > 10 or name ='xxx';
# 查看表中id,name列的数据,并将name列名重新取个叫cname的别名
select id,name as cname from tb1 where id > 10 or name ='xxx';
select name,age,11 from tb1;

进阶的查操作

select * from tb1 where id != 1
# 查看id为(1,5,12)中的数的行
select * from tb1 where id in (1,5,12);
select * from tb1 where id not in (1,5,12);
# 查tb1表中值id为tb11中元素的行
select * from tb1 where id in (select id from tb11)
# 查看id为5到12之间数的行
select * from tb1 where id between 5 and 12;

通配符的查操作

# 查询表中以ale开头的所有用户 %表示后面可以有任意多个字符,比如可以匹配到【alex,alexk】
select * from tb1 where name like "ale%"
# 查询表中以ale开头的所有用户 _表示后面只能有一个字符,比如【alex】可以匹配到但是【alexxxx】就不可以匹配到
select * from tb1 where name like "ale_"

✨7.5、limit以及order by语句

将上面知识是先看下面的图:

a4dc37d4581944988490a7b096517b22.png

在我们浏览器搜素想要的内容时,返回的结果通常是很多的,如果一次将结果全部显示给你,那么电脑可能会崩溃,这时浏览器就会默认返回结果的前几十条,这种对想要查询结果的条数的限制我们在数据库中也可以使用limit来实现

🎉7.5.1、limit【限制】的用法

# 查看表中的前十条数据
select * from tb1 limit 10;
# 从0行开始后面取十条数据          
select * from tb1 limit 0,10;
select * from tb1 limit 10,10;
# 从20行开始后面取十条数据
select * from tb1 limit 20,10;
# 从第20行开始读取,读取10行;
select * from tb1 limit 10 offset 20;

🎉7.5.2、order by【排序语句】

# 将表tb1按id列从大到小排
select * from tb1 order by id desc; 大到小 【口诀先d后c,d在c后面所以是从大到小】
select * from tb1 order by id asc;  小到大 【口诀先a后c,c在a后面所以是从小到大】
# 将表tb1按age列从大到小排,如果id数值相同就按id列大小从小到大排
select * from tb1 order by age desc,id desc;

拓展要点:取后十条数据

# 实现原理:将tb1表逆序,然后在取前十条数据,这样就相当于取了原表的最后十条数据
select * from tb1 order by id desc limit 10;

🍀八、MySQL分组操作知识点

关键语句:

group by

首先我们按如下的方式创建两张表【department表】【userinfo表】

department表
  CREATE table department(
    id int auto_increment primary key,
    title varchar(32)
  )engine=innodb default charset=utf8;
userinfo表
CREATE table userinfo(
    id int auto_increment primary key,
    name varchar(32),
  age int,
  depart_id int,
  CONSTRAINT fk_usrt_depart FOREIGN key (depart_id) REFERENCES department(id)
  )engine=innodb default charset=utf8;
# 给两张表加数据
  # department表
+----+-------+
| id | title |
+----+-------+
|  1 | 财务  |
|  2 | 公关  |
|  3 | 测试  |
|  4 | 运维  |
+----+-------+
  # userinfo表
+----+------+------+-----------+
| id | name | age  | depart_id |
+----+------+------+-----------+
|  1 | 小费 |    6 |         1 |
|  2 | 小港 |    6 |         3 |
|  3 | 小干 |    6 |         2 |
|  4 | 小刚 |    6 |         4 |
|  5 | 小强 |    6 |         4 |
|  6 | 小美 |    6 |         4 |
|  7 | 小亮 |    6 |         2 |
|  8 | 小每 |    6 |         1 |
+----+------+------+-----------+

对于语句我就不多解释了,主要看结果就可以了

1、将同一个部门的人放在一起,并且用户部门相同取id值大的用户

SELECT depart_id, max(id) FROM userinfo GROUP BY depart_id;

输出结果:

1a05cdb2795f41f1aeb1403efa79add0.png

2、在上面操作的基础上显示各个部门的人数

select count(id),max(id),depart_id from userinfo group by depart_id;

输出结果:

379a6e001b95454e91d8ae37d9afa809.png

3、如果对于聚合函数结果进行二次筛选时?必须使用having

select count(id),depart_id from userinfo group by depart_id having count(id) > 1;

11ac3a48cdcc4be88366f33334a80229.png

4、上面的列名为count(id),这是看着有点不舒服的,我们可以使用as关键字改名

e166c51e0fd84942ad8ad1ccb600c0c2.png

5、进一步的进阶方式

select count(id),depart_id from userinfo where id > 4 group by depart_id having count(id) > 1;

52915af0fff64bcbacf1d656b6346d0a.png

🍀九、MySQL连表操作

✨9.1、连表操作概念

连表顾名思义就是将两张表连在一起查看的操作,操作大的分为两种内连接和外连接,而外连接又分为左连接、右连接和全连接。

  • 内连接(inner join):只包含匹配的记录。
  • 外连接(outer join):除了包含匹配的记录还包含不匹配的记录。{

1. 左连接(left join):返回匹配的记录,以及表 A 多余的记录。

2. 右连接(right join):返回匹配的记录,以及表 B 多余的记录。

3. 全连接(full join):返回匹配的记录,以及表 A 和表 B 各自的多余记录。

}

用网上一张图比较好的图可以更加方便理解如下:

11a3def5289b4dcea96c945c3677ca86.png

下面我们都用【department表】【user_mess表】来举例:

# department表
+----+-------+
| id | title |
+----+-------+
|  1 | 财务  |
|  2 | 公关  |
|  3 | 测试  |
|  4 | 运维  |
+----+-------+
  # user_mess表
+----+------+-----------+
| id | name | depart_id |
+----+------+-----------+
|  1 | 小费 |         1 |
|  2 | 小港 |         1 |
|  3 | 小干 |         2 |
|  4 | 小刚 |         4 |
+----+------+-----------+

执行如下语句可以连接两张表:

select * from user_mess,department where user_mess.depart_id = department.id;
输出结果:
+----+------+-----------+----+-------+
| id | name | depart_id | id | title |
+----+------+-----------+----+-------+
|  1 | 小费 |         1 |  1 | 财务  |
|  2 | 小港 |         1 |  1 | 财务  |
|  3 | 小干 |         2 |  2 | 公关  |
|  4 | 小刚 |         4 |  4 | 运维  |
+----+------+-----------+----+-------+
4 rows in set (0.00 sec)

✨9.2、内连接

内连接 语法: a inner join b ,但是一般 inner 可以省略不写,也就是如下形式

select  *  from  a  join  b ;

执行下面语句:

select  *  from  user_mess join department;
输出结果:
+----+------+-----------+----+-------+
| id | name | depart_id | id | title |
+----+------+-----------+----+-------+
|  4 | 小刚 |         4 |  1 | 财务  |
|  3 | 小干 |         2 |  1 | 财务  |
|  2 | 小港 |         1 |  1 | 财务  |
|  1 | 小费 |         1 |  1 | 财务  |
|  4 | 小刚 |         4 |  2 | 公关  |
|  3 | 小干 |         2 |  2 | 公关  |
|  2 | 小港 |         1 |  2 | 公关  |
|  1 | 小费 |         1 |  2 | 公关  |
|  4 | 小刚 |         4 |  3 | 测试  |
|  3 | 小干 |         2 |  3 | 测试  |
|  2 | 小港 |         1 |  3 | 测试  |
|  1 | 小费 |         1 |  3 | 测试  |
|  4 | 小刚 |         4 |  4 | 运维  |
|  3 | 小干 |         2 |  4 | 运维  |
|  2 | 小港 |         1 |  4 | 运维  |
|  1 | 小费 |         1 |  4 | 运维  |
+----+------+-----------+----+-------+

说明:像这样不加查询条件会形成 笛卡尔积 。笛卡尔积的意思是:是指包含两个集合中任意取出两个元素构成的组合的集合。// 两表分别交叉查询了一遍;也可以加上条件查询条件 on 或者 using ,两者的区别在于 都是查询出符合条件的结果集 ,但是using会优化掉相同的字段。

下面来举个栗子更好理解:

# 使用on语句添加条件
select  *  from  user_mess join department on user_mess.depart_id = department.id;
输出结果:
+----+------+-----------+----+-------+
| id | name | depart_id | id | title |
+----+------+-----------+----+-------+
|  1 | 小费 |         1 |  1 | 财务  |
|  2 | 小港 |         1 |  1 | 财务  |
|  3 | 小干 |         2 |  2 | 公关  |
|  4 | 小刚 |         4 |  4 | 运维  |
+----+------+-----------+----+-------+
4 rows in set (0.00 sec)

这时我们可以发现这与上面的select * from user_mess,department where user_mess.depart_id = department.id;语句输出结果是相同的

✨9.3、外连接

🎉9.3.1、左连接

语法:

# 左连接既 左边 tb_left 表作为基表(主表)显示所有行, tb_right 表作为外表 条件匹配上的就显示,没匹配上的就用 Null 填充
select * from tb_left left join tb_right on tb_left.id = tb_left.id ;

栗子:

select  *  from  user_mess left join department on user_mess.depart_id = department.id;
输出结果:
+----+------+-----------+------+-------+
| id | name | depart_id | id   | title |
+----+------+-----------+------+-------+
|  1 | 小费 |         1 |    1 | 财务  |
|  2 | 小港 |         1 |    1 | 财务  |
|  3 | 小干 |         2 |    2 | 公关  |
|  4 | 小刚 |         4 |    4 | 运维  |
+----+------+-----------+------+-------+
4 rows in set (0.00 sec)

🎉9.3.1、右连接

语法:

# 右连接即 右边 tb_right 表作为基表(主表)显示所有行, tb_left 表作为外表 条件匹配上的就显示,没匹配上的就用 Null 填充; 和左连接相反。
select * from tb_left right join tb_right on tb_left.id = tb_left.id ;

栗子:

select  *  from  user_mess right join department on user_mess.depart_id = department.id;
输出结果:
+------+------+-----------+----+-------+
| id   | name | depart_id | id | title |
+------+------+-----------+----+-------+
|    2 | 小港 |         1 |  1 | 财务  |
|    1 | 小费 |         1 |  1 | 财务  |
|    3 | 小干 |         2 |  2 | 公关  |
| NULL | NULL |      NULL |  3 | 测试  |
|    4 | 小刚 |         4 |  4 | 运维  |
+------+------+-----------+----+-------+
5 rows in set (0.00 sec)

🎉9.3.1、全外连接

语法:

# 经查找发现 MySQL 是不支持所谓 tb_left full join tb_right 语作为 全外连接查询的,想要实现全外连接查询可以通过 union 实现,union 操作符用于合并两个或多个 SELECT 语句的结果集,语句如下:
select * from tb_left left join tb_right on tb_left.id = tb_right.id  union  select * from tb_left right join tb_right on tb_left.id = tb_right.id ;

栗子:

select  *  from  user_mess left join department on user_mess.depart_id = department.id union select * from  user_mess right join department on user_mess.depart_id = department.id;
输出结果:
+------+------+-----------+------+-------+
| id   | name | depart_id | id   | title |
+------+------+-----------+------+-------+
|    1 | 小费 |         1 |    1 | 财务  |
|    2 | 小港 |         1 |    1 | 财务  |
|    3 | 小干 |         2 |    2 | 公关  |
|    4 | 小刚 |         4 |    4 | 运维  |
| NULL | NULL |      NULL |    3 | 测试  |
+------+------+-----------+------+-------+
5 rows in set (0.00 sec)

值得注意的是:注:当 union 和 all 一起使用时(即 union all ),重复的行不会去除。

栗子:

select  *  from  user_mess left join department on user_mess.depart_id = department.id union all select * from  user_mess right join department on user_mess.depart_id = department.id;
输出结果:
+------+------+-----------+------+-------+
| id   | name | depart_id | id   | title |
+------+------+-----------+------+-------+
|    1 | 小费 |         1 |    1 | 财务  |
|    2 | 小港 |         1 |    1 | 财务  |
|    3 | 小干 |         2 |    2 | 公关  |
|    4 | 小刚 |         4 |    4 | 运维  |
|    2 | 小港 |         1 |    1 | 财务  |
|    1 | 小费 |         1 |    1 | 财务  |
|    3 | 小干 |         2 |    2 | 公关  |
| NULL | NULL |      NULL |    3 | 测试  |
|    4 | 小刚 |         4 |    4 | 运维  |
+------+------+-----------+------+-------+
9 rows in set (0.00 sec)

✨9.4、交叉连接

概念:

交错连接 语法:tb1 cross join tb2 ;交错连接可以加查询条件,也可以不加查询条件,如果不加查询条件会形成 笛卡尔积,类似内连接效果,同样可以使用 using 语句优化字段。

栗子:

select * from user_mess cross join department;
输出结果:
+----+------+-----------+----+-------+
| id | name | depart_id | id | title |
+----+------+-----------+----+-------+
|  4 | 小刚 |         4 |  1 | 财务  |
|  3 | 小干 |         2 |  1 | 财务  |
|  2 | 小港 |         1 |  1 | 财务  |
|  1 | 小费 |         1 |  1 | 财务  |
|  4 | 小刚 |         4 |  2 | 公关  |
|  3 | 小干 |         2 |  2 | 公关  |
|  2 | 小港 |         1 |  2 | 公关  |
|  1 | 小费 |         1 |  2 | 公关  |
|  4 | 小刚 |         4 |  3 | 测试  |
|  3 | 小干 |         2 |  3 | 测试  |
|  2 | 小港 |         1 |  3 | 测试  |
|  1 | 小费 |         1 |  3 | 测试  |
|  4 | 小刚 |         4 |  4 | 运维  |
|  3 | 小干 |         2 |  4 | 运维  |
|  2 | 小港 |         1 |  4 | 运维  |
|  1 | 小费 |         1 |  4 | 运维  |
+----+------+-----------+----+-------+
16 rows in set (0.00 sec)

✨9.5、总结各种连表操作

1、内连接和交叉连接是十分相似的,只是语句语法有所不同,但最后查询出来的结果集的效果都是一样的,添加条件查询就只查询匹配条件的行,不添加条件查询则形成 笛卡尔积(生成重复多行) 而降低效率。
2、左连接以左边表为基础表 显示所有行 ,右边表条件匹配的行显示,不匹配的则有 Null 代替。
3、右连接以右边表为基础表 显示所有行 ,左边表条件匹配的行显示,不匹配的则有 Null 代替。

🍀十、小结

恭喜你看到了最后,现在看了这么多,不如赶快网上找些题目自己动手实践一波撒😁。

不知道在哪找?放心我帮你找好了👀。

👉 【MySQL练习题】复制链接打开阿里云盘就行了:https://www.aliyundrive.com/s/D24NKjfNpTW

0c40704bf55d4c23910b2edd97b57d6a.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
93 9
|
7天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
34 8
|
14天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
19 7
|
13天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
46 5
|
2天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
23 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2
|
18天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
130 15
|
11天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。