数据库部分全部内容

目录

一.数据库的操作

二.常用数据类型

三.表的操作

四.表的增删查改(CRUD)

1.增

2.查

3.改

4.删

五.数据库约束

六.表的设计

1.实体之间的关系:

1.一对一的关系

2.一对多的关系

3.多对多的关系

七.和查询结合在一起的新增操作

八.聚合查询(把多个行的数据进行关联运算)

1.聚合函数

2.GROUP BY子句

3.HAVING

九.多表联合查询

1.内连接

2.外连接

3.自连接

4.子查询(嵌套查询)

(1)单行子查询

(2)多行子查询

5.合并查询

十.索引(index)

1.索引的作用/目的/优缺点

2.索引的使用场景

3.索引的使用及案例(案例在PDF上没有放上来)

(1)查看索引

(2)创建索引

(3)删除索引

4.索引的面试问题(注意要通过举例+画图的方式回答)

(1)索引是干啥的

(2)索引的使用场景及付出的代价

(3)索引背后的数据结构

十一.事务

1.什么是事务

2.事务的目的

3.面试问题

3.1事物的四种基本特性

3.2由于隔离性低引发的脏读问题


一.数据库的操作

1.显示当前的数据库:SHOW DATABASES;
2.创建数据库: 1.CREATE DATABASE 数据库名;
                   2.CREATE DATABASE IF NOT EXISTS 数据库名;
                   3.CREATE DATABASE IF NOT EXISTS db_test CHARACTER SET 数据库名;
3.使用数据库: use 数据库名;
4.删除数据库: DROP DATABASE [IF EXISTS] 数据库名;

二.常用数据类型

1.数值类型
                 

2.字符串类型
3.日期类型

三.表的操作

操作数据库中的表时,需要先使用该数据库 !!!
1.创建表:  CREATE TABLE table_name (
             field1 datatype,
             field2 datatype,
             field3 datatype );
2.查看表: show tables;
3.查看表结构 : desc 表名;
4.删除表:
  (1)drop table 表名;   
  (2)drop table if exists 表名; 

 四.表的增删查改(CRUD)

1.增

 

2.查

select操作不会影响到服务器中硬盘上保存的数据,查找的时候只是建立了临时表

3.改

注意注意:查询操作是临时表,因此他的数据类型不一定和原始的表的诗句类型完全一致;而修改操作因为改的是原始数据,因此数据类型不能超出范围

4.删

注意:where处如果不写条件,就会把整个表的数据都删除,得到一个空表

五.数据库约束


六.表的设计

表的设计 :根据实际的问题场景,把表创建出来
设计表的方法是:先找出实际场景中的实体(对象),再分析实体之间的关系

1.实体之间的关系:

1.一对一的关系

以教务系统的账户和学生为例,一个账户对应一个学生,一个学生只有一个账号

2.一对多的关系

以教务系统的班级和学生为例,一个学生处于一个班级里,一个班级可以包含多个学生
但MySQL没有提供数组类型,因此这个方法不能用

3.多对多的关系

以教务系统的学生和课程为例,一个学生可以选多个课程,一个课程可以被多个学生选
方法:使用一个关联表

七.和查询结合在一起的新增操作

 先执行查找,针对查找到的每个结果都执行插入操作

注意:查询的表中的查询结果的列的顺序和类型要和要插入的表一样


八.聚合查询(把多个行的数据进行关联运算)

1.聚合函数

2.GROUP BY子句

GROUP BY 列名,根据这一列中的每一行的值,对数据进行分组,把值相同的行都归为一组

3.HAVING

group by可以使用where,只不过where是在分组之前执行;如果要对分组之后的结果进行条件查询,就需使用having


九.多表联合查询

实际开发中往往数据来自不同的表,所以需要多表联合查询。多表查询是对多张表的数据取笛卡尔积

关联查询可以对关联表使用别名

关于笛卡尔积,举一个例子:

1.内连接

2.外连接

外连接分为 左外连接右外连接。如果联合查询, 左侧的表完全显示我们就说是左外连接右侧的表完全显示我们就说是右外连接

注意:多表查询的时候, from 多个表 where是内连接,
        而 from 表1 join 表2 on 条件 join 表3 on 条件既可以表示内连接,也可以表示外连接

3.自连接

自连接是指在同一张表连接自身进行查询,把行和行之间的比较条件转化成列和列之间的比较
举个例子:

4.子查询(嵌套查询)

(1)单行子查询

返回多行记录的子查询,把题目分解成两步分别写,写完合并

(2)多行子查询

返回多行记录的子查询

5.合并查询

