sql语句练习(二):Demand
成绩表t_score——学生编号(stu_id),课程编号(lesson_id),学生成绩(score)
学生表t_student——学生编号(stu_id),学生姓名(stu_name),性别(gender),年龄(age),班级编号(class_id)
课程表t_lesson——课程编号(lesson_id),课程名称(lesson_name)
以下为数据库demand
中的三张表,其结构和内容(部分)如下:
1. 查询学生没有参加考试的课程。(显示形式:学生、姓名、班级、课程)
知识点:
NOT EXISTS关键字
、内部联结
思路:理想情况下,所有学生参加了所有考试(笛卡尔积
);现实情况是,部分学生参加了部分考试。使用NOT EXISTS关键字
求差集。
mysql> SELECT stu_id, stu_name, class_id, lesson_name-> FROM (-> SELECT stu_id, stu_name, class_id, lesson_id, lesson_name-> FROM t_stu_profile, t_lesson) a-> WHERE NOT EXISTS (-> SELECT *-> FROM t_score b-> WHERE a.stu_id = b.stu_id AND a.lesson_id = b.lesson_id);
+--------+----------+----------+-------------+
| stu_id | stu_name | class_id | lesson_name |
+--------+----------+----------+-------------+
| 001 | 郭东 | 0611 | 英语 |
| 001 | 郭东 | 0611 | 物理 |
| 001 | 郭东 | 0611 | 化学 |
| 002 | 李西 | 0612 | 数据 |
| 002 | 李西 | 0612 | 英语 |
| 002 | 李西 | 0612 | 化学 |
| 003 | 张北 | 0613 | 语文 |
| 003 | 张北 | 0613 | 数据 |
| 003 | 张北 | 0613 | 物理 |
| 003 | 张北 | 0613 | 化学 |
| 004 | 钱南 | 0611 | 语文 |
| 004 | 钱南 | 0611 | 数据 |
| 004 | 钱南 | 0611 | 英语 |
| 004 | 钱南 | 0611 | 物理 |
| 005 | 王五 | 0614 | 语文 |
| 005 | 王五 | 0614 | 数据 |
| 005 | 王五 | 0614 | 英语 |
| 005 | 王五 | 0614 | 物理 |
| 005 | 王五 | 0614 | 化学 |
| 006 | 赵七 | 0615 | 语文 |
| 006 | 赵七 | 0615 | 数据 |
| 006 | 赵七 | 0615 | 英语 |
| 006 | 赵七 | 0615 | 物理 |
| 006 | 赵七 | 0615 | 化学 |
+--------+----------+----------+-------------+
2. 查找每门课程的前3名。(显示形式:课程、第一名(姓名+分数) 、第二名(姓名+分数))
知识点:窗口函数中的序号函数(
RANK()
)、Concat()拼接函数
、自联结
# ① 按课程对成绩排名
mysql> SELECT stu_name, lesson_name, score, RANK() OVER (PARTITION BY a.lesson_id ORDER BY score DESC) score_order-> FROM t_score a-> INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id-> INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id;
+----------+-------------+-------+-------------+
| stu_name | lesson_name | score | score_order |
+----------+-------------+-------+-------------+
| 张北 | 语文 | 99 | 1 |
| 钱南 | 语文 | 98 | 2 |
| 郭东 | 语文 | 90 | 3 |
| 李西 | 语文 | 84 | 4 |
| 郭东 | 数据 | 86 | 1 |
| 李西 | 数据 | 77 | 2 |
| 张北 | 数据 | 76 | 3 |
| 郭东 | 英语 | 89 | 1 |
| 张北 | 英语 | 85 | 2 |
| 李西 | 英语 | 69 | 3 |
| 张北 | 物理 | 78 | 1 |
| 李西 | 物理 | 75 | 2 |
| 钱南 | 化学 | 98 | 1 |
+----------+-------------+-------+-------------+# ② 自联结
mysql> SELECT t1.lesson_name '课程',-> CONCAT(t1.stu_name, '+', t1.score) AS '第一名',-> CONCAT(t2.stu_name, '+', t2.score) AS '第二名',-> CONCAT(t3.stu_name, '+', t3.score) AS '第三名'-> FROM-> (SELECT stu_name, lesson_name, score, RANK() OVER (PARTITION BY a.lesson_id ORDER BY score DESC) score_order FROM t_score a INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id)t1,-> (SELECT stu_name, lesson_name, score, RANK() OVER (PARTITION BY a.lesson_id ORDER BY score DESC) score_order FROM t_score a INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id)t2,-> (SELECT stu_name, lesson_name, score, RANK() OVER (PARTITION BY a.lesson_id ORDER BY score DESC) score_order FROM t_score a INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id)t3-> WHERE t1.score_order = 1 AND t2.score_order = 2 AND t3.score_order = 3-> AND t1.lesson_name = t2.lesson_name AND t2.lesson_name = t3.lesson_name;
+--------+-----------+-----------+-----------+
| 课程 | 第一名 | 第二名 | 第三名 |
+--------+-----------+-----------+-----------+
| 语文 | 张北+99 | 钱南+98 | 郭东+90 |
| 数据 | 郭东+86 | 李西+77 | 张北+76 |
| 英语 | 郭东+89 | 张北+85 | 李西+69 |
+--------+-----------+-----------+-----------+
3. 检索0611班所有男生的成绩。(显示形式:姓名、语文、数学、英语、物理、化学、总分)
知识点:内部联结、
CASE WHEN 条件 THEN... ELSE... END
、SUM()函数
、GROUP BY子句
# ① 筛选符合条件的学生信息(0611班、男生)
mysql> SELECT stu_name, lesson_name, score-> FROM t_score a-> INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id-> INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id-> WHERE class_id = '0611' AND gender = 'M';
+----------+-------------+-------+
| stu_name | lesson_name | score |
+----------+-------------+-------+
| 钱南 | 语文 | 98 |
| 钱南 | 化学 | 98 |
+----------+-------------+-------+# ② 测试语句(CASE)
mysql> SELECT stu_name,-> (CASE WHEN lesson_name = '语文' THEN score ELSE 0 END) chinese,-> (CASE WHEN lesson_name = '数学' THEN score ELSE 0 END) math,-> (CASE WHEN lesson_name = '英语' THEN score ELSE 0 END) english,-> (CASE WHEN lesson_name = '物理' THEN score ELSE 0 END) physics,-> (CASE WHEN lesson_name = '化学' THEN score ELSE 0 END) chemistry-> FROM (-> SELECT stu_name, lesson_name, score-> FROM t_score a-> INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id-> INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id-> WHERE class_id = '0611' AND gender = 'M')t;
+----------+---------+------+---------+---------+-----------+
| stu_name | chinese | math | english | physics | chemistry |
+----------+---------+------+---------+---------+-----------+
| 钱南 | 98 | 0 | 0 | 0 | 0 |
| 钱南 | 0 | 0 | 0 | 0 | 98 |
+----------+---------+------+---------+---------+-----------+# 最终代码
mysql> SELECT stu_name '姓名',-> SUM(CASE WHEN lesson_name = '语文' THEN score ELSE 0 END) '语文',-> SUM(CASE WHEN lesson_name = '数学' THEN score ELSE 0 END) '数学',-> SUM(CASE WHEN lesson_name = '英语' THEN score ELSE 0 END) '英语',-> SUM(CASE WHEN lesson_name = '物理' THEN score ELSE 0 END) '物理',-> SUM(CASE WHEN lesson_name = '化学' THEN score ELSE 0 END) '化学'-> FROM (-> SELECT stu_name, lesson_name, score-> FROM t_score a-> INNER JOIN t_stu_profile b ON a.stu_id = b.stu_id-> INNER JOIN t_lesson c ON a.lesson_id = c.lesson_id-> WHERE class_id = '0611' AND gender = 'M')t-> GROUP BY stu_name-> ;
+--------+--------+--------+--------+--------+--------+
| 姓名 | 语文 | 数学 | 英语 | 物理 | 化学 |
+--------+--------+--------+--------+--------+--------+
| 钱南 | 98 | 0 | 0 | 0 | 98 |
+--------+--------+--------+--------+--------+--------+
sql语句练习(二):Demand相关推荐
- 【数据库】适用于SQLite的SQL语句(二)
目录 九.视图VIEW 1.创建视图 2.删除视图 十.虚拟表 1.创建虚拟表 2.删除虚拟表 十一.时间和日期的函数 十二.分析和故障排除 十三.SQL语句中的表达式 1.运算符 2.字面值 3.参 ...
- Oracle SQL语句大全(二)
avg(sal) desc; 查找部门中平均薪水打印2000的员工并按部门号进行排序,查询分组后的平均薪水必须大于1500,查询结果按平均薪水从低到高排列 49.select ename from e ...
- sql语句优化(二)
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 建立索引好处 : 之前做的一个项目 , 一个查询10w多条的数据 ,需要20s ,后来加 ...
- 初学者一些常用的SQL语句(二)
一.数据库的创建 create 创建 database 数据库 1.创建数据库student create database student create database teacher 2.在st ...
- springboot整合P6spy 打印sql语句《二》
1.加入P6spy maven依赖 <!-- https://mvnrepository.com/artifact/p6spy/p6spy --> <dependency>&l ...
- SQL语句(二)创建带主键和约束的数据表
内容摘要 创建带主键和约束的表 创建带组合主键和外键的表 1. 创建带主键和约束的表 Student (学生表) CREATE TABLE Student ( sclass varchar(10) N ...
- SQL语句性能调整原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...
- 数据库优化专题---7、SQL语句优化
数据库优化专题-1.表的主键用数字还是UUID 数据库优化专题-2.逻辑删除还是物理删除 数据库优化专题-3.千万记录如何快速分页 数据库优化专题-4.读多写少和读多写多 数据库优化专题-5.删改数据 ...
- mysql数据库求和语句_常用统计求和SQL语句示例
推荐:两种mysql对自增id重新从1排序的方法本文介绍了两种mysql对自增id重新从1排序的方法,简少了对于某个项目初始化数据的工作量,感兴趣的朋友可以参考下 最近老是要为现在这个项目初始化数据, ...
- 第二十三章 MySQL数据库 手册2 SQL语句
第二十三章 MySQL数据库 手册2 SQL语句 实验二:用SQL语句,管理数据库 `危险命令,delete 后不加 where 条件代表删除所有数据 delete.` `更加危险的删除命令trunc ...
最新文章
- 摇滚吧HTML5!Jsonic超声波前端交互!
- 【项目实战课】基于Pytorch的3DCNN视频分类与行为识别实战
- 消防信号总线原理_建筑电气消防设计6大常见问题分析
- 【AWSL】之Linux常用命令,学习Linux,这一篇就够了(type、echo、enable、du、ls、mkdir、touch、ln、cp、rm、mv、find、gzip、bzip、tar)
- CodeForces - 1353E K-periodic Garland(思维+dp)
- vue子父组件间传值
- P4495-[HAOI2018]奇怪的背包【数论,dp】
- perl大骆驼和小骆驼_快速的骆驼和云消息传递
- html ajax 双引号的问题
- 一个简单的fftw3例子:正弦信号的离散傅里叶变换
- linux查看共享内存max,浅析Linux的共享内存与tmpfs文件系统
- Debian — command not found
- 如何使用WordPress搭建网站
- linux软件中心无法安装软件,linux中软件的安装
- c语言图形时钟编程,c语言+图形编程——打造浅易的时钟
- android webview 清空内容,Android WebView清空缓存
- springboot基于微信小程序的高校学生疫情在校封闭管理系统的设计与实现毕业设计源码240904
- 共享计算机突然无法访问,共享的文件突然不能访问了电脑重启后又能访问为什么...
- UltraCompare如何进行模块和线路模式合并?
- 还在熬夜干论文——Python带你一键起飞!【内附演示视频】
热门文章
- win10设置默认输入法_为什么说win10越来越好用了?(技巧篇)
- .net 怎么在控制器action中返回一个试图_一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤...
- object 构造器java_“java”中为什么“Object”类要有一个空的构造函数?
- android 城市列表数据,用RecyclerView写的城市列表
- java线程同步的死锁_Java基础之线程5-线程同步死锁
- java freememory 单位_Runtime类中的freeMemory,totalMemory,maxMemory区别
- 系统运维岗位职责和要求
- Ajax后端极简笔记
- ssm之九 批量导入excel到数据库
- python windows 安装scrapy_Windows下安装Scrapy