Днешната публикация в блога ще се фокусира върху сортирането и групирането в SQL. Това са мощни техники, които ни позволяват да сортираме и групираме нашите данни според нашите нужди. Сортирането ни позволява да подреждаме данните си в определен ред, докато групирането ни позволява да изучаваме подгрупи от нашите данни въз основа на общи атрибути. Както сортирането, така и групирането са подобни на функциите „groupby“ и „sort_values“ в библиотеката pandas на Python. Ако сме запознати с пандите, можем да сравним и контрастираме тези техники със SQL и да придобием по-задълбочено разбиране и за двете.

Тази тема е много практична, така че си помислих защо да не разреша някои проблеми/заявки и да не се науча да сортирам и групирамчрез анализиране на решенията. И така, ще решим някои заявки и ще ги анализираме, за да се научим да сортираме и групираме по.

Ще използваме набор от данни за смартфон за нашия анализ, който има колони като име на марка (текст), модел (текст), цена (цяло число), рейтинг (двойно), наличие на 5G (текст), NFC (текст), IR blaster (текст), марка процесор (текст), брой ядра (двойно), скорост на процесора (двойно), капацитет на батерията (двойно), наличие на бързо зареждане (int), капацитет на RAM (двойно), вътрешна памет (двойно), екран размер (двойно), честота на опресняване (int), брой задни и предни камери (int), операционна система (текст), спецификации на задната и предната камера (двойно), наличност на разширена памет (int), максимална разширена памет (текст) , ширина на разделителна способност (int) и височина на разделителна способност (int).

Ще използваме SQL, за да анализираме този набор от данни и да разрешим някои проблеми. Също така ще използваме сортиране и групиране, за да анализираме данните и да извлечем прозрения.

Да започнем със сортиране на данни.

Да предположим, че имаме набор от данни с колони като име на ученик, възраст и CGPA. Наборът от данни съдържа следните ученици и техните подробности:

Можем да сортираме тези данни въз основа на всяка колона. Например, нека сортираме данните въз основа на колоната CGPA, като редът на сортиране е DESC. Pradeep с CGPA 8.4 ще се появи на върха, последван от Sumit с CGPA 8, след това Anand с CGPA 7.6 и накрая Kajol с CGPA 7.

Забавен факт😅🫵!! Съжаляваме, дами, последната точка от данни са данни за момиче. Humarari betiya към върха kr ri | Humari Chori choro se kam hai ke 😅😅 Нека насърчаваме равенството и всички шеги настрана.

Забележка: Тези данни са само за илюстрация и не знам за реални данни за възраст/CGPA.

По същия начин можем също да сортираме въз основа на възраст, име или дори комбинация от две колони. Сортирането е много полезно, тъй като ни помага да решаваме различни видове проблеми или заявки. Например, ако някой попита кой е най-скъпият телефон в набора от данни за смартфони, можем просто да приложим DESC сортиране в ценовата колона, за да получим най-високата стойност. Този тип проблеми включват намиране на най-горните или най-долните стойности, втората (n-та) най-висока или най-ниска стойност или първите 5 стойности, като се започне от 5-та най-висока стойност и т.н.

Намерете топ 5 телефона на Samsung с най-голям размер на екрана.

Искаме да намерим първите 5 телефона с най-голям размер на екрана, които са от Samsung. За да направим това, първо трябва да настроим база данни, като й дадем име и създадем таблица. След това ще качим данните и ще ги настроим в таблицата.

След като настроим базата данни и създадем таблица чрез качване на данните, ще трябва да филтрираме само редовете, които имат телефони Samsung. Можем да направим това, като използваме клауза WHERE, за да филтрираме редовете, които нямат телефони Samsung. И така, това, което получаваме от тази заявка, са данните само за телефони Samsung.

SELECT * FROM databas_name.table_name
WHERE brand_name = ‘samsung’

Сега имаме нужда от първите 5 телефона с най-голям размер на екрана, така че ще използваме сортиране.

