关系型数据库面试看这篇就够了(MySQL ,Oracle)--传统数仓

怎么去优化查询的sql语句/怎么优化数据库?
1.要先通过执行计划看一下sql语句执行的效率
2.查看表格的数量,如果数据量很大,就先给表格进行分区表的设置
3.给表格建适当的索引
4.检查索引失效的语句
5.使用嵌套去替换部分连接的场景
查询SMITH在哪里上班
联合查询14 4 56行
嵌套查询14 4 18行
6.使用临时表去存储一个或者多个大表筛选的结果,然后使用临时表进行表格的连接
7.or的效率比较低,可以使用union all去进行替换,使用or可能会使索引失效,从而全表扫描
8.where查询的顺序,数据筛选量大的放在右边,筛选量小的放在左边(.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.)
9.尽量先用where筛选然后再分组,having只对聚合结果筛选
10.使用union all替代or,union all是并行
11.使用group by 替代distinct,分组比以行为单位筛选更快
12.使用大写的sql替代小写的sql,数据库本来就是要转换成大写再运行的
13.尽量少使用union minus intersect这三种集合运算,这三种集合会多一步sort unique的排序操作
14.使用exists()函数去替代in 包含语句(in 对子查询中的表进行了一个 全表遍历,但如果是子查询所满足的结果集很小也是可以使用的)

exists() 语法:
select * from 原表 a where exists(select 1 from 原表 b where 查询条件);

  1. 尽量少使用union minus intersect等集合的运算,这些都是效率很差的关键字
    9.使用多线程的并发的优化器去加速执行的速度
    hints优化器:用来强行改变表格内部运行逻辑的方法
    写在select后面,写在列名的前面
    /*+ 优化器的内容 /
    并发的使用
    /
    + parallel(8) */ 强制使用并行的资源,来执行这个sql语句
    、AND比OR的优先级高
    主键和索引的区别!
    1.主键一定是唯一性索引,唯一性索引并不一定就是主键。

  2. 一个表中可以有多个唯一性索引,但只能有一个主键。

  3. 主键列不允许空值,而唯一性索引列允许空值。

  4. 索引可以提高查询的速度。
    数据库的索引:index
    什么是索引:就是每一个表格的目录结构,帮你快速的定位表格中的数据在表格里的位置
    添加索引的语法:
    create index 索引名 on 表名(列名);

索引有哪些类型:

  1. 主键索引:在创建表格的时候,添加了主键约束,那么就会自动生成主键索引
    alter table emp_idx add constraint pri_empno primary key(empno);
    通过主键约束的创建,来生成这个主键索引

  2. 唯一索引:
    2.1 在创建表格的时候,会根据唯一约束自动的生成唯一索引
    alter table emp_idx add constraint uni_empno unique(empno);
    2.2 在没有约束的前提下,手动创建唯一索引,唯一索引不会反过去创建唯一约束
    create unique index idx_emp_empno on emp_idx(empno);

  3. 普通索引:这个列经常需要被查询,但是这个列又没有什么特点
    create index idx_nor_ename on emp_idx(ename);

  4. 组合索引:和普通索引相同,有多个列需要同时被查询,但是这些列也没有什么特点,那么就放在一起,创建一个组合索引
    create index idx_sal_job on emp_idx(sal,job);

create index 索引名 on 表名(a,b,c);
abc
ab
ac
a
查询组合索引,一定需要包含组合的第一个列

  1. 函数索引:如果你的列,是需要被使用函数计算之后再用来查询,那么计算过程需要被写在索引里面
    create index idx_func_hiredate on emp_idx(to_char(hiredate,‘yyyy’));

  2. 位图索引:列的内容是由大量的重复的内容组成的 bitmap
    create bitmap index idx_emp_deptno on emp_idx(deptno);

7. 分区表索引
7.1 本地索引
create index idx_hash_ename on emp_hash(ename) local;

7.2 全局索引
create index idx_hash_job on emp_hash(job) global;
本地和全局的区别?
–本地索引的话,在创建唯一索引的时候,在整个表中,可能会出现重复信息,在一个分区里面,值保证是唯一的,全局索引是整个表中,数据唯一存在
–删除了一个分区或者新增了一个分区,那么全局的索引会失效,需要你删除了索引然后重新建立,本地的索引是不会失效的

