sql中group by,having语句在select前执行,那么为什么能用select中的别名?
一、sql中group by,having语句为什么能用select中的别名
SQL语句的语法顺序:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY
因此一般不能在having condition中使用select list中的alias。
但是mysql对此作了扩展。在mysql 5.7.5之前的版本,ONLY_FULL_GROUP_BY sql mode默认不开启。在5.7.5或之后的版本默认开启。
如果ONLY_FULL_GROUP_BY sql mode不开启,那么mysql对标准SQL的扩展可以生效:
允许在select list、having condition和order by list中使用没有出现在group by list中的字段。此时mysql会随机选择没有出现在group by list中的字段的值。效果和使用ANY_VALUE()是相同的。允许在having condition中使用select list中的alias— 1 以具体案例来介绍SQL的执行顺序(SQL Server)。
/*
要求:统计员工表里2014年1月1号及之后入职的员工所在国家、所属年份、人数,
过滤条件:以上信息里每个过国家和年份至少要对应有两条记录
排序:排序时按照国家和年份降序排列。
*/
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= ‘20140101’
GROUP BY country, YEAR(hiredate)
HAVING COUNT(*) > 1
ORDER BY country, yearhired DESC;
— 2 执行顺序
1 FROM
2 WHERE
3 GROUP BY
4 HAVING
5 SELECT
6 ORDER BY
— 3 错误写法汇总(在了解了SQL的执行顺序后,不难发现如下的写法是错误的)
— 3.1 WHERE后用SELECT后的字段别名。
SELECT country, YEAR(hiredate) AS yearhired
FROM HR.Employees
WHERE yearhired >= 2014;
–3.2 SELECT 后一字段用前面字段的别名。
SELECT empid, country, YEAR(hiredate) AS yearhired, yearhired – 1 AS prevyear
FROM HR.Employees;
–3.3 GROUP BY用SELECT里的别名
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= ‘20140101’
GROUP BY country, yearhired
HAVING COUNT(*) > 1
ORDER BY country, yearhired DESC;
/* 错误信息
Msg 207, Level 16, State 1, Line 4
Invalid column name ‘yearhired’.
*/
— 4 特别的:Mysql SQL执行顺序和标准SQL有差异,如下SQL能正常执行。
SELECT deptno dpt,COUNT(empno) cnt
FROM emp
WHERE deptno IN(10,20)
GROUP BY dpt
HAVING cnt > 1
延伸阅读:
二、Django 是什么
Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。
Django 可以使你的应用具有以下优点:
完备性
Django 遵循“功能完备”的理念,提供开发人员可能想要“开箱即用”的几乎所有功能。因为你需要的一切都是一个”产品“的一部分,它们都可以无缝结合在一起,遵循一致性设计原则,并且具有广泛和最新的文档。
通用性
Django 可以(并已经)用于构建几乎任何类型的网站—从内容管理系统和维基,到社交网络和新闻网站。它可以与任何客户端框架一起工作,并且可以提供几乎任何格式(包括 HTML,Rss 源,JSON,XML 等)的内容。你正在阅读的网站就是基于 Django。
在内部,尽管它为几乎所有可能需要的功能(例如几个流行的数据库,模版引擎等)提供了选择,但是如果需要,它也可以扩展到使用其他组件。
安全性
Django 帮助开发人员通过提供一个被设计为“做正确的事情”来自动保护网站的框架来避免许多常见的安全错误。例如,Django 提供了一种安全的方式来管理用户账户和密码,避免了常见的错误,比如将 session 放在 cookie 中这种易受攻击的做法(取而代之的是 cookies 只包含一个密钥,实际数据存储在数据库中)或直接存储密码而不是密码哈希。
密码哈希是通过密码散列函数发送密码而创建的固定长度值。Django 能通过运行哈希函数来检查输入的密码 – 就是 – 将输出的哈希值与存储的哈希值进行比较是否正确。然而由于功能的“单向”性质,即时存储的哈希值受到威胁,攻击者也难以解决原始密码。(但其实有彩虹表 – 译者观点)
默认情况下,Django 可以防范许多漏洞,包括 SQL 注入,跨站点脚本,跨站点请求伪造和点击劫持。

猜你喜欢LIKE
相关推荐HOT
更多>>
为什么SQL数据库用B树索引?
一、SQL数据库用B树索引的原因1、平衡性B树是一种自平衡的树型数据结构,它能够自动调整和保持树的平衡状态。这意味着无论是在插入、删除还是查...详情>>
2023-10-15 17:27:31
Python的pymysql、mysql、mysqlx库都有什么区别?
一、Python的pymysql、mysql、mysqlx库的区别Python的pymysql、mysql、mysqlx库连接数据库所使用的引擎不一样,简单操作都没什么影响的。如果一...详情>>
2023-10-15 16:54:43
CHNS数据库怎么查找想要的数据?
一、CHNS数据库查找想要的数据的方法CHNS数据库是指中国健康与营养调查(China Health and Nutrition Survey)数据库,该数据库提供了中国家庭...详情>>
2023-10-15 16:31:56
502 Bad Gateway怎么解决?
一、502 Bad Gateway的解决办法“502 Bad Gateway”错误是指在客户端(通常是您的浏览器)和服务器之间建立网关或代理时出现问题。1、刷新页面...详情>>
2023-10-15 16:03:47热门推荐
MySQL LEFT JOIN 和 JOIN查询有什么区别?
沸写好的java可执行程序在其他电脑上如何使用?
热oracle19c与oracle12c有哪些区别?
热Python的字典和数据库有什么区别?
新mysql字符串内部是怎么比较大小的?
Excel怎样从Access中实时读取更新的数据?
mysql中,逻辑删除对索引以及性能会造成什么影响?
什么是 ZIP 文件,工作机制是什么?
sql中group by,having语句在select前执行,那么为什么能用select中的别名?
public class和class的区别有哪些?
Python的应用领域及优缺点?
postgreSQL is not null 和 !=NULL有什么区别吗?
Oracle执行SQL报错ORA-00922是什么原因?
为什么SQL数据库用B树索引?
技术干货






