使用t-sql语句修改表中的某些数据及数据类型。_数据库基本理论详细介绍

1、数据库范式

第一范式:列不可分,eg:【联系人】(姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF;

第二范式:有主键,保证完全依赖。eg:订单明细表【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName),Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID,不符合2NF;

第三范式:无传递依赖(非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况),eg:订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID),CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。

2、什么是反模式

范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。

然而,通过数据库范式化设计,将导致数据库业务涉及的表变多,并且可能需要将涉及的业务表进行多表连接查询,这样将导致性能变差,且不利于分库分表。因此,出于性能优先的考量,可能在数据库的结构中需要使用反模式的设计,即空间换取时间,采取数据冗余的方式避免表之间的关联查询。至于数据一致性问题,因为难以满足数据强一致性,一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。

需要谨慎使用反模式设计数据库。一般情况下,尽可能使用范式化的数据库设计,因为范式化的数据库设计能让产品更加灵活,并且能在数据库层保持数据完整性。

有的时候,提升性能最好的方法是在同一表中保存冗余数据,如果能容许少量的脏数据,创建一张完全独立的汇总表或缓存表是非常好的方法。举个例子,设计一张“下载次数表”来缓存下载次数信息,可使在海量数据的情况下,提高查询总数信息的速度。

另外一个比较典型的场景,出于扩展性考虑,可能会使用 BLOB 和 TEXT 类型的列存储 JSON 结构的数据,这样的好处在于可以在任何时候,将新的属性添加到这个字段中,而不需要更改表结构。但是,这个设计的缺点也比较明显,就是需要获取整个字段内容进行解码来获取指定的属性,并且无法进行索引、排序、聚合等操作。因此,如果需要考虑更加复杂的使用场景,更加建议使用 MongoDB 这样的文档型数据库。

3、数据库事务

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。

(1). 事务的特征

原子性(Atomicity):事务所包含的一系列数据库操作要么全部成功执行,要么全部回滚;

一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态;

隔离性(Isolation):并发执行的事务之间不能相互影响;

持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。

(2). 事务并发带来的问题

脏读:一个事务读取了另一个事务未提交的数据;

不可重复读:不可重复读的重点是修改,同样条件下两次读取结果不同,也就是说,被读取的数据可以被其它事务修改;

幻读:幻读的重点在于新增或者删除,同样条件下两次读出来的记录数不一样。

(3). 隔离级别

隔离级别决定了一个session中的事务可能对另一个session中的事务的影响。

ANSI标准定义了4个隔离级别,MySQL的InnoDB都支持,分别是:

READ UNCOMMITTED(未提交读):最低级别的隔离,通常又称为dirty read,它允许一个事务读取另一个事务还没commit的数据,这样可能会提高性能,但是会导致脏读问题;

READ COMMITTED(提交读):在一个事务中只允许对其它事务已经commit的记录可见,该隔离级别不能避免不可重复读问题;

REPEATABLE READ(可重复读):在一个事务开始后,其他事务对数据库的修改在本事务中不可见,直到本事务commit或rollback。但是,其他事务的insert/delete操作对该事务是可见的,也就是说,该隔离级别并不能避免幻读问题。在一个事务中重复select的结果一样,除非本事务中update数据库。

SERIALIZABLE(可串行化):最高级别的隔离,只允许事务串行执行。

MySQL默认的隔离级别是REPEATABLE READ。

4、什么是存储过程?有哪些优缺点?

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。进一步地说,存储过程是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。存储过程具有以下特点:

4.1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行效率;

4.2、当SQL语句有变动时,可以只修改数据库中的存储过程而不必修改代码;

4.3、减少网络传输,在客户端调用一个存储过程当然比执行一串SQL传输的数据量要小;

4.4、通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

5、简单说一下drop、delete、truncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别:

Delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除, delete命令会触发这个表上所有的delete触发器;

Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小;

Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。

6、什么叫视图?游标是什么?

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能,可以对视图进行增,删,改,查等操作。特别地,对视图的修改不影响基本表。相比多表查询,它使得我们获取数据更容易。

游标是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

