Sql тооллогыг жишээгээр бүлэглэх. Тушаалын бүлгийг Хэсгээр нь сонго

Энэ нийтлэлд би хэд хэдэн асуулгын жишээн дээр өгөгдлийг хэрхэн бүлэглэх, хэрхэн бүлэглэх, дотор нь SQL асуулга байх талаар хэрхэн зөв ашиглах талаар хэлэх болно.

Өгөгдлийн сан дахь ихэнх мэдээлэл дэлгэрэнгүй хэлбэрээр хадгалагддаг. Гэсэн хэдий ч ихэвчлэн тайлан авах шаардлагатай байдаг. Жишээлбэл, хэрэглэгчийн санал хүсэлтийн нийт тоо эсвэл агуулахад байгаа барааны тоог олж мэдээрэй. Үүнтэй төстэй олон даалгавар байдаг. Тиймээс, ийм тохиолдлуудад тусгайлан зориулсан SQL хэл нь бүлгүүдийг бүтэцтэй болгож өгдөг бөгөөд энэ нь үр дүнд бий болсон өгөгдлийг бүлэглэх, шүүх боломжийг олгодог.

Гэсэн хэдий ч тэдгээрийн хэрэглээ нь програм хангамжийн шинэхэн зохиогчдод олон асуудал үүсгэдэг. Тэд олж авсан үр дүн болон өгөгдлийг бүлэглэх механизмыг зөв тайлбарладаггүй. Тиймээс, юу болж, яаж болохыг практик дээр олж мэдье.

Жишээ болгон би зөвхөн нэг хүснэгтийг авч үзэх болно. Шалтгаан нь энгийн бөгөөд эдгээр операторууд үүссэн өгөгдлийн загварт аль хэдийн хэрэглэгдэж байна (хүснэгтийн мөрүүдийг нэгтгэж, шүүсний дараа). Тэгэхээр хаана, нэгдэх операторуудыг нэмснээр мөн чанар өөрчлөгдөхгүй.

Хийсвэр жишээг төсөөлье. Танд форумын хэрэглэгчдийн хураангуй хүснэгт байна гэж бодъё. Үүнийг userstat гэж нэрлэе, энэ нь иймэрхүү харагдаж байна. Нэг чухал зүйл бол хэрэглэгч зөвхөн нэг бүлэгт хамаарах боломжтой гэдэгт бид итгэдэг.

хэрэглэгчийн_нэр - хэрэглэгчийн нэр

форум_бүлэг - бүлгийн нэр

mess_count - мессежийн тоо

is_have_social_profile - форумын профайл нь нийгмийн сүлжээн дэх хуудасны холбоосыг агуулсан эсэх

Таны харж байгаагаар хүснэгт нь энгийн бөгөөд та өөрөө тооны машин ашиглан олон зүйлийг тооцоолох боломжтой. Гэхдээ энэ бол зүгээр л нэг жишээ бөгөөд ердөө 10 бичлэг байна. Бодит мэдээллийн санд бүртгэлийг мянгаар хэмжиж болно. Тиймээс асуултуудаас эхэлье.

Group by ашиглан цэвэр бүлэглэх

Бүлэг бүрийн үнэ цэнийг, тухайлбал, бүлгийн хэрэглэгчдийн дундаж үнэлгээ, форумд үлдсэн нийт мессежийн тоог мэдэх хэрэгтэй гэж төсөөлөөд үз дээ.

Нэгдүгээрт, SQL асуулгыг ойлгоход хялбар болгох үүднээс товч аман тайлбар. Тиймээс та форумын бүлгүүдийн тооцоолсон утгыг олох хэрэгтэй. Үүний дагуу та эдгээр бүх арван мөрийг админ, модер, хэрэглэгч гэсэн гурван өөр бүлэгт хуваах хэрэгтэй. Үүнийг хийхийн тулд та хүсэлтийн төгсгөлд forum_group талбарын утгуудаар бүлэглэл нэмэх хэрэгтэй. Мөн нэгтгэсэн функцийг ашиглан сонгохын тулд тооцоолсон илэрхийллийг нэмнэ үү.

Талбарууд болон тооцоолсон багануудыг зааж өгөх форум_бүлэг, авг(хэрэглэх_тоо)-ыг авг_райтинг, нийлбэр(эмх замбараагүй_тоо)-ыг нийт_эмхээгүй_тоо гэж сонгоно -- Хүснэгтийг userstat-аас зааж өгөх -- Талбайн бүлгээр форумын_бүлэгээр бүлэглэхийг зааж өгнө.

