百度数据库工作面试题

虽然 很失望,因为招聘的时候写的是数据清洗类的工作,需要用python脚本处理数据存入数据库,但是到了后他们要改需求,我看了下面试题,基本上就是数据建设管理的工作了吧,达不到那个水平,就只有算了,但是还是把面试题做一遍写出来吧,万一有人需要呢,不多说,开始吧,题是原题,答案是我自己回来找的,仅供参考

一、理论知识题

1.SQL语言包括哪些类型

答:①.数据操纵语言(DML):主要用来处理数据库中的数据内容。允许用户对数据库中的数据进行查询 ,插入,更新和删除等操作
常用的DML语句及其功能:
DML语句 功能说明
SELECT 从表或视图中检索数据行
INSERT 插入数据到表或视图
UPDATE 更新数据
DELETE 删除数据
CALL 调用过程
MERGE 合并(插入或修改)
COMMIT 将当前事务所做的更改永久化(写入数据库)
ROLLBACK 取消上次提交以来的所有操作

②.数据定义语言(DDL):是一组SQL命令,用于创建和定义数据库对象,并且将对这些对象的定义保存到数据字典中。通过DDL语句可以创建数据库对象,修改数据库对象和删除数据库对象等。
常用的DDL语句及其功能:
CREATE 创建数据库结构
ALTER 修改数据库结构
DROP 删除数据库结构
RENAME 更改数据库对象的名称
TRUNCATE 删除表的全部内容
注:每一条DDL语句执行后,Oracle都将提交当前事务。

③.数据控制语言(DCL):数据控制语言用于修改数据库结构的操作权限。DCL语句主要有2种:
DCL常用语句及其功能:
DCL语句 功能说明
CRANT 授予其他用户对数据库结构的访问权限

2.索引的作用,和它的优缺点
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索,索引可以是唯一的,创建索引允许指定单个列或者是多个列,可以加速表和表之间的连接,加快 数据的检索速度。

缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

3.描述InnoDB引擎的四大特性
插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)

4.如何将外部的文档或者excel表导入或者录入到MYSQL数据库中

如果是数据库客户端,直接点击导入就可以了,指引得很清楚,如果是代码的话这个就需要自己研究下对应语言的操作了

5.常用数据库建模工具
ERDesigner NG、ModelRight3、OpenSystemArchitect、Mysql WorkBench、PowerDesigner (最佳)

6.为什么要进行数据库建模
在设计数据库时,对现实世界进行分析、抽象、并从中找出内在联系,进而确定数据库的结构,这一过程就称为数据库建模。它主要包括两部分内容:确定最基本的数据结构;对约束建模。

数据库设计 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)

二、操作技能题

1.列举集中数据库表table的连接方式
连接分为两类:1、内连接 2、外连接(左外连接、右外连接、全外连接(只要有数据,不匹配的表字段补null))3、笛卡尔集(交叉连接)

–内连接:(对于不匹配的都会进行舍弃)
select * from a inner join b on a.id=b.id;
select * from a,b where a.id = b.id;

–外连接:(对于不匹配的字段补null)
–左外连接:(以左表为基表(驱动表),将左表的每一条数据都与右表匹配,如果在右表中没有匹配数据,则右表补null)
select * from a left join b on a.id=b.id;
select * from a,b where a.id=b.id(+);
–右外连接:(以右表为基表(驱动表),将右表的每一条数据都与左表匹配,如果在左表中没有匹配数据,则左表补null)
select * from a right join b on a.id = b.id;
select * from a,b where a.id(+) = b.id;
–全外连接:左表和右表没有符合条件的都补null值
select * from a full join b on a.id = b.id;
select * from a,b where a.id(+)=b.id union select * from a,b where a.id = b.id(+);
–交叉连接:(全连接,笛卡尔集,全排列)
select * from a cross join b;
select * from a,b;

2.不借助第三方工具,怎么查看sql的执行计划
Set autotrace on EXPLAIN PLAN FOR (这个需要测试学习)

3.如何为mysql设置密码或修改root密码
mysqld -nt --skip-grant-tables命令,这句命令的意思是跳过权限设置启动

mysql -u root

use mysql;

UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
#update user set authentication_string =password('你的密码'),plugin='msyql_native_password' where user='root'    如果前一个行不通的话

FLUSH PRIVILEGES

4,如何授权用户访问数据库

# 允许外网 IP 访问
# insert into mysql.user(Host,User,Password) values('%','zhouz',password('1234'));
# 刷新授权
# flush privileges;

# 创建数据库
# create database cmdb_v2 
# 授予用户通过外网IP对于该数据库的全部权限
# grant all privileges on `zhouzdb`.* to 'zhouz'@'%' identified by '1234';
# 授予用户在本地服务器对该数据库的全部权限
# grant all privileges on `cmdb_v2`.* to 'zhouz'@'%' identified by '1234';
# 刷新权限
# flush privileges;

5.请写出mysql数据的分页查询,并简述分页和limit的区别
客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:

比如:

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

6.查询名字jack,电话以135开头的人,如何查找和删除名字为wang(保留id最小的吧)的重复数据

select * from user where name='jack' and phone_number like '135%';
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)#语法

delete from user where name=‘wang’ 
        and id not in (
        SELECT id from 
        (select min(id) from user where name='wang'  group by id having count(name)>1) )

7.如何查询当前数据库最大连接数
1、查看最大连接数
show variables like ‘%max_connections%’;
2、修改最大连接数
set GLOBAL max_connections = 200;

三、思维理解题

1.当linux系统上mysql突然变慢,从哪些方面找原因

a. Cpu 的占用率

CPU占用率与数据库性能不成反比. CPU占用率高, 不能说明数据库性能慢. 通常情况, 一个优化很好, 而且业务量确实很大的数据库, CPU的占用率都会高, 而且会平均分布在每个进程上. 反过来, CPU的占用率都会高也不代表数据库性能就好, 要结合数据库的等待事件来判断CPU占用率高是否合理.

如果某个进程的cpu占用高, 肯定是这个进程有问题. 如果,不是oracle的进程, 可以让application察看是否程序有死循环等漏洞. 如果,是oracle的进程, 可以根据pid查找oracle数据字典看看这个进程的发起程序, 正在执行的sql语句, 以及等待事件. 然后, 不同情况使用不同的方法来解决.

b. IO

排除硬件的IO问题, 数据库突然变慢, 一般来说, 都是一个或几个SQL语句引起的.

如果IO很频繁, 可以通过优化disk reads高的TOP SQL来解决. 当然这也是解决IO问题的最笨也是最有效的办法.

OS以及存储的配置也是影响IO的一个重要的原因.

比如, 最常见的HP-unix下异步IO的问题, 如果DBA GROUP没有MLOCK的权限, ORACLE是不使用AIO的. 偏偏OS与DB的两方的admin如果配合不够好地话, 这个配置就很容易给漏掉了.

c. Memory

第二种情况与memory的关系比较小, 只要SGA区配置合理没有变化, 一般来说, 只要不是Application Memory leak, 不会引起突然变慢的现象.
  随便写的几个,这个很多内容的

2.如何维护数据库的完整性和唯一性
https://baike.1688.com/doc/view-d5181441.html

3.如何加强MYSQL数据库的安全
1、避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权
2、定期备份数据库
3、禁用或限制远程访问
4、设置root用户的口令并改变其登录名
5、移除测试(test)数据库
6、禁用LOCAL INFILE
7、移除匿名账户和废弃的账户
8、降低系统特权
9、降低用户的数据库特权
10、移除和禁用.mysql_history文件
11、安全补丁
12、启用日志
13、改变root目录
14、禁用LOCAL INFILE命令

4.mysql数据库备份的问题
https://www.cnblogs.com/SQL888/p/5751631.html

5.利用shell连接数据库的增删改查
这里写个我用的python连接就是了:

import pymysql
conn = pymysql.Connect(
    host='localhost',
    port=3306,
    user='root',
    passwd='123456',
    db='liyang',
    charset='utf8'
)
cursor = conn.cursor()
sql = "SELECT LOCATION,ID FROM JOB WHERE LOCATION LIKE '%s'" % search
cursor.execute(sql)		#就是这么操作,跟数据库本身语句一样了
rr = cursor.fetchall()
print(rr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值