删除索引:
drop index 索引名;
drop index idx_hash_job;

什么时候用哪种索引

普通的索引和位图的索引,区别在哪?
主键、唯一、普通、组合、函数(普通的normal类型) 树状结构 b树索引,btree索引
位图(bitmap) 二维表结构

普通索引是通过根节点、分支节点、叶子节点、行数据四个节点块,一层层进行数据范围的筛选。
位图的索引是在二维表中,通过0和1来存储数据内容。
每一种索引都是通过rowid来搜索数据的。

索引是不是越多越好?
一个表不要建超过5个索引;索引的数量,不要超过列的数量的15%。
索引一定是建立上反复的经常被查询的列上。
索引会加快dql的速度,但是会降低dml的速度。

有一个2000W数据的表格,要接着往里面添加2000W的数据,怎么样操作最快?
1.先删除所有的索引
2.插入2000W数据
3.重建索引

一个亿的数据中 怎么删除10000万数据最快

– 复制表结构
CREATE TABLE tableB (LIKE tableA);
– 插入筛选数据
INSERT into tableB SELECT * from tableA where XXX = ?;
– 重命名,替换
rename table tableA to tableC;
rename table tableB to tableA;
– 删除旧表
DROP TABLE tableC;

索引在什么时候会失效?

  1. 经常需要被修改的列,索引是一直处于失效状态的
  2. 数据发生了隐性的转换
    select * from emp_idx where to_char(hiredate,‘yyyy’)=1981;
  3. 计算的时候,公式放在了等号的左边
    select * from emp_idx where sal+1000=4000 and job=‘MANAGER’
  4. 查询的时候使用不等于
    select * from emp_idx where deptno!=20
  5. 查询的时候使用了not
    select * from emp_idx where not deptno=20
  6. 空值查询
    select * from emp_idx where ename is null
  7. 组合索引没有使用第一列的列查询
  8. 查询的时候,使用了非函数索引的函数

索引的优点
·大大加快数据的查询速度
·使用分组和排序进行数据查询时,可以显著减少查询时分组和排序的时间·
创建唯一索引,能够保证数据库表中每一行数据的唯一性在实现数据的参考完整性方面,可以加速表和表之间的连接

索引的缺点
·创建索引和维护索引需要消耗时间,并且随着数据量的增加,时间也会增加·
索引需要占据磁盘空间
·对数据表中的数据进行增加,修改,删除时,索引也要动态的维护,降低了护的速

创建索引的原则
更新频繁的列不应设置索引
数据量小的表不要使用索引《毕竟总共2页的文档,还要目录吗? )
重复数据多的字段不应设为索引《比如性别,只有男和女,一般来说:重复的数据超过百分之15就不该建索引)
首先应该考虑对where 和 order by 涉及的列上建立家引

MySQL表引擎
它们之间的主要区别在于:
锁定机制:InnoDB使用行级锁定,MyISAM使用表级锁定。这意味着在并发访问情况下,InnoDB可以更好地支持多用户写入,而MyISAM在写入时可能会遇到锁定等待。
数据完整性:InnoDB支持外键和事务,因此可以更好地保证数据完整性。而MyISAM则不支持这些功能,因此具有更快的性能。
性能:在多用户读取并发的情况下,MyISAM可能会更好,因为它更简单并且有更少的开销。但是对于多用户写入并发情况,InnoDB可能会更好。
综上所述,选择哪种引擎应该基于实际情况来考虑。如果数据完整性和事务是最重要的,那么应该选择InnoDB。如果读取速度比写入速度更重要,或者代码中没有使用外键和事务,那么MyISAM可能会更适合。

2.两种引擎所使用的索引的数据结构是什么?

答案:都是B+树!

MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。

Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引

oracle
oracle中不存在引擎的概念,数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;
OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等

什么是事务:在数据库里面,处理数据的最小的功能模块

事务处理可以用来维护数据库的完整性,保证成批的 SQL语句要么全部执行,要么全部不执行事
事务的几个特征:
原子性:每一个事务都是最小的功能模块
一致性:同时成功同时失败
隔离性:同时操作事务的时候,事务之间不会互相影响
持久性:通过事务操作的数据,是永久保存的

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