За целта ще използваме клаузата “ORDER BY”, която ще извикаме и ще посочим колоната, въз основа на която искаме да сортираме. Искаме да сортираме въз основа на колоната „размер на екрана“, така че ще посочим това. Също така трябва да уточним дали искаме да сортираме във възходящ ред (ASC) или в низходящ ред (DESC). Тъй като първо искаме най-големия размер на екрана, ще използваме реда DESC.

Когато изпълним тази заявка, ще видим, че всички телефони са сортирани въз основа на размера на екрана им.

SELECT * FROM databas_name.table_name
WHERE brand_name = ‘samsung’
ORDER BY screen_size

Виждаме, че всички телефони са сортирани според размера на екрана, но искаме само първите 5. За това имаме друга клауза, наречена LIMIT. Като използваме LIMIT, трябва да предадем число, което означава броя на редовете, които искаме да получим. Той ще върне този брой редове. Можем да използваме функцията head() в pandas, за да видим първите няколко реда. Ще проучим допълнително LIMIT.

Тъй като искаме да запазим само името и размера на екрана, ще заменим * с model и screen_size, където избираме колоните.

SELECT * FROM databas_name.table_name
WHERE brand_name = ‘samsung’
ORDER BY screen_size DESC LIMIT 5

Намерете топ 10 на Apple телефони с най-голям размер на екрана

SELECT model,screen_size FROM databas_name.table_name
WHERE brand_name = 'apple'
ORDER BY screen_size DESC LIMIT 10

Намерете топ 5 телефона xiaomi с най-висок рейтинг.

SELECT model,screen_size FROM databas_name.table_name
WHERE brand_name = 'xiaomi'
ORDER BY rating DESC limit 5

Намерете топ 7 телефона на Samsung с най-висок рейтинг.

SELECT model,screen_size FROM databas_name.table_name
WHERE brand_name = 'samsung'
ORDER BY rating DESC LIMIT 7

Сортирайте данните на базата на ppi в низходящ ред.

Където „Хоризонтален пиксел“ е броят на хоризонталните пиксели на екрана, „Вертикален пиксел“ е броят на вертикалните пиксели на екрана, а „Диагонал на екрана“ е размерът на диагонала на екрана в инчове.

За да изчислим PPI, използваме формулата, която включва ширината на разделителната способност и размера на екрана на телефона. Използвайки тази формула, можем да изчислим PPI на всички телефони в набора от данни. Ако сортирането не е приложено, можем да сортираме данните с помощта на клаузата ORDER BY. Ако искаме да сортираме данните в низходящ ред, можем да използваме ключовата дума DESC. В този случай създадохме сложна колона и я сортирахме в низходящ ред.

SELECT model,SQRT((resolution_width*resolution_width + resolution_height*resolution_height)/screen_size) AS 'ppi'
FROM databas_name.table_name
ORDER BY ppi DESC

Намерете телефона с 2-ра по големина батерия

Този въпрос е Zakkass! Това, което трябва да направим, е да намерим името на телефона, който има втория най-висок капацитет на батерията. За да направим това, първо сортираме данните въз основа на колоната за капацитет на батерията в низходящ ред

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity DESC

Ние го откроихме в червен цвят, това е резултатът, който искаме.

За да получим втората най-висока стойност след сортиране по капацитет на батерията, можем да използваме клаузата LIMIT с две стойности: x и y. Стойността на x представлява отместването или броя на редовете за пропускане, докато стойността на y представлява броя на редовете, които да се върнат след отместването. Така че в този случай ще зададем x на 1, за да пропуснем първия ред (който има най-висок капацитет на батерията), и y на 1, за да върнем втория ред (който има втория най-голям капацитет на батерията). Заявката ще изглежда така:

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity DESC LIMIT 1,1

Намерете телефона с 3-та най-голяма батерия

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity DESC LIMIT 2,1

намерете телефона с 5-та по големина батерия.

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity DESC LIMIT 4,1

Намерете телефона с 5-та и 6-та най-голяма батерия.

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity DESC LIMIT 4,2

Може би се чудите защо правя толкова много в една колона, но всъщност това, което се случва е, че докато решавам проблема с намирането на телефона с втората по големина батерия, има 13 реда в DESC ред в това изображение. Можете да го проверите отново, ако искате. Останалите изходни изображения също са правилни.

