数据库整理+SQL笔试2道

数据库整理+SQL笔试2道

Mysql与Oracle区别:

Oracle是大型数据库,而Mysql是中小型数据库;
Mysql是开源的,而Oracle价格非常高;
Oracle占内存大;
单引号的处理:
MYSQL里可以用双引号包起字符串,
ORACLE里只可以用单引号包起字符串。
翻页的SQL语句的处理:
MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;
ORACLE每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80。
日期字段
MYSQL日期字段分DATE和TIME两种,
ORACLE日期字段只有DATE
字符串的模糊比较
MYSQL里用 字段名 like ‘%字符串%’,
ORACLE里也可以用 字段名 like ‘%字符串%’ 但这种方法不能使用索引, 速度不快,用字符串比较函数 instr(字段名,‘字符串’)>0 会得到更精确的查找结果。

数据库对象

表、索引、视图、图表、函数、触发器

谈谈乐观锁和悲观锁

修改数据的时候会发生丢失更新,悲观锁的实现如 for update 之后其他任何人要对数据进行操作,都会被阻塞,直到我事物提交后释放锁。

用数据库实现乐观锁怎么实现

乐观锁的实现通常有两种方式:版本号字段和时间戳字段。
MYSQL 中有几种索引 主键索引,普通索引,全文索引,唯一索引,

MYSQL中什么是左链接、右链接和内链接?

INNER JOIN(内连接): 获取两个表中字段匹配关系的记录。LEFT JOIN(左连接): 获取左表所有记录,即使右表没有对应匹配的记录。RIGHT JOIN(右连接): 获取右表所有记录,即使左表没有对应匹配的记录。

什么是 内连接、外连接、交叉连接、笛卡尔积?

1、内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
完整语法:左表 inner join 右表 on 匹配条件
MySQL语法:左表 join 右表 on 匹配条件
2、外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。
具体分为:左外连接,右外连接,全外连接。
2.1、左外连(left outer join):除显示两表满足匹配关系的记录,还显示左边表不满足匹配关系的记录;
完整语法:左表 left outer join 右表 on 匹配条件
MySQL语法:左表 left join 右表 on 匹配条件
2.2、右外接(right outer join):除显示两表满足匹配关系的记录,还显示右边表不满足匹配关系的记录;
完整语法:左表 right outer join 右表 on 匹配条件
MySQL语法:左表 right join 右表 on 匹配条件
2.3、全外连(full outer join):除显示两表满足匹配关系的记录,还显示左右两边表不满足匹配关系的记录;
完整语法:左表 full outer join 右表 on 匹配条件
MySQL语法:MySQL不支持全外连接语法,可以用一条左外语句union一条右外语句得到同样效果。
3、交叉连接(cross join):显示两张表所有记录的一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。
完整语法:左表 cross join 右表
MySQL语法:左表 join 右表 或 左表,右表

在Oracle 数据库的逻辑结构中有以下组件:A:表空间 B:数据块 C:区 D:段,这些组件从大到小依次是?
ADCB

数据库事务隔离级别有哪几种?.[Oracle、SQL Server、MySQL中选择一个你熟悉的即可
读提交,读未提交,重复读,串行

SQL优化问题(待补)

存储过程和存储函数的区别?(待补)

SQL多表笔试

表g_cardapply
g_applyno varchar 8; //申请单号
g_applydate datetime; //申请日期
g_state varchar 2; //申请状态
表g_cardapplydetail
g_applyno varchar 8; //申请单号
g_name varchar 30; //申请人姓名
g_idcard varchar 18 //申请人身份
g_state varchar 2; //申请状态
两个表的关联字段是申请单号。
1.查询身份证号码为XXXXXXX的申请日期

select g_applydate 
from g_cardapply gc 
left join g_cardapplydetail gcd 
on gc.g_applyno=gcd.g_applyno 
where gcd.g_idcard='440401430103082'

2.查询同一个身份证号有两条以上记录的身份证号以及记录个数

select g_idcard,count(*) 
from g_cardapplydetail 
group by g_idcard 
having count(*)>1

3.将身份证号为xxxx的记录在两个表中申请状态均改为07

update g_cardapplydetail as a,g_cardapply as b 
set a.g_state=07,b.g_state=07 
where a.g_applyno =b.g_applyno and g_idcard=440401430103082;

4.删除g_cardapplydetail表中所有姓李的记录

delete from g_cardapplydetail where g_name like '小小李%'

现有如下表结构
表A:活动分类表,
拥有字段id(自增主键)、name(分类名称):
表B:活动表,
拥有字段id(自增主键)、name(活动名称)、startDate(活动开始日期)、aid(活动分类)、num(参与人数);
在这里插入图片描述
问题:
1.查询所有活动记录,并关联出活动所属的分类的名称;

select * from tablea a join tableb b on a.id=b.aid;

在这里插入图片描述
6. 查询已经开始的活动

select b.aid as id,a.name as type,b.name as name,b.startDate,b.num 
from tablea a 
left join tableb b on a.id=b.aid 
where b.startDate<'2021-09-15'

在这里插入图片描述
7. 来查询出各个分类下有已经开始的活动的数量;

select c.fid,c.fname,count(c.fid) as nums
from(
	select b.id as bid,a.id as fid,a.name as fname,b.name as name,b.startDate,b.num 
	from tablea a
    left join tableb b
	on a.id=b.aid
	where b.startDate<'2021-09-15') as c
group by c.fid;

在这里插入图片描述
8. 请写 SQL来查询出已开始的活动数量大于5的分类记录;

select c.fid,c.fname,count(c.fid) as nums
from(
	select b.id as bid,a.id as fid,a.name as fname,b.name as name,b.startDate,b.num 
	from tablea a
    left join tableb b
	on a.id=b.aid
	where b.startDate<'2021-09-15') as c
group by c.fid
having count(c.fid)>1

在这里插入图片描述
5.请写 SQL来查询出每个分类下的参与人数最多的一条活动记录,即如果有N个分类应该返回N条记录,每一条记录都是各自分类下参与人数最多的那个

select c.fname,max(c.num) as nums 
from (
	select a.name as fname,b.name,b.startDate,b.num 
	from tableA a 
	left join tableB b 
	on a.id=b.aid order by fname )as c 
group by c.fname;

先筛选中间的并排序:
在这里插入图片描述
查出分组的最大值
在这里插入图片描述

SQL得再研究整理一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值