سؤال

لا بد أنني أبحث في Google بطريقة خاطئة أو أنني أواجه لحظة غبية في الوقت المناسب.

ما الفرق بين HAVING و WHERE في SQL SELECT إفادة؟

يحرر:لقد حددت إجابة ستيفن على أنها الإجابة الصحيحة لأنها تحتوي على جزء أساسي من المعلومات على الرابط:

متى GROUP BY هو ليس مستخدما، HAVING يتصرف مثل أ WHERE بند

الوضع الذي رأيته WHERE في لم يكن لديك GROUP BY وهذا هو المكان الذي بدأت فيه حيرتي.بالطبع، حتى تعرف ذلك، لا يمكنك تحديده في السؤال.

شكرا جزيلا لجميع الإجابات التي كانت مفيدة للغاية.

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

وبصعوبات يحدد حالة البحث عن   جماعة أو دالة تجميع المستخدمة في عبارة SELECT.

<وأ href = "http://blog.sqlauthority.com/2007/07/04/sql-server-definition-comparison-and-difference-between-having-and-where-clause/" يختلط = " noreferrer "> المصدر

نصائح أخرى

وفبعد أن: يستخدم لفحص الظروف <م> بعد تجميع يحدث
. المكان: ويستخدم للتحقق الظروف <م> قبل تجميع يحدث

وهذا الرمز:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City

ويعطيك جدول كافة المدن في MA وعدد من العناوين في كل مدينة.

وهذا الرمز:

select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5

ويعطيك جدول المدن في MA مع أكثر من 5 عناوين وعدد من العناوين في كل مدينة.

وعدد فارق واحد بالنسبة لي: إذا تمت إزالة HAVING من لغة SQL ثم فإن الحياة تستمر أكثر أو أقل كما كان من قبل. بالتأكيد، سوف تحتاج إلى الاستفسارات الأقلية إلى إعادة صياغة باستخدام جدول مشتقة، CTE، وما إلى ذلك ولكنها ستكون يمكن القول أسهل للفهم والمحافظة نتيجة لذلك. ربما لن تحتاج إلى رمز محسن البائعين إلى إعادة صياغة لحساب هذا، مرة أخرى فرصة للتحسين في هذه الصناعة.

والآن ينظر للحظة إزالة WHERE من اللغة. وهذا من شأنه الوقت الغالبية <م> من الاستعلامات في وجود حاجة إلى إعادة صياغة دون بناء بديل واضح. سوف المبرمجون ان تحصل على مثل الإبداعي انضمام الداخلية إلى جدول المعروف لاحتواء واحد بالضبط صف (على سبيل المثال DUAL في أوراكل) باستخدام شرط ON لمحاكاة شرط WHERE مسبق. ان مثل هذه المنشآت يكون مفتعلة. سيكون من الواضح أن هناك شيئا ما كان مفقودا من اللغة وأن الوضع سيكون أسوأ نتيجة لذلك.

وTL، DR نحن قد تفقد HAVING غدا، وسوف تكون الأمور ليس أسوأ، وربما أفضل، ولكن الشيء نفسه لا يمكن أن يقال عن WHERE

.

ومن الإجابات هنا، يبدو أن العديد من قوم لا يدركون أن الشرط HAVING يمكن استخدامها دون شرط GROUP BY. في هذه الحالة، يتم تطبيق شرط HAVING إلى التعبير الجدول بأكمله ويتطلب أن الثوابت الوحيدة تظهر في بند SELECT. عادة شرط HAVING ستشمل الركام.

وهذا هو أكثر فائدة مما يبدو. على سبيل المثال، النظر في هذا الاستعلام لاختبار ما إذا كان العمود name هي فريدة من نوعها لجميع القيم في T:

SELECT 1 AS result
  FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );

وهناك اثنين فقط من النتائج الممكنة: إذا كان شرط HAVING هو الصحيح فإن النتيجة تكون مع صف واحد يحتوي على 1 قيمة، وإلا فإن النتيجة ستكون مجموعة فارغة

وتمت إضافة بند الحاجة إلى SQL WHERE لأن الكلمة لا يمكن استخدامها مع دالات التجميع.

وتحقق من هذا w3schools صلة للحصول على مزيد من المعلومات

وبناء الجملة:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

واستعلام مثل هذا:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

... يمكن إعادة كتابة باستخدام جدول مشتقة (وإهمال HAVING) مثل هذا:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

الفرق بين الاثنين هو في العلاقة مع جملة GROUP BY:

  • أين يأتي قبل GROUP BY؛تقوم SQL بتقييم جملة WHERE قبل أن تقوم بتجميع السجلات.

  • يأتي HAVING بعد GROUP BY؛يقوم SQL بتقييم HAVING بعد أن يقوم بتجميع السجلات.

select statement diagram

مراجع

ويستخدم HAVING عند استخدام على تجميع مثل GROUP BY.

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

WHERE يطبق الحصر على مجموعة إرجاعها بواسطة SQL. ويستخدم oeprations تعيين المدمج في SQL والفهارس، وبالتالي هي اسرع وسيلة لتصفية مجموعات النتائج. دائما استخدم WHERE كلما أمكن ذلك.