Сега нека направим същото с ASC.

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity ASC

Намерете телефона с 3-та най-ниска батерия.

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity ASC LIMIT 2,1

Намерете телефона с 3-та и 4-та най-ниска батерия.

SELECT model,battery_capacity
FROM databas_name.table_name
ORDER BY  battery_capacity ASC LIMIT 2,2

намерете името и рейтинга на най-лошо оценения телефон на Apple.

за да намерим името и рейтинга на най-лошо оценения телефон на Apple, трябва първо да филтрираме данните само за телефони на Apple. След това можем да сортираме филтрираните данни във възходящ ред въз основа на рейтинга и да вземем първия ред, за да получим най-лошо оценения телефон на Apple.

Ето SQL кода:

SELECT model,rating
FROM databas_name.table_name
WHERE brand_name='apple'
ORDER BY rating ASC LIMIT 1

Сортирайте телефоните по азбучен ред и след това според рейтинга в низходящ ред.

Можем също да сортираме въз основа на две колони като име на марка и рейтинг.

SELECT * FROM databas_name.table_name
ORDER BY brand_name ASC, rating DESC

Трябва да сортираме телефоните по азбучен ред и след това на основата на рейтинг в низходящ ред. Така че първо сортирахме модела по име, така че телефоните, започващи с „a“, бяха първи, след това „b“ и т.н. В първото изображение можем да видим, че всички телефони на Apple са изброени първи, последвани от телефони, сортирани по рейтинг в DESC ред. Във второто изображение виждаме, че можем да анализираме 3 телефона: Asus, Doogee и Google. Ако имаше 2 или повече телефона с едно и също име, можехме също да видим, че имената им са подредени по азбучен ред и оценките им са подредени в DESC ред.

сортирайте телефоните по азбучен ред и след това на базата на цена във възходящ ред.

SELECT * FROM databas_name.table_name
ORDER BY brand_name ASC, price ASC

В първото изображение можем да видим, че най-евтиният телефон на Apple е в горната част и така нататък. Във второто изображение можем да видим, че цената на Nubia първоначално е ниска и след това се увеличава, и същата тенденция може да се види за OnePlus, където цената се увеличава.

сортирайте телефоните по азбучен ред и след това въз основа на цената във възходящ ред и също въз основа на цената във възходящ ред.

SELECT * FROM databas_name.table_name
ORDER BY brand_name ASC, rating ASC , price ASC

Намерете името на телефона, цената на най-скъпия телефон

SELECT model,price FROM databas_name.table_name
ORDER BY price DESC LIMIT 1

тук няма ограничение за сортиране по множество колони, можем да сортираме по множество колони, използвайки или възходящ, или низходящ ред. трябва да посочим реда за всяка колона, използвайки DESC или ASC, или да сортираме една колона в ред DESC, а другата колона в ред ASC, като ги разделяме със запетая, ако това е логично сортиране.

можем да приложим sortvalues() в pandas, за да постигнем същото.

Ред за изпълнение на заявката

FROM JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY

> — — — — — — — — — — — — — — — ->>> — — — →>> — — — — — — — — — →>>>>>>>

„FamousJawaavWenttoGoaчаканстите, несе го поръчвайте”

Famous (FROM)
Jawaan (JOIN)
Went (WHERE)
Goa (GROUP BY)
Ваканция (HAVING)
Така че (SELECT)
Не (DISTINCT)
Поръчай (ORDER BY)

Chaliye ab data данни за групиране ki taraf badhte hai.

Групиране на данни

За да разберем как работи групирането, нека се опитаме да отговорим на въпрос, използвайки данните, с които разполагаме. Да предположим, че искаме да изчислим броя на смартфоните въз основа на името на марката, които се появяват в нашия набор от данни.

Да предположим, че в нашите данни има 1000 смартфона. Искаме да създадем нова таблица с две колони — „Име на марката“ и „Телефони“ — която показва броя на телефоните за всяка марка. За да решим този тип проблеми, използваме функцията „групиране по“.