Асуулгад бүтцийг ашиглан бүлгийг ашигласны дараа зөвхөн сонгох хэсэгт бүлгийн дараа заасан талбаруудыг нэгтгэх функцийг ашиглахгүйгээр ашиглах боломжтой гэдгийг анхаарна уу. Үлдсэн талбаруудыг нэгтгэх функц дотор зааж өгөх ёстой.

Би бас хоёр нэгтгэсэн функц ашигласан. AVG - дундаж утгыг тооцоолно. Мөн SUM - нийлбэрийг тооцдог.

форум_бүлэгдундаж_үнэлгээнийт_эмх замбараагүй_тоо
админ 4 50
зохицуулагч 3 50
хэрэглэгч 3 150

1. Эхлээд эх хүснэгтийн бүх мөрүүдийг forum_group талбарын утгын дагуу гурван бүлэгт хуваасан. Жишээлбэл, админ бүлэгт гурван хэрэглэгч байсан. Модер дотор бас 3 мөр байна. Мөн хэрэглэгчийн бүлэг дотор 4 мөр (дөрвөн хэрэглэгч) байсан.

2. Дараа нь бүлэг бүрт нэгтгэх функцуудыг ашигласан. Жишээлбэл, админ бүлгийн хувьд дундаж үнэлгээг дараах байдлаар тооцоолсон (2 + 5 + 5)/3 = 4. Мессежийн тоог (10 + 15 + 25) = 50 гэж тооцсон.

Таны харж байгаагаар ямар ч төвөгтэй зүйл байхгүй. Гэхдээ бид зөвхөн нэг бүлэглэх нөхцөлийг ашигласан бөгөөд бүлгээр шүүгээгүй. Тиймээс дараагийн жишээ рүү шилжье.

Бүлэг ашиглан бүлэглэх, байгаагаар бүлэглэх

Одоо өгөгдлийг бүлэглэх илүү төвөгтэй жишээг харцгаая. Хэрэглэгчдийг нийгмийн үйл ажиллагаанд татах үйл ажиллагааны үр нөлөөг үнэлэх хэрэгтэй гэж бодъё. Энгийнээр хэлэхэд, бүлэгт хэдэн хэрэглэгчид өөрсдийн профайл руу линк үлдээсэн, хичнээн нь үл тоомсорлосон захидал гэх мэтийг олж мэдээрэй. Гэсэн хэдий ч бодит амьдрал дээр ийм олон бүлгүүд байж болох тул бид үл тоомсорлож болох бүлгүүдийг шүүж үзэх хэрэгтэй (жишээлбэл, хэтэрхий цөөхөн хүн холбоос үлдээгээгүй; яагаад бүтэн тайланг эмх замбараагүй болгох ёстой вэ). Миний жишээнд эдгээр нь зөвхөн нэг хэрэглэгчтэй бүлгүүд юм.

Эхлээд бид SQL асуулгад юу хийх ёстойг амаар тайлбарлах болно. Бид хэрэглэгчийн статистикийн анхны хүснэгтийн бүх мөрийг дараах шалгуурын дагуу хуваах хэрэгтэй: бүлгийн нэр, нийгмийн профайл байгаа эсэх. Үүний дагуу хүснэгтийн өгөгдлийг форумын_бүлэг болон нийгмийн_профайл талбаруудаар бүлэглэх шаардлагатай. Гэхдээ ганцхан хүнтэй бүлгүүдийг бид сонирхдоггүй. Тиймээс ийм бүлгүүдийг шүүж үзэх хэрэгтэй.

Анхаарна уу: Энэ асуудлыг зөвхөн нэг талбараар бүлэглэх замаар шийдвэрлэх боломжтой гэдгийг мэдэх нь зүйтэй. Хэрэв та кейсийн бүтцийг ашигладаг бол. Гэсэн хэдий ч энэ жишээний хүрээнд бүлэглэх боломжийг харуулсан болно.

Би бас нэг чухал зүйлийг нэн даруй тодруулахыг хүсч байна. Та нэгтгэх функцийг ашиглахдаа зөвхөн has-г ашиглан шүүж болох ба тусдаа талбараар биш. Өөрөөр хэлбэл, энэ нь хаана байгуулах биш, энэ нь бие даасан бичлэг биш харин мөрийн бүлгүүдийн шүүлтүүр юм. Хэдийгээр доторх нөхцөлүүдийг "эсвэл" ба "ба" ашиглан ижил төстэй байдлаар зааж өгсөн байдаг.

SQL асуулга иймэрхүү харагдах болно

