SQL 查询强化 - 数据准备
最近要搞新的项目了, 我的 BI 报表这块, 我感觉, 可能又要写sql, 对于一些简单的 查询, 表连接我还应付得来, 如果涉及多个表的, 什么子查询嵌套, 自定义函数, 加上控制流...就感觉就不行了, 下的我赶紧从网上找几篇教程来跟着写一写...
SQL 真的是, 特别, 特别重要, 面试,笔试必考... 而我是专做数据这块, 必然是重中之重. 而然,我真实中却, 真的写的很少, 主要是我太依赖 Pandas 了, 直接连接上多个表, 然后就可以为所欲为, 其实跟sql 是一样的, 什么段筛选, 表横向连接 (join) , 纵向连接 (union) , 分组聚合 (group by, aggregation) + 控制流(if else, loop) 80% 的数据处理内容, 就是这些呀.
我在处理这些内容时, 用编程语言如 Python 来搞, 轻轻松松, 再复杂的逻辑, 我无所畏惧. 但一旦要用 sql 写出逻辑来, 我真的是很头疼, 而且吧, 不同的 sql 写法又不一样(有差异)标准sql, mysql, oracle, sqlserver, 以及目前公司用的 sybase sql... 我好难...
但必须迈过这道坎. (就以mysql 为栗子来整吧, 反正大致也差不多的).
表关系
还是咱最为熟悉的, 学生表, 成绩表, 课程表, 教师表... 业务也是差不多的, 只是熟悉度而已, 我感觉.