Group by е основно начин за изучаване на групи. Това, което правим, е да вземем определена категорична колона от нашите данни, като името на марката. Можем да разделим всичките си данни на по-малки групи въз основа на тази колона. Например групата на Apple има всички свои телефони в една таблица, докато телефоните на Google имат своя собствена таблица. Телефоните Vivo, OnePlus и Samsung също имат свои отделни маси. Сега можем да проучим всяка от тези таблици, за да разберем колко телефона има всяка марка. Можем да започнем, като разгледаме таблицата на групата на Apple и след това преминем към другите таблици за другите марки, за да получим броя на телефоните за всяка марка.

Добрата част е, че можем да прилагаме множество агрегатни функции едновременно. Досега използвахме count и въз основа на следващия въпрос можем съответно да приложим други агрегатни функции.

Основната идея е да вземем родителска таблица, след което да я разделим на групи въз основа на една или понякога две категорийни колони. След това за всяка група прилагаме функции за агрегиране като сума, брой, средна стойност, ср. и т.н., за да изчислим резултата и да го покажем. Това се нарича групиране по.

в pandas имаме и функцията groupby() за групиране на нашите данни въз основа на една или повече категорични колони и след това прилагане на обобщена функция, за да получим резултата. Работи по начин, подобен на начина, по който го обяснихме преди.

Групирайте смартфони по марка и получете броя, средната цена, максималния рейтинг, среден размер на екрана и среден капацитет на батерията.

Първият ни въпрос е да създадем групи от смартфони от нашите родителски данни по марка и трябва да намерим броя, средната цена, максималната оценка, средния размер на екрана и средния капацитет на батерията. Трябва да използваме толкова много agg функции, така че няма да правим всичко наведнъж. Първо ще създадем групи по марка и след това ще ги преброим.

SELECT brand_name,COUNT(*)  AS 'num_phone'
GROUP BY brand_name
ORDER BY num_phone DESC

Сега, след като имаме броя, нека преминем към намирането на средната цена и максималния рейтинг, като запазим групирането по марка.

SELECT brand_name,COUNT(*)  AS 'num_phone',
AVG(price) AS 'avg_price'
FROM databas_name.table_name
GROUP BY brand_name
ORDER BY num_phone DESC

След като имаме броя, средната цена и максималната оценка, трябва да намерим средния размер на екрана и средния капацитет на батерията. В изображението по-горе колоната със средна цена не изглежда добре поради големите стойности, така че можем да закръглим десетичните точки с помощта на функцията ROUND. След като приложихме функцията ROUND към всички цифрови колони, установихме, че средният размер на екрана постоянно е 7. Ние обаче запазваме 2 десетични знака, за да създадем малка разлика между стойностите. За да направим това, можем да добавим запетая след името на колоната във функцията ROUND, последвана от броя десетични точки, които искаме да запазим. В нашия случай това е 2.

SELECT brand_name,COUNT(*)  AS 'num_phone',
ROUND(AVG(price)) AS 'avg_price',
ROUND(MAX(rating)) AS 'max_rating',
ROUND(AVG(screen_size),2) AS 'Avg_screeen_size',
ROUND(AVG(battery_capacity)) AS 'Avg_battery_capacity'
FROM databas_name.table_name
GROUP BY brand_name
ORDER BY num_phone DESC

Можем да извлечем много информация за всяка марка в една заявка, като използваме мощната функция GROUP BY в SQL. Например, можем да напишем проста заявка, за да покажем средната цена и максималната оценка на дадена марка, предоставяйки обобщение на високо ниво за тази марка и можем да направим това за всички марки. Тази възможност за групиране на данни въз основа на категорични променливи и след това прилагане на агрегатни функции към тях прави SQL невероятно мощен инструмент за анализ на данни.

Ето как можем да разрешим този проблем, а също и други проблеми..

Ред за изпълнение на заявката

FROM JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY

> — — — — — — — — — — — — — — — ->>> — — — →>> — — — — — — — — — →>>>>>>>

„FamousJawaavWenttoGoaчаканстите, несе го поръчвайте”

Famous (FROM)
Jawaan (JOIN)
Went (WHERE)
Goa (GROUP BY)
Ваканция (HAVING)
Така че (SELECT)
Не (DISTINCT)
Поръчай (ORDER BY)

