朝花夕拾:快速回忆被遗忘在角落的SQL

news/2025/2/24 23:24:23/文章来源:https://www.cnblogs.com/overxus/p/18734756

你现在看到这篇博客,可能是因为你急于回忆起遗忘多时的SQL. SQL比编程要简单地多,因此回忆起来也是相当简单。

为了回忆SQL,我需要下载MySQL或其它数据库吗?当然可以。不过点开这篇博客的家人们有福了,如果只是为了回忆SQL的基本操作,直接使用Python内置的sqlite3即可。运行以下程序即可马上体验SQL的魅力:

import os, sqlite3def run_sql(temp_file:str = 'temp.sqlite3'):con = sqlite3.connect(temp_file)cur = con.cursor()while True:sql = input('> ')if sql == 'exit':con.close()os.remove(temp_file)breaktry:result = cur.execute(sql)if 'select' in sql.lower():for item in result.fetchall():print(item)elif 'insert' in sql.lower() or 'drop' in sql.lower():con.commit()except Exception as e:print(e)if __name__ == '__main__':run_sql()

不过,sqlite3对数据类型的支持没有主流数据库那么好,但这对文中内容毫无影响。另外,SQL语句的关键字是不区分大小写的。

众所周知,一位自称是“数据科学工作者”的人,他的工作可能就是写SQL. 传统SQL讲究四门工夫——“增删查改”。“增”可以创建表、向表中写入数据;“删”可以删表、删数据,有一种传统艺能叫作“删库跑路”;“查”是SQL的重中之重,大部分SQL都是用于查找的;“改”可以修改表中数据,这个并不常见,在文中一笔带过。

学过数据库的朋友都知道,SQL有两种老掉牙的例子:一是学生、二是订单,我们这里使用的例子正是学生。

“增”:创建表、向表中添加行

建表语句如下:

CREATE TABLE stu (id INTEGER PRIMARY KEY, name VARCHAR(32), age INTEGER);

创建了表stu,包含3列:id(学号)、name(姓名)、age(年龄)。

向表中添加记录(10001,  张萌萌, 12), 插入语句如下:

INSERT INTO stu VALUES(10001, '张萌萌', 12);

我们再多插入几条记录:

INSERT INTO stu VALUES(10002, '李帅', 13);
INSERT INTO stu VALUES(10003, '王杰', 11);
INSERT INTO stu VALUES(10004, '欧阳清华', 14);

“查”:查找表中内容

简单查找

查找语句应该是大家记忆最深的语句了,其格式为:

SELECT [列表项] FROM [表名] WHERE [筛选条件];

例如,我们要查看表stu中的所有行:

select * from stu;

查找结果为:

(10001, '张萌萌', 12)
(10002, '李帅', 13)
(10003, '王杰', 11)
(10004, '欧阳清华', 14)

如果我们要查找年龄大于12的所有学生姓名:

SELECT name FROM stu WHERE age > 12;

查找结果为:

('李帅',)
('欧阳清华',)

数据聚合

SQL中常用的内置聚合函数有COUNT、MIN、MAX、SUMAVG,它们用于执行简单的统计功能。例如,计算表stu中学生的平均年龄:

SELECT AVG(age) FROM stu;

关于COUNT

COUNT(*)可统计表的行数,而COUNT(age)可以统计列age中,非空(NOT NULL)值的个数。

分组查询

可通过GROUP BY将表分组,再对每个分组运用统计函数。为了演示效果,我们在表stu中再添加几条记录:

INSERT INTO stu VALUES(10005, '李芳芳', 13);
INSERT INTO stu VALUES(10006, '王菜刀', 11);
INSERT INTO stu VALUES(10007, '诸葛韭菜', 11);

插入后,表stu中有年龄重复的行了。如果我们要统计表中各个年龄的有多少人,可以首先根据年龄,将表中数据分为若干个组,再利用统计函数COUNT,统计每个分组的行数:

SELECT age, COUNT(*) FROM stu GROUP BY age;

输出为:

(11, 3)
(12, 1)
(13, 2)
(14, 1)

提示

当查询语句同时包含WHEREGROUP BY时,WHERE先执行,GROUP BY作用于WHERE过滤后的表上。GROUP BY的表可通过HAVING进一步筛选,但用得比较少,一般在WHERE中写好过滤条件。

结果排序

对表排序是最常见的一种需求,只需要通过ORDER BY指定排序的列即可。例如,将表stu按照成绩从高到低排序:

SELECT * FROM stu ORDER BY age DESC;

SQL默认从小到大排序,想要从大到小排序,需要指定关键字DESC. 排序时可以指定多个列名。

“删”:删除表中特定行、删除表

删除表中特定行的SQL语句为:

DELETE FROM [表名] WHERE [指定条件];

删除表的操作为:

DROP TABLE [表名];

现在,请删除表stu,我们将重新生成其它表,温习更复杂的查询操作。

“查”:表的连接操作

两张列相同的表可以执行UNION、INTERSECT等集合操作,例如:

(SELECT id, name FROM stu1) UNION (SELECT id, name FROM stu2);

下面重点考察内外连接、左右链接。

有如下两张表:

表stu_name
id name
10001 王一
10002 王二
10003 王三

 

表stu_age
id age
10001 11
10002 12
10004 14
10005 12

将表中具有相同id的行连接起来。

SELECT stu_name.id, name, age FROM stu_name INNER JOIN stu_age ON stu_name.id = stu_age.id;
/*
(10001, '王一', 11)
(10002, '王二', 12)
*/SELECT stu_name.id, name, age FROM stu_name LEFT JOIN stu_age ON stu_name.id = stu_age.id;
/*
(10001, '王一', 11)
(10002, '王二', 12)
(10003, '王三', None)
*/SELECT stu_name.id, name, age FROM stu_name RIGHT JOIN stu_age ON stu_name.id = stu_age.id;
/*
(10001, '王一', 11)
(10002, '王二', 12)
(None, None, 14)
(None, None, 12)
*/

由此可见这几种查询模式的区别:当两侧数据都有效时,才能内连接上;左连接保证左边表的指定列中数据都在表中,而右链接则是保证右边的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889258.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单逆向Java程序

前置 来源 这个程序是我同学编写的一个学生分数管理系统,我将对这个已经编译的程序进行测试、逆向,找出其中的问题,并进行改进。 运行环境macOS 15.4 IntelliJ IDEA 2024.2.3 OpenJDK 23.0.2 TomCat 11.0.4 Safari 15.4运行结果主要问题 在使用了这个程序之后,我发现了以下…

信息论概述

1 信息与消息 1.1 信息 1.1.1 信息的定义 信息是信息论中最基本、最重要的概念 香农信息的定义:信息是事物运动状态或存在方式的不确定描述 1.1.2 (香农)信息的度量样本空间:对于我们需要描述的事物中,事物可能存在不同的状态,即事物展现出来的多种状态。那么为了便于形容事…

JUC并发—12.ThreadLocal源码分析

大纲 1.ThreadLocal的特点介绍 2.ThreadLocal的使用案例 3.ThreadLocal的内部结构 4.ThreadLocal的核心方法源码 5.ThreadLocalMap的核心方法源码 6.ThreadLocalMap的原理总结1.ThreadLocal的特点介绍 (1)ThreadLocal的注释说明 (2)ThreadLocal的常用方法 (3)ThreadLocal的使用…

前端Vue创建

一、创建Vue项目二、导入idea 复制景区 三、设置main.js点击查看代码 import Vue from vue import App from ./App.vue import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import ./assets/golbal.css; import axios from axios; // 正确的模块…

朋友说喊搞个简单的微信对接的封装搞外包,不要那么多的方法拿来就用的的那种,来看看Simple.Wechat吧

朋友说喊搞个简单的微信对接的封装搞外包,不要那么多的方法拿来就用的的那种,来看看Simple.Wechat吧😂不知道大家有没有和我朋友一样,很多时候做外包总免不了去对接微信,最简单的微信用户信息获取、微信支付、微信模板消息发送,要是不熟悉总是要去找这个那个的包,但是人…

龙哥量化:二重奏啊!同时用deepseek和腾讯元宝的Hunyuan大模型写技术指标和选股公式,把收集的公式源码传给他,可以像人一样思考

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔) 开源的deepseek非常爆火,大科技公司都纷纷接入ds。腾讯元宝也接入了, 可以选Hunyuan或者deepseek模型给你帮忙,…

【APP逆向35】frida反调试2

前言:有些app运行时会监测frida的相关特征,监测到之后就会直接闪退 示例:解决方法:可以尝试使用strongR-frida-android来绕过监测1.下载frida-server(加强版)下载地址:https://github.com/hzzheyang/strongR-frida-android/releases?page=4 找到frida对应的版本解压,上…

【作业】自我介绍

软件工程学第一节课作业:自我介绍+软工5问作业相关信息这个作业属于哪个课程🔗班级链接 这个作业要求在哪里🔗作业链接 这个作业的目标 1. 自我介绍 2. 软工五问作业一: 自我介绍 🚩Hi! I am Mike, a technology learner enthusiastic in new ideas and programs. Toge…

磁盘总结---特殊符号系列-正则概述

1.系统管理-补充 文件系统: 磁盘中文件的组织方式常见文件系统 说明xfs centos 7默认的文件系统即可ext4 centos 6.x ubuntu 默认的文件系统ext3 centos 5.x 默认的文件系统swap 交换分区,也算是个文件系统2.磁盘性能指标磁盘性能指标 说明吞吐量(读写速度) 一般值得是磁盘读…

多态的前提--java进阶day02

1.多态的前提条件第一点和第二点都很好理解,第三点父类引用指向子类对象是什么意思?以下图进行讲解我们以前的写法,如下图,叫做子类引用指向子类那父类引用呢?就是把左边换成父类Animal即可因为dog和cat都是Animal的子类,所以二者皆可用该种引用方式并不是所有的对象都可…