mysql的4种事务隔离级别,如下所示:

1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

2、提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

3、可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读

4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

数据库的锁:
为了避免多个用户对同一个数据同时进行操作,操作数据的时候数据保存出错产生脏数据
从锁的范围上看
行锁:
A用户在对数据做dml操作的时候,数据会被上锁,B用户不能对这个数据所在的行同时进行操作
表锁:
A用户在对数据做dml操作的时候,数据所在的表会被上锁,B用户不能对表做ddl(除了新增表格结构之外)的操作
从上锁的主动性和被动性看
悲观锁:通过for update提前占用数据的资源
select 语句 + for update;
select * from scott.emp where ename=‘SMITH’ for update;
乐观锁:数据库默认的就是乐观锁

数据库的死锁:
同时操作的进程里面,每个进程都互相占用了对方的资源,谁都无法释放资源和成功跑完
怎么解决死锁的问题?
–查看所有被上了锁的对象 69539
select * from vKaTeX parse error: Expected 'EOF', got '#' at position 129: …--找锁的id的 serial#̲ 9555 select * …session where sid=131;
–根据这两个编号,杀掉这个锁
alter system kill session ‘131,9555’;

临时表:临时存储数据的表格,数据暂时放在这个表格中,等会会自动的根据什么事件消失掉,不会永久的占用你的物理磁盘的空间。

会话级临时表:
create global temporary table 表名(
列名 数据类型
)on commit preserve rows;
重新打开plsql的对话框,dept_tmp的表格内容就清空了

事务级临时表:
create global temporary table 表名(
列名 数据类型
)on commit delete rows;
如果进行了commit和rollback的操作,表格的数据都会被清空。

如果是正常的sql语句的操作,那么一般会话级的操作更多;
如果是在代码中写sql语句,那么就是事务级的临时表更多。

分区表和表分区:***
表分区:将一个表里面,所有的拥有相同特征的数据,在硬盘上规划出一块区域,整合在一起
分区表:拥有表分区的划分规律的表格
表分区的类型划分:

  1. 散列分区:hash 用来划分那么没有什么规律的列
    通过数据库的内部的哈希算法,将所有的行,根据名字的内容,一共放到4个不同的分区中进行分开的保存。哈希算法的分区的数量,最好是写2的次方数。
    2.列表分区 list
    当某个列的值,是大量的重复的相同数据数据,使用列表分区,对这个列进行特征和内容的归纳和划分,将拥有相同数据的行,放在同一个分区中
  2. 范围分区 range

数字类型、日期类型的数据,例如金额、时间、年龄等等,将某个范围内的数据,存放在一起,那么就使用范围分区
4. 组合分区
首先划分父分区,设置父分区的规则,然后在父分区中划分子分区的规则,这样可以在同时对两个列进行查询的时候,有效的减少查询需要消耗的资源和时间。

表连接有三种内部的连接方式(查询内容的三种方法):
hash join 哈希连接
nested loops nl嵌套连接
merge join 排序归并

什么时候会出现这个hash join?
两个表格列的等值筛选

什么时候会出现NL嵌套连接?

  1. 两个表的列,进行非等值筛选;
  2. A表和B表的数据,相差很大,并且表连接的列都是有索引的,这个时候的等值连接就不会变成hash join,而是会使用nl嵌套连接。

什么时候会出现merge join 排序归并?
两个表的连接,筛选条件不是对列和列进行筛选,而是对列和值进行筛

oracle的序列:sequence,一组有规律的从大到小或者从小到大的数字,一般序列都是在表格里面,充当主键的自增序号来使用的

oracle的视图:view 一个或者多个表查询的结果,这个结果就是一个虚拟的表,每次运行视图,都会重新运行视图中的那个查询语句

视图的作用:

  1. 将一个复杂的select语句,放入到一个视图里面,简化日常的操作
  2. 可以隐藏一部分原表的列,简化别人在操作表的时候的业务逻辑
  3. 可以添加with read only,增加表的安全性
  4. 视图可以节省网络流量
    视图的缺点:
    对拥有复杂逻辑的视图,再次表连接等操作,会导致语句更加复杂,运行效率很慢。