Групирайте смартфоните според това дали имат NFC и получете средната цена и оценка

Така че сега трябва да групираме смартфоните въз основа на това дали имат NFC или не и да намерим средната цена и рейтинг за всяка група. За целта ще вземем нашите родителски данни, които са смартфоните, и ще ги групираме по NFC. След това ще отидем до всяка група и ще намерим средната цена и рейтинг по групи. Ето как можем да използваме групата по функция в SQL, за да получим полезна информация от нашите данни.

SELECT has_nfc,
AVG(price) AS 'avg price',
AVG(rating) AS 'avgrating'
FROM databas_name.table_name
GROUP BY has_nfc

Изглежда, че няма голяма разлика в оценката поради функцията NFC, но цената е значително по-висока.

Групирайте смартфоните според това дали имат 5g и получете средната цена и оценка

SELECT has_5g, AVG(price) AS ‘avg price’, AVG(rating) AS ‘avgrating’ 
FROM databas_name.table_name
GROUP BY has_5g

Изглежда, че има положителна връзка между наличието на 5G функция и по-високите оценки и цени. Телефоните с 5G функция имат по-високи оценки и цени в сравнение с тези без нея. Това изглежда е важна характеристика, която трябва да имате предвид.

Групирайте смартфоните според това дали имат fast_charging_available и получете средната цена и оценка.

SELECT fast_charging_available,
AVG(price) AS 'avg price',
AVG(rating)
FROM databas_name.table_name
GROUP BY fast_charging_available

Въз основа на анализа на смартфони с и без функция за бързо зареждане може да се види, че устройствата с бързо зареждане имат по-висок рейтинг и цена в сравнение с тези без нея. Устройствата без функция за бързо зареждане обаче имат относително по-ниска цена, но оценката им е средна. Това показва, че функцията за бързо зареждане е важен фактор за клиентите при вземането на решение за покупка, тъй като повишава оценката и цената на устройството. Освен това липсата на функция за бързо зареждане може да доведе до намаляване на цената, но няма значително влияние върху оценката на устройството.

Групирайте смартфоните според наличната разширена памет и получете средната цена.

SELECT extended_memory_available,
AVG(price) AS ‘avg price’,
AVG(rating)
FROM databas_name.table_name
GROUP BY extended_memory_available

Въз основа на анализа на телефони с и без външна памет изглежда, че телефоните без разширена памет обикновено са по-скъпи. Това обаче противоречи на факта, че телефоните с разширена памет имат по-високи цени. Интересното е, че оценките на телефоните с и без разширена памет показват малка разлика и са средно около 70. Това предполага, че наличието на разширена памет може да не е основен фактор, влияещ върху общата оценка на смартфона.

можем да групираме по множество колони едновременно в SQL. Например, ако искаме да групираме смартфони както по характеристиките „has5G“, така и по „hasNFC“, можем да създадем две колони с имена „has5G“ и „hasNFC“ със стойности „да“ или „не“. След това можем да извършим група чрез операция върху тези две колони, за да получим общо четири групи: „да-да“, „да-не“, „не-да“ и „не-не“.

Общото правило е, че броят на групите, които ще бъдат формирани, е равен на произведението от броя на категориите във всяка колона. Например, ако една колона има 5 категории, а друга има 3, тогава общият брой групи, които могат да бъдат формирани, е 5 x 3 = 15.

Чрез групиране в множество колони можем да получим повече представа от нашите данни и да идентифицираме връзките между различни променливи.

Групирайте смартфоните по марка и марка процесор и получете броя на моделите и средната разделителна способност на основната камера (задна)

SELECT brand_name,
processor_brand,
COUNT(*) AS ‘num of phone’,
ROUND(AVG(primary_camera_rear)) AS ‘Avg camera resolution’
FROM databas_name.table_name
GROUP BY brand_name,processor_brand

намерете топ 5 на най-скъпите марки.

За да намерим топ 5 на най-скъпите марки, първо трябва да групираме данните по марки. След това можем да изчислим средната цена на всяка марка и да ги сортираме в низходящ ред. И накрая, можем да ограничим резултата до първите 5 марки с най-високи средни цени.