وبصعوبات هو ضروري لبعض مرشحات الكلية. فإنه بتصفية الاستعلام بعد SQL واستردادها، وتجميعها، وفرز النتائج. ولذلك، فمن أبطأ بكثير من أين وينبغي تجنبها إلا في الحالات التي تتطلب ذلك.

وSQL Server سيتم تتيح لك الابتعاد باستخدام بصعوبات حتى عندما أين سيكون أسرع بكثير. لا تفعل ذلك.

WHERE لا تعمل بند لدالات التجميع
يعني: يجب عدم استخدام مثل هذه المكافأة: اسم الجدول

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

وهنا بدلا من استخدام جملة WHERE لديك لاستخدام بصعوبات ..

ودون استخدام GROUP BY شرط، بعد أن الشرط يعمل تماما كما جملة WHERE

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200  

الفرق ب / ث WHERE و HAVING بند:

الفرق الرئيسي بين WHERE و HAVING الشرط هو، WHERE يستخدم لعمليات الصف و HAVING يستخدم لعمليات العمود.

لماذا نحتاج HAVING بند؟

كما نعلم، لا يمكن تنفيذ الوظائف التجميعية إلا على الأعمدة، لذلك لا يمكننا استخدام الوظائف التجميعية فيها WHERE بند.ولذلك، فإننا نستخدم وظائف التجميع في HAVING بند.

متى GROUP BY لا يستخدم، و WHERE و HAVING الجمل متساوية في الأساس.

رغم ذلك، متى GROUP BY يستخدم:

  • ال WHERE يتم استخدام العبارة لتصفية السجلات من النتيجة.يحدث التصفية قبل إجراء أي مجموعات.
  • ال HAVING يتم استخدام البند لتصفية القيم من مجموعة (أي ، للتحقق من الظروف بعد إجراء التجميع في مجموعات).

المصدر من هنا

وكان لي مشكلة وتبين فرق آخر بين WHERE وHAVING. إلا أنه لا يتصرف بنفس الطريقة على أعمدة فهرستها.

وWHERE my_indexed_row = 123 سوف تظهر الصفوف وتلقائيا تنفيذ "ASC ORDER" في صفوف فهرستها أخرى.

وHAVING my_indexed_row = 123 يظهر كل شيء من أقدم "إدراج" صف إلى أحدث واحد، لا الطلب.

إحدى الطرق للتفكير في الأمر هي أن عبارة "الوجود" هي عامل تصفية إضافي لعبارة "حيث".

أ أين يتم استخدام جملة لتصفية السجلات من النتيجة.يتم إجراء التصفية قبل إجراء أية مجموعات.أ نأخذ يتم استخدام العبارة لتصفية القيم من المجموعة

في استعلام الكلي، (أي استفسار أين يتم استخدام الدالة التجميعية) المسندات في حيث يتم تقييم الشرط قبل يتم إنشاء مجموعة نتائج وسيطة مجمعة،

وتطبق

ويسند في بند الحاجة إلى النتيجة الإجمالية تعيين بعد تم إنشاؤها. هذا هو السبب في ظروف الأصلية على القيم الإجمالية يجب أن توضع في وجود الشرط، وليس في بند أين و لماذا يمكنك استخدام الأسماء المستعارة المحددة في الفقرة الاختيار في وجود شرط، ولكن ليس في جملة WHERE.

WHERE يستخدم بند لمقارنة القيم في الجدول الأساسي، في حين يمكن استخدام جملة HAVING لتصفية نتائج دالات التجميع في مجموعة نتائج الاستعلام انقر هنا !

وأنا جدوى من وجود لتقييد استعلام يستند على نتائج دالة تجميع. E.G. حدد * في مجموعة blahblahblah من شيء وجود عدد (شيء)> 0

هنا .

<اقتباس فقرة>   

ومعيار SQL يتطلب أن وجود   يجب أن تشير الأعمدة الوحيدة في   GROUP BY بند أو الأعمدة المستخدمة في   دالات التجميع

وبدلا من جملة WHERE التي يتم تطبيقها على صفوف قاعدة البيانات

أثناء العمل في مشروع، كان هذا أيضًا سؤالي.وكما ذكر أعلاه، فإن نأخذ يتحقق من الحالة في نتيجة الاستعلام التي تم العثور عليها بالفعل.لكن أين مخصص للتحقق من الحالة أثناء تشغيل الاستعلام.

واسمحوا لي أن أعطي مثالا لتوضيح ذلك.لنفترض أن لديك جدول قاعدة بيانات مثل هذا.

جدول المستخدم {معرف المستخدم، حقل التاريخ، الدخل اليومي int }

لنفترض أن الصفوف التالية موجودة في الجدول:

1, 2011-05-20, 100

1, 2011-05-21, 50

1, 2011-05-30, 10

2, 2011-05-30, 10

2, 2011-05-20, 20

والآن نريد الحصول على useridرمل sum(dailyincome) لمن sum(dailyincome)>100

إذا كتبنا:

حدد userId ، sum (GainaIncome) من Usertable حيث SUM (SAMEINCOME)> 100 مجموعة من قبل userId

سيكون هذا خطأ.الاستعلام الصحيح سيكون:

حدد userId ، sum (GainaIncome) من Usertable Group بواسطة userId له SUM (DailainIncome)> 100

وربما تكون مجرد أن موضوع "أين" هو على التوالي، في حين أن موضوع "وجود" هو مجموعة. هل أنا على حق؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top