SQLで持つことの使用は何ですか[mssql]

この記事は、金の創造への道を始めるための「新人創造セレモニー」イベントに参加しました。

データをフィルタリングする場所

持っていることについて話すには、まずどこについて話し合う必要があります。このステートメントは非常に一般的で重要です。
データベースにクエリを実行するとき、毎回すべてのデータを取り出すことは不可能です(数億のデータ、サーバーはそれを処理できません)。
通常、最初の10レコード、時間ごとの最初の30レコードを名前で取り出します。データテーブル内のage、amount、およびその他のフィールドを使用して、フィールドの値をフィルタリングします。フィルタリング後もデータが大量にある可能性があり、ページングプロセスが実行されます。
ここで重要なのはどこの役割です!テーブルに存在するフィールド値型である限り、ブール値の結果の式として記述でき、多条件のAND、OR、およびNOT演算を使用できます。

プロジェクトで使用されているSQLステートメントの99.9%にWhereステートメントが含まれていると言え、実用性も想像できます。
でも実現できない機能がいくつかあります。この時、持っていることが登場します〜

持つことの意味

SQLステートメントで、合計数を計算する必要がある場合は、累積、平均、およびその他の集計操作を行い、合計数に達していない、または達していない部分セットを除外します。これは
Whereステートメントで置き換えることはできません。
Count in Whereを使用すると、例外エラーは次のようになります。

image.png

画像コンテンツの翻訳:Where中不能出现聚合运算,只能写到having或者select中

したがって、持っていることは、どこでは達成できない効果を達成できると言えます。

持っていることの毎日の使用

通常、次のような集計操作があります。

チェックする

SELECT
    CompanyName
FROM Company 
GROUP BY CompanyName 
HAVING count(1) > 1
复制代码

統計的スクリーニングを行う:特定の指標を達成するコレクション

例:2021年に会社の総収入が120,000未満の従業員を選別します(その後、給与を増やします〜)

SELECT * FROM
Payroll
WHERE DATEPART(Year, CreateTime) = 2021
GROUP BY EmployeeId
HAVING SUM(Wages) < 120000
复制代码

groupbyの後に使用する必要があります

通过上面的两个简单例子,可以看出,having都是写在group by后面
为什么是这样呢?
首先,group by作用是将数据进行按条件分组,having的作用是对聚合计算操作后的数据进行筛选
因此,没有前面的分组,也就没办法聚合计算了,那更没有对聚合结果的筛选操作了
结论:having出现的地方,前面必须有group by,而反过来则不一定(有group by,不一定需要having...)

具体执行顺序的梳理

首先肯定是数据来源开始,数据都在数据库中,对数据库中数据进行筛选的是Where,那where肯定第一个执行
把数据拿出来之后,直接比较?肯定不是,要按条件进行分类(即分组),最后才是聚合计算,having过滤的是聚合计算的结果。
换句话说,where查询完数据库,数据已经到了设备的内存当中了,group by 和 having 都是在内存中进行的!相当于数据被筛选了两次,计算了一次,这一次计算夹在两次筛选之间,而计算前还有一次分组的过程。

这里也可以看出来,where和having都是过滤数据,前者是过滤数据库中数据,后者是过滤聚合计算后的数据!

举一个简单例子理解这里的执行顺序

一个不会举例子的程序员是没有前途的....
比如公司给员工发福利之分零食,首先肯定要把零食从超市或仓库里拿出来(购买或拿肯定有一个筛选过程,就是where了),然后再按人员或部门进行分发(Group by),最后领导说,统计一下那些人分的少于3包(随便规定一个条件),这里就用到了having,这里就筛选出来领的少的员工,然后进行补偿....这整个顺序大致分三步:拿零食、分零食、找少的;它的顺序肯定是不可颠倒的,总不能先找少的?还没分呢,先分,那零食还没拿出来或买回来,怎么分....

好了既然执行顺序理清了,拿写法也是相当人性化,就按照执行顺序来写就行了,好理解,书写时也符合我们的思维逻辑。

文末总结

役に立たないように見えるかもしれませんが、実際には非常に便利です。
存在は合理的
逆に、どんなに強い人でも、すべてをカバーすることはできません。自分の欠点を受け入れることで、自分を強くすることができます。やった!あなたはどうですか[犬]

おすすめ

転載: juejin.im/post/7102691477955805191