数据库操作、锁特性
1. DML、DDL和DQL是数据库操作语言的三种主要类型
1.1 DML(Data Manipulation Language)数据操纵语言
-
DML是用于检索、插入、更新和删除数据库中数据的SQL语句。
-
主要的DML语句包括:
-
SELECT
:用于查询数据库中的数据。 -
INSERT
:用于向数据库表中插入新数据。 -
UPDATE
:用于修改数据库表中的现有数据。 -
DELETE
:用于从数据库表中删除数据。
-
-
DML语句通常不涉及数据库结构的修改。
1.1.1 SELECT
-
用于查询数据库中的数据,可以结合WHERE子句、GROUP BY子句、HAVING子句和ORDER BY子句等进行复杂的查询。
SELECT column1, column2 FROM table_name WHERE condition;
1.1.2 INSERT
-
用于向数据库表中插入新的数据行。
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-
如果不指定列名,将插入所有列的默认值:
INSERT INTO table_name VALUES (value1, value2);
1.1.3 UPDATE
-
用于修改数据库表中的现有数据。
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
1.1.4 DELETE
-
用于从数据库表中删除数据。
DELETE FROM table_name WHERE condition;
-
注意:如果没有WHERE子句,将删除表中的所有行。
1.2 DDL(Data Definition Language)数据定义语言
-
DDL用于定义和管理数据库的结构,如创建、修改和删除数据库对象(如表、索引、视图、触发器等)。
-
主要的DDL语句包括:
-
CREATE
:用于创建新的数据库对象,如表、索引或视图。 -
ALTER
:用于修改现有数据库对象的结构。 -
DROP
:用于删除数据库对象。 -
TRUNCATE
:用于快速删除表中的所有行。
-
-
DDL语句通常会影响数据库的元数据,并且需要数据库管理员权限。
1.2.1 CREATE:创建新的数据库对象。
-
创建数据库:
CREATE DATABASE test;
-
创建表:
CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, position VARCHAR(100), hire_date DATE );
-
创建索引:
CREATE INDEX idx_lastname ON employees (name);
-
创建视图:
CREATE VIEW employee_positions AS SELECT name, position FROM employees;
-
创建触发器:在指定的数据库表上特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。
CREATE TRIGGER before_insert_employee BEFORE INSERT ON employees FOR EACH ROW BEGIN SET NEW.name = CONCAT('Mr/Ms ', NEW.name); END;
注:创建一个名为before_insert_employee的触发器,在employees表中执行插入操作之前,在名字之前加上'Mr/Ms'。
1.2.2 ALTER:修改现有数据库对象的结构。
-
修改表结构,添加新列:
ALTER TABLE employees ADD COLUMN salary DECIMAL(10, 2);
-
修改列的数据类型:
ALTER TABLE employees MODIFY COLUMN name VARCHAR(150);
-
重命名表:
ALTER TABLE employees RENAME TO staff;
1.2.3 DROP:删除数据库对象。
-
删除表:
DROP TABLE IF EXISTS staff;
-
删除数据库:
DROP DATABASE IF EXISTS mydatabase;
-
删除视图:
DROP VIEW IF EXISTS employee_positions;
-
删除触发器:
DROP TRIGGER IF EXISTS before_insert_employee;
1.2.4 TRUNCATE:快速删除表中的所有行。
-
快速删除表中的所有行,不记录行删除操作:
TRUNCATE TABLE employees;
1.3 DQL(Data Query Language)数据查询语言:
-
DQL是用于查询或检索数据库中数据的SQL语句。
-
DQL实际上主要是
SELECT
语句,它允许用户指定他们想要检索的数据。 -
DQL语句可以包含多个子句,如
WHERE
、GROUP BY
、HAVING
和ORDER BY
,以提供更复杂的查询能力。
1.3.1 基本查询
SELECT column1, column2 FROM table_name;
1.3.2 条件查询
SELECT column1, column2 FROM table_name WHERE condition;
1.3.3 分组查询
SELECT column1, COUNT(*) FROM table_name GROUP BY column1;
1.3.4 分组后筛选
SELECT column1, SUM(column2) FROM table_name GROUP BY column1 HAVING SUM(column2) > 100;
1.3.5 排序查询
SELECT column1, column2 FROM table_name ORDER BY column1 ASC, column2 DESC;
1.3.6 聚合查询
SELECT column1, AVG(column2), MAX(column3), MIN(column3), COUNT(*) FROM table_name GROUP BY column1;
1.3.7 联结查询
SELECT a.column1, b.column2 FROM table_name AS a JOIN another_table AS b ON a.common_column = b.common_column;
1.3.8 子查询
SELECT * FROM table_name WHERE column1 IN (SELECT column1 FROM another_table WHERE condition);
2. 简单的示例
2.1 DQL语句关键字执行顺序
-
FROM
-
首先确定查询的数据来源,即指定的表或子查询。
-
-
JOIN
-
接下来执行连接操作,根据JOIN关键字(INNER JOIN, LEFT JOIN, RIGHT JOIN等)将多个表连接起来。
-
-
WHERE
-
应用WHERE子句的条件过滤数据,只有满足条件的记录才会被保留。
-
-
GROUP BY
-
将结果集按照GROUP BY子句中的列进行分组。
-
-
HAVING
-
对分组后的结果应用HAVING子句的条件过滤,类似于WHERE,但是用于过滤分组后的结果。
-
-
SELECT
-
选择特定的列或计算后的列。
-
-
DISTINCT
-
如果使用DISTINCT关键字,去除结果中的重复行。
-
-
ORDER BY
-
对结果集进行排序。
-
-
LIMIT(在某些数据库系统中,如MySQL)
-
限制返回的结果数量。
-
-
OFFSET(与LIMIT一起使用)
-
指定从哪一条记录开始返回结果。
-
2.2 左连接示例
mysql> select * from employees e left join departments d on e.department = d.department_name;
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
| id | first_name | last_name | email | department | hire_date | salary | department_id | department_name |
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
| 1 | John | Doe | john.doe@example.com | Finance | 2023-01-10 | 70000.00 | 1 | Finance |
| 2 | Jane | Smith | jane.smith@example.com | IT | 2023-02-15 | 75000.00 | 3 | IT |
| 3 | Alice | Johnson | alice.johnson@example.com | HR | 2023-03-20 | 65000.00 | 2 | HR |
| 4 | Mike | Brown | mike.brown@example.com | Marketing | 2023-04-25 | 80000.00 | 4 | Marketing |
| 5 | yang | rongkai | 1968497756@qq.com | IT | NULL | 100000.00 | 3 | IT |
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
5 rows in set (0.00 sec)mysql> select * from employees e left join departments d on e.department = d.department_name where id = 1;
+----+------------+-----------+----------------------+------------+------------+----------+---------------+-----------------+
| id | first_name | last_name | email | department | hire_date | salary | department_id | department_name |
+----+------------+-----------+----------------------+------------+------------+----------+---------------+-----------------+
| 1 | John | Doe | john.doe@example.com | Finance | 2023-01-10 | 70000.00 | 1 | Finance |
+----+------------+-----------+----------------------+------------+------------+----------+---------------+-----------------+
1 row in set (0.00 sec)mysql> select * from employees e left join departments d on e.department = d.department_name order by id desc limit 3;
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
| id | first_name | last_name | email | department | hire_date | salary | department_id | department_name |
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
| 5 | yang | rongkai | 1968497756@qq.com | IT | NULL | 100000.00 | 3 | IT |
| 4 | Mike | Brown | mike.brown@example.com | Marketing | 2023-04-25 | 80000.00 | 4 | Marketing |
| 3 | Alice | Johnson | alice.johnson@example.com | HR | 2023-03-20 | 65000.00 | 2 | HR |
+----+------------+-----------+---------------------------+------------+------------+-----------+---------------+-----------------+
3 rows in set (0.00 sec)
注:inner join...on、left join...on、right join...on是一样的写法,主要在于以哪一个表为核心连接。
3. 锁
MySQL中的锁机制是确保数据一致性和隔离性的关键技术,主要分为以下几种类型:
-
全局锁
-
锁定整个数据库,使其处于只读状态。适用于全库备份等需要确保数据一致性的场景。使用
FLUSH TABLES WITH READ LOCK;
命令可以获取全局锁。
-
-
表级锁
-
对某个表加锁,包括表锁和元数据锁(MDL)。表锁分为读锁(共享锁)和写锁(排他锁)。表级锁是粗粒度的锁,适用于不需要并发操作的场景。
-
读锁(共享锁)允许多个事务同时读取数据,而写锁(排他锁)在操作未完成前会阻塞其他读和写操作。
-
-
意向锁(Intention Lock)
-
表级锁的一种,标记当前事务对表中行的锁定意图,用于加速表锁和行锁之间的协调。分为意向共享锁(IS)和意向排他锁(IX)。
-
-
行级锁
-
每次操作锁住对应的行数据。主要分为记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-Key Lock)。InnoDB通过行级锁实现了更细粒度的控制,支持更高的并发更新和查询。
-
记录锁(Record Lock)针对索引记录的锁定,防止其他事务对特定行进行update和delete。
-
间隙锁(Gap Lock)锁定索引记录间隙,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。
-
临键锁(Next-Key Lock)结合了记录锁和间隙锁的功能,在RR隔离级别下支持。
-
-
共享锁(S锁)与排他锁(X锁)
-
共享锁允许多个事务同时获取,而排他锁则确保同一时间内只有一个事务可以获取。
-
-
乐观锁与悲观锁
-
乐观锁认为自己的操作会成功,先尝试执行,失败时再获取锁;悲观锁则认为自己的操作可能不成功,会先获取锁再执行。
-
-
页面锁
-
针对数据库表中的页进行加锁的机制,适用于对某一页中的多行进行操作时,减少锁的粒度,提高并发性能。
-
不积跬步,无以至千里 --- xiaokai
相关文章:

数据库操作、锁特性
1. DML、DDL和DQL是数据库操作语言的三种主要类型 1.1 DML(Data Manipulation Language)数据操纵语言 DML是用于检索、插入、更新和删除数据库中数据的SQL语句。 主要的DML语句包括: SELECT:用于查询数据库中的数据。 INSERT&a…...
学习笔记039——SpringBoot整合Redis
文章目录 1、Redis 基本操作Redis 默认有 16 个数据库,使用的是第 0 个,切换数据库添加数据/修改数据查询数据批量添加批量查询删除数据查询所有的 key清除当前数据库清除所有数据库查看 key 是否存在设置有效期查看有效期 2、Redis 数据类型String追加字…...

(笔记)简单了解ZYNQ
1、zynq首先是一个片上操作系统(Soc),结合了arm(PS)和fpga(PL)两部分组成 Zynq系统主要由两部分组成:PS(Processing System)和PL(Programmable L…...

大众点评小程序mtgsig1.2算法
测试效果: var e function _typeof(o) {return "function" typeof Symbol && "symbol" typeof Symbol.iterator? function (o) {return typeof o;}: function (o) {return o && "function" typeof Symbol &…...

七牛云AIGC内容安全方案助力企业合规创新
随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…...

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角
窗体透明, 将Form的属性Opacity,由默认的100% 调整到 80%,这个数字越小越透明(尽量别低于50%,不信你试试看)! 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&…...

基于YOLOv8深度学习的智慧课堂教师上课行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
随着人工智能技术的迅猛发展,智能课堂行为分析逐渐成为提高教学质量和提升教学效率的关键工具之一。在现代教学环境中,能够实时了解教师的课堂表现和行为,对于促进互动式教学和个性化辅导具有重要意义。传统的课堂行为分析依赖于人工观测&…...

使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件
使用 Tkinter 创建一个简单的 GUI 应用程序来合并视频和音频文件 Python 是一门强大的编程语言,它不仅可以用于数据处理、自动化脚本,还可以用于创建图形用户界面 (GUI) 应用程序。在本教程中,我们将使用 Python 的标准库模块 tkinter 创建一…...

【C++笔记】模板进阶
前言 各位读者朋友们大家好!上一期我们讲了stack、queue以及仿函数。先前我们讲过模板的初阶内容,这一期我们来更深入的学习一下模板。 一. 非类型模板参数 1.1 非类型模板参数 模板参数分为类型形参和类类型形参: 类型形参:…...

Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新
随着全球AI领域的竞争加剧,越来越多的科技巨头和创新企业纷纷致力于多模态AI的开发。2024年10月14日至18日,GITEX GLOBAL海湾信息技术博览会在迪拜举行,吸引了超过6700家全球科技巨头和创新公司参与,展示了智能互联、人工智能等领域的新成果。 此次展会中,Soul App创始人张璐团…...
ffmpeg.wasm 在浏览器运行ffmpeg操作视频
利用ffmpeg.wasm,可以在浏览器里运行ffmpeg,实现对音视频的操作 参考链接: https://blog.csdn.net/jchsgwbr/article/details/143252044 https://gitee.com/CXBalCai/ffmpeg-template 其他参考 https://github.com/ffmpegwasm/ffmpeg.wasm https://b…...

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险
引言:数据的宝藏 在这个信息爆炸的时代,数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说,1688上的商品详情就是那些闪闪发光的金子。今天,我们将化身为数据的海盗,用Python这把锋利的剑࿰…...
CentOS上如何离线批量自动化部署zabbix 7.0版本客户端
CentOS上如何离线批量自动化部署zabbix 7.0版本客户端 管理的服务器大部分都是CentOS操作系统,版本主要是CentOS 7。因为监控服务器需要,要在前两天搭建的Zabbix 7.0系统上把这些CentOS 7系统都监控起来。因为服务器数量众多,而且有些服务器…...
【开源项目】ChinaAddressCrawler 中国行政区划数据(1980-2023年)采集及转换(Java版),含SQL格式及JSON格式
ChinaAddressCrawler 开源项目地址:https://gitee.com/li_yu_jiang/ChinaAddressCrawler 来源于国家民政部的数据只包括省级(省/直辖市/自治区/特别行政区)、地级(地级市/地区/自治州/盟)、县级(县/市辖区…...

React中事件处理和合成事件:理解与使用
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Local Changes不展示,DevEco Studio的git窗口中没有Local Changes
DevEco Studio的git窗口中,没有Local Changes,怎么设置可以调出? 进入File-->Settings-->Version Control,将Use non-modal commit interface前的勾选框取消勾选,点击OK即可在打开git窗口,就可以看到…...

大数据笔记
第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响…...

【Linux网络编程】TCP套接字
TCP与UDP的区别: udp是无连接的、面向数据报(通信时以数据报为单位传输)的传输层通信协议,其中每个数据报都是独立的,通信之前不需要建立连接,bind绑定套接字后直接可以进行通信。 tcp是面向连接的、基于字…...
在Manjaro Gnome桌面的基础上安装Budgie桌面环境
在Manjaro上安装Budgie桌面环境 Budgie是Solus团队开发的一种简单而优雅的桌面环境。 Budgie是由Solus项目主要开发的流行桌面环境,与GNOME堆栈紧密集成。它提供了简单而优雅的用户体验,并且可用于大多数发行版,如Arch、Debian、Manjaro等。…...

vscode可以编译通过c++项目,但头文件有红色波浪线的问题
1、打开 VSCode 的设置,可以通过快捷键 Ctrl Shift P 打开命令面板,然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令,这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...