• توابع جمع SQL. گروه بندی در SQL: GROUP BY، HAVING Clauses و Aggregate Functions

    با مقدار ستون نظم و انضباط . ما 4 گروه دریافت می کنیم که می توانیم مقادیر گروهی مانند تعداد تاپل ها در گروه، حداکثر یا حداقل مقدار ستون Score را برای آنها محاسبه کنیم. جدول 5.7. توابع جمع
    تابع نتیجه
    شمردن تعداد سطرها یا مقادیر فیلد غیر خالی که پرس و جو انتخاب کرده است
    جمع مجموع تمام مقادیر انتخابی یک فیلد معین
    AVG میانگین حسابی همه مقادیر انتخاب شده در یک فیلد مشخص
    MIN کوچکترین مقدار از تمام مقادیر انتخاب شده برای این فیلد
    حداکثر بزرگترین مقدار از تمام مقادیر انتخاب شده برای این فیلد
    R1
    نام و نام خانوادگی انضباط مقطع تحصیلی
    گروه 1 پتروف F.I. پایگاه داده 5
    سیدوروف K. A. پایگاه داده 4
    میرونوف A.V. پایگاه داده 2
    استپانووا K. E. پایگاه داده 2
    کریلوا تی اس. پایگاه داده 5
    ولادیمیروف V. A. پایگاه داده 5
    گروه 2 سیدوروف K. A. نظریه اطلاعات 4
    استپانووا K. E. نظریه اطلاعات 2
    کریلوا تی اس. نظریه اطلاعات 5
    میرونوف A.V. نظریه اطلاعات خالی
    گروه 3 تروفیموف P. A. شبکه و مخابرات 4
    ایوانووا E. A. شبکه و مخابرات 5
    Utkina N.V. شبکه و مخابرات 5
    گروه 4 ولادیمیروف V. A. زبان انگلیسی 4
    تروفیموف P. A. زبان انگلیسی 5
    ایوانووا E. A. زبان انگلیسی 3
    پتروف F.I. زبان انگلیسی 5

    توابع جمعمانند نام فیلدها در دستور SELECT استفاده می شود، با یک استثنا: نام فیلد را به عنوان آرگومان می گیرند. فقط فیلدهای عددی را می توان با توابع SUM و AVG استفاده کرد. هر دو فیلد عددی و کاراکتری را می توان با توابع COUNT، MAX و MIN استفاده کرد. هنگامی که با فیلدهای کاراکتر استفاده می شود، MAX و MIN آنها را به معادل ASCII خود ترجمه کرده و آنها را به صورت پردازش می کنند. به ترتیب حروف الفبا. برخی از DBMS ها به توده های تو در تو اجازه می دهند، اما این یک انحراف از استاندارد ANSI است، با همه پیامدهای آن.

    برای مثال می توانید تعداد دانش آموزانی که در هر رشته امتحان داده اند را محاسبه کنید. برای انجام این کار، باید یک کوئری گروه بندی شده توسط فیلد «موضوع» اجرا کنید و در نتیجه نام رشته و تعداد ردیف های گروه را برای این رشته نمایش دهید. استفاده از کاراکتر * به عنوان آرگومان COUNT تابعبه معنی شمارش تمام ردیف های یک گروه است.

    SELECT R1.Discipline، COUNT(*) FROM R1 GROUP BY R1.Discipline

    نتیجه:

    اگر بخواهیم تعداد دانش آموزانی را که در هر رشته ای امتحان داده اند بشماریم، قبل از گروه بندی باید مقادیر null را از نسبت اصلی حذف کنیم. در این حالت درخواست به صورت زیر خواهد بود:

    نتیجه را می گیریم:

    در این مورد، خط با دانش آموز

    میرونوف A.V. نظریه اطلاعات خالی

    قبل از گروه بندی در مجموعه تاپل ها قرار نمی گیرد، بنابراین تعداد تاپل ها در گروه برای نظم و انضباط " نظریه اطلاعات" 1 کمتر خواهد بود.

    قابل بکارگیری است توابع جمعهمچنین بدون عملیات پیش گروه بندی که در این صورت کل رابطه به عنوان یک گروه در نظر گرفته می شود و برای این گروه می توان یک مقدار برای هر گروه محاسبه کرد.

    با مراجعه مجدد به پایگاه داده "Session" (جدول R1، R2، R3)، تعداد امتحانات با موفقیت را دریافت می کنیم:

    این البته با انتخاب یک فیلد متفاوت است، زیرا صرف نظر از تعداد ردیف‌های جدول، همیشه یک مقدار برگردانده می‌شود. بحث و جدل توابع جمعمی تواند ستون های جداول جداگانه ای وجود داشته باشد. اما برای محاسبه مثلاً تعداد مقادیر مختلف یک ستون خاص در یک گروه، باید از کلمه کلیدی DISTINCT به همراه نام ستون استفاده کنید. بیایید تعداد نمرات دریافتی مختلف در هر رشته را محاسبه کنیم:

    نتیجه:

    نتیجه می تواند شامل یک مقدار فیلد گروه بندی و چندین عدد باشد توابع جمعو چندین فیلد را می توان در شرایط گروه بندی استفاده کرد. در این حالت، گروه ها بر اساس مجموعه ای از فیلدهای گروه بندی مشخص شده تشکیل می شوند. عملیات انبوه را می توان برای پیوستن به چندین جدول منبع اعمال کرد. به عنوان مثال، بیایید این سوال را مطرح کنیم: برای هر گروه و هر رشته، تعداد افرادی که امتحان را با موفقیت پشت سر گذاشتند و میانگین نمره آن رشته را تعیین کنید.

    نتیجه:

    ما نمی توانیم استفاده کنیم توابع جمعدر عبارت WHERE، زیرا محمول ها بر حسب یک ردیف ارزیابی می شوند و توابع جمع- از نظر گروه های ردیف.

    عبارت GROUP BY به شما این امکان را می دهد که زیرمجموعه ای از مقادیر را در یک فیلد خاص بر حسب فیلد دیگر تعریف کنید و یک تابع تجمیع را به زیر مجموعه اعمال کنید. این امکان ترکیب فیلدها و توابع جمعدر یک بند SELECT. توابع جمعمی تواند هم در بیان خروجی نتایج ردیف SELECT و هم در بیان شرایط پردازش برای گروه های تشکیل شده HAVING استفاده شود. در این حالت، هر تابع مجموع برای هر گروه انتخاب شده محاسبه می شود. مقادیر حاصل از محاسبه توابع جمع، می تواند برای نمایش نتایج مربوطه یا شرطی کردن انتخاب گروه ها استفاده شود.

    بیایید یک پرس و جو بسازیم که گروه هایی را نشان دهد که در آنها بیش از یک دس در یک رشته در امتحانات دریافت شده است:

    در آینده، به عنوان مثال، ما نه با پایگاه داده "Session"، بلکه با پایگاه داده "Bank"، متشکل از یک جدول F، کار خواهیم کرد که رابطه F را حاوی اطلاعات مربوط به حساب ها در شعب یک بانک خاص ذخیره می کند:

    F = (N، نام کامل، شعبه، تاریخ باز، تاریخ بسته، موجودی)؛ Q = (شعبه، شهر)؛

    زیرا بر این اساس می توان کار را با توابع جمع و گروه بندی واضح تر نشان داد.

    برای مثال، فرض کنید می خواهیم کل موجودی حساب ها را در شعب پیدا کنیم. شما می توانید با انتخاب SUM(Balance) از جدول برای هر شاخه، یک پرس و جو جداگانه برای هر یک از آنها ایجاد کنید. با این حال، GROUP BY همه آنها را در یک دستور قرار می دهد:

    SELECT Branch, SUM(Balance) FROM F GROUP BY Branch;

    GROUP BY اعمال می شود توابع جمعبه طور مستقل برای هر گروهی که با مقدار قسمت Branch تعریف شده است. این گروه از ردیف هایی با همان مقدار در قسمت Branch تشکیل شده است و



    • توابع جمعمانند نام فیلدها در دستور SELECT استفاده می شود، با یک استثنا: نام فیلد را به عنوان آرگومان می گیرند. با امکانات جمعو AVGفقط از فیلدهای عددی می توان استفاده کرد. با امکانات COUNT، MAX و MINهر دو فیلد عددی و کاراکتری را می توان استفاده کرد. هنگامی که با فیلدهای کاراکتر استفاده می شود حداکثرو MINآنها را به معادل ASCII خود ترجمه می کند و آنها را به ترتیب حروف الفبا پردازش می کند. برخی از DBMS ها به توده های تو در تو اجازه می دهند، اما این یک انحراف از استاندارد ANSI است، با همه پیامدهای آن.


    برای مثال می توانید تعداد دانش آموزانی که در هر رشته امتحان داده اند را محاسبه کنید. برای انجام این کار، باید یک پرس و جو گروه بندی شده توسط فیلد "موضوع" را اجرا کنید و در نتیجه نام رشته و تعداد ردیف های گروه را برای این رشته نمایش دهید. استفاده از کاراکتر * به عنوان آرگومان برای تابع COUNT به معنای شمارش تمام ردیف‌های گروه است.

    R1 را انتخاب کنید. نظم و انضباط، COUNT(*)

    GROUP BY R1.

    نتیجه:


    SELECT R1.Discipline، COUNT (*)

    WHERE R1. ارزیابی پوچ نیست

    GROUP BY R1.

    نتیجه:


    قبل از گروه بندی در مجموعه تاپل ها قرار نمی گیرد، بنابراین تعداد تاپل ها در گروه برای رشته "نظریه اطلاعات" 1 کمتر خواهد بود.

    اگر پرس و جو به روش زیر نوشته شده باشد، نتیجه مشابهی به دست می آید:

    R1 را انتخاب کنید. نظم و انضباط، COUNT (R1. امتیاز)

    گروه توسط R1. انضباط؛

    تابع COUNT (ATTRIBUT NAME)بر خلاف یک تابع، تعداد مقادیر تعریف شده را در یک گروه می شمارد شمردن(*)،که تعداد ردیف های یک گروه را می شمارد. در واقع، در گروه با رشته "نظریه اطلاعات" 4 خط وجود دارد، اما فقط 3 مقدار مشخص از ویژگی "ارزیابی".


    قوانینی برای مدیریت مقادیر NULL در توابع مجموع

    اگر هر یک از مقادیر در یک ستون برابر باشد خالیهنگام محاسبه نتیجه تابع، آنها حذف می شوند.

    اگر همه مقادیر در یک ستون برابر باشند خالی، آن حداکثر حداقل میانگین مجموع = تهی، شمارش = 0 (صفر).

    اگر جدول خالی است، count(*) = 0 .

    توابع تجمیع را می توان بدون عملیات پیش گروه بندی نیز استفاده کرد که در این صورت کل رابطه به عنوان یک گروه در نظر گرفته می شود و برای هر گروه می توان یک مقدار را برای این گروه محاسبه کرد.

    قوانینی برای تفسیر توابع مجموع

    توابع مجموع را می توان در لیست خروجی گنجاند و سپس آنها را در کل جدول اعمال کرد.

    حداکثر (امتیاز) را از R1 انتخاب کنیدحداکثر نمره را در جلسه می دهد.

    SUM (امتیاز) را از R1 انتخاب کنیدمجموع همه رتبه‌بندی‌ها را برای جلسه ارائه می‌دهد.

    AVG (امتیاز) را از R1 انتخاب کنیدنمره متوسط ​​را در کل جلسه می دهد.


    2 نتیجه: "width="640"

    با مراجعه مجدد به پایگاه داده "Session" (جدول R1)، تعداد امتحانات با موفقیت را دریافت می کنیم:

    انتخاب تعداد(*) اجاره شده است _ امتحانات

    WHERE امتیاز 2;

    نتیجه:


    توابع جمع می توانند ستون های جداگانه جداول را به عنوان آرگومان بگیرند. برای محاسبه، به عنوان مثال، تعداد مقادیر متمایز برای یک ستون خاص در یک گروه، باید از کلمه کلیدی DISTINCT همراه با نام ستون استفاده شود. بیایید تعداد نمرات دریافتی مختلف در هر رشته را محاسبه کنیم:

    R1.Discipline، COUNT (امتیاز R1 متمایز) را انتخاب کنید

    WHERE R1. ارزیابی پوچ نیست

    GROUP BY R1.

    نتیجه:


    اگر شرط صریح در قسمت WHERE حذف شود، همین نتیجه به دست می آید، در این صورت پرس و جو به صورت زیر خواهد بود:

    R1 را انتخاب کنید. نظم و انضباط، COUNT (امتیاز R1 متمایز)

    گروه توسط R1. انضباط؛

    تابع COUNT (امتیاز R1 متمایز)فقط قطعی به حساب می آید مختلفارزش های.

    به منظور به دست آوردن در این مورد نتیجه مطلوب، لازم است یک تبدیل نوع داده اولیه ستون "امتیاز" انجام شود و آن را به یک نوع واقعی ریخته و سپس نتیجه محاسبه میانگین یک عدد صحیح نخواهد بود. در این حالت درخواست به صورت زیر خواهد بود:


    2 گروه توسط R2. گروه، R1. انضباط؛ در اینجا تابع CAST() ستون Score را به یک نوع داده معتبر تبدیل می کند. "width="640"

    R2.Group، R1.Subject،Count(*) را به عنوان Total، AVG(cast(امتیاز به صورت اعشاری(3،1))) را به عنوان Average_Score انتخاب کنید.

    از R1، R2

    جایی که R1. نام کامل = R2. نام کامل و R1. ارزیابی پوچ نیست

    و R1. درجه 2

    گروه بر اساس R2. گروه، R1. انضباط؛

    در اینجا تابع قالب()ستون Score را به یک نوع داده معتبر تبدیل می کند.


    شما نمی توانید از توابع جمع در یک عبارت WHERE استفاده کنید زیرا شرایط در این بخش بر حسب یک ردیف ارزیابی می شود، در حالی که توابع جمع بر اساس گروه هایی از ردیف ها ارزیابی می شوند.

    عبارت GROUP BY به شما این امکان را می دهد که زیرمجموعه ای از مقادیر را در یک فیلد خاص بر حسب فیلد دیگر تعریف کنید و یک تابع تجمیع را به زیر مجموعه اعمال کنید. این امکان ترکیب فیلدها و توابع انباشته در یک عبارت SELECT را فراهم می کند. توابع جمع را می توان هم در بیان خروجی نتایج ردیف SELECT و هم در بیان شرط پردازش گروه های HAVING تشکیل شده استفاده کرد. در این حالت، هر تابع مجموع برای هر گروه انتخاب شده محاسبه می شود. مقادیر به دست آمده در محاسبه توابع جمع را می توان برای نمایش نتایج مربوطه یا شرایط انتخاب گروه استفاده کرد.

    بیایید یک پرس و جو بسازیم که گروه هایی را نشان دهد که در آنها بیش از یک دس در یک رشته در امتحانات دریافت شده است:


    1 نتیجه: "width="640"

    R2 را انتخاب کنید. گروه

    از R1، R2

    WHERE R1. نام کامل = R2. نام کامل و

    R1.امتیاز = 2

    GROUP BY R2.Group, R1.Discipline

    داشتن تعداد(*) 1;

    نتیجه:


    ما یک پایگاه داده "بانک" داریم که متشکل از یک جدول F است که رابطه F را ذخیره می کند و حاوی اطلاعات حساب های موجود در شعب یک بانک خاص است:

    کل موجودی حساب ها را در شعب پیدا کنید. می توانید با انتخاب SUM (Remainder) از جدول برای هر شاخه، یک پرس و جو جداگانه برای هر یک از آنها ایجاد کنید، اما عملیات GROUP BY همه آنها را در یک دستور قرار می دهد:

    انتخاب کنید شاخه , SUM( باقی مانده )

    گروه به شاخه;

    دسته بندی بر اساستوابع مجموع را به طور مستقل برای هر گروهی که با مقدار فیلد Branch مشخص شده است اعمال می کند. این گروه از ردیف هایی با همان مقدار در قسمت Branch و تابع تشکیل شده است جمعبرای هر گروه به طور جداگانه اعمال می شود، یعنی کل موجودی حساب به طور جداگانه برای هر شعبه محاسبه می شود. مقدار فیلدی که برای آن اعمال می شود دسته بندی بر اساس، طبق تعریف فقط یک مقدار در هر گروه خروجی دارد، درست مانند نتیجه یک تابع مجموع.


    5000; آرگومان های عبارت HAVING از همان قوانینی پیروی می کنند که در عبارت SELECT که در آن از GROUP BY استفاده شده است. آنها باید یک مقدار در هر گروه خروجی داشته باشند. "width="640"

    فرض کنید فقط شعبه هایی را انتخاب می کنید که کل موجودی حساب آنها بیش از 5000 دلار باشد و همچنین کل موجودی شعب انتخاب شده را نیز انتخاب کنید. برای نمایش شعب با کل موجودی بیش از 5000 دلار، از عبارت HAVING استفاده کنید. عبارت HAVING معیارهای مورد استفاده برای حذف گروه‌های خاص از خروجی را مشخص می‌کند، درست مانند عبارت WHERE برای ردیف‌های جداگانه.

    دستور صحیح این خواهد بود:

    SELECT شعبه، SUM (موجودی)

    دسته بندی بر اساس شاخه

    داشتن مجموع ( باقی مانده ) 5 000;

    استدلال در یک جمله داشتنمشروط به قوانین مشابه در پیشنهاد انتخاب کنیدکه در آن استفاده می شود دسته بندی بر اساس. آنها باید یک مقدار در هر گروه خروجی داشته باشند.


    دستور زیر ممنوع خواهد شد:

    SELECT شعبه، جمع (موجودی)

    گروه به شعبه

    تاریخ افتتاحیه = 27/12/2004 ;

    رشته تاریخ افتتاحیهنمی توان در یک جمله استفاده کرد داشتن، زیرا می تواند بیش از یک مقدار در هر گروه خروجی داشته باشد. برای جلوگیری از این وضعیت، پیشنهاد داشتنفقط باید به مجموع ها و فیلدهای انتخاب شده اشاره داشته باشد دسته بندی بر اساس. در دسترس راه درستدرخواست فوق را مطرح کنید:

    SELECT شعبه، جمع (موجودی)

    WHERE OpenDate = '27/12/2004'

    گروه به شاخه;


    معنی درخواست داده شدهبعدی: جمع موجودی هر شعبه از حساب های افتتاح شده در 27 دسامبر 2004 را بیابید.

    همانطور که قبلاً گفته شد، HAVING فقط می تواند آرگومان هایی بگیرد که در هر گروه خروجی یک مقدار دارند. در عمل، ارجاع به توابع جمع رایج ترین هستند، اما فیلدهایی که با استفاده از GROUP BY انتخاب می شوند نیز معتبر هستند. به عنوان مثال، ما می خواهیم کل موجودی حساب های شعب در سن پترزبورگ، پسکوف و اوریوپینسک را ببینیم:

    SELECT شعبه، SUM (موجودی)

    از F,Q

    WHERE F. Branch = Q. Branch

    گروه به شعبه

    داشتن شعبه در ("سن پترزبورگ"، "پسکوف"، "اوریوپینسک")؛

    100000; اگر موجودی کل بیش از 100000 دلار باشد، آن را در رابطه حاصل می بینیم، در غیر این صورت یک رابطه خالی خواهیم داشت. "width="640"

    بنابراین، در عبارات حسابی محمول های موجود در بند انتخاب عبارت HAVING، فقط می توان از مشخصات ستون هایی که به عنوان ستون های گروه بندی در بند GROUP BY مشخص شده اند، استفاده کرد. ستون‌های باقی‌مانده را فقط می‌توان در مشخصات توابع مجموع COUNT، SUM، AVG، MIN و MAX مشخص کرد که به ارزیابی می‌شوند. این موردمقداری مجموع برای کل گروه سطرها. نتیجه اجرای بخش HAVING یک جدول گروه بندی شده است که فقط شامل آن دسته از ردیف هایی است که نتیجه محاسبه شرط انتخاب در قسمت HAVING برای آنها TRUE است. به طور خاص، اگر یک عبارت HAVING در یک پرس و جو وجود داشته باشد که حاوی GROUP BY نباشد، نتیجه اجرای آن یا یک جدول خالی یا نتیجه اجرای بخش های قبلی عبارت جدول است که به عنوان یک گروه در نظر گرفته می شود. بدون گروه بندی ستون ها یک مثال را در نظر بگیرید. فرض کنید می خواهیم خروجی بگیریم مبلغ کلموجودی برای همه شعبه ها، اما فقط در صورتی که بیش از 100000 دلار باشد. در این صورت، کوئری ما شامل عملیات گروه بندی نخواهد بود، بلکه شامل یک بخش HAVING خواهد بود و به شکل زیر خواهد بود:

    SELECT SUM( باقی مانده )

    داشتن مجموع( باقی مانده ) 100 000;

    اگر موجودی کل بیش از 100000 دلار باشد، آن را در رابطه حاصل می بینیم، در غیر این صورت یک رابطه خالی خواهیم داشت.


    استفاده از توابع جمع

    SQL بسیاری از توابع داخلی از دسته‌های مختلف را تعریف می‌کند، که در میان آن‌ها جایگاه ویژه‌ای را توابع انبوهی اشغال می‌کنند که بر روی مقادیر ستون‌های چند ردیف عمل می‌کنند و یک مقدار واحد را برمی‌گردانند. آرگومان های توابع جمع می توانند هم ستون های جداول و هم نتایج عبارات روی آنها باشند. توابع مجموع خود را می توان در سایر عبارات حسابی گنجاند. جدول زیر متداول‌ترین توابع جمع‌آوری استاندارد مورد استفاده را فهرست می‌کند.


    فرمت کلی یک تابع مجموع یکنواخت به شرح زیر است:

    function_name([ALL | DISTINCT] عبارت)

    جایی که DISTINCT مشخص می کند که تابع باید فقط مقادیر متمایز آرگومان را در نظر بگیرد و ALL همه مقادیر از جمله موارد تکراری را مشخص می کند (این پیش فرض است). به عنوان مثال، تابع AVG با کلمه کلیدی DISTINCT برای ردیف های ستون با مقادیر 1، 1، 1 و 3، 2 را برمی گرداند و اگر کلمه کلیدی ALL وجود داشته باشد، 1.5 را برمی گرداند.

    توابع جمع در بندهای SELECT و HAVING استفاده می شوند. در اینجا ما به کاربرد آنها در بند SELECT نگاه خواهیم کرد. در این حالت، عبارت در آرگومان تابع به تمام ردیف‌های جدول ورودی عبارت SELECT اعمال می‌شود. همچنین، نمی‌توانید از توابع جمع و ستون‌های جدول (یا عبارات با آنها) در یک عبارت SELECT استفاده کنید، مگر اینکه یک بند GROUP BY داشته باشید، که در بخش بعدی به بررسی آن خواهیم پرداخت.

    تابع COUNT دو فرمت دارد. در حالت اول، تعداد ردیف‌های جدول ورودی برگردانده می‌شود، در حالت دوم، تعداد مقادیر آرگومان در جدول ورودی:

    • شمردن(*)
    • COUNT (بیان)

    ساده‌ترین راه برای استفاده از این تابع، شمارش تعداد ردیف‌های یک جدول (اعم از همه یا آن‌هایی که یک شرط معین را دارند) است. برای این، اولین نوع نحو استفاده می شود.

    Query: تعداد انواع محصولاتی که اطلاعات مربوط به آنها در پایگاه داده موجود است.

    COUNT(*) AS را انتخاب کنید "تعداد محصولات"

    از محصول

    در نوع دوم نحو تابع COUNT، نام یک ستون می تواند به عنوان آرگومان استفاده شود. در این حالت، تعداد تمام مقادیر موجود در این ستون از جدول ورودی یا فقط موارد غیر تکراری (هنگام استفاده از کلمه کلیدی DISTINCT) شمارش می شود.

    Query: تعداد نام‌های متمایز موجود در جدول مشتری.

    SELECT COUNT (FNAME متمایز)

    از مشتری

    استفاده از سایر توابع مجموع یکپارچه مشابه COUNT است، با این تفاوت که برای توابع MIN و MAX، استفاده از کلمات کلیدی DISTINCT و ALL معنی ندارد. با توابع COUNT، MAX و MIN، می توان از فیلدهای کاراکتر علاوه بر فیلدهای عددی نیز استفاده کرد. اگر آرگومان تابع مجموع حاوی هیچ مقداری نباشد، تابع COUNT 0 و بقیه NULL برمی‌گردانند.

    انتخاب حداکثر (تاریخ سفارش)

    از جانب

    WHERE OrdDate"1.09.2010"

    وظیفه برای کار مستقل: برای انتخاب داده های زیر در پرس و جوهای زبان SQL فرمول بندی کنید:

    • هزینه کل کلیه سفارشات؛
    • تعداد شهرهای متمایز موجود در جدول مشتری.

    چگونه می توانم از تعداد مدل های رایانه شخصی تولید شده توسط یک فروشنده خاص مطلع شوم؟ چگونه می توان میانگین قیمت کامپیوترهایی را که دارای همان قیمت هستند تعیین کرد مشخصات فنی? این و بسیاری از سوالات دیگر مربوط به برخی است اطلاعات آماری، می توانید پاسخ ها را با استفاده از توابع خلاصه (جمع). استاندارد توابع کلی زیر را ارائه می دهد:

    همه این توابع یک مقدار واحد را برمی‌گردانند. در همان زمان، توابع COUNT، MINو حداکثردر حالی که برای هر نوع داده ای اعمال می شود جمعو AVGفقط برای فیلدهای عددی استفاده می شود. تفاوت بین عملکرد شمردن(*)و شمردن(<имя поля>) این است که دومی در هنگام محاسبه مقادیر NULL را در نظر نمی گیرد.

    مثال. حداقل و حداکثر قیمت را برای رایانه های شخصی بیابید:

    مثال. تعداد رایانه های موجود تولید شده توسط سازنده A را بیابید:

    مثال. اگر به کمیت علاقه مند باشیم مدل های مختلفتولید شده توسط سازنده A، سپس پرس و جو را می توان به صورت زیر فرموله کرد (با استفاده از این واقعیت که هر مدل یک بار در جدول Product ثبت شده است):

    مثال. تعداد مدل های مختلف موجود تولید شده توسط سازنده A را بیابید. پرس و جو مشابه مورد قبلی است که در آن باید تعداد کل مدل های تولید شده توسط سازنده A مشخص شود. در اینجا باید تعداد مدل های مختلف را پیدا کنید. در جدول PC (یعنی موجود برای فروش).

    به منظور حصول اطمینان از اینکه در هنگام بدست آوردن شاخص های آماری فقط از مقادیر منحصر به فرد استفاده می شود آرگومان تابع مجموعمی تواند به کار رود پارامتر DISTINCT. یکی دیگر پارامتر ALLپیش فرض است و انتظار دارد که تمام مقادیر بازگشتی را در ستون شمارش کند. اپراتور،

    اگر باید تعداد مدل های PC تولید شده توسط هر یکسازنده، شما باید استفاده کنید GROUP BY پیشنهاد، به صورت نحوی پس از آن دنبال می شود بندهای WHERE.

    GROUP BY پیشنهاد

    GROUP BY پیشنهادبرای تعریف گروه هایی از خطوط خروجی که می توان روی آنها اعمال کرد استفاده می شود توابع انبوه (COUNT، MIN، MAX، AVG و SUM). اگر این بند وجود نداشته باشد و از توابع انبوه استفاده شود، تمام ستون‌ها با نام‌های ذکر شده در انتخاب کنید، باید در آن گنجانده شود توابع جمع، و این توابع برای کل مجموعه سطرهایی که گزاره پرس و جو را برآورده می کنند اعمال خواهند شد. در غیر این صورت، تمام ستون های لیست SELECT، شامل نمی شوددر توابع جمع، باید مشخص شود در بند GROUP BY. در نتیجه، تمام ردیف های خروجی پرس و جو به گروه هایی تقسیم می شوند که با ترکیب مقادیر یکسانی در این ستون ها مشخص می شوند. پس از آن، توابع جمع برای هر گروه اعمال می شود. توجه داشته باشید که برای GROUP BY، تمام مقادیر NULL برابر در نظر گرفته می شوند، یعنی. هنگام گروه بندی توسط یک فیلد حاوی مقادیر NULL، همه این ردیف ها در یک گروه قرار می گیرند.
    اگر اگر یک بند GROUP BY وجود داشته باشد، در بند SELECT بدون توابع مجموع، سپس پرس و جو به سادگی یک ردیف از هر گروه را برمی گرداند. این ویژگی به همراه کلمه کلیدی DISTINCT می تواند برای حذف ردیف های تکراری در مجموعه نتایج استفاده شود.
    یک مثال ساده را در نظر بگیرید:
    مدل SELECT، COUNT(model) AS Qty_model، AVG(price) AS Avg_price
    از کامپیوتر
    GROUP BY مدل;

    در این کوئری برای هر مدل رایانه شخصی تعداد و میانگین هزینه آنها مشخص می شود. تمام خطوط با همان مقادیرمدل (شماره مدل) یک گروه را تشکیل می دهد و خروجی SELECT تعداد مقادیر و مقادیر متوسط ​​قیمت را برای هر گروه محاسبه می کند. نتیجه پرس و جو جدول زیر خواهد بود:
    مدل Qty_model میانگین_قیمت
    1121 3 850.0
    1232 4 425.0
    1233 3 843.33333333333337
    1260 1 350.0

    اگر ستونی با تاریخ در SELECT وجود داشت، می توان این شاخص ها را برای هر تاریخ خاص محاسبه کرد. برای انجام این کار، باید تاریخ را به عنوان یک ستون گروه بندی اضافه کنید، و سپس توابع جمع برای هر ترکیبی از مقادیر (مدل-تاریخ) محاسبه می شود.

    چندین خاص وجود دارد قوانین برای اجرای توابع جمع:

    • اگر در نتیجه درخواست هیچ ردیفی دریافت نشد(یا بیش از یک ردیف برای این گروه)، پس هیچ داده اولیه برای محاسبه هیچ یک از توابع جمع وجود ندارد. در این حالت، نتیجه اجرای COUNT توابع صفر و نتیجه همه توابع دیگر NULL خواهد بود.
    • بحث و جدلتابع کل خود نمی تواند شامل توابع جمع باشد(تابع از تابع). آن ها مثلاً در یک درخواست، دریافت حداکثر مقادیر متوسط ​​غیرممکن است.
    • نتیجه اجرای تابع COUNT می باشد عدد صحیح(INTEGER). سایر توابع انبوه انواع داده های مقادیر پردازش شده را به ارث می برند.
    • اگر هنگام اجرای تابع SUM، نتیجه ای به دست آمد که از حداکثر مقدار نوع داده مورد استفاده فراتر رفت، خطا.

    بنابراین، اگر درخواست شامل نمی شود GROUP BY پیشنهاد می کند، آن توابع جمعگنجانده شده است بند SELECT، روی تمام رشته های پرس و جو به دست آمده اجرا می شوند. اگر درخواست شامل GROUP BY پیشنهاد، هر مجموعه ای از ردیف هایی که دارای مقادیر یکسانی از ستون یا گروه ستون های مشخص شده در هستند پیشنهاد GROUP BY، یک گروه را تشکیل می دهد و توابع جمعبرای هر گروه به طور جداگانه اجرا می شود.

    داشتن پیشنهاد

    اگر بند WHEREسپس یک گزاره برای فیلتر رشته تعریف می کند بند داشتنکاربردی پس از گروه بندیبرای تعریف گروه های فیلتر کننده محمول مشابه بر اساس مقادیر توابع جمع. این بند برای اعتبار سنجی مقادیری که با آنها به دست می آیند مورد نیاز است تابع کلنه از ردیف های جداگانه منبع رکورد تعریف شده در بند FROM، و از گروه هایی از این قبیل خطوط. بنابراین، چنین چکی نمی تواند شامل شود بند WHERE.

    آنها می توانند پردازش گروهی تعمیم یافته مقادیر فیلد را انجام دهند. این کار با استفاده از توابع جمع انجام می شود. توابع مجموع یک مقدار واحد برای کل گروه جدول تولید می کنند. SQL توابع انبوه زیر را ارائه می دهد:

    • شمردن- تعداد ردیف های جدول با مقادیر غیر NULL فیلد مشخص شده به عنوان آرگومان را می شمارد.
    • جمع- مجموع حسابی تمام مقادیر انتخابی فیلد داده شده را محاسبه می کند.
    • AVG- میانگین تمام مقادیر انتخابی فیلد داده شده را نشان می دهد.
    • حداکثر- نمایش می دهد بالاترین ارزشاز تمام مقادیر انتخابی این فیلد.
    • MIN- کوچکترین مقدار از تمام مقادیر انتخاب شده را در فیلد داده شده نمایش می دهد.

      استفاده از توابع جمع

      توابع جمعی مانند نام فیلدها در عبارت SELECT یک پرس و جو استفاده می شوند، با یک استثنا: آنها نام فیلدها را به عنوان آرگومان می گیرند. فقط با فیلدهای عددی می توان استفاده کرد جمعو AVG. با شمردن, حداکثر، و MINهر دو فیلد عددی و کاراکتری را می توان استفاده کرد. هنگامی که با فیلدهای کاراکتر استفاده می شود حداکثرو MINآنها را به معادل ASCII خود ترجمه می کند. این به آن معنا است MINاولی را انتخاب خواهد کرد و حداکثرآخرین مقدار به ترتیب حروف الفبا

      برای یافتن کل میزان فروش در جدول فروش باید عبارت زیر را بنویسیم:

      SELECT SUM(SSsum) FROM Sells

      در نتیجه، دریافت می کنیم:

      این کوئری تعداد مقادیر غیر خالی را در فیلد SNum جدول فروش شمارش کرده است. اگر پرس و جو را به صورت زیر بازنویسی کنیم:

      SELECT COUNT(SDDate) FROM Sells

      سپس در نتیجه دریافت می کنیم:

      COUNT OF SD date
      4

      نتایج پرس و جوی مختلف هنگام محاسبه به ظاهر یک چیز به دست می آید زیرا یکی از مقادیر فیلد SDate دارای مقدار خالی است ( خالی). هنگام استفاده از چنین درخواست هایی مراقب باشید.