牛客题霸sql入门篇之多表查询

本文介绍了SQL多表查询的基础,包括子查询的应用(浙江大学用户答题情况)、链接查询(按学校和难度统计答题数)、组合查询(山东大学用户信息及性别筛选)。重点讲解了GROUP BY、JOIN、UNION等操作及其知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牛客题霸sql入门篇之多表查询

1 子查询

1.1 浙江大学用户题目回答情况

1.1.1 题目内容
a 内容1

在这里插入图片描述

b 内容2

在这里插入图片描述

1.1.2 示例代码
SELECT device_id,question_id,result
FROM question_practice_detail
WHERE device_id=(SELECT device_id FROM user_profile WHERE university='浙江大学' );
1.1.3 运行结果

在这里插入图片描述

1.1.4 考察知识点
如果一个表需要通过另外一个表筛选出来的结果
就可以考虑子查询了

2 链接查询

2.1 统计每个学校的答过题的用户的平均答题数

2.1.1 题目内容
a 内容1

在这里插入图片描述

b 内容2

在这里插入图片描述

c 内容3

在这里插入图片描述

2.1.2 示例代码
SELECT u.university university,count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN question_practice_detail q
ON u.device_id=q.device_id
GROUP BY u.university
ORDER BY u.university
2.1.3 运行结果

在这里插入图片描述

2.1.4 考察知识点
看到每个、各这种类似的词语,代表需要使用group by分组关键字
分组中的平均数量可以有优先考虑count(字段)/count(distinct 字段),再去考虑avg函数
另外这个字段如果多张表都存在且是多表联查,一定要指明一个表,像表别名.字段才是正解

2.2 统计每个学校各难度的用户平均刷题数

2.2.1 题目内容
a 内容1

在这里插入图片描述

b 内容2

在这里插入图片描述

c 内容3

在这里插入图片描述

d 内容4

在这里插入图片描述

2.2.2 示例代码
SELECT u.university university,q2.difficult_level difficult_level,count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN  question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level
2.2.3 运行结果

在这里插入图片描述

2.2.4 考察知识点
多表联查后得到的新表和普通表具有一样的功能,都能使用分组 分组筛选、过滤、排序功能
但是需要注意是的是使用时最好才有表别名.字段名这种写法,这样可以提高代码的可读性

2.3 统计每个用户的平均刷题数

2.3.1 题目内容
a 内容1

在这里插入图片描述

b 内容2

在这里插入图片描述

c 内容3

在这里插入图片描述

d 内容4

在这里插入图片描述

2.3.2 示例代码
SELECT u.university university,q2.difficult_level difficult_level,
count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level
HAVING u.university='山东大学'
2.3.3 运行结果

在这里插入图片描述

2.3.4 考察知识点
① 如果有分组和特定条件,先筛选后分组和先分组后筛选都可以,哪种熟悉就用哪种
若筛选完之后发现有个键是取不到的,如山东大学,那就直接对唯一的值
进行一次排序就行,聚合键是一定可以拿到的
② 如果()里面的值不写别名,默认的字段名就是查询时原表的字段名
③想用括号里面的表 需要再后面写上表别名,通过别名.字段名去调用
以下是本题的另外一种写法
SELECT u.university university,q2.difficult_level difficult_level,
count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM (SELECT * FROM user_profile WHERE university='山东大学') u
INNER JOIN question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level

3 组合查询

3.1 查找山东大学或者性别为男生的信息

3.1.1 题目内容

在这里插入图片描述

3.1.2 示例代码
SELECT device_id,gender,age,gpa
FROM user_profile
WHERE university='山东大学' 
UNION all
SELECT device_id,gender,age,gpa
FROM user_profile
WHERE gender='male'
3.1.3 运行结果

在这里插入图片描述

3.1.4 考察知识点
union all 表示两种查询结果的并集且不去除重复行
如果是单union 就代表是去除重复行
union要求两者的字段个数、字段类型完全一致才可以进行拼接
### 使用CNN卷积神经网络进行MNIST手写数字识别 对于MNIST手写数字识别任务,采用卷积神经网络(CNN)能够更有效地捕捉图像中的局部特征[^1]。相比于全连接层(Dense Layer),CNN利用其特有的结构特性,在处理二维图像数据方面表现更为出色。 #### 数据准备与预处理 在着手建立模型之前,需先加载并预处理MNIST数据集。这一步骤涉及将图片像素值归一化至0到1之间以及对标签进行独热编码(one-hot encoding)[^3]。具体操作如下: ```python from keras.datasets import mnist import numpy as np (x_train, y_train), (x_test, y_test) = mnist.load_data() # 归一化 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 调整形状以适应CNN输入要求 x_train = np.expand_dims(x_train, axis=-1) x_test = np.expand_dims(x_test, axis=-1) # 将类别向量转换为二进制矩阵表示形式(One-Hot Encoding) y_train = keras.utils.to_categorical(y_train, num_classes=10) y_test = keras.utils.to_categorical(y_test, num_classes=10) ``` #### 构建CNN模型架构 接下来定义一个基础版本的CNN模型,该模型至少应包含两个主要组件——卷积层(Convolutional Layers)池化层(Pooling Layers),之后接上若干个全连接层(Fully Connected Layers)完成最后的分类工作[^4]。下面给出了一种可能的设计方案: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout model = Sequential([ # 第一层卷积+最大池化 Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)), MaxPooling2D(pool_size=(2, 2)), # 第二层卷积+最大池化 Conv2D(filters=64, kernel_size=(3, 3), activation='relu'), MaxPooling2D(pool_size=(2, 2)), # 展平层(Flatten Layer) Flatten(), # 添加Dropout防止过拟合 Dropout(rate=0.5), # 输出层(Output Layer) Dense(units=10, activation='softmax') ]) ``` 此设计中包含了两轮卷积加池化的组合,每一轮都旨在逐步缩小空间尺寸的同时增强特征表达能力;随后通过展平层将多维张量转化为一维向量供后续全连接层使用;为了提升泛化性能还加入了随机失活(Dropout)机制来对抗潜在的过拟合现象[^5]。 #### 编译与训练模型 编译阶段指定了损失函数(Loss Function)、优化器(Optimizer)及评价指标(Metrics),而训练过程则是让机器不断调整内部参数直至达到预期效果的过程。这里选用交叉熵作为衡量标准,并配合Adam优化算法加快收敛速度。 ```python model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) history = model.fit(x=x_train, y=y_train, epochs=10, batch_size=128, validation_split=0.2) ``` 上述代码片段设置了验证集比例(validation_split)以便实时监控模型的表现变化趋势,从而更好地把握最佳停止时机。 #### 测试与评估 当训练完成后,可以调用`evaluate()`方法获取测试集上的准确率得分,以此检验整个系统的实际效能。 ```python test_loss, test_acc = model.evaluate(x=x_test, y=y_test) print(f'Test accuracy: {test_acc}') ``` 综上所述,借助Keras框架所提供的便捷接口,只需少量代码即可快速搭建起一套完整的CNN解决方案应用于MNIST手写字体辨识场景之中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值