在操作mysql的时候,我们知道MySQL检索操作返回一组称为结果集的行。这组返回的行都是与 SQL语句相匹配的行(零行或多行)。使用简单的 SELECT语句,例如,没有办法得到第一行、下一行或前 10行,也不存在每次一行地处理所有行的简单方法(相对于成批地处理它们)。有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条 SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。

7、什么是触发器?

触发器是与表相关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据库的完整性。

8、超键、候选键、主键、外键

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另一个表的主键称此表的外键。

9、什么是事务?什么是锁?

事务:就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。

锁:在所以的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

10、数据库锁机制

数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问,访问变得有序所设计的一种规则。MySQL各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。

表级锁定(table-level):表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。表级锁分为读锁和写锁。页级锁定(page-level):页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。行级锁定(row-level):行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。InnoDB的行级锁同样分为两种,共享锁和排他锁,同样InnoDB也引入了意向锁(表级锁)的概念,所以也就有了意向共享锁和意向排他锁,所以InnoDB实际上有四种锁,即共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX);

在MySQL数据库中,使用表级锁定的主要是MyISAM,Memory,CSV等一些非事务性存储引擎,而使用行级锁定的主要是Innodb存储引擎和NDBCluster存储引擎,页级锁定主要是BerkeleyDB存储引擎的锁定方式。

而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个

ef74f2eae43dacaa94bae288947035e8.png

意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

4ab04794f2f126c29a95aea78ee50b43.png

想了解更多相关内容请访问:mysql视频教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-retry_使用Spring-Retry重试处理

spring-retry每当软件组件相互通信时,就有可能出现暂时的自我纠正错误。 这些故障包括服务的暂时不可用,网络连接的瞬时丢失或服务繁忙时出现的超时。 在这种情况下,适当的重试处理可以减少这些故障可能引起的问题。 在这篇文章中&#xff0…

【WebRTC---入门篇】(三)WebRTC运行机制

轨和流 Track 轨:音频轨和视频轨是不相交的 MediaStream 媒体流:中包含多个音视频轨 WebRTC重要类 MediaStream 负责添加N个轨,加入到RTCPeerConnection RTCPeerConnection 核心 RTCDataChannel 非音视频数据,通过RTCP…

a - 数据结构实验之串一:kmp简单应用_【在线教学示范课案例】数据结构(刘航)...

一、教师简介刘航,网络空间安全学院教师,本科生“数据结构”、“算法设计综合实验” 和研究生“算法设计与优化”课程的主讲教师。近年来积极开展了教学与考核模式改革、探究式/研究型课程等课程改革探索,探索课程、学科竞赛和项目相结合的科…

c语言创建字符树,使用C语言构建基本的二叉树数据结构

二叉树结构常用的一些初始化代码#include#includetypedef struct Node{int data;Node *leftchild;Node *rightchild;}Node;/*初始化一棵二叉树排序树。*/void InitBinaryTree(Node**root,int elem){*root(Node*)malloc(sizeof(Node));if(!(*root)){printf("Memory allocat…

可变lambda_Lambda的Lambda(如果可选)

可变lambda因此,我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是,没有明显的方法可以在块中执行else操作,因为只有isPresent方法,除非您使用的是老式的if语句。 第二个问题当然是古老的板栗,即使您能够做到&…

【WebRTC---入门篇】(四)WebRTC设备管理

