سؤال
لا بد أنني أبحث في 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 بعد أن يقوم بتجميع السجلات.
مراجع
ويستخدم 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
وربما تكون مجرد أن موضوع "أين" هو على التوالي، في حين أن موضوع "وجود" هو مجموعة. هل أنا على حق؟