Талбарууд болон тооцоолсон багануудыг зааж өгөх форум_бүлэг, нийгмийн_профайлтай, тоолох(*)-ыг нийтээр сонгоно -- Хүснэгтийг хэрэглэгчийн статаас зааж өгнө -- Талбаруудын бүлгээр форумын_бүлэг, нийгмийн_профайлаар бүлэглэхийг зааж өгнө -- Count(*) > 1 гэсэн бүлгийн шүүлтүүрийг зааж өгнө.

Бүтээлээр бүлгийн дараа талбарууд таслалаар тусгаарлагдахыг анхаарна уу. Сонголтонд талбаруудыг зааж өгөх нь өмнөх жишээн дээрхтэй ижил аргаар явагдана. Би мөн бүлгүүдийн эгнээний тоог тооцдог нэгтгэх функцийг ашигласан.

Үр дүн нь энд байна:

форум_бүлэгнийгмийн_профайлтай_байнанийт
админ 1 2
зохицуулагч 1 2
хэрэглэгч 0 3

Энэ үр дүн хэрхэн гарсан талаар алхам алхмаар харцгаая.

1. Эхний ээлжинд 6 бүлгийг авсан. Forum_group бүлэг бүрийг нийгмийн_профайл_байгаа талбарын утгуудад үндэслэн хоёр дэд бүлэгт хуваасан. Өөрөөр хэлбэл бүлгүүд: , , , , , .

Анхаарна уу: Дашрамд хэлэхэд, 6 бүлэг байх албагүй. Жишээлбэл, хэрэв бүх администраторууд профайл бөглөсөн бол 5 бүлэг байх болно, учир нь is_have_social_profile талбар нь админ бүлгийн хэрэглэгчдийн хувьд зөвхөн нэг утгатай байх болно.

2. Дараа нь бүлэг тус бүрт байгаа шүүлтүүрийн нөхцөлийг ашигласан. Тиймээс дараах бүлгүүдийг хассан: , , . Ийм бүлэг бүрт эх хүснэгтийн зөвхөн нэг мөр байсан тул.

3. Үүний дараа шаардлагатай өгөгдлийг тооцоолж, үр дүнг гаргав.

Таны харж байгаагаар ашиглахад хэцүү зүйл байхгүй.

Мэдээллийн сангаас хамааран эдгээр бүтээцийн чадвар өөр байж болно гэдгийг мэдэх нь зүйтэй. Жишээлбэл, илүү олон нэгтгэсэн функц байж болно, эсвэл та тусдаа талбаруудыг бүлэглэхээс илүү тооцоолсон багануудыг зааж өгч болно. Энэ мэдээллийг техникийн тодорхойлолтод аль хэдийн авч үзэх ёстой.

Одоо та өгөгдлийг бүлэгээр хэрхэн бүлэглэх, мөн has-г ашиглан бүлгийг хэрхэн шүүхийг мэддэг болсон.


Хамгийн чухал багуудын нэг SQL бол GROUP BY юм. Хүснэгтээс тус тусад нь мөрийн бүлгүүдийг сонгохын тулд энэ бүтцийг бүтээсэн бөгөөд тус бүрд нь заасан функцууд орно СОНГОХ(Жишээлбэл, COUNT(), MIN()гэх мэт). Тодорхой жишээнүүдийг харцгаая.

Бидэнд супермаркетуудын ширээ байна гэж бодъё:

  • ID- өвөрмөц танигч.
  • дэлгүүрийн дугаар- супермаркетийн өвөрмөц танигч.
  • Үнэ- сүүний үнэ.

Супермаркет бүрийн сүүний дундаж үнийг мэдэх хэрэгтэй. тэрийг тэмдэглэ дэлгүүрийн дугаардавтаж болно (эцсийн эцэст супермаркетуудын сүлжээ байдаг). Тиймээс бид дагуу бүлэг гаргах хэрэгтэй дэлгүүрийн дугаар, мөн энэ бүлгийн мөр бүрт дундаж үнийг тооцоол.

Жинхэнэ хүснэгт дараах байдалтай байна.

Тиймээс бид тодорхой супермаркет сүлжээн дэх (эсвэл нэг дэлгүүрийн) дундаж үнийг олж мэдсэн.

Өөр нэг түгээмэл хэрэглээ бол хүснэгтүүдээс өвөрмөц бичлэгүүдийг татаж авах явдал юм. Өмнөх жишээн дээр та үр дүнгийн дээжинд давхардсан зүйл байхгүй байгааг анзаарсан дэлгүүрийн дугаар, харин анхны хүснэгтэд тэдгээр нь байсан.