oracle的物化视图:是一个真实的物理的表格,将一个或多个表格查询的结果,当成一个新的表格来保存,物化视图的表格,会对原表的数据进行同步,物化视图的表格,本身就是不能更改的
物化视图也叫做 快照表。
on commit:类似于实时更新,原表提交数据时更新
on demand:定时更新
视图和物化视图的区别是什么?
5. 视图是一张虚拟的表格,不会占用磁盘空间,物化视图是一个真实的表格,会占用磁盘空间
6. 视图为了简化select操作用的,物化视图也叫做快照表,是为了保存某个表格或者是select语句在某个时间点的数据而存在的
7. 视图是实时更新的,物化视图有两个刷新表格内容的方法,一种是提交数据的时候更新,第二种是定时更新
8. 当原表非常大的时候,视图不会减少查询时间,物化视图是会减少查询时间的
9. 可以在物化视图上建立索引,进一步加快查询速度

拉链表,缓慢变化维:(拉链用在业务规模较大,有存在少量更新 ,同时业务又要保留更新记录,以及查看某个历史时间快照信息的场景)
拉链表就是一张普通的表格,这个表格会保存你每一次数据前后变更的状态。
1.以行的方式保存历史数据和变化状态
有开始时间和结束时间还有变更状态这三列,用来记录每一行数据前后变更的状态和顺序,这三列叫做缓慢变化维。
优点:可以保存所有的历史记录
缺点:表格的数据会特别的多
2.以列的方式保存最近的历史数据
会创建列的旧数据的备份列,会保存最近一次的变更的数据,和数据变更的时间
优点:可以保证表格的数据量不会很大
缺点:看不到详细的变化状态

缓慢变化维和拉链表:
拉链表长什么样?
拉链表除了有表格核心的列的信息之外,还有数据变更状态的开始时间、结束时间、状态码,
例如现在有一个新的数据进来,这个数据的开始时间是现在时间,结束时间是2999-12-31的最大值,状态码给个1,如果这个数据的状态发生了变更,那么这个时候要新增一个数据,除了数据的新内容之外,开始时间是现在时间,结束时间是2999-12-31的最大值,状态码给个1,上一个这个数据的历史信息,结束时间要变成新数据的开始时间,状态码变成0。

什么是缓慢变化维?
记录拉链表前后数据变更的列,就是缓慢变化维。

有哪几种不同的缓慢变化维?
有两种,拉链表是最常见的一种。
还有一种只记录最近的变量数据和状态,不会记录所有的变更状态。
核心列 变更列 变更时间
id name addr mobile old_addr old_mobile update_time
1 li gz 131xx sz 130xxx 2020-12-18

存储过程:有名字的代码块 procedure
存储过程的硬代码是什么?
–没有参数的存储过程:
create or replace procedure 存储过程名字
as
变量的声明;
begin
执行的sql语句;
end;

什么时候会使用到存储过程?
一个固定的功能的代码块,并且这个代码需要经常的反复的运行
公司的常用的业务计算;
进行数据的增量、全量操作;
删除索引和恢复索引的操作;
每天自动的创建当天的新的分区;
日志的操作

数据库的函数:自己去定义数据运行的过程,最终返回这个过程结果的代码块
create or replace function 函数名(输入的参数 数据类型)
return 返回的数据类型
as
声明部分
begin
执行部分
end;

存储过程和函数的区别?
1.存储过程可以没有参数,也可以有输入和输出的参数;函数一定要有输入的参数和返回的值
2.存储过程通过call调用,函数通过sql语句运行
3.函数里面不能执行dml和ddl操作,存储过程可以
4.函数是用来进行数据计算的,存储过程是用来实现一个固定的功能

游标:cursor,从上往下游动的箭头,每一次都会读取一行数据,每一行数据都只能读取一次
声明一个游标
cursor 游标名 is select 语句;
打开游标
open 游标名;
使用游标,获取游标当前的内容
fetch 游标名 into 变量;
关闭游标
close 游标名;
静态游标,就是一旦声明,游标的内容就不会变了。