enumerateDevices API用来获取音视频设备 JS使用单线程处理,为了避免阻塞。使用异步调用Promise。handle为处理函数,处理主要逻辑。成功调用resolve;失败调用reject。Promise可以注册两个方法 then(逻辑处理成功会收到on_resolve) 和 catch(…

n阶幻方c语言编程,求单偶阶与双偶阶幻方编程思想及其算法!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #define N 100void oujie(int oushu){int a[N][N]{0},i,j,k1,n,m;noushu/2;m(oushu-2)/4;for(i1,j3*n/2;k<n*n;){if(i<0){ ii3*n; continue; }if(j>3*n){ jj-3*n; continue; }if(j<0){ jj3*n; continue; }if(…

python函数结构_PYTHON 之结构体,全局变量,函数参数,lambda编程 等

PYTHON 之结构体,全局变量,函数参数,lambda编程 ,generator&#xff08;yield&#xff09;使用以及如何自己构建switch结构 *********************** pass pass可以模拟struct结构 class Data pass d Data() d.a 2 d.b 4 print d.a print d.b *********************** 子函数…

【音视频安卓开发 (六)】Android GLSurfaceView播放视频

GLSurfaceView渲染RGB的数据,利用双缓冲空间机制。取出缓冲地址,将要渲染的数据copy到缓冲地址. 获取Surface Java部分&#xff1a; SurfaceView控件设置到界面中显示 SurfaceView定义一个类来实现 package com.example.hello;import android.content.Context; import android…

什么是openstack_您在OpenStack Summit 2016上错过了什么

什么是openstack今年&#xff0c;我第一次参加了4月25日至29日在德克萨斯州奥斯汀举行的OpenStack峰会。 今天结束了&#xff0c;我要回家了&#xff0c;我想回顾一下&#xff0c;从我的角度分享你错过的事情。 作为以应用程序开发人员为重点的技术传播者&#xff0c;转移到包…

python链表实现栈_使用python实现数组、链表、队列、栈

引言 什么是数据结构&#xff1f; 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说&#xff0c;数据结构就是设计数据以何种方式组织并存储在计算机中。 比如&#xff1a;列表&#xff0c;集合和字典等都是数据结构 N.W…

笛卡尔乘积c语言代码,c# – 高效笛卡尔乘积算法

有人可以向我证明比目前使用的笛卡儿乘积算法更有效(假设有一个)。我已经看了周围的SO和谷歌&#xff0c;但看不到任何明显的东西&#xff0c;所以我可能会缺少一些东西。foreach (int i in is) {foreach (int j in js) {//Pair i and j}}这是我在代码中做的非常简化的版本。两…

【音视频安卓开发 (七)】安卓视频播放窗口去掉标题栏、全屏、横屏

java中的MainActivity初始化部分设置这些操作 //去掉标题栏supportRequestWindowFeature( Window.FEATURE_NO_TITLE);//全屏&#xff0c;隐藏状态getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN ,WindowManager.LayoutParams.FLAG_FULLSCREEN);//屏幕为横屏…

drools6.5_Drools 6.4.0.Final提供

drools6.5最新和最出色的Drools 6.4.0.Final版本现已可供下载。 这是我们先前构建的增量版本&#xff0c;对核心引擎和Web工作台进行了一些改进。 您可以在此处找到更多详细信息&#xff0c;下载和文档&#xff1a; Drools网站 资料下载 文献资料 发行说明 请阅读下面的…

python 统计组合用什么库_Python机器学习需要用到的库

www.oldboyedu.com 老男孩 IT 教育&#xff0c;只培养技术精英 Python 机器学习需要用到的库 Python 是一种面向对象的解释型计算机程序设计语言&#xff0c;具有丰富和强大的 库&#xff0c;再加上其简单、易学、速度快、开源免费、可移植性、可扩展性以及面向对 象的特点&…

c语言编程数学黑洞,一个数学黑洞——6174

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*问题描述&#xff1a;从0-9中任意选取4个不完全相同的数比如&#xff0c;不能是5 5 5 5&#xff0c;可以是1 2 2 2用这4个数排列出最大的数&#xff0c;2221&#xff0c;最小的数1222最大减最小&#xff1a;2221-12220999用0 9 9…

【音视频安卓开发 (八)】OpenSLES播放音频步骤和接口讲解

OpenSLES是安卓内部的音频播放和录音 初始化引擎 创建输出设备 配置PCM格式信息 初始化播放器 播放和缓冲队列 本文开源项目下载

kata_FizzBu​​zz Kata与Java流

kata在柔道练习仅几周之后&#xff0c;我的儿子感到无聊。 他抱怨说自己没有学任何东西&#xff0c;因为他一遍又一遍地做着同样的事情。 混淆学习和做新事物的不仅是幼儿。 例如&#xff0c;有多少软件开发人员通过执行kata或参加dojos来进行刻意练习的麻烦&#xff1f; 重复…

python中if语句的实例_对python中if语句的真假判断实例详解

说明 在python中&#xff0c;if作为条件语句&#xff0c;当if后面的条件参数为真时&#xff0c;则执行后面的语句块&#xff0c;反之跳过&#xff0c;为了深入理解if语句&#xff0c;我们需要知道if语句的真假判断方式。 示例 在python交互器中&#xff0c;经过测试发现以下条件…