SELECT brand_name, ROUND(AVG(price)) AS ‘avg_price’
FROM databas_name.table_name
GROUP BY brand_name
ORDER BY avg_price DESC LIMIT 5

Изображението показва, че Royole и Leit имат много малко телефони, поради което са на върха. Въпреки това, ако добавим някои ограничения, като например избор на марка, която има повече от 20 телефона, Apple като цяло е по-скъп от другите два.

коя марка произвежда смартфони с най-малък екран

SELECT brand_name, ROUND(AVG(screen_size)) AS ‘avg_screen_size’
FROM databas_name.table_name
GROUP BY brand_name
ORDER BY avg_screen_size ASC LIMIT 1

Обикновено телефоните на Apple имат по-малки екрани, но в данните може да има 1 или 2 телефона от марката blackview, поради което се появява в горната част. В противен случай, ако решим заявката чрез прилагане на някои ограничения, може да получим по-точен резултат.

Групирайте смартфоните по марка и намерете марката с най-голям брой модели, които имат както NFC, така и IR бластер.

Задачата е да се намери марката, която има най-много телефони с функции NFC и IR blaster. Първо, ще приложим филтър, за да изберем телефоните, които имат и двете функции. След това ще ги групираме по марка и ще използваме функцията COUNT, за да преброим броя на тези телефони. След това ще ги сортираме в низходящ ред въз основа на броя и ще използваме LIMIT 1, за да получим най-добрата марка, която има най-много телефони с NFC и IR blaster функции.

SELECT brand_name, COUNT(*) AS ‘count’
FROM databas_name.table_name
WHERE has_nfc = ‘true’ AND has_ir_blaster = ‘true’
GROUP BY brand_name
ORDER BY count DESC LIMIT 1

Намерете всички смартфони с поддръжка на samsung 5g и разберете средната цена за телефони с NFC и без NFC.

В тази заявка първо трябва да филтрираме смартфоните на Samsung с помощта на клауза WHERE и след това да групираме телефоните въз основа на това дали имат NFC или не. И накрая, можем да изчислим средната цена на всяка група (телефони с NFC и без NFC) с помощта на функцията AVG.

SELECT has_nfc, AVG(price) AS ‘avg_price’
FROM databas_name.table_name
WHERE brand_name = ‘samsung’
GROUP BY has_nfc

Изглежда, че телефоните с NFC имат по-висока цена в сравнение с телефоните без NFC. Следователно NFC се превърна във важна характеристика, която трябва да имате предвид, когато купувате смартфон.

Можем да запомним поръчката за изпълнение на заявкатаr

„FamousJawaavWenttoGoaчаканстите, несе го поръчвайте”

> — — — — — — — — — — — — — — — ->>> — — — →>> — — — — — — — — — →>>>>>>>

FROM JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY

> — — — — — — — — — — — — — — — ->>> — — — →>> — — — — — — — — — →>>>>>>>

клауза HAVING

нека започнем с клаузата HAVING. Използва се във връзка с GROUP BY за филтриране на резултатите от групираните данни въз основа на определени условия.

Клаузата WHERE се използва в оператора SELECT за филтриране на редове въз основа на определено условие. По подобен начин клаузата HAVING се използва в оператора GROUP BY за филтриране на групите въз основа на обобщените стойности, изчислени от агрегатните функции, използвани в оператора SELECT.

ИЗБЕРЕТЕ ke liye jo kaam WHERE krta hai vo ГРУПИРАНЕ ПО ke liye ИМАЩ krta h

Нека се опитаме да разберем с помощта на пример. Да предположим, че имаме заявка, която показва името на марката и средната цена на смартфоните. Средната цена обаче е значително изкривена от 1 или 2 много скъпи телефона, защото те са единствените в тази марка. За да разрешим този проблем и да получим по-точен анализ, можем да приложим допълнително ограничение, което показва само марките с поне 20 телефона. По този начин много марки само с 1 или 2 телефона ще бъдат филтрирани и резултатите ще бъдат по-точни. За да постигнем това, можем да използваме клаузата HAVING, която работи като филтър за израза GROUP BY.

