面试
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
-
简述 TCP三次握手、四次回收的流程。(3分)
-
TCP和UDP的区别?(3分)
tcp 上传下载 可靠 面向连接 速度慢 能传递的数据长度不限
udp协议 即使通讯工具 不可靠 面向数据报 速度快 能传递 的数据长度有限
-
什么是黏包?(2分)
数据与数据之间没有明显的边界
-
什么 B/S 和 C/S 架构?(2分)
B/S:百度,淘宝,码云
C/S:微信,浏览器 英雄联盟
-
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
from socket import socket,SOCK_DGRAM
sk = socket(type=SOCK_DGRAM) server_addr = ('127.0.0.1',9001)
while True: msg = input('>>>') if msg.upper() == 'Q': break sk.sendto(msg.encode('utf-8'),server_addr) msg = sk.recv(1024) print(msg.decode('utf-8'))
-
简述进程、线程、协程的区别?(3分)
进程是计算机资源分配的最小单位
线程是计算机中可以被cpu调度的最小单位
一个进程中可以有多个线程,同一进程中的线程可以共享进程中的资源,一个进程中至少有一个线程(一个应用程序中至少有一个进程)
-
什么是GIL锁?(2分)
全局解释器锁,同一时刻保证一个进程中只有一个线程可以被cpu调度
-
进程之间如何进行通信?(2分)
利用IPC进行
-
Python如何使用线程池、进程池?(2分)
-
请通过yield关键字实现一个协程? (2分)
-
什么是异步非阻塞? (2分)
用户进程触发io操作以后开始做自己的事情读取或者写入方法立即返回
-
什么是死锁?如何避免?(2分)
就是上两个个锁就是死锁
-
程序从flag a执行到falg b的时间大致是多少秒?(2分)import threading import time def _wait(): time.sleep(60)
flag a
t = threading.Thread(target=_wait) t.setDeamon(False) t.start()
flag b
60s
15.程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading import time def _wait(): time.sleep(60)
flag a
t = threading.Thread(target=_wait) t.setDeamon(True) t.start()
flag b
16.程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading import time def _wait(): time.sleep(60)flag a
t = threading.Thread(target=_wait) t.start() t.join()
flag b
0~1s
17.读程序,请确认执行到最后number是否一定为0(2分)
import threading loop = int(1E7) def add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ta.join() ts.start() ts.join()
18.读程序,请确认执行到最后number是否一定为0(2分)
import threading loop = int(1E7) def add(loop:int = 1): global number for _ in range(loop): number += 1 def _sub(loop:int = 1): global number for _ in range(loop): number -= 1 number = 0 ta = threading.Thread(target=add,args=(loop,)) ts = threading.Thread(target=_sub,args=(loop,)) ta.start() ts.start() ta.join() ts.join()
-
MySQL常见数据库引擎及区别?(3分)
InnoDB
支持事务支持外键
支持表锁、行锁(for update)
表锁:select * from tb for update
行锁:select id,name from tb where id=2 for update
myisam
查询速度快
全文索引
支持表锁
表锁:select * from tb for update -
简述事务及其特性? (3分)
事物用于将某些操作的多个sql作为原子性操作,一旦有某一个出现错误,即可回滚到原来状态,从而保证数据库完整性
-
事务的隔离级别?(2分)
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。
-
char和varchar的区别?(2分)
char可变,varchar不可变
-
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
char可变,varchar不可变
-
MySQL中delete和truncate的区别?(2分)
delete操作完之后如果没有提交事务可以回滚,truncate不可以回滚
-
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c) -
组合索引遵循什么原则才能命中索引?(2分)
-
列举MySQL常见的函数? (3分)
concat
max
min
avg
sum
-
MySQL数据库 导入、导出命令有哪些? (2分)
数据库导入:
-
什么是SQL注入?(2分)
-
简述left join和inner join的区别?(2分)
-
SQL语句中having的作用?(2分)
过滤
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
varchar100个
-
MySQL的索引方式有几种?(3分)
-
什么时候索引会失效?(有索引但无法命中索引)(3分)
存在空值
-
数据库优化方案?(3分)
1,,使用索引
2,sql语句优化
-
什么是MySQL慢日志?(2分)
mysql的慢查询日志是msyql提供的一种日志记录,它用来记录在msyql中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的sql,则会被记录到慢查询日志中。
-
设计表,关系如下: 教师, 班级, 学生, 科室。(4分) 科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。
1. 写出各张表的逻辑字段
2. 根据上述关系表
a.查询教师id=1的学生数
b.查询科室id=3的下级部门数
c.查询所带学生最多的教师的id看看
-
有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)
-
根据表关系写SQL语句(10分)
-
查询所有同学的学号、姓名、选课数、总成绩;
-
selsct sid,sname,from student
-
查询姓“李”的老师的个数;
-
select tname form teacher where tname like ‘’李%‘’
-
查询平均成绩大于60分的同学的学号和平均成绩;
-
select class——id
-
查询有课程成绩小于60分的同学的学号、姓名
-
select
-
删除学习“叶平”老师课的score表记录;
-
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
-
查询每门课程被选修的学生数;
-
查询出只选修了一门课程的全部学生的学号和姓名;
-
查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
-
查询两门以上不及格课程的同学的学号及其平均成绩;
-
-
什么是IO多路复用?
其实就是整个函数对外表现为阻塞式的,也就是我们调用这个函数,如果条件达不到一定
会被阻塞;但是其实内部并不是阻塞的,而是以一种非阻塞的方式工作的,内部能够实现
自动轮询,如果有任何一个IO设备达到条件即可返回到应用层 -
async/await关键字的作用?
一、async/await的优点
1)方便级联调用:即调用依次发生的场景;
2)同步代码编写方式: Promise使用then函数进行链式调用,一直点点点,是一种从左向右的横向写法;async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;
3)多个参数传递: Promise的then函数只能传递一个参数,虽然可以通过包装成对象来传递多个参数,但是会导致传递冗余信息,频繁的解析又重新组合参数,比较麻烦;async/await没有这个限制,可以当做普通的局部变量来处理,用let或者const定义的块级变量想怎么用就怎么用,想定义几个就定义几个,完全没有限制,也没有冗余工作;
4)同步代码和异步代码可以一起编写: 使用Promise的时候最好将同步代码和异步代码放在不同的then节点中,这样结构更加清晰;async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别,当然,异步过程需要包装成一个Promise对象放在await关键字后面;
5)基于协程: Promise是根据函数式编程的范式,对异步过程进行了一层封装,async/await基于协程的机制,是真正的“保存上下文,控制权切换……控制权恢复,取回上下文”这种机制,是对异步过程更精确的一种描述;
6)async/await是对Promise的优化: async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法 -
MySQL的执行计划的作用?
1.查看mysql执行计划
2.执行计划包含的信息 -
简述MySQL触发器、函数、视图、存储过程?
触发器
(1)触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。
(2)触发器必须定义在特定的表上。
(3)自动执行,不能直接调用,
函数
它跟php或js中的函数几乎一样:需要先定义,然后调用(使用)。
只是规定,这个函数,必须要返回数据——要有返回值
视图
视图只是一种逻辑对象,是一种虚拟表,它并不是物理对象,因为视图不占物理存储空间,在视图中被查询的表称为视图的基表,大多数的select语句都可以用在创建视图中(说白了,视图就是一种虚拟表,就像是一张电子照片)
优点:集中用户使用的数据,掩码数据的复杂性,简化权限管理以及为向其他应用程序输出而重新组织数据等
存储过程
存储过程(procedure),概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现。在封装的语句体里面,可以同if/else ,case,while等控制结构,可以进行sql编程,查看现有的存储过程。 -
数据库中有表:t_tade_date
id tade_date
1 2018-1-2
2 2018-1-26
3 2018-2-8
4 2018-5-6
...
输出每个月最后一天的ID

浙公网安备 33010602011771号