动态的游标:为了让你只声明一个游标,可以反复的使用这个游标的类型,不需要创建多个游标

动态和静态的游标,都叫做显性游标,还有一种叫做隐性游标。通过sql关键字来查看,本次数据修改的范围,一共有多少行。

异常处理
在代码中捕获所有出现的异常和错误
create or replace procedure 过程名
as
–声明部分
begin
–执行部分
exception
when 异常的名字 then
对异常的处理
when 异常的名字 then
对异常的处理
when others then
对异常的处理
end;

others表示所有的错误。

  1. 系统预定义的异常 21种 有名字有编号的错误,就是预定义错误
    declare
    数据库的触发器:在做A这个事情的时候,自动的发生B这个事情 trigger
    检查输入的数据;实时备份表格的数据;记录表格操作的日志。(前置,后置)

触发器的类型:
create or replace trigger 触发器名字
before|after insert or update or delete on 表名
for each row
begin
执行的sql语句;
end;

包:统一的管理同一个模块下所有的代码的块的一个概念 package
包规范:声明你要打包的那些存储过程和函数长什么样
create or replace package 包的名字
as
function 函数名字(输入的参数 数据类型) return 返回的数据;
procedure 过程的名字(输入的参数 in 数据类型, 输出的参数 out 数据类型);
end 包的名字;

常用函数有哪些?
聚合函数:max min avg sum count
单行函数:数字 round trunc abs floor(6.3 变6) ceil(6.1 变7) mod power
字符串 substr截取 concat replace length
日期 last_day months_between add_months sysdate
转换 to_date to_char to_number
分析函数:row_number rank dense_rank lag lead + over()
行列转换:pivot
空值处理:nvl nvl2
逻辑相关:decode
字符串的行列转换:wm_concat()
将一个列的字符串,以行的方式拼接起来,中间用逗号隔开。
delete和truncate的区别是什么?

  1. delete是DML操作,truncate是DDL操作
  2. delete是以行为单位删除数据,truncate是基于整个表格删除的
  3. delete可以加where筛选需要删除的数据,truncate不能使用where筛选
  4. delete是有缓存的,truncate删除是没有缓存的

where 和 having 他们的区别是什么?
5. 先筛选再分组,用使用where筛选,速度上更快
6. where在group by 之前使用的,having是在group by之后使用的
7. where不能筛选聚合函数的结果,having可以
内连接 [inner] join
拼接左右两个表格,显示两个表格连接列共同拥有的数据
左连接 left [outer] join
首先先显示左右两个表格所有的共同数据,然后再显示左边那边表独有的数据,因为右边没有匹配数据,所以显示为空

右连接 right [outer] join:刚好和左连接相反,首先先显示左右两个表格所有的共同数据,然后再显示右边那边表独有的数据,因为左边没有匹配数据,所以显示为空

全连接 full [outer] join:先显示两个表的共同数据,然后再显示左边表的独有数据,右边没有匹配就显示为空,然后再显示右边表的独有数据,左边没有匹配就显示为空。

sql语句里面的集合运算:

union all:将第一个语句的结果和第二个语句的结果,拼接在一起

union:将第一个语句的结果和第二个语句的结果,拼接在一起,并且去除掉重复的数据
minus:显示第一个语句有的内容,但是第二个句子没有的内容

intersect:显示两个句子共有的数据部分

union&union all上下拼接

union和union all都是上下拼接sql的结果,这点是和join有区别的,join是左右关联,union和union all是上下拼接。union去重,union all不去重。

union和union all在上下拼接sql结果时有两个要求:

(1)两个sql的结果,列的个数必须相同

(2)两个sql的结果,上下所对应列的类型必须一致

WHERE 与 ON
当查询涉及多个表的关联时,我们既可以使用WHERE子句也可以使用ON子句指定连接条件和过滤条件。这两者之间的主要区别在于:

对于内连接(inner join)查询,WHERE和ON中的过滤条件等效;
对于外连接(outer join)查询,ON中的过滤条件在连接操作之前执行,WHERE中的过滤条件(逻辑上)在连接操作之后执行。
左连接的时候,数据筛选使用and和where的区别?
a表 b表
1 a 1 A
2 b 2 B
3 c 4 D