Бидэнд хэрэглэгчидтэй хүснэгт байна гэж бодъё:

  • ID- өвөрмөц танигч.
  • имэйл - цахим шууданхэрэглэгч.
  • хэш- өвөрмөц хэрэглэгчийн хэш.

Тэгээд бид сонгох даалгавартай тулгарсан өвөрмөц хэрэглэгчид, ялангуяа өвөрмөц хүмүүс, өвөрмөц данс биш. Эцсийн эцэст нэг хүн байж болно 100 өөр өөр данстай цахим шууданмөн мэдээжийн хэрэг ID. А хэш- энэ бол түүнийг өвөрмөц хүн гэж тодорхойлдог тодорхой шугам юм.

Тиймээс бид сонгох хэрэгтэй өвөрмөц хэш бүхий бүх бичлэг. Үүний тулд үүнийг дахин ашигладаг GROUP BY:

* `хүснэгт`-ээс `хэш`-ээр БҮЛГЭЭС СОНГОХ

Үүний үр дүнд зөвхөн өвөрмөцийг гаргаж авах болно хэш, тэр бол 2 адилхан хэшҮүссэн дээж дээр та үүнийг харахгүй.

Энд хоёр практик байна SQL дээр GROUP BY ашиглах жишээбид үүнийг цэгцэлсэн.

Бид маш олон материалыг судалж үзсэн SQL, ялангуяа Transact-SQL, гэхдээ бид ийм энгийн сэдвийг хөндөөгүй өгөгдлийг бүлэглэх GROUP BY. Тиймээс өнөөдөр бид өгөгдлийг бүлэглэхийн тулд группийг оператороор хэрхэн ашиглах талаар сурах болно.

Олон шинэхэн програмистууд SQL-тэй тулгарахдаа GROUP BY оператор ашиглан өгөгдлийг бүлэглэх боломжийн талаар мэддэггүй, гэхдээ энэ функцийг практикт нэлээд олон удаа шаарддаг боловч энэ талаар бидний өнөөдрийн хичээлийг ердийн жишээн дээр зориулав. to Энэ операторыг хэрхэн ашиглахыг сурах нь танд илүү хялбар бөгөөд хялбар байсан, учир нь та түүнтэй тулгарах нь гарцаагүй. Хэрэв та SQL-ийн сэдвийг сонирхож байгаа бол, өмнө нь хэлсэнчлэн, бид үүнийг нэгээс олон удаа хөндсөн, жишээлбэл, SQL Language - JOIN эсвэл Union and Union all гэсэн нийтлэлд та энэ материалтай танилцаж болно. .

Мөн танилцуулга, бага зэрэг онол.

GROUP BY оператор гэж юу вэ

GROUP BYоператор ( эсвэл дизайн, аль нь танд илүү тохиромжтой) Асуулгад нийлбэр, макс, мин, тоо гэх мэт нэгтгэх функцийг ашиглах үед өгөгдлийг талбараар бүлэглэх SQL.

Таны мэдэж байгаагаар нэгтгэх функцууд нь олон тооны утгуудтай ажилладаг, жишээ нь нийлбэр нь бүх утгыг нэгтгэдэг. Гэхдээ та зарим нөхцөлөөр эсвэл хэд хэдэн нөхцөлөөр нэг дор нийлбэр хийх шаардлагатай гэж бодъё, иймээс бид бүх өгөгдлийг нэгтгэсэн функцүүдийн үр дүнгийн гаралт бүхий талбараар бүлэглэхийн тулд оператороор бүлэглэх шаардлагатай байна.

Энэ бүхнийг жишээн дээр задлан шинжилбэл илүү ойлгомжтой байх шиг санагдаж байгаа тул жишээнүүд рүүгээ орцгооё.

Анхаар! Бид бүх жишээг Management Studio SQL Server 2008 дээр бичих болно.

GROUP BY операторыг ашиглах жишээ

Эхлээд бид group by ашиглан сонгосон асуулгаа илгээх өгөгдөл бүхий тестийн хүснэгт үүсгэж, бөглөцгөөе. Хүснэгт болон өгөгдөл нь мэдээж зохиомол, жишээ нь.

Хүснэгт үүсгэх

ХҮСНЭГТ ҮЗҮҮЛЭХ .( NULL, (50) NULL, NULL, NULL) ЯВАХ

Би үүнийг дараах мэдээллээр бөглөсөн.

  • Id - бичлэгийн танигч;
  • нэр - ажилтны овог;
  • Сумма - бэлэн мөнгө;
  • Шагнал бол сангийн шинж тэмдэг юм (жишээлбэл, 1-Цалин; 2-Урамшуулал).

Асуултаар бүлгийг ашиглан өгөгдлийг бүлэглэх

Тэгээд хамгийн эхэнд синтаксийг харцгаая бүлэг, өөрөөр хэлбэл Энэ бүтцийг хаана бичих вэ:

Синтакс:

Сонго нэгтгэсэн функцууд

-аас эх сурвалж

Хаана Сонгох нөхцөл

Группээр бүлэглэх талбарууд

Байгаа Агрегат функцүүдийн нөхцөл

Захиалга эрэмбэлэх талбарууд

Одоо, хэрэв бид бүлэглэл ашиглахгүйгээр тодорхой ажилтны бүх хөрөнгийг нэгтгэх шаардлагатай бол бид дараах хүсэлтийг илгээх болно.

Тестийн_хүснэгтээс нийлбэр(нийлбэр)-ийг нийлбэр болгон СОНГОХ НЭР "Иванов"

Хэрэв бид өөр ажилтныг цуглуулах шаардлагатай бол нөхцөлийг өөрчилнө. Зөвшөөрч байна, хэрвээ ийм олон ажилчид байгаа бол яагаад тус бүрийг нэгтгэн дүгнэж байгаа юм бэ, энэ нь тодорхойгүй байгаа тул оператор тус бүр нь бидэнд туслах болно. Бид хүсэлт бичдэг:

НИЙТЛЭЛ(нийлбэр)-ийг нийлбэр болгон сонгоод, тестийн_хүснэгтээс GROUP-ийг нэрээр нэрлэнэ үү

Таны анзаарсанчлан, бид ямар ч нөхцөл бичдэггүй бөгөөд бид бүх ажилчдыг нийлбэр дүнгээр нь шууд харуулдаг бөгөөд энэ нь илүү тодорхой харагдаж байна.

Анхаар! Бид нэгтгэх функцээс гадна хүсэлтэд хэдэн талбар бичиж байгаагаас (өөрөөр хэлбэл бүлэглэх талбар) хамаарч бүлэгт ижил тооны талбаруудыг бүтээцээр нь бичдэг гэдгийг би нэн даруй тэмдэглэх болно. Бидний жишээн дээр бид нэг талбарыг харуулж байгаа тул бид зөвхөн нэг талбарыг зааж өгсөн (хэрэв бид хэд хэдэн талбарыг харуулсан бол тэдгээрийг бүгдийг нь бүтцээр нь бүлэгт зааж өгөх ёстой (та үүнийг дараа нь харах болно); жишээнүүд).

Та бусад функцуудыг ашиглаж болно, жишээлбэл, хүлээн авсан нийт хөрөнгийн хэмжээгээр тухайн ажилтанд хэдэн удаа мөнгө хүлээн авсныг тоолох боломжтой. Үүнийг хийхийн тулд бид нийлбэрийн функцээс гадна тоолох функцийг ашиглах болно.

SUM(нийлбэр)-ийг [Нийт сан]-аар, COUNT(*)-ыг [Баримтын тоо]-р, Нэр [Ажилтан]-ыг туршилтын_хүснэгтээс БҮЛЭГ НЭРЭЭР СОНГОХ

Гэхдээ энэ нь эрх баригчдын хувьд хангалттай биш гэж бодъё, тэд үүнийг ижил аргаар нэгтгэхийг хүсч байна, гэхдээ шинж чанараар нь бүлэглэж, өөрөөр хэлбэл. Энэ нь ямар төрлийн мөнгө вэ (цалин эсвэл урамшуулал), үүний тулд бид зүгээр л бүлэглэлд өөр талбар нэмж оруулаад, илүү сайн ойлгохын тулд бид ажилтнаар эрэмбэлэхийг нэмэх бөгөөд үр дүн нь дараах болно.

НИЙТЛЭЛ(нийлбэр)-ийг [Нийт сан], COUNT(*)-ыг [Барааны тоо], Нэр [Ажилтан] , Шагнал [Эх сурвалж] Тестийн_хүснэгтээс БҮЛЭГ НЭРЭЭР, шагнал ЗАХИАЛГА НЭРЭЭР СОНГОХ

Одоо бүх зүйл харагдаж байна, өөрөөр хэлбэл. ажилтан хэдий хэмжээний мөнгө, хэдэн удаа, ямар эх үүсвэрээс авсан.

Одоо нэгтгэхийн тулд илүү төвөгтэй асуулгыг бүлэглэж бичье, гэхдээ энэ эх сурвалжийн нэрийг нэмж оруулъя, учир нь шинж чанаруудын тодорхойлогчдод үндэслэн хөрөнгө нь аль эх үүсвэрээс ирсэн нь тодорхойгүй гэдгийг та хүлээн зөвшөөрөх болно. Үүний тулд бид барилгын ажлыг ашигладаг хэрэг.

НИЙТЛЭЛ(нийлбэр)-ийг [Нийт бэлэн мөнгө], ТООЛТ(*) ОР [Барааны тоо], Нэр [Ажилтан], ХЭЗЭЭ шагнал = 1, дараа нь "Цалин" ХЭЗЭЭ шагнал = 2, дараа нь "Урамшуулал" ГЭВЭЛ "Эх сурвалж байхгүй" ГЭЖ СОНГОХ. [Эх сурвалж] Тестийн_хүснэгтээс НЭР БҮЛГЭЭС, нэрээр нь ЗАХИАЛГА

Одоо бүх зүйл маш тодорхой бөгөөд эхлэгчдэд ч гэсэн тийм ч хэцүү биш юм.

Мөн нэгтгэсэн функцүүдийн эцсийн үр дүнгийн нөхцлийн талаар ярилцъя ( байх). Өөрөөр хэлбэл, бид мөрүүдийг өөрөө сонгох биш харин функцүүдийн эцсийн утгын нөхцөлийг нэмдэг, манай тохиолдолд энэ нь нийлбэр эсвэл тоо юм. Жишээлбэл, бид ижил зүйлийг харуулах хэрэгтэй, гэхдээ зөвхөн эдгээрийг харуулах хэрэгтэй "нийт хөрөнгө" 200-аас дээш. Үүнийг хийхийн тулд байгаа нөхцөлийг нэмнэ үү.

НИЙТЛЭЛ(нийлбэр)-ийг [Нийт бэлэн мөнгө], COUNT(*)-ыг [Барааны тоо], Нэр [Ажилтан], ТОХИОЛДОЛ ХЭЗЭЭ шагнал = 1, дараа нь "Цалин" ХЭЗЭЭ шагнал = 2, дараа нь "Урамшуулал" БУСДАА "Эх сурвалж байхгүй" гэж СОНГОХ. AS [Source] FROM test_table GROUP BY, priz --group HAVING SUM(summa) > 200 --SORER BY-ыг нэрээр сонгох --сорт

Одоо бид нийлбэрийн (нийлбэр) 200-аас их утгыг харуулсан, бүх зүйл энгийн.

Өнөөдрийн хичээлийн дараа та бүтцийг хэрхэн, яагаад ашиглахаа ойлгосон гэж найдаж байна бүлэг. Амжилт хүсье! Бид дараагийн нийтлэлүүдэд SQL-ийг үргэлжлүүлэн судлах болно.

Сүүлийн шинэчлэлт: 2017/07/19

T-SQL нь дараах албан ёсны синтаксийг ашиглан өгөгдлийг бүлэглэхдээ GROUP BY болон HAVING мэдэгдлүүдийг ашигладаг.

Хүснэгтээс багануудыг СОНГОХ

GROUP BY

GROUP BY заалт нь мөрүүдийг хэрхэн бүлэглэхийг тодорхойлдог.

Жишээлбэл, бүтээгдэхүүнийг үйлдвэрлэгчээр нь бүлэглэе

Үйлдвэрлэгчийг сонгох, COUNT(*) загвараар Бүтээгдэхүүнийг үйлдвэрлэгчээр бүлэглэх

SELECT мэдэгдлийн эхний багана - Үйлдвэрлэгч нь бүлгийн нэрийг, хоёр дахь багана - ModelsCount нь бүлгийн мөрийн тоог тооцоолох Count функцийн үр дүнг илэрхийлнэ.

SELECT мэдэгдэлд хэрэглэгддэг аливаа баганыг (нийтлэг функцүүдийн үр дүнг хадгалах баганыг тооцохгүй) GROUP BY заалтын дараа зааж өгөх ёстой гэдгийг анхаарч үзэх нь зүйтэй. Жишээлбэл, дээрх тохиолдолд Үйлдвэрлэгчийн баганыг SELECT болон GROUP BY заалтуудад зааж өгсөн болно.

Хэрэв SELECT мэдэгдэл нь нэг буюу хэд хэдэн багана дээр сонгогдохоос гадна нэгтгэх функцуудыг ашигладаг бол та GROUP BY заалтыг ашиглах ёстой. Дараах жишээ нь бүлэглэх илэрхийлэл агуулаагүй тул ажиллахгүй болно.

Үйлдвэрлэгч, COUNT(*)-г загвараас сонго

Өөр нэг жишээ, бүтээгдэхүүний тоогоор бүлэглэл нэмье:

Үйлдвэрлэгч, Бүтээгдэхүүний тоо, COUNT(*)-г загвараар сонгох. Үйлдвэрлэгч, Бүтээгдэхүүний тоо

GROUP BY заалт нь олон баганаар бүлэглэж болно.

Хэрэв таны бүлэглэж буй багана NULL утгатай байвал NULL утгатай мөрүүд тусдаа бүлэг үүсгэнэ.

GROUP BY заалт нь WHERE заалтын дараа харин ORDER BY заалтын өмнө байх ёстойг анхаарна уу.

Үйлдвэрлэгчийг сонгох, ТООЛ(*) ТООЛОХ БҮТЭЭГДЭХҮҮНИЙГ ХААНА БАЙНА Үнэ > 30000 БҮЛЭГ ҮЙЛДВЭРЛЭГЧДЭЭР ЗАХИАЛАХ Загваруудын тоо DESC

Бүлэг шүүлтүүр. БАЙХ

Оператор БАЙХ гаралтын үр дүнд ямар бүлгүүдийг оруулахыг тодорхойлдог, өөрөөр хэлбэл бүлгүүдийг шүүдэг.

HAVING-ийн хэрэглээ нь WHERE-ийн хэрэглээтэй олон талаараа төстэй. Зөвхөн WHERE-г мөрийг шүүх, HAVING-г бүлгүүдийг шүүнэ.

Жишээлбэл, 1-ээс олон загвар тодорхойлсон бүх бүтээгдэхүүний бүлгийг үйлдвэрлэгчээр нь олъё.

Үйлдвэрлэгчийг COUNT(*) загвараар сонгох

Энэ тохиолдолд нэг тушаалд бид WHERE болон HAVING илэрхийллийг ашиглаж болно:

Үйлдвэрлэгчийг ТООЛОН(*) загвараар сонгох Үнэ * Бүтээгдэхүүний тоо > 80000 БҮЛЭГ ТООН(*) > 1

Өөрөөр хэлбэл, энэ тохиолдолд мөрүүдийг эхлээд шүүнэ: нийт өртөг нь 80,000-аас дээш байгаа барааг сонгоод дараа нь сонгосон барааг үйлдвэрлэгчээр нь ангилна. Дараа нь бүлгүүдийг өөрсдөө шүүдэг - 1-ээс олон загвар агуулсан бүлгүүдийг сонгосон.

Хэрэв эрэмбэлэх шаардлагатай бол ORDER BY илэрхийлэл нь HAVING илэрхийллийн ард ирнэ.

Үйлдвэрлэгчийг, ТООЛОН(*) загвараар, НИЙЛЭГ(БҮТЭЭГДЭХҮҮНИЙГ) ХААНА БҮТЭЭГДЭХҮҮНИЙГ НЭГЖЭЭР СОНГОХ Үнэ * Бүтээгдэхүүний тоо > 80000 БҮЛЭГ ҮЙЛДВЭРЛЭГЧДЭЭ НИЙЛҮҮЛЭХ(Бүтээгдэхүүний тоо) > 2 ЗАХИАЛАХ БҮТЭЭГДЭХҮҮНИЙГ НЭГЖ DESC

Энэ тохиолдолд бүлэглэл нь үйлдвэрлэгчээр хийгдсэн бөгөөд үйлдвэрлэгч тус бүрийн загваруудын тоо (Загвар) болон эдгээр бүх загварт (нэгж) хамаарах бүх бүтээгдэхүүний нийт тоог мөн сонгоно. Төгсгөлд нь бүлгүүдийг бүтээгдэхүүний тоогоор нь буурах дарааллаар эрэмбэлдэг.

Энэ зааварт та SQL хэллэгийг хэрхэн ашиглах талаар сурах болно GROUP BYсинтакс болон жишээнүүдийн хамт.

Тодорхойлолт

SQL GROUP BY заалтыг SELECT мэдэгдэлд олон бичлэгээс мэдээлэл цуглуулж, үр дүнг нэг буюу хэд хэдэн багана болгон бүлэглэхэд ашиглаж болно.

Синтакс

SQL дээрх GROUP BY мэдэгдлийн синтакс нь:

Параметр эсвэл аргументууд

илэрхийлэл1 , илэрхийлэл2 , … илэрхийлэл_n Нэгтгэсэн функцэд агуулаагүй бөгөөд SQL асуулгын төгсгөлд GROUP BY-д оруулах ёстой илэрхийллүүд. aggregate_function Энэ нь SUM, COUNT, MIN, MAX эсвэл AVG зэрэг нэгтгэсэн функц юм. нийлбэр_илэрхийлэл Энэ нь нэгтгэсэн_функцийг ашиглах багана эсвэл илэрхийлэл юм. хүснэгтүүд Бичлэг авахыг хүссэн хүснэгтүүд. FROM заалт дор хаяж нэг хүснэгтийг зааж өгөх ёстой. WHERE нөхцөл Сонголт. Эдгээр нь бүртгэлийг сонгохдоо хангасан байх ёстой нөхцөлүүд юм. ORDER BY BY илэрхийлэл Нэмэлт. Үр дүнгийн багц дахь бичлэгүүдийг эрэмбэлэхэд ашигласан илэрхийлэл. Хэрэв нэгээс олон илэрхийлэл заасан бол утгуудыг таслалаар тусгаарлах ёстой. ASC нэмэлт. ASC нь үр дүнгийн багцыг илэрхийллээр өсөх дарааллаар эрэмбэлдэг. Хэрэв өөрчлөгчийг заагаагүй бол энэ нь анхдагч үйлдэл юм. DESC Нэмэлт. DESC нь үр дүнгийн багцыг илэрхийллээр буурах дарааллаар эрэмбэлдэг.

Жишээ - GROUP BY-г SUM функцээр ашиглах

SQL дээр GROUP BY функцийг SUM функцээр хэрхэн ашиглахыг харцгаая.
Энэ жишээнд бид дараах өгөгдөл бүхий ажилчдын хүснэгттэй байна.

dept_id нийт_цалин
500 119500
501 113000

Энэ жишээнд бид Dept_id тус бүрийн бүх цалинг нэмэхийн тулд SUM функцийг ашигласан ба SUM(цалин) үр дүнд "нийт_цалин" гэсэн нэр өгсөн. Dept_id нь SUM функцэд багтаагүй тул GROUP BY заалтад үүнийг зааж өгөх ёстой.

Жишээ - GROUP BY-г COUNT функцээр ашиглах

SQL дээрх COUNT функцтэй GROUP BY заалтыг хэрхэн ашиглахыг харцгаая.

Энэ жишээнд бид дараах өгөгдөл бүхий бүтээгдэхүүний хүснэгттэй байна.

Энэ жишээнд бид ангилал_id тус бүрийн нийт_бүтээгдэхүүний тоог тооцоолохдоо COUNT функцийг ашигласан бөгөөд COUNT функцийн үр дүн болгон "нийт_бүтээгдэхүүн" хэмээх нэрийг зааж өгсөн. Бид NULL байгаа бүх категорийн_id утгыг WHERE зүйлд шүүж хассан. Категорийн_id нь COUNT функцэд ороогүй тул үүнийг GROUP BY зүйлд зааж өгөх ёстой.

Жишээ - GROUP BY-г MIN функцээр ашиглах

Одоо SQL-ийн MIN функцтэй GROUP BY заалтыг хэрхэн ашиглахыг харцгаая.

Энэ жишээнд бид ажилчдын хүснэгтийг дараах өгөгдөлтэй дахин ашиглах болно.

2 бүтээлийг шалгаруулна. Энд таны авах үр дүн байна:

dept_id хамгийн бага_цалин
500 57500
501 42000

Энэ жишээнд бид dept_id тус бүрийн хамгийн бага цалингийн утгыг буцаахын тулд MIN функцийг ашигласан ба MIN функцийн үр дүнг "хамгийн бага_цалин" гэж нэрлэсэн. dept_id нь MIN функцэд багтаагүй тул үүнийг GROUP BY зүйлд зааж өгөх ёстой.

Жишээ - GROUP BY-г MAX функцээр ашиглах

Эцэст нь MAX функцтэй GROUP BY заалтыг хэрхэн ашиглахыг харцгаая.

Ажилчдын хүснэгтийг дахин ашиглая, гэхдээ энэ удаад dept_id бүрийн хамгийн өндөр цалинг олоорой:

ажилтны_тоо Нэр овог_нэр цалин dept_id
1001 Жастин Бибер 62000 500
1002 Селена Гомез 57500 500
1003 Мила Кунис 71000 501
1004 Том Круз 42000 501

Дараах SQL мэдэгдлийг оруулна уу.



Хуваалцах