网络编程数据库面试题

1. 简述 OSI 7层模型及其作用?(2分)

'''
OSI 7层模型 :
应用层 :为应用软件提供服务
表示层 :用于处理两个通信系统中交换信息的表示方式
会话层 :维护两个计算机之间的传输连接,保证点到点传输不中断
传输层 ;向用户提供端到端的服务
网络层 :实现路由选择和分组转发
数据链路层 :在数据实体之间建立数据链路连接,传输以帧为单位的数据包
物理层 :利用物理介质为数据链路层提供物理连接
'''

2. 简述 TCP三次握手、四次挥手的流程。(3分)

'''
三次握手:
(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数
据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,
Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将
该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正
确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检
查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server
进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始
传输数据了。
四次挥手:
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,
Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到
序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,
Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一
个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成
四次挥手。
'''

3. TCP和UDP的区别?(3分)

'''
TCP:TCP是面向连接的,可靠的;TCP是面向字节流的全双工的可靠信道。
UDP:UDP是无连接的,不可靠的;UDP是面向报文的不可靠信道
'''

4. 什么是黏包?(2分)

'''
黏包:当多条消息发送时接收变成了一条或者出现接收不准确的情况就是黏包。
'''

5. 什么 B/S 和 C/S 架构?(2分)

'''
B/S架构:基于 Browser(浏览器) 和 Server(服务器)
C/S架构:基于 Client(客户端) 和 Server(服务端)
'''

6. 请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

'''

服务端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()

conn, addr = sk.accept()
conn.send(b'hello')
msg = conn.recv(1024).decode('utf-8')
print(msg)
conn.close()
sk.close()

客户端

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))

msg = sk.recv(1024)
print(msg)
sk.send('您好'.encode('utf-8'))
sk.close()
'''

7. 简述进程、线程、协程的区别?(3分)

'''
进程、线程、协程:三个都可以提高并发;
进程是计算机中分配资源最小的单位,线程是计算机中CPU调度的最小单位;协程又称为
“微线程”,是基于代码人为创造的,而进程和线程是计算机中真实存在的,一个进程中可以
有多个线程,一个线程可以创建多个协程。
'''

8. 什么是GIL锁?(2分)

'''
GIL锁:在同一时刻保证一个进程中只有一个线程可以被CPU调度。
'''

9. 进程之间如何进行通信?(2分)

'''
进程之间可通过管道、FIFO(命名管道)、消息队列、信号量、共享内存进行通信。
'''

10. Python如何使用线程池、进程池?(2分)

'''
在Python中: 计算密集型使用多进程,
IO密集型使用多线程/协程 + IO切换
'''

11. 请通过yield关键字实现一个协程? (2分)

'''

'''

12. 什么是异步非阻塞? (2分)

'''
异步非阻塞就是不用进行等待上一进程的执行可异步执行,并且立即返回结果。
'''

13. 什么是死锁?如何避免?(2分)

'''
死锁是因为进程竞争资源或推进顺序不当而引发的一种胶着状态。
死锁的四个必要条件分别是:互斥、占有且等待、不可剥夺以及循环等待。为了预防死锁,
必须破坏死锁的四个必要条件。由于互斥条件不能改变,因此可以采取破坏四个必要条件中
的后三个。
'''

14. 程序从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

程序从flag a执行到falg b的时间大致是 1 秒
'''

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

程序从flag a执行到falg b的时间大致是 1 秒
'''

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

程序从flag a执行到falg b的时间大致是 60 秒
'''

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()

确认执行到最后number一定为0
'''

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()

确认执行到最后number不一定为0
'''

19. MySQL常见数据库引擎及区别?(3分)

'''
mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、
MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。
其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
'''

20. 简述事务及其特性? (3分)

'''
事务:指作为单个逻辑工作单元执行的一系列操作,要么完整的执行,要么完全的不执行,
执行回滚。
'''

21. 事务的隔离级别?(2分)

'''
事务的隔离级别: 读未提交、 不可重复读、 可重复读、 串行化
'''

22. char和varchar的区别?(2分)

'''
char:定长(255),节省时间,浪费空间
varchar:变长(65535), 节省空间,浪费时间
'''

23. mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)

'''
char:定长(255),节省时间,浪费空间
varchar:变长(65535), 节省空间,浪费时间
varchar(50)中的50代表的含义 : 表示可以存储的最大字符串长度为50个字节,并且字符是
变长的,如果不满50个就是根据实际存储的字节来确定的。
'''

24. MySQL中delete和truncate的区别?(2分)

'''
(1)、灵活性:delete可以条件删除数据,而truncate只能删除表的所有数据;
(2)、效率:delete效率低于truncate,delete是一行一行地删除,truncate会重建表结构,
(3)、事务:truncate是DDL语句,需要drop权限,因此会隐式提交,不能够rollback;
delete是DML语句,可以使用rollback回滚。
(4)、触发器:truncate 不能触发任何Delete触发器;而delete可以触发delete触发器
'''

25. where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)

'''
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c)


(a,b,c)
'''

26. 组合索引遵循什么原则才能命中索引?(2分)

'''

'''

27. 列举MySQL常见的函数? (3分)

'''
count、 max、 min、 avg、 sum、
'''

28. MySQL数据库 导入、导出命令有哪些? (2分)

'''
MySQL数据库导入命令:
MySQL数据库导出命令:
'''

29. 什么是SQL注入?(2分)

30. 简述left join和inner join的区别?(2分)

31. SQL语句中having的作用?(2分)

32. MySQL数据库中varchar和text最多能存储多少个字符?(2分)

33. MySQL的索引方式有几种?(3分)

34. 什么时候索引会失效?(有索引但无法命中索引)(3分)

35. 数据库优化方案?(3分)

36. 什么是MySQL慢日志?(2分)

37. 设计表,关系如下: 教师, 班级, 学生, 科室。(4分)

科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。

# 1. 写出各张表的逻辑字段 # 2. 根据上述关系表 # a.查询教师id=1的学生数 # b.查询科室id=3的下级部门数 # c.查询所带学生最多的教师的id #

38. 有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)

39. 根据表关系写SQL语句(10分)

网络编程数据库面试题

- 查询所有同学的学号、姓名、选课数、总成绩;

- 查询姓“李”的老师的个数;

- 查询平均成绩大于60分的同学的学号和平均成绩;

- 查询有课程成绩小于60分的同学的学号、姓名

- 删除学习“叶平”老师课的score表记录;

- 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

- 查询每门课程被选修的学生数;

- 查询出只选修了一门课程的全部学生的学号和姓名;

- 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

- 查询两门以上不及格课程的同学的学号及其平均成绩;

### 第二部分 补充题

1. 什么是IO多路复用?

2. async/await关键字的作用?

3. MySQL的执行计划的作用?

4. 简述MySQL触发器、函数、视图、存储过程?

5. 数据库中有表:t_tade_date

# id tade_date # 1 2018-1-2 # 2 2018-1-26 # 3 2018-2-8 # 4 2018-5-6 # ... # 输出每个月最后一天的ID #

上一篇:python面试题网络编程和数据库


下一篇:【多任务线程高级day03】线程+使用threading模块+单线程执行+多线程执行+主线程会等待所有的子线程结束后才结束+查看线程数量+python的thread模块是比较底层的模块,python的