select * from a left join b on a.id=b.id where a.id=2;
先连接,在连接的基础上进行筛选,数据只剩1行
2 b 2 B
select * from a left join b on a.id=b.id and a.id=2;
先筛选a表,用筛选后的结果和b表进行连接,数据有3行
2 b 2 B
1 a null null
3 c null null

在使用left jion时,on和where条件的区别如下:

(1) on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

(2) where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

如果有where条件,顺序是on 后where,如果要使用where条件可以用and代替。

笛卡尔积
表连接的过程:
对a和b的所有数据进行匹配,先找出所有数据的笛卡尔积,然后在所有的集合结果中找出符合的数据

distinct和group by都可以去重,那么场景下用哪一种,效率更高?

  1. 数据量非常大的时候,group by的速度更快
  2. 数据量不大的时候,两者的速度差不多,如果去重的列,有大量的重复的信息的组成的,那么group by更快,如果列里面大部分的信息都不重复,只有少部分需要去重的数据,那么distinct更快

伪列:在创建表格的时候,没有直接写上去的列名,但是每个表都一定会有的信息,效果等同于row_number()
rownum:分页查询,必须从1开始查询才会有结果

rowid:数据去重,表里面每一行数据,在数据库中的唯一编号,不会出现重复的数据
–对重复的数据分组
–找到每个组里面最小或者最大的rowid
–删除除了这些rowid之外的其他rowid所在行
统计行数:
count(列名):统计的是这一列中不为空的数量
count(1)等同于count(*):以行为单位,只要整行中有一列有值,那么就统计数量
腾讯面试:
1.表连接(左连接,左边一个a,右边两个a,结果是什么)
a a
a a

8.假如有a,b两张表,如果a表有数据就用a表的数据,如果a表没有,就用b表的数据,你怎么做?
select case when a.name is null then b.name else a.name end
from a left join b on a.id=b.id;

数据库的with as语句:
with 别名 as (select 语句),
别名 as (select 语句),

select 查询;

判断相关的语句:case when 语句
case
when 条件判断1 then 条件判断1为真的时候
when 条件判断2 then 条件判断2为真的时候
when 条件判断3 then 条件判断3为真的时候
else 所有条件都为假的时候
end

select sno,cno,score,
case
when score>=60 then ‘及格’
else ‘不及格’
end
from sc;

select ename,sal,
case
when sal<2000 then ‘C’
when sal>=2000 and sal<=3000 then ‘B’
else ‘A’
end
from scott.emp;

使用case when判断emp的员工是普通员工还是管理层(MANAGER PERSIDENT)
select ename,job,
case
when job in(‘MANAGER’,‘PRESIDENT’) then ‘管理层’
else ‘普通员工’
end
from scott.emp;

查询出及格和不及格分别有多少人,显示效果如下:
jige bujige
7 1
select * from (
select sno,case when score>=60 then ‘jige’ else ‘bujige’ end c
from sc
)
pivot(count(sno) for c in (‘jige’,‘bujige’));

select
sum(case when score>=60 then 1 else 0 end) jige,
sum(case when score<60 then 1 else 0 end) bujige
from sc;

影响MySQL查询慢的原因有以下几个:

索引缺失:如果查询中涉及的列没有合适的索引,MySQL将会进行全表扫描,导致查询速度变慢。可以通过创建适当的索引来优化查询性能。

锁冲突:当多个查询同时访问同一数据时,可能会发生锁冲突,导致查询阻塞。可以通过合理设置事务隔离级别、优化查询语句、调整并发连接数等方式来减少锁冲突。

数据库设计问题:如果数据库表的设计不合理,如表字段冗余、表关联关系复杂等,会导致查询变慢。可以通过优化数据库的结构、拆分大表、避免使用过多的关联查询等方式来改善性能。

查询语句问题:不合理的查询语句也可能导致查询慢。例如,查询中使用了大量的子查询、不必要的排序、模糊查询等,都会影响性能。可以通过优化查询语句、避免不必要的计算和排序等来提升查询速度。

硬件资源限制:如果数据库所在的服务器硬件资源不足,如CPU、内存、磁盘IO等,也会导致查询慢。可以通过升级硬件、优化数据库配置参数等来改善性能。