В SQL заявка клаузата WHERE филтрира редове въз основа на стойностите в отделните колони, докато клаузата HAVING филтрира групи въз основа на резултата от обобщена функция, приложена към една или повече колони. Клаузата GROUP BY се използва за групиране на редове въз основа на една или повече колони. Като използваме клаузата HAVING след клаузата GROUP BY, можем да филтрираме групи въз основа на резултата от агрегатна функция, което може да ни помогне допълнително да прецизираме нашите данни и да получим по-конкретни резултати.

Каква е заявката за намиране на средната цена на марки, които имат поне 20 телефона в нашите данни?

SELECT brand_name,
COUNT(*) AS ‘count’,
AVG(price) AS ‘avg_price’
FROM databas_name.table_name
GROUP BY brand_name 
HAVING count>20
ORDER BY avg_price DESC

Изглежда, че заявката е подобна на предишната, с добавяне на клауза за наличие. В този случай ние използваме клаузата за филтриране на резултатите въз основа на броя на телефоните за всяка марка, където искаме да видим само резултатите за марки с поне 20 телефона. След това подреждаме резултатите въз основа на средната цена в низходящ ред. Редът по подразбиране за подреждане по е възходящ, но в този случай първо искаме да видим най-високата средна цена, така че посочваме низходящ ред. Изглежда, че резултатът правилно показва, че Apple има най-високата средна цена и можем да видим и цените на телефоните на другите марки.

намерете средния рейтинг на марки смартфони, които имат повече от 20 телефона.

SELECT brand_name,
COUNT(*) AS ‘count’,
AVG(rating) AS ‘avg_rating’
FROM databas_name.table_name
GROUP BY brand_name 
HAVING count>20
ORDER BY avg_rating DESC

Същото като при последното запитване, единствената разлика е, че вместо средна цена, ние изчисляваме средния рейтинг за всяка марка. Ние също така филтрираме марките, които имат по-малко от 20 телефона в набора от данни, като използваме клаузата HAVING в колоната COUNT. След това резултатите се сортират в низходящ ред на средната оценка.

Намерете първите 3 марки с най-висока средна оперативна памет, които имат честота на опресняване от най-малко 90 Hz и налично бързо зареждане и не вземайте предвид марки, които имат по-малко от 10 телефона.

SELECT brand_name,
AVG(ram_capacity) AS ‘avg_ram’
FROM databas_name.table_name
WHERE refresh_rate > 90 AND fast_charging_available = 1
GROUP BY brand_name
HAVING COUNT(*) > 10
ORDER BY avg_ram DESC LIMIT 3

Тази заявка може да бъде трудна за начинаещи, защото включва използването на много от концепциите, които сме научили досега, като WHERE, GROUP BY, ORDER BY, HAVING, LIMIT и др. Това обаче е чудесен пример за това как можем да използваме тези различни клаузи заедно, за да анализираме и извличаме полезна информация от нашите данни.

намерете средната цена на всички марки телефони със среден рейтинг › 70 и num_phones повече от 10 сред всички телефони с 5g.

В тази заявка използваме както клаузите HAVING, така и WHERE. Използваме клаузата HAVING, когато трябва да филтрираме въз основа на агрегатна функция. В този въпрос филтрираме въз основа на среден рейтинг на общата функция › 70 и броя на преброените телефони. Освен това в този въпрос трябва да филтрираме всички телефони с 5G поддръжка, което ще направим с помощта на клаузата WHERE

SELECT 
brand_name, AVG(price) AS ‘avg_price’
FROM databas_name.table_name
WHERE has_5g = ‘True’
GROUP BY brand_name
HAVING AVG(rating) > 70 AND COUNT(*) > 10

Yeh rahen humare vo brand jo 5G phone bechte hain jinka Среден рейтинг ›70 или 10 se jada phone market me available hain unme se Средна цена най-висока hai Apple ka, phir Samsung, phir Oneplus aur aise hi aage. Тази заявка може да изглежда трудна, но просто трябва да разберем коя клауза кога да използваме и ако я разбием, не е толкова трудно.“

Докато продължавам да решавам още запитвания, ще продължа да ги добавям към този блог. Така че, ако четете този блог по-късно, може да видите повече заявки с различни данни.