MySQL性能卓越服务稳定,开放源代码,安装使用简单,易于维护。Oracle是大型数据库,安全性好,性能高,适合大型应用。
1.MySQL的存储引擎InnoDB和MyISAM的区别?
InnoDB 引擎提供了对数据库事务的支持,并且提供了行级锁和外键的约束,它能处理大数据容量的数据库系统。但是不支持全文搜索,同时启动也比较慢,它是不会保存表的行数的。所以当进行 select count() from table 指令的时候,需要进行扫描全表获取数据量。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用效率比较高。
MyISAM时引擎是MySQL 的默认引擎,不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,会锁定这个表,所以效率低。MyIASM 引擎保存了表的行数,当进行 select count() from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,使用MyISAM效率高。
2.MySQL和Oracle的区别?
1) MySQL是开源的项目,免费。中小企业首选MySQL,Oracle是Oracle公司推出的一款成熟的数据库产品是闭源同时也是收费的。
2) SQL语法的不同,MySQL较为灵活,Oracle较为严格(具体就是单引号,分页的处理,主键的自动增长)
3)对于事务的支持,MySQL对于事务默认是不支持的,只有存储引擎InnoDB支持。而Oracle对于事务是完全支持。
4)并发性。MySql默认表级锁,Oracle行级锁,所以oracle并发行高很多。
3.char和varchar的区别?
char是一种固定长度的类型,varchar则是一种可变长度的类型。
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足。在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
varchar适合字符串列的最大长度比平均长度大很多 ,并且字符串很少被更新,容易产生存储碎片 。
char适合存储具有固定长度(如身份证,手机号),长度比较短小的字符串,更适合经常更新的字符串。更新时不会出现页分裂情况,不容易产生存储碎片。
4. 如何选择建立索引的列?
(一)适合创建索引的列
1) 频繁搜索的列
2) 经常用作查询的列
3) 经常排序,分组的列
4) 经常用作连接的列(主键/外键)
(二)不适合创建索引
1) 仅包含几个不同值的列
2) 表中只有几行
5.MySQl如何进行大表优化?
1)限定表的扫描范围
2)读写分离,经典的数据库拆分方案,主库负责写,从库负责读。
3)垂直拆分,根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
4)水平分区,保持数据表结构不变,通过某种策略(日期范围,整数范围等)存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。
6.数据库的乐观锁和悲观锁是什么?
确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性,乐观锁和悲观锁是并发控制主要采用的技术手段。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作.在查询数据的时候就把事务锁起来,直到提交事务。实现方式:使用数据库中的锁机制。
执行select xxx for update操作时,数据会被锁定,只有执行commit或rollback才会释放。这种方式并发性很低。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version的方式来进行锁定。实现方式:使用version版本或者时间戳.
(1)在数据查询的时候把整个数据都copy到应用中,在进行提交的时候比对当前数据库中的数据和开始的更新前取得的数据进行比较。如果没有变化,就表示没有冲突则可以提交事务,否则就是并发冲突(其他请求已经修改过数据),则不能提交,需要去用业务逻辑进行解决。
(2)在表中添加一个新的列,这个列采用timestamp型,存储数据最后更新的时间。这种Timestamp的数据精度在Oracle的时间类型中是最高的,精确到微秒。在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则提交,否则就是版本冲突。
7. oralce中 rowid, rownum的定义
1)rowid和rownum都是伪列
2)rowid是物理地址,用于定位oracle中具体数据的物理存储位置
3)rownum则是sql的输出结果排序
8.MySQL数据库, 每页数据显示5行,显示Teacher表中第2页的数据的SQL语句
select * from Teacher limit 5,5
9.使用一条SQL语句,删除表temp中的重复数据
![d2007d24c6c8a155088d77d02139d744.png](https://img-blog.csdnimg.cn/img_convert/d2007d24c6c8a155088d77d02139d744.png)
Oracle语法:
delete from temp where id not in(select max(id) from temp group by name)
MySql语法:
delete from temp where id
not in ( select * from
(select max(id)
from test group by name) a
)
10.学生成绩表如下:
姓名 | 课程 | 分数 |
张三 | 语文 | 74 |
张三 | 数学 | 85 |
张三 | 物理 | 92 |
李四 | 语文 | 79 |
李四 | 数学 | 82 |
李四 | 物理 | 95 |
使用一条SQL语句,得出如下结果
姓名 | 语文 | 数学 | 物理 |
张三 | 74 | 85 | 92 |
李四 | 79 | 82 | 95 |
select name,max(case whencource =’语文’ then score else 0 end) 语文,
max(case when cource =’数学’ then score else 0 end) 数学,
max(case when cource =’英语’ then score else 0 end) 英语
from scores group by name
11.一个叫department的表,里面只有一个字段name,一共有4条纪录,分别是a,b,c,d,对应四个球队,现在四个球队进行比赛,用一条sql语句显示所有可能的比赛组合。
select a.name, b.name
from team a, team b
where a.name < b.name
12.甲、乙、丙三人在玩牌,一共玩了一百盘,各盘的成绩都保存在Score表中。请用SQL语句查出三人各自的最高分在哪一局,输出局号和最高成绩。
字段名 | 属性 | 备注 |
ID | Int(自增) | 局号 |
OptionA | Int | 甲的成绩 |
OptionB | Int | 乙的成绩 |
OptionC | Int | 丙的成绩 |
select ‘A’ as name,
max(OptionA) as maxScore from score
union
select ‘B’, max(OptionB) from score
union
select ‘C’, max(OptionC) from score
13.表A有三个字段 ,结构如下
books | a | b |
2001 | 1 | 1.1 |
2001 | 2 | 1.2 |
2001 | 3 | 1.3 |
2001 | 4 | 1.4 |
2002 | 1 | 1.1 |
2002 | 2 | 1.2 |
2002 | 3 | 1.3 |
2002 | 4 | 1.4 |
使用一条SQL语句,生成的结果如下图:
books | a1 | a2 | a3 | a4 |
2001 | 1.1 | 1.2 | 1.3 | 1.4 |
2002 | 1.1 | 1.2 | 1.3 | 1.4 |
select books,
sum(case when a=1 then b else 0 end) as a1,
sum(case when a=1 then b else 0 end) as a2,
sum(case when a=3 then b else 0 end) as a3,
sum(case when a=4 then b else 0 end) as a4
from A group by books
14.员工表emp如下图
列出所有员工的姓名及其直接上级的姓名
分析:表自连接,为表起别名,关联 , t1 表模拟员工表 t2 表保存直接上级信息
select t1.ename 员工姓名, t2.ename 直接上级 from emp t1,emp t2
where t1.MGR = t2.empno
15.列出受雇日期早于其直接上级的所有员工
select t1.*,t2.hiredate from emp t1,emp t2 where t1.MGR = t2.empno
and t1.hiredate < t2.hiredate
16.将薪水最高的员工的薪水降30%
Oracle语法:
update emp set sal = sal*0.7 where sal = (select max(sal) from emp)
MySQL语法:
update emp set sal = sal*0.7 where sal = (select t.maxsal from
(select max(sal) maxsal from emp) t)
注意:Mysql 规范要求修改或者删除 表中记录,不允许在子查询中查询相同表