这些只是一些常见的原因,

在写存储过程的时候,遇到过什么问题?
第一种,语法没有问题,但是因为上游数据的问题,导致了sql语句运行出错或报异常,这个时候就需要去对存储过程的代码进行异常的捕获
第二种,运行的结果和预期结果不太一致:在存储过程中,在每个判断、循环等位置,写上变量和表格数据的打印,查看一下是否是逻辑问题,然后再查看表格对应的上游数据是否有问题

游标:
为什么要写游标?
需要对表格的数据一行行进行计算和判断的时候。

游标有哪些不同的类型?
显性(静态和动态)和隐形。

静态和动态的区别?
静态是在声明部分去定义游标的内容,动态是在执行部分去定义游标内容;
静态的内容一个游标只能定义一次,动态可以在执行过程中进行变更。

动态游标怎么写的?
type 数据类型名 is ref cursor;
游标名 数据类型名;
open 游标名 for select 语句;
fetch 游标名 into 变量;
close 游标名;

游标执行的过程是什么?
声明 cursor
打开 open
抓取 fetch
关闭 close

操作数据库的语言,SQL语句:
数据控制语言 DCL
grant 赋予权限
revoke 收回权限

数据定义语言 DDL
create 创建
alter 修改
drop 删除
truncate 清空

数据查询语言 DQL
select

数据操作语言 DML
insert
update
delete

往所有的列中添加对应的数据
insert into 表名 values(值1,值2,值3…);
insert into user_info values(1001,‘李雷’,1,date’2020-11-19’,‘13400009999’);
往指定的列中添加对应的数据
insert into 表名(列名1,列名2…) values(值1,值2…);

修改已有数据:where 列名=值 根据某个列的值,找到拥有这个值的行,一般都会通过主键查找数据
update 表名 set 列名=新的值 where 列名=原有的值;
update user_info set usersex=0 where username=‘韩梅梅’;
update user_info set username=‘韩小梅’ where userid=1002;

删除数据
delete from 表名 where 列名=原有的值;
delete from user_info where userid=1001;

count(*),表示统计所有行数,包含null值;

count(某列),表示该列一共有多少行,不包含null值;

max(),求最大值,不包含null,除非所有值都是null;

min(),求最小值,不包含null,除非所有值都是null;

sum(),求和,不包含null。

avg(),求平均值,不包含null

数据库的概念
 存放数据的仓库,是大量数据的集合
 由模式及模式中的表、索引、视图等数据库对象组成
 存放在数据库中的数据的特点
 永久存储
 有组织
 可共享

schema的概念
 数据库形式语言描述的一种结构,是对象的集合;
 把数据库对象组织成逻辑组,更便于管理;
 形成命名空间,避免对象的名字冲突;
 由表、索引、视图等数据库对象组成;
 操作不同模式下的对象互不干扰。

在数据库管理中,“database”(数据库)和"schema"(模式)是两个相关但不同的概念。

  1. Database(数据库)

    • 一个数据库是一个组织数据的容器,通常包含一组相关联的表、视图、存储过程、函数等对象。
    • 数据库是一个独立的实体,可以被备份、恢复、导入和导出,它在物理上存在于计算机的磁盘上。
    • 一个数据库可以包含多个模式(schemas),每个模式可以包含一组相关的对象。
  2. Schema(模式)

    • 模式是数据库中的一个逻辑容器,用于组织和管理数据库对象,如表、视图、索引、存储过程等。
    • 它定义了对象的结构和约束条件,以及对象之间的关系。
    • 模式可以用来对数据库对象进行权限控制,使得不同用户或用户组对不同的模式有不同的访问权限。

在一些数据库管理系统中,“schema” 这个术语也被用来指代用户拥有的命名空间,用户可以在其中创建和管理数据库对象。每个用户可以有自己的模式,以便于隔离和管理各自的数据。但在其他系统中,“schema” 可能用来指代数据库中对象的逻辑分组,而不是用户的命名空间。

总的来说,数据库是一个包含数据的容器,而模式是用来组织和管理数据库对象的逻辑结构。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一凡888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值