数据准备
-- 创建库
-- 终端: pysql -u root -p (回车)
-- 密码: xxxx
show databases;
drop database if exists cj;
create database cj charset=utf8;
use cj;
-- 1. 学生表 student (s_id, s_name, birth_date, gender)
drop table if exist student;
create table student(
s_id char(5),
s_name varchar(20),
birth_date date,
gender char(3)
);
-- 插入学生数据
insert into student(s_id,s_name,birth_date,gender)
values('0001' , '王二' , '1989-01-01' , '男');
insert into student(s_id,s_name,birth_date,gender)
values('0002' , '星落' , '1990-12-21' , '女');
insert into student(s_id,s_name,birth_date,gender)
values('0003' , '胡小适' , '1991-12-21' , '男');
insert into student(s_id,s_name,birth_date,gender)
values('0004' , '油哥' , '1996-10-01' , '男');
-- 2. 成绩表 score (s_id, c_id, score)
drop table if exists score;
create table score(
s_id char(5),
c_id char(5),
score int
);
-- 插入学生成绩
insert into score(s_id,c_id,score)
values('0001' , '0001' , 80);
insert into score(s_id,c_id,score)
values('0001' , '0002' , 90);
insert into score(s_id,c_id,score)
values('0001' , '0003' , 99);
insert into score(s_id,c_id,score)
values('0002' , '0002' , 60);
insert into score(s_id,c_id,score)
values('0002' , '0003' , 80);
insert into score(s_id,c_id,score)
values('0003' , '0001' , 80);
insert into score(s_id,c_id,score)
values('0003' , '0002' , 80);
insert into score(s_id,c_id,score)
values('0003' , '0003' , 80);
-- 3. 课程表 course (c_id, c_name, t_id)
drop table if exists course;
create table course(
c_id char(5),
c_name varchar(20),
t_id char(5)
);
-- 插入课程信息
insert into course(c_id,c_name,t_id)
values('0001' , '语文' , '0002');
insert into course(c_id,c_name,t_id)
values('0002' , '数学' , '0001');
insert into course(c_id,c_name,t_id)
values('0003' , '英语' , '0003');
-- 4.教师表 teacher (t_id, t_name)
drop table if exists teacher;
create table teacher(
t_id char(5),
t_name varchar(20)
);
-- 插入教师信息
insert into teacher(t_id,t_name)
values('0001' , '欧拉');
insert into teacher(t_id,t_name)
values('0002' , '仲尼');
-- 这里的t_name是空值(null)
insert into teacher(t_id,t_name)
values('0003' , null);
-- 这里的t_name是空字符串('')
insert into teacher(t_id,t_name)
values('0004' , '');
数据预览
mysql> show tables;
+--------------+
| Tables_in_cj |
+--------------+
| course |
| score |
| student |
| teacher |
+--------------+
4 rows in set (0.00 sec)
学生表 student
mysql> select * from student;
+------+-----------+------------+--------+
| s_id | s_name | birth_date | gender |
+------+-----------+------------+--------+
| 0001 | 王二 | 1989-01-01 | 男 |
| 0002 | 星落 | 1990-12-21 | 女 |
| 0003 | 胡小适 | 1991-12-21 | 男 |
| 0004 | 油哥 | 1996-10-01 | 男 |
+------+-----------+------------+--------+
4 rows in set (0.00 sec)
成绩表 score
mysql> select * from score;
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 0001 | 0001 | 80 |
| 0001 | 0002 | 90 |
| 0001 | 0003 | 99 |
| 0002 | 0002 | 60 |
| 0002 | 0003 | 80 |
| 0003 | 0001 | 80 |
| 0003 | 0002 | 80 |
| 0003 | 0003 | 80 |
+------+------+-------+
8 rows in set (0.00 sec)
课程表 course
+------+--------+------+
| c_id | c_name | t_id |
+------+--------+------+
| 0001 | 语文 | 0002 |
| 0002 | 数学 | 0001 |
| 0003 | 英语 | 0003 |
+------+--------+------+
3 rows in set (0.00 sec)
教师表 teacher
mysql> select * from teacher;
+------+--------+
| t_id | t_name |
+------+--------+
| 0001 | 欧拉 |
| 0002 | 仲尼 |
| 0003 | NULL |
| 0004 | |
+------+--------+
4 rows in set (0.00 sec)
后面的查询, 都基于这个数据, 字段啥的. 当然这也是咱最为熟悉的表. 哎, 真的是孰能生巧吧, 这种东西.
SQL 查询强化 - 数据准备的更多相关文章
- 视图查询的数据和sql查询的数据不一样
视图查询的数据和sql查询的数据不一样. 手动刷新视图 exec sp_refreshview 视图名称
- sql 查询重复数据,删除重复数据,过滤重复数据
select * from (SELECT titleid,count(titleid) c FROM [DragonGuoShi].[dbo].[ArticleInfo] group by titl ...
- ORACLE和SQL查询库数据量
ORACLE根据账号查询每张表数据量: select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC; SQL SE ...
- 关于SQL查询某年数据 和DATEPART 函数的使用
数据库查询某年数据(sql server)select *from 表名 where YEAR(存时间的字段名) =某年select *from News where YEAR(addDate) =2 ...
- [sql查询] 重复数据只取一条
SELECT * FROM tab_init WHERE id IN ( --根据Data分类获取数据最小ID列表 select max(id) from tab_init group by a,b ...
- sql查询当天数据
向数据库中添加日期 MS SQL SERVER: NSERT into student(studentid,time1)values('15',getdate()); MY SQLinsert int ...
- PL/SQL 查询的数据出现乱码
解决方法: 1.首先在查询出Oracle数据库的字符集. select userenv('language') from dual; 2.新建系统变量 NLS_LANG,变量值为第一步查询出来的字符集 ...
- 工作 巧遇 sql 查询 一组数据中 最新的一条
SELECT * FROM rsl a, (SELECT CODE, max(time_key) time_key FROM rsl GROUP BY CODE ) b WHERE a. CODE = ...
- sql 查询大数据 常用 50列优化
大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到. 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能 ...
- SQL查询遍历数据方法一 [ 临时表 + While循环]
以下以SQL Server 2000中的NorthWind数据库中的Customers表为例, 用 临时表 + While循环 的方法, 对Customers表中的CompanyName列进行遍历 c ...
随机推荐
- DeepSeek智能编程
技术背景 DeepSeek开源之后,让大家意识到了即时是在自己硬件性能一般的本地环境,也能够部署和使用大语言模型,真正实现了大模型的"私有化".而私有化大模型之后,自然是考虑生产力 ...
- 记一次golang项目context引发的OOM故障
之前写过一篇一种基于etcd实践节点自动故障转移的思路, 程序经历过一次线上进程内存持续上涨终OOOM的小事故, 本次技术复盘导致本次内存泄露的完整起因. 提炼代码: 业务函数etcdWatchLoo ...
- SpringBoot 2.x 接入非标准SSE格式大模型流式响应实践 🚀
近期DeepSeek等国产大模型热度持续攀升,其关注度甚至超过了OpenAI(被戏称为CloseAI).在SpringBoot3.x环境中,可以使用官方的Spring AI轻松接入,但对于仍在使用JD ...
- VMware15.5虚拟机下载及安装
一.VMware虚拟机介绍 VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Windows.DOS.LINUX系统.与"多启动&qu ...
- 性能对比实验折线图绘制代码(YOLO系列为例)
本文用于绘制性能折线图,适用于对比实验,发现很多博文都是收费,欺负哥们懒得学习,一气之下ai了一下再进行代码修改,免费供给大家学习参考,便于大家撰写论文数据时利于绘制图像. import pandas ...
- PPT 技巧&网站
样机生成网站 https://mockuphone.com/device?type=computer CTROL+L 演示生成荧光笔 3.如何内嵌字体 文件->选项->保存->勾选潜 ...
- 2025年3月GESP八级真题解析
第一题--上学 题目描述 C 城可以视为由 \(n\) 个结点与 \(m\) 条边组成的无向图.这些结点依次以 \(1,2,-,n\) 标号,边依次以 \(1,2,-,m\) 标号.第 \(i\) 条 ...
- Zotero 设置坚果云同步(使用 WebDAV 的方法)
1.坚果云设置 登录坚果云:官网,注册账号 1.建立个人文件夹:zotero 2.在网页打开右上角的 账户信息,并选择 安全选项 在页面下方选择 添加应用 并输入与前面文件夹对应的名称 zotero ...
- 【Linux】远程连接Linux虚拟机(MobaXterm)
[Linux]远程连接Linux虚拟机(MobaXterm) 零.原因 有时候我们在虚拟机中操作Linux不太方便,比如不能复制粘贴,不能传文件等等,我们在主机上使用远程连接软件远程连接Linux虚拟 ...
- JMeter提取响应结果保存到本地总结
1.说明 本次实验以登录接口为例提取响应结果中的uid和ticket参数并保存到csv文件 2.脚本结构 说明: 1)本次实验的在于BeanShell后置处理程序的编写,登录接口参数传递之前有些总结, ...