为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION
和UNION ALL时,前后查询的结果集中,字段需要一致


十.索引(index)

1.索引的作用/目的/优缺点

(1)索引的作用:数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系
(2)索引的主要目的:提高查找的效率
(3)索引的优点:提高了查找的效率;缺点:占用了更多空间,拖慢了增删改的效率
          (解释一下:因为书的目录也是废纸的,索引也是一样,用索引的时候会消耗额外的存储空间;书的内容进行调整,目录也会跟着调整,同样,增删改的时候,也要调整索引的结构)

2.索引的使用场景

3.索引的使用及案例(案例在PDF上没有放上来)

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引

(1)查看索引

(2)创建索引

(3)删除索引

4.索引的面试问题(注意要通过举例+画图的方式回答)

(1)索引是干啥的

(2)索引的使用场景及付出的代价

(3)索引背后的数据结构

索引可以提高查找效率(这里的查找指的是 按值查找, 注意和按下标查找区分开,按下标查找叫做访问),索引背后的数据结构是: 多叉搜索树---(在MySQL中叫)B+树
B+树是什么样的,举一个例子:
B+树的特点:
使用B+树进行查找的时候,整体IO的次数比较少;
所有的查询都会落到叶子节点上;每次查询的IO次数也差不多,查询速度是稳定的;
叶子节点用链表链接后,非常适合范围查找;
所有的数据存储(载荷)都在叶子节点上,非叶子节点只保留key的值因此非叶子结点占用的空间很少,可以缓冲到内存中,这时磁盘IO就几乎没有了
拿一个实际例子来看,哪部分是非叶子结点,哪部分是叶子节点:
            
另外索引背后不能是这些数据结构的原因附上:
1.顺序表/链表不行,因为他们是按下标查找
2.二叉树不行,因为二叉树的特点是,当元素多了,高度就高了,对应着比较次数就多了,意味着每次比较磁盘都要IO
3.哈希表不行,哈希表查找速度虽然很快,但是他只能针对"相等"进行判定,不能对"大于小于"或是范围查找进行判定
4.堆不行,因为堆只能找最大/最小

十一.事务

1.什么是事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败

2.事务的目的

将若干个独立的SQL操作打包成一个整体

3.面试问题

3.1事物的四种基本特性

(1)原子性:要么全部执行,要么都不执行,事务不可再细分

但具体操作的时候,每个操作该执行执行,因为无法预知失败,但是!!当出现执行失败的时候,由数据库自动执行一些还原性的工作,来消除前面SQL操作带来的影响(看起来就像没执行一样)
由数据库自动执行一些还原性的工作,来消除前面SQL操作带来的影响--->这个操作叫 回滚(rollback)

(2)一致性:事务执行前后,数据库中的数据都是合理合法的

(3)持久性:事务一旦提交,数据就持久化存储起来,数据就写入硬盘了

(4)隔离性:用来解决并发执行事务的时候产生的问题

                           并发--->一心多用,可以同时解决多个事务

3.2由于隔离性低引发的脏读问题

(1)什么是脏读问题

(2)出现脏读问题的原因:事务和事务之间没有进行隔离
(3)如何处理脏读问题:写操作和读操作都加锁(我在进行写操作的时候,你不能读,我写完你才能读;同样的我在进行读操作的时候,你不能写,我读完你才能写)
注意: 一旦加锁,意味着事务之间的隔离性高了,并发性低了.隔离性和并发性是不可兼得的,并发性是注重快,隔离性是注重安全
(4)为何处理脏读问题时要写操作读操作都加锁,而非只给写操作加锁
因为可能会出现:我写完了,解锁了,你可以读了,但你在读的时候,我同时继续写下面的操作,当你往下读的时候,发现代码变了(这里这种情况叫做----> 不可重复读:在一个事务中,包含了多次读操作,多次读操作读出的结果不一致)
--->那么这个时候,为了避免这种情况,我们需要让 读操作也加锁,此时事务的隔离性又高了,并发性更低了
(5)关于脏读问题的"加锁"的进一步解释&可能会出现的幻读问题及解决方法
事务在提高隔离性的时候需要进行一系列加锁,但是这里的加锁不是把整个数据库都加锁,因此我依旧可以在你读操作的时候,我在数据库的其他表中进行写操作.但是这里会出现一个问题:
读代码读着读着发现,代码变多了,原本只有A.java,现在多了一个B.java(幻读问题)
                                                                                                       幻读问题:特殊的不可重复读
那怎么 解决幻读问题:彻底串行化执行(就是写操作加锁,读操作加锁,并且读操作时,写操作停止,什么都不干)
(6)隔离级别
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值