前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL实例整理

SQL实例整理

作者头像
全栈程序员站长
发布于 2021-04-07 03:23:49
发布于 2021-04-07 03:23:49
34800
代码可运行
举报
运行总次数:0
代码可运行

本文适合将w3school的SQL教程(http://www.w3school.com.cn/sql/sql_create_table.asp)都基本看过一遍的猿友阅读。

说说博主的情况吧。毕业找工作之前确实有大概看过w3school的SQL教程,然后参加校园招聘,每次遇到一些SQL笔试题,立马懵逼了(大写的)。其实我那时候大概知道怎么写的,只是总是写不正确,或者是对一些特定的而且没有见过的场景的SQL语句,根本写不出来。相信不少猿友工作之后,其实挺多都用得不熟吧(如果白板编写的话)。

因为大部分Java猿友工作做的事情,其实比较少情况自己去动手写特定场景的SQL(可能有也是百度,接触过一个会一个),简单SQL也是直接由框架(hibernate和Mybatis)提供接口。当然,那种专门做后台,经常跟数据打交道的Java猿友除外,因此只能说大部分。

如果还是继续保持这样的状态的话,下次自己找工作遇到SQL笔试题,估计也会继续懵逼(大写的)。

下面小宝鸽整理了一些实例(实例主要来自网上),以提升自己写SQL的某些关键字的理解。

1、用一条SQL 语句 查询出每门课都大于80 分的学生姓名。(表结构如下图)

答案可以有如下两种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select distinct student_name from table_test_one where student_name not in (select distinct student_name from table_test_one where score<=80);

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select student_name from table_test_one group by student_name having min(score)>80;

第二种方法是group by 、min函数 结合 having的使用,w3school教程里面也提到过(在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用)

似乎看懂了,但是还是没有自己运行一遍深刻!!!自己能动手敲一遍就更好了! 下面我们自己造数据,后面的例子也会用到。

建表然后倒入初始数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP TABLE IF EXISTS `table_test_one`;
CREATE TABLE `table_test_one` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_no` varchar(10) NOT NULL, `student_name` varchar(10) NOT NULL, `subject_no` varchar(10) NOT NULL, `subject_name` varchar(10) NOT NULL, `score` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO `table_test_one` VALUES ('1', '201601', '张三', '0001', '数学', '98');
INSERT INTO `table_test_one` VALUES ('2', '201601', '张三', '0002', '语文', '66');
INSERT INTO `table_test_one` VALUES ('3', '201602', '李四', '0001', '数学', '60');
INSERT INTO `table_test_one` VALUES ('4', '201602', '李四', '0003', '英语', '78');
INSERT INTO `table_test_one` VALUES ('5', '201603', '王五', '0001', '数学', '99');
INSERT INTO `table_test_one` VALUES ('6', '201603', '王五', '0002', '语文', '99');
INSERT INTO `table_test_one` VALUES ('7', '201603', '王五', '0003', '英语', '98');

可以运行一下上面两个语句试试结果是不是你想要的。

2、删除除了id不同, 其他都相同的学生冗余信息,表如下:

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete table_test_one where id not in (select min(id) from table_test_one group by student_no, student_name, subject_no, subject_name, score);

是否有看懂?如果没能看懂的话,继续往下看:

先来造数据,题1中的数据只需要执行如下SQL就变成题2中的数据了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
update table_test_one set subject_no = '0001', subject_name = '数学' where id = 6;

然后我们先执行这个看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select min(id) from table_test_one group by student_no, student_name, subject_no, subject_name, score

这个的执行结果如下:

如果还不懂就再看看几次吧。

PS:GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。刚刚就是GROUP BY 对多列的使用场景。

3、行转列:

表数据如下:

希望查询到结果如下:

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select year, (select amount from table_test_two t where t.month = 1 and t.year = table_test_two.year) as month1, (select amount from table_test_two t where t.month = 2 and t.year = table_test_two.year) as month2, (select amount from table_test_two t where t.month = 3 and t.year = table_test_two.year) as month3 from table_test_two group by year;

利用group by 实现行转列,这种场景在数据统计的时候经常用到。

猿友可以造数据自己运行试试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- ----------------------------
-- Table structure for `table_test_two`
-- ----------------------------
DROP TABLE IF EXISTS `table_test_two`;
CREATE TABLE `table_test_two` ( `year` int(11) NOT NULL, `month` int(11) NOT NULL, `amount` decimal(10,1) NOT NULL, PRIMARY KEY (`year`,`month`,`amount`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of table_test_two
-- ----------------------------
INSERT INTO `table_test_two` VALUES ('1991', '1', '1.1');
INSERT INTO `table_test_two` VALUES ('1991', '2', '1.2');
INSERT INTO `table_test_two` VALUES ('1991', '3', '1.3');
INSERT INTO `table_test_two` VALUES ('1992', '1', '2.1');
INSERT INTO `table_test_two` VALUES ('1992', '2', '2.2');
INSERT INTO `table_test_two` VALUES ('1992', '3', '2.3');

4、复制表( 只复制结构, 源表名:table_test_two 新表名:table_test_three)

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table table_test_three as select * from table_test_two where 1=2;

PS:如果需要将数据也复制过去,则上面改成where 1=1

5、复制表数据(将表 table_test_two 的数据复制到表table_test_three 里面)

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert into table_test_three (year,month,amount) select year,month,amount from table_test_two;

6、两张关联表,删除主表中已经在副表中没有的信息

答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete from table_test_student where not exists (select * from table_test_class where table_test_student.class_id = table_test_class.calss_id); 

我们先造点数据吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- ----------------------------
-- Table structure for `table_test_class`
-- ----------------------------
DROP TABLE IF EXISTS `table_test_class`;
CREATE TABLE `table_test_class` ( `calss_id` int(11) NOT NULL AUTO_INCREMENT, `calss_name` varchar(10) CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`calss_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of table_test_class
-- ----------------------------
INSERT INTO `table_test_class` VALUES ('1', '一班');
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- ----------------------------
-- Table structure for `table_test_student`
-- ----------------------------
DROP TABLE IF EXISTS `table_test_student`;
CREATE TABLE `table_test_student` ( `student_id` int(11) NOT NULL AUTO_INCREMENT, `student_name` varchar(10) CHARACTER SET utf8 NOT NULL, `class_id` int(11) NOT NULL, PRIMARY KEY (`student_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of table_test_student
-- ----------------------------
INSERT INTO `table_test_student` VALUES ('1', '罗国辉', '1');
INSERT INTO `table_test_student` VALUES ('2', '小宝鸽', '2');

执行后数据如下:

显然副表student中小宝鸽这条数据的calss_id,主表没有对应的class_id.

执行对应SQL语句就会把小宝鸽这条数据删除掉了。


未完待续……….(TODO),边学习边写博客真的很花时间,累并快乐着~~~

发布者:全栈程序员栈长,转转请注明出处:https://javaforall.cn/2285.html原文链接:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年11月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 23丨学生们参加各科测试的次数【难度简单】​
难度简单 SQL架构 学生表: Students +---------------+---------+ | Column Name   | Type    | +---------------+---------+ | student_id    | int     | | student_name  | varchar | +---------------+---------+ 主键为 student_id(学生ID),该表内的每一行都记录有学校一名学生的信息。 科目表: Subjects +-----
不吃西红柿
2022/07/29
2100
一文看懂如何分析MySQL Explain(1/3)
在网上经常看到一些写SQL优化经历的文章,看完文章发现懂的不用看,不懂的看不懂,大家都是都在讲调优经历,但是忽略了如何看懂执行计划,如何调优。本文不讲调优经历,只讲如何看懂执行计划及常用的调优原则,从而可以有针对性的提升我们查询语句的性能。
程序员小强
2019/06/11
1.5K0
go面试题整理(附带部分自己的解答)
go的调度原理是基于GMP模型,G代表一个goroutine,不限制数量;M=machine,代表一个线程,最大1万,所有G任务还是在M上执行;P=processor代表一个处理器,每一个允许的M都会绑定一个G,默认与逻辑CPU数量相等(通过runtime.GOMAXPROCS(runtime.NumCPU())设置)。
全栈程序员站长
2022/02/17
2K0
LeetCode MySQL 1280. 学生们参加各科测试的次数
主键为 student_id(学生ID),该表内的每一行都记录有学校一名学生的信息。
Michael阿明
2021/02/19
4840
高频SQL50题(基础版)二
前言:本篇文章主要是来自力扣网站的高频SQL50题的第二部分(连接),第一部分可以参考我的上一篇文章高频SQL50题(一)
ma布
2024/10/21
2060
MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官
使用YEAR()和MONTH()函数从signup_date字段中提取年份和月份,并匹配给定的条件。
小白的大数据之旅
2024/11/20
2450
LeetCode 数据库专题
写一段SQL查询来展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。你可以以 任意 顺序返回结果表。查询结果的格式如下例所示:
wywwzjj
2023/05/09
1.5K0
LeetCode 数据库专题
最强总结!数据库脏数据清理完整指南!!
数据质量是数据库管理中的关键问题。本文将系统地介绍数据库中脏数据的识别、清理和预防方法,帮助您提升数据质量!
SQL数据库开发
2024/12/25
2890
最强总结!数据库脏数据清理完整指南!!
MySQL 基础(二)
外键是数据库表中的一个字段(或字段组合),用于建立两个表之间的逻辑关联。它指向另一个表的主键(或唯一键),确保引用的数据在关联表中存在,从而维护数据的完整性和一致性。
落幕
2025/05/27
910
MySQL 基础(二)
Oracle经典面试题,你都掌握了吗?
--以下使用的是SQL1999的连表方式,语法不一样效果与第一题使用的SQL1992的一样
数据和云
2019/05/17
1.1K0
Oracle经典面试题,你都掌握了吗?
一文看懂如何分析MySQL Explain(2/3)
⑨ range:如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法,比如:
程序员小强
2019/06/11
1.6K0
详解一条SQL语句的执行过程
SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上。同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同。
葆宁
2019/04/19
6080
详解一条SQL语句的执行过程
MySQL 系列教程之(十五)SQL 面试题精讲
查询每个主播的最大level以及对应的最小gap(注意:不是每个主播的最大level和最小gap)
ruochen
2021/08/17
45.9K0
MySQL 系列教程之(十五)SQL 面试题精讲
mysql必知必会2
语法:delete from {1} where {2} 第一对大括号替换为表名,第二对大括号替换为查询条件。 注意:删除语句一定要写删除条件,否则整张表删除。 例如:delete from commodity 这个SQL语句删除commodity表中的所有数据。 例如:delete from commodity where id = 5 这个SQL语句删除commodity表中的id=5的数据
潇洒坤
2018/09/10
7570
mysql必知必会2
MySQL 练习题和答案,以及运行结果截图
一共四道大题,运行结果截图在最后面。 SQL 题目一 数据准备 # 创建数据库 renda01 CREATE DATABASE renda01 CHARACTER SET utf8; # 使用数据库 USE renda01; # 创建商品表: CREATE TABLE product( pid INT, # 主键 ID pname VARCHAR(20), # 商品名称 price DOUBLE, # 商品价格 category_name VARCHAR(32) #
RendaZhang
2020/09/08
1.5K0
MySQL 练习题和答案,以及运行结果截图
MySQL数据库入门
后台 (连接点:连接数据库JDBC,链接前端(控制,控制视图跳转,和给前端传递数据))
落寞的鱼丶
2022/02/21
6210
【数据库】MySQL经典面试题(练习)
【数据库】MySQL经典面试题(练习) 一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条) 要求结果数据: 原始数据: CREATE TA
Java帮帮
2018/03/15
1.7K0
【数据库】MySQL经典面试题(练习)
MySQL || 结果排序--聚集函数讲解
字段名1 、2 是对查询结果排序的依据。 ASC 表示升序 DESC表示降序。 默认是ASC。
宁在春
2022/10/31
2.2K0
MySQL || 结果排序--聚集函数讲解
Mysql explain命令详解
在 MySQL 中,EXPLAIN 语句用于获取关于查询执行计划的信息,模拟优化器执行SQL查询语句,帮助我们分析SQL查询的瓶颈。
一杯茶Ja
2024/09/25
3290
Oracle 经典面试题分享
整理了4道Oracle 经典面试题,与大家分享学习。 第一题 create table test( id number(10) primary key, type number(10) , t_id number(10), value varchar2(6) ); insert into test values(100,1,1,'张三'); insert into test values(200,2,1,'男'); insert into test values(300,3,1,'
星哥玩云
2022/08/18
3450
Oracle 经典面试题分享
推荐阅读
相关推荐
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 23丨学生们参加各科测试的次数【难度简单】​
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验