半天搞定MySQL(全)三(MySQL数据库教程)

2024-02-26 12:30

本文主要是介绍半天搞定MySQL(全)三(MySQL数据库教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

半天搞定MySQL(全)

半天搞定MySQL(全)一
半天搞定MySQL(全)二
半天搞定MySQL(全)四
半天搞定MySQL(全)五
半天搞定MySQL(全)六
半天搞定MySQL(全)七(终章)

博主用的是8.0版本的MySQL,储存引擎是InnoDB,关于InnoDB这里不详细解释,需要的话推荐了解这篇博文(或者自行百度)https://www.jianshu.com/p/519fd7747137

  • 目录
  • 多表操作
  • 正则表达式
  • 事务

5. 多表操作
在前面博主有试着进行过多表查询,但是正式的多表操作现在开始吧!

JOIN

inner join(内连接,或等值连接):获取两个表中字段匹配关系的记录。
left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
right join(右连接): 与 left join相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

inner join

inner join也可以省略inner使用join,效果一样

mysql> select city_journey.city_name,city_journey.times,city_spots.city_score from city_spots inner join city_journey on city_journey.city_name=city_spots.city_name;
+-----------+-------+------------+
| city_name | times | city_score |
+-----------+-------+------------+
| 海南      |     2 |         78 |
| 香港      |     1 |         76 |
| 香港      |     1 |         76 |
| Janpan    |     1 |         85 |
| America   |     1 |         82 |
| Iceland   |     1 |         88 |
+-----------+-------+------------+
6 rows in set (0.00 sec)

上述语句等价于以下语句:

mysql> select city_journey.city_name,city_journey.times,city_spots.city_score from city_spots,city_journey where city_journey.city_name=city_spots.city_name;
+-----------+-------+------------+
| city_name | times | city_score |
+-----------+-------+------------+
| 海南      |     2 |         78 |
| 香港      |     1 |         76 |
| 香港      |     1 |         76 |
| Janpan    |     1 |         85 |
| America   |     1 |         82 |
| Iceland   |     1 |         88 |
+-----------+-------+------------+
6 rows in set (0.00 sec)

图片来源:https://www.runoob.com/mysql/mysql-join.html
图片来源:https://www.runoob.com/mysql/mysql-join.html

left join

mysql> select city_journey.city_name,city_journey.times,city_spots.city_score from city_spots left join city_journey on city_journey.city_name=city_spots.city_name;
+-----------+-------+------------+
| city_name | times | city_score |
+-----------+-----![在这里插入图片描述](https://img-blog.csdnimg.cn/20200618190402958.gif)--+------------+
| America   |     1 |         82 |
| Iceland   |     1 |         88 |
| Janpan    |     1 |         85 |
| NULL      |  NULL |         80 |
| NULL      |  NULL |         86 |
| NULL      |  NULL |         93 |
| NULL      |  NULL |         90 |
| 海南      |     2 |         78 |
| 香港      |     1 |         76 |
| 香港      |     1 |         76 |
+-----------+-------+------------+
10 rows in set (0.00 sec)

在这里插入图片描述
图片来源:https://www.runoob.com/mysql/mysql-join.html

right join

mysql> select city_journey.city_name,city_journey.times,city_spots.city_score from city_spots right join city_journey on city_journey.city_name=city_spots.city_name;
+-----------+-------+------------+
| city_name | times | city_score |
+-----------+-------+------------+
| 海南      |     2 |         78 |
| 夏威夷    |     1 |       NULL |
| 香港      |     1 |         76 |
| 香港      |     1 |         76 |
| Janpan    |     1 |         85 |
| America   |     1 |         82 |
| Iceland   |     1 |         88 |
+-----------+-------+------------+
7 rows in set (0.00 sec)

在这里插入图片描述
图片来源:https://www.runoob.com/mysql/mysql-join.html
NULL值处理

IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。 <=>: 比较操作符(不同于 = ),当比较的两个值相等或者都为
NULL 时返回 true。

null

mysql> create table city_play(-> city_name varchar(20) not null,-> city_thing varchar(50) not null,-> cost int,-> journey_ID varchar(20),-> thing_score int,-> play_ID int auto_increment primary key);
Query OK, 0 rows affected (0.04 sec)

is null 和 is not null

mysql> select * from city_play where cost is null;
+-----------+------------+------+------------+-------------+---------+
| city_name | city_thing | cost | journey_ID | thing_score | play_ID |
+-----------+------------+------+------------+-------------+---------+
| 夏威夷    || NULL | 2          |          88 |       2 |
| 香港      | 潜水       | NULL | 10         |          95 |      10 |
| Janpan    | woman      | NULL | 11         |          90 |      11 |
+-----------+------------+------+------------+-------------+---------+
3 rows in set (0.00 sec)

6. 正则表达式
在讲到like时,博主提到了模糊匹配:a,a%,%a,%a,a%,%a%…
但是MySQL支持的正则表达式不仅仅这些。

模式描述
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式
[…]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^…]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
p1|p2|p3匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

^ 匹配以city_journey中以’Ja’开头的所有数据

mysql> select * from city_journey where city_name regexp '^Ja';
+------------+-----------+-------+------------+
| journey_ID | city_name | times | data       |
+------------+-----------+-------+------------+
|         11 | Janpan    |     1 | 2021-06-04 |
+------------+-----------+-------+------------+
1 row in set (0.02 sec)

$ 匹配以city_journey中以’n’结尾的所有数据

mysql> select * from city_journey where city_name regexp 'n$';
+------------+-----------+-------+------------+
| journey_ID | city_name | times | data       |
+------------+-----------+-------+------------+
|         11 | Janpan    |     1 | 2021-06-04 |
+------------+-----------+-------+------------+
1 row in set (0.00 sec)

$ 匹配以city_journey中包含’ri’字符串的所有数据

mysql> select * from city_journey where city_name regexp 'ri';
+------------+-----------+-------+------------+
| journey_ID | city_name | times | data       |
+------------+-----------+-------+------------+
|         12 | America   |     1 | 2022-06-06 |
+------------+-----------+-------+------------+
1 row in set (0.00 sec)

∧ ∧ [北上广]|d$ 匹配以[北上广]中任意字符开头或以’d’字符结尾的所有数据

mysql> select * from city_spots where city_name regexp '^[北上广]|d$';
+-----------+--------------------+------------+----------+----------+-----------+
| city_name | place_of_interest' | city_score | cost_rmb | time_way | time_stay |
+-----------+--------------------+------------+----------+----------+-----------+
| Iceland   | Ice                |         88 |    19000 |      1.5 |         5 |
| 上海      | 购物               |         80 |    13000 |        1 |       2.5 |
| 北京      | 长城               |         93 |    15000 |        1 |         3 |
+-----------+--------------------+------------+----------+----------+-----------+
3 rows in set (0.00 sec)

∗ * 匹配前一个字符0次以上

mysql> select * from city_spots where city_name regexp 's*';
+-----------+--------------------+------------+----------+----------+-----------+
| city_name | place_of_interest' | city_score | cost_rmb | time_way | time_stay |
+-----------+--------------------+------------+----------+----------+-----------+
| America   | 未知               |         82 |    20000 |      1.5 |         4 |
| Iceland   | Ice                |         88 |    19000 |      1.5 |         5 |
| Janpan    | 未知               |         85 |    15000 |        1 |         3 |
| 上海      | 购物               |         80 |    13000 |        1 |       2.5 |
| 东北      | 雪                 |         86 |    10000 |      1.5 |         5 |
| 北京      | 长城               |         93 |    15000 |        1 |         3 |
| 新疆      | 水果               |         90 |    12000 |      1.5 |         5 |
| 海南      | 沙滩               |         78 |     9000 |        1 |         4 |
| 香港      | 未知               |         76 |     8000 |        1 |         3 |
+-----------+--------------------+------------+----------+----------+-----------+
9 rows in set (0.00 sec)mysql> select * from city_spots where city_name regexp 'as*';
+-----------+--------------------+------------+----------+----------+-----------+
| city_name | place_of_interest' | city_score | cost_rmb | time_way | time_stay |
+-----------+--------------------+------------+----------+----------+-----------+
| America   | 未知               |         82 |    20000 |      1.5 |         4 |
| Iceland   | Ice                |         88 |    19000 |      1.5 |         5 |
| Janpan    | 未知               |         85 |    15000 |        1 |         3 |
+-----------+--------------------+------------+----------+----------+-----------+
3 rows in set (0.00 sec)

事务

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL
语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句

事务四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

事务控制语句:
BEGIN 或 START TRANSACTION 显式地开启一个事务;

COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;

ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;

RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACK TO identifier 把事务回滚到标记点;

SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

  1. 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,时会被回滚(Rollback)到事务开始前的状态。
  2. 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
  3. 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  4. 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交

完整事务

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into city_spots-> values('Italy','food',79,20000,1,4);
Query OK, 1 row affected (0.01 sec)
mysql> insert into city_spots-> values('西安','兵马俑',83,5500,1,3);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

回滚

mysql> begin;
Query OK, 0 rows affected (0.00 sec)-> values('Italian','food',79,20000,1,4);
Query OK, 1 row affected (0.01 sec)mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

未完待续。。。
半天搞定MySQL(全)一
半天搞定MySQL(全)二
半天搞定MySQL(全)四
半天搞定MySQL(全)五
半天搞定MySQL(全)六
半天搞定MySQL(全)七(终章)

这篇关于半天搞定MySQL(全)三(MySQL数据库教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/748876

相关文章

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使