SQL备忘记(一)

news/2024/9/20 7:21:37/文章来源:https://www.cnblogs.com/MyRecords/p/18379647

一前言

环境:win10 mysql 5.7.32

记录一些sql中平时容易弄错的或不明白一些知识点

二 正文

1 select语句执行顺序

FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY
--一个大概的执行顺序,具体执行顺序根据数据库管理系统S的不同而不同

如下成绩表score
image
image

如上,可以看出,avg()函数只统计了0003同学两门得分50的课程,得分80的课程并没有被统计

根据上面的执行顺序,应该是先执行where,即把成绩大于60所在行数据踢出去,再执行的group语句,所以0003同学得分为80的成绩自然未被统计

2 关于分组 group by

2.1 作为select查询结果的列名对应的限制

如果查询语句使用了group by,那么和group by所对应的select 后面的列只能属于三种情况
即select xxx1,xx2,xxn from table group by c1
xxx1,xxx2,xxn只能是结果为单一值的下面4种情况

  • 常数
  • 聚合函数:如sum() count(*) max()
  • 与 紧跟在 group by后指定的列一致
  • 虽然与group by后指定的不一致,但group by后 结果为单一值得列(好像只有在mysql才行)

如下,有成绩表score2
image

现在要查出每个subject成绩排前三的数据
尝试写出下列部分语句时却报错
image

事后细察,原因就出在select后面的 a.name, , a.score,因为以subject分组时,同一个组内,有多个name的值,系统不知道要显示哪一个。 有group by, 对应select查询结果只能是单一值

改成下面这样就不报错image

2.2 group by中的列名不能用别名

如 select xx2 as c2 from table group by c2

这样写是错误的,因为执行顺序的原因,会先执行group by,就导致系统不知道c2是个什么东西

2.3 count(分组字段)是可以的

select count(性别) from table group by 性别
如上,之前,因为同一组性别的值都是相同的,就一直隐隐感觉分组字段放在聚合函数会有问题。

其实是对count()函数的作用没理解清楚,count()和值基本无关,count()值会统计字段列的行数。
此时count(性别)和count(*)就是等价的

3 count(1),count(*), count(字段xxx)

count()是用来统计行数的
简单点,可以把count(1)与count(*)看成等价的,针对所有列计算其行数,不会忽略任何行

count(字段xxx),针对该字段所在列计算其行数,如果该列在某行的值为null,则会忽略,而count(*)与count(1)不会忽略null

image

image
image

4 where中不能使用聚合函数

比如 现有一张班级学生成绩表。 要查询成绩小于班级平均成绩的同学信息

selext  xxxx from table where 成绩<avg(平均成绩)
#上面这样下意识觉得没有啥问题,但却不符合where的使用规则# 采用子查询的方式来得到where后需要统计函数计算的字段
select xxx from tablewhere 成绩<(select avg(平均成绩) from table)

5 distinct的作用范围

select ditinct xx1
select sum(distinct xx)

如上,distinct放在一个单独的字段前面或聚合函数里面,都是只对该字段起作用,只会在该字段所在列的结果行上删除重复的行(null值也被视为一类数据)

distinct也可以放在多个字段的最前面,会将多个字段的值进行组合,如果组合值有重复则会被删掉

select distinct xx1, xx2 from table
#此时distinct不是对xx1起作用,而是对xx1 xx2的组合起作用

另外要注意distinct的位置,除非放在聚合函数的括号里面,否则distinct只能放在第一个列名字段之前

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

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

相关文章

Linux C++ 开发5 - 一文了解CMake构建

1. 什么是CMake?1.1. CMake的定义 1.2. CMake有哪些优势? 1.3. CMake 的特点 1.4. Cmake 、CMakeLists.txt 、Make 、Makefile 之间的关系2. 应用案例2.1. 项目概述 2.2. CMakeLists.txt2.2.1. 基本用法 2.2.2. 完整内容 2.2.3. 构建执行上一篇《Linux C++ 开发4 - 入门makef…

BLE 广播报文格式

广播报文结构 一个完整的BLE广播报文由四部分组成,分别是前导码、接入地址、协议数据单元和CRC校验码。Preamble 前导 Access address(接入设备) PDU CRC校验1 Bytes 4 Bytes 2-37 Bytes 3 Bytes前导码:用来同步时序,可以是0x55或者0xAA,由接入地址的第一个比特决定。如果接…

[JLOI2015] 骗我呢——一类经典反射容斥

加载解析界面 数字变化跳跃反射容斥 一层反射:有一条线 \(y=x+b\) 不能碰到。 从第一次碰到直线开始,将后面的部分沿直线翻折,最终一定会到达 \((n-b,n+b)\),因为 \(b\ne 0\),所以构成双射。答案即为 \(\binom{2n}{n}-\binom{2n}{n-b}\)。 注意,如果最终到达的位置是 \((…

南沙区信息学奥林匹克竞赛(信奥赛)介绍

​信息学奥林匹克竞赛(International Olympiad in Informatics,IOI)是一项旨在选拔和培养信息技术和计算机科学人才的国际性竞赛。该竞赛始于1989年,每年举办一次,由不同的国家轮流承办。参加比赛的选手来自全球各国,都是信息技术和计算机科学领域的尖子生。信息学奥林匹…

英文单词字母大小写在线转换工具html代码

这是一个简单而实用的在线大小写转换工具。它允许用户输入任意文本,并提供三种转换选项:转换为全大写、全小写或首字母大写。 使用这个工具非常简单快捷。用户只需要在输入框中输入想要转换的文本,选择合适的转换类型,然后点击"转换"按钮即可。转换结果会立即显示在输…

TCP的调试助手开发笔记

动图:1 先利用VS自带的socket类来写好TCP_CORE: 类目录如下:点击查看代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExp…

Why Transformers Need Adam: A Hessian Perspective

目录概符号说明所有参数的 Hessian 矩阵Block-wise Hessian代码Zhang Y., Chen C., Ding T., Li Z., Sun R. and Luo Z. Why transformers need adam: a hessian perspective. arXiv preprint, 2024.概 本文从 Hessian 矩阵的角度回答为什么 Adam 相较于其它方法, 比如 SGD 在 …

VL24 边沿检测

这个就是需要对a 进行打一拍last_a<=a; 需要理解的点是打一拍的last_a是落后a一个时钟周期的,也就是对当前时刻使用a时候,此时的last_a是a的上一时刻的值。`timescale 1ns/1ns module edge_detect(input clk,input rst_n,input a,output reg rise,output reg down ); reg …

RE入门第三天---TEA算法

OK,老规矩,先复习一下昨天的内容 ..... 几分钟就复习了,直接开干今天的内容 先找大佬的wp 来源: TEA系列加密解密 | Gruges Blog (g2uge.github.io) 逆向算法之TEA算法 - Sk2rw - 博客园 (cnblogs.com) 一.TEA加密解密简介 在密码学中,微型加密算法(Tiny Encryption Algo…

vue3 控制el-dialog 双向绑定显示隐藏

父组件<Contact v-model:isView="isView" /> 子组件<template><div><el-dialogwidth="400"title="微信二维码":model-value="props.isView"@closed="handleClose"><div class="dialog-div…