串讲-网编和MySQL
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
物理层功能:利用传输介质为数据链路层提供物理连接,负责处理数据传输率并监控数据出错率,实现数据流的透明传输;
数据链路层:在物理层提供的服务基础上,数据链路层在数据实体之间建立数据链路连接,传输以帧为单位的数据包,在采用差错控制和流量控制方法,是有差错的物理链路便成无差错的数据链路;
网络层:为分组通过网络选择合适的路径,实现路由选择和分组转发拥塞控制等;
传输层:向用户提供的端到端服务,处理数据报错误,数据包次序,向高层屏蔽了下层数据通讯细节; .
会话层:维护两个计算机之间的传输链接,保证点到点传输不中断,以及管理数据交换等;
表示层:用于处理两个通信系统中交换信息的表示方式,主要有数据格式交换,数据加密数据解秘,数据压缩等;
应用层:为应用软件提供服务。 -
简述 TCP三次握手、四次回收的流程。(3分)
三次握手:
主机向服务器发送syn请求,服务器收到后返回一个syn,ack,主机收到后再返回一个ack
四次挥手:
主机给服务器发送一个fin,ack请求断开连接,服务器收到后返回一个ack是否允许断开
服务器再给主机发送一个fin,ack请求断开,主机返回一个ack是否允许断开 -
TCP和UDP的区别?(3分)
-
tcp:数据安全 面向连接 速度慢 数据长度不限
-
udp:数据不安全 速度快 面向数据报文 数据长度有限制
-
-
什么是黏包?(2分)
-
两条消息发送间隔多段,或者长度短,就会把两条消息再发送之前就拼接在一起
-
发送到缓存端 没有及时接收,或接收长度不足依次
-
-
什么 B/S 和 C/S 架构?(2分)
-
c/s 客户端 服务端
-
b/s 浏览器 服务端
-
b/s属于c/s
-
-
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
服务端:
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
conn,addr = sk.accept()
conn.send('你好'.encode('utf-8'))
arg=conn.recv(1024).decode('utf-8')
print(arg)
conn.close()
sk.close()
客户端:
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
msg = sk.recv(1024).decode('utf-8')
print(msg)
sk.send('你也好'.encode('utf-8'))
sk.close() -
简述进程、线程、协程的区别?(3分)
都可以提高并发能力
进程,线程是计算机中真实存在的 协程是程序员创造出来的
协程又可以成为微线程,实际上是让一个线程轮番取执行一些任务
进程是计算机资源分配的最小单位
线程是计算机中可以被cup调用的最小单位
一个线程可以有多个协程
一个进程中可以有多个线程,一个进程中的线程可以共享进程中的资源,一个进程中至少有一个线程(一个应用程序里至少一个进程)
默认进程之间无法资源共享,如果想要通讯可以基于文件,网络,queue
Python中因为有GIL锁 同一时刻保证一个进程中只有一个线程可以被CPU调度
计算密集型(利用多核)多进程
io密集型(不利用多核) 多线程,协程+io切换
注意:单纯的协程没办法提高并发,只是代码之间的来回切换,加上io自动切换才有意义
-
什么是GIL锁?(2分)
全局解释器锁
同一时刻保证一个进程中智能有一个线程被cpu调度
Python中创建多线程无法运用计算机多核的优势
由于垃圾回收机制 不能在多线程环境下正常进行引用计数 -
进程之间如何进行通信?(2分)
基于文件,网络,queue
-
Python如何使用线程池、进程池?(2分)
from concurrent.futures import ThreadPoolExecutor
def task(n1, n2):
# time.sleep(2)
print('任务')
# 创建线程池
pool = ThreadPoolExecutor(10)
for i in range(10):
pool.submit(task, i, 1)
print('END')
# 等线程池中的任务执行完毕之后,再继续往下走
pool.shutdown(True)
print('其他操作,依赖线程池执行的结果') -
请通过yield关键字实现一个协程? (2分)
def consumer():
r = ''
while True:
n = yield r #执行的中断点
if not n:
return
print('[消费者] 正在消费:{0}'.format(n))
r = '200 人民币'
def produce(c):
c.send(None) #启动消费者(生成器)——实际上是函数调用,只不过生成器不是直接象函数那般调用的
n = 0
while n < 5:
n = n + 1
print('[生产者] 正在生产:{0}'.format(n))
r = c.send(n) #给消费者传入值——实际上也是函数调用
print('[生产者] 消费者返回:{0}'.format(r))
print('-------------------------------------------------')
c.close()
c = consumer()#构造一个生成器
produce(c) -
什么是异步非阻塞? (2分)
-
排队办业务,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
-
-
什么是死锁?如何避免?(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
0秒 -
程序从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
60秒 -
程序从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
60秒 -
读程序,请确认执行到最后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()
一定为0 -
读程序,请确认执行到最后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()
不一定为0 -
MySQL常见数据库引擎及区别?(3分)
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
注:MEMORY存储引擎正式地被确定为HEAP引擎。
InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。
NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。
ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。
CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。
BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。
FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。 -
简述事务及其特性? (3分)
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
(1)原子性(Atomicity)-事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。
(2)一致性(Consistency)-在一个事务执行之前和执行之后数据库都必须处于一致性状态。
(3)分离性(Isolation)-并发执行的事务不应该交叉影响。即一个事务内部的操作及正在操作的数据不被其它企图进行修改的事务看到。
(4)持久性(Durability)-一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,经得住任何系统故障。 -
事务的隔离级别?(2分)
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 否 是 是
可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否 -
char和varchar的区别?(2分)
-
char 最长智能放255个字符,不管存多少都占255,浪费空间 ,节省时间
-
varchar 最长能放65535个字符 节省空间,浪费时间
-
-
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
-
char 最长智能放255个字符,不管存多少都占255,浪费空间 ,节省时间
-
varchar 最长能放65535个字符 节省空间,浪费时间
-
varchar(50) 50就是最大字符长度
-
-
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分)
-
count
-
max
-
min
-
avg
-
sum
-
group by
-
order by
-
limit
-
-
MySQL数据库 导入、导出命令有哪些? (2分)
-
导出:mysqldump -u username -password dbname > dbname.sql
-
导入:
-
-
什么是SQL注入?(2分)
-
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句
-
-
简述left join和inner join的区别?(2分)
-
left join返回包括左表中的所有记录和右表中联结字段相等的记录
-
inner join只返回两个表中联结字段相等的行
-
-
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
-
MySQL的索引方式有几种?(3分)
-
什么时候索引会失效?(有索引但无法命中索引)(3分)
-
数据库优化方案?(3分)
-
什么是MySQL慢日志?(2分)
-
设计表,关系如下: 教师, 班级, 学生, 科室。(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分)
-
查询所有同学的学号、姓名、选课数、总成绩;
-
查询姓“李”的老师的个数;
-
查询平均成绩大于60分的同学的学号和平均成绩;
-
查询有课程成绩小于60分的同学的学号、姓名
-
删除学习“叶平”老师课的score表记录;
-
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
-
查询每门课程被选修的学生数;
-
查询出只选修了一门课程的全部学生的学号和姓名;
-
查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
-
查询两门以上不及格课程的同学的学号及其平均成绩;
-
第二部分 补充题
-
什么是IO多路复用?
-
async/await关键字的作用?
-
MySQL的执行计划的作用?
-
简述MySQL触发器、函数、视图、存储过程?
-
数据库中有表:t_tade_date
id tade_date
1 2018-1-2
2 2018-1-26
3 2018-2-8
4 2018-5-6
...
输出每个月最后一天的ID -