MySql查询语句中解决,join使用on与where筛选的差异

MySql查询语句中解决“该列没有包含在聚合函数或者groupby子句中”的相关问题方法,groupby子句

 

首先引入语句来源,表结构和数据如下:

图片 1

需求是:查出员工(personname)在不同店铺(store)的总薪酬(salary),相同店铺输出store,不同店铺输出multi_store。

正确查询语句如下:

SELECT personname,(case when count(distinct Store)>1 then 'multi_store' else MAX ( store) end),sum(Salary) FROM dbo.StaffInformation
GROUP BY PersonName

 第一想到的语句:(但是达不到想要的结果或者直接报错:“选择列表中的列'列名'无效,因为该列没有包含在聚合函数或group by 子句中”)

SELECT personname,(case when count(distinct Store)>1 then 'multi_store' else store end),sum(Salary) FROM dbo.StaffInformation
GROUP BY PersonName

 

遇到类似的问题:首先看看输出的字段是不是你需要的,如果需要但是又不能放在group by中(因为放在group by中就得不到分组的效果,但是不放就报错)

就要考虑将store这样的字段用个函数处理下。其实想想挺简单的,多遇到点问题 就能慢慢得到自己的一套解决问题的方案了。

 

   有问题可以随时评论。我基本上每天都会来一下。有问题互相探讨,学习,进步。

首先引入语句来源,表结构和数据如下: 需...

mysql的left join使用on与where筛选的差异,mysqljoin

    举例进行说明,我们现在有两个表,即商品表(products)与sales_detail(销售记录表)。我们主要是通过这两个表来对MySQL关联left join 条件on与where 条件的不同之处进行讲述。

mysql交互协议解析——mysql包基础数据、mysql包基本格式,mysql交互

mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等。

在此我们要认识到mysql交互协议其实是半双工的交互协议,至于为什么,这里就先挖个小坑,以后再填。

在探讨mysql交互协议的格式之前,我们要理清一个小问题,就是mysql交互协议会用到的基本数据类型。

1.整数类型

这里的整数类型可以用来表示mysql数据类型中的整数类型、日期时间类型、DOUBLE、FLOAT类型、比特类型以及枚举类型等等。

所有的mysql整数类型都是小端的,这是网络数据的惯例。即对于16进制数0x12345678,在存储时会变成0x78563412

那么这里的整数数据类型有:int<len>(其中len = 1,2,3,4,6,8)以及可变的整数类型int<lenenc>

(1)int<len>是固定长度为len字节的整数数据,如int<3>表示数字3的话,会以小端 0x030000表示。

(2)int<lenenc>是可变长度类型的整数,这种字符的长度可以是1, 3, 4, 9。

  我们设要表示的数值是n

      1)当 n < 251时,int<lenenc>会以int<1>表示。

  2)当251 <= n < 2^16时,int<lenenc>会以0xfc int<2>表示。

  3)当2^16 <= n < 2^24时,int<lenenc>会以0xfd int<3>表示。

  4)当2^24 <= n < 2^64时,int<lenenc>会以0xfe int<8>表示。

  这就表示如果我们遇到int<lenenc>类型,我们需要先读取第一个数值type来判断

  1)当type < 0xfb时,就认为读取的数是type。

  2)当type == 0xfc时,就读取后面的int<2>,int<2>才是真实的数值。

  3)当type == 0xfd时,就读取后面的int<3>,int<3>才是真实的数值。

  4)当type == 0xfe时,就读取后面的int<8>,int<8>才是真实的数值。

 那么当type为0xff和0xfb是什么?这边挖坑在此以后再填。

   可以剧透下的是:

   0xff在mysql交互协议中一般代表某一个动作错误,

   如发送一个插入命令失败后会有这种回复出现。

   而0xfb代表NULL,就是mysql插入值往往会是空值,指的就是NULL

2.字符串类型

这里的字符串类型可以用来表示mysql的高精度小数类型、字符串类型、大比特类型以及大整数类型等等。

这里的字符串类型主要是

(1)string<len>就是长度为len的字符串。

(2)string<NUL> 就是string '0x00',这里的'0x00'是作为结尾符的。

(3)string<lenenc>就是int<lenenc> string,int<lenenc> 代表字符串的长度。

(4)string<EOF>就是在一个mysql交互包结尾处出现的字符串。换言之,这个字符串是一个mysql交互包的最后一个字符串。

(5)string<fix>和string<var>几乎用不到。

3.mysql包基本格式

mysql包长度 int<3> mysql包序号 int<1> mysql包内容 string<len>

 

 

mysql包长度就是mysql包内容的长度,不把包头即包长度和包序号计入mysql包长度中,一般是int<3>,如果超过长度2^24-1,mysql会进行分包,如2^24-1,分成下述两个包。

0xfffffff 0x00 mysql包内容
0x000000 0x01 mysql包内容

 

 

 

mysql包序号就是一个完整流程的发包序号,就是由该流程的发出的第一包是从0x00开始的,以后不管回复的包还是分包的包都会在上面加1,直到包序号达到0xff,再从0x001开始计数。

比如我要查询语句"select * from 某表",那么我会发送出第一个包含查询语句"select * from 某表"的mysql包给mysql数据库,这个包的序号是0x00,这时,流程开始,以后的mysql数据库回复的包都会从0x01开始计数,直到回复结束,这时,该流程就结束了。我要查询新的语句就代表新的流程开始,mysql包序号计数重新从0x00开始。

 参考网址 

             

mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等。 在此我...

 1、数据准备

创建products表并插入数据

drop table if exists products;   
CREATE TABLE `products` (
    `pid` INT (3) NOT NULL auto_increment,
    `pname` VARCHAR (20) NOT NULL,
    `pcode` VARCHAR (20) NOT NULL,
    PRIMARY KEY (`pid`)
) ENGINE = MyISAM AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;

INSERT INTO `products` (`pid`, `pname`, `pcode`)
VALUES
    (1, '商品1', 'AC90'),
    (2, '商品2', 'DE78'),
    (3, '商品3', 'XXXX');

 创建sales_detail表并插入数据

drop table if exists sales_detail;
CREATE TABLE `sales_detail` (
    `aid` INT (3) NOT NULL auto_increment,
    `pcode` VARCHAR (20) NOT NULL,
    `saletime` date NOT NULL,
    PRIMARY KEY (`aid`)
) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

INSERT INTO `sales_detail` (`aid`, `pcode`, `saletime`)
VALUES
    (1, 'AC90', '2008-09-22'),
    (2, 'DE78', '2008-09-22'),
    (3, 'AC90', '2008-09-23'),
    (4, 'AC90', '2008-09-24');

 

 数据库中的数据如下:

products表
pid pname pcode
1 商品1 AC90
2 商品2 DE78
3 商品3 XXXX
sales_detail表
aid pcode saletime
1 AC90 2008-09-22
2 DE78 2008-09-22
3 AC90 2008-09-23
4 AC90 2008-09-24

本文由ca88手机版登录发布于亚洲城ca88手机版官网,转载请注明出处:MySql查询语句中解决,join使用on与where筛选的差异

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。