برای select کردن میتونیم اسم جدول و بعد اسم اون فیلدی که میخوایم رو بنویسیم

حالا میرسیم به قسمت aggrigate function ها

میره تعداد دیتا ها رو میخونه

َ

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

حالا وقتی که روی یه فیلد دیگه میزنیم

اینجا نتیجه میشه 16 در صورتی که میبایست 18 تا باشه دلیلش اینه که دو تا از کتاب ها price شون null هستش برای همین هم 16 تا نشون میده

نکته اینه که null در توابع aggrigate تاثیر داده نمیشد

بهترین حالت اینه که count رو روی PK بزاریم

خوب نکته ی بعدی اینه که اینجا اسم جدول no column name هستش

تایم 41

خوب حالا همونطوری که میبینید اینجا نتیجه ای که ما میده no column name داره یعنی اسمی نداره برای همین ما برای این که بخوایم در آینده ازش استفاده کنیم میایم و بهش اسم میدیم :

نکته max و min رو میتونیم روی کارکتر ها پیاده سازی کنیم ، این ها بر اساس حرف الفبا این کار رو انجام میده

کوئری بنویسید که تعداد نویسندگانی که حداقل یک کتاب دارند رو بهمون بده

خوب توی تصویر بالا میایم جدول titles رو با tittleauthor با کلید ta.title_id و t.title_id با هم inner join میکنیم و بعد میایم authors رو با tittle author که یه جدول میانی هستش join میزنیم

خوب اینجا وقتی که از روش بالا میریم میشه 25 تا نام نویسنده در صورتی که 23 تا داریم و علتش این هست که در روش اول یک کتاب دوباره اومده یعنی نویسنده 1 و 2 و بار دیگر نویسنده 2 و 1 رو اورده

تایم: 59

خوب حالا اگر بخوایم نویسنده هایی رو بخوایم که حداقل یک کتاب چاپ کرده اند

اینطوری میتونیم بدستش بیاریم :

حالا همنوطوری که میدونیم این هم اشتباه به همون دلیل بالا پس برای همین باید از یه قابلیت دیگه استفاده کنیم تا دیتای درست رو بدست بیاریم اون هم استفاده از distinct هستش چون تمام رکورد های تکراری رو میاد حذف میکنه یعنی کتاب هایی که به طور مثال دو تا نویسنده دارند دو بار نوشته شده اند

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

توضیحات distinct :

https://www.programiz.com/sql/select-distinct

در حالتی که 3 تا هستش میشه خوده جدول اصلی چون هیچ کدوم از اون دیتاها به صورت 3 تایی تکراری نیستند .

https://www.programiz.com/sql/group-by

کوئری که کد کتاب و تعداد فروش هر کتاب رو لیست کنه

الان نام کتاب و تعداد فروش کتاب رو میخوایم ، الان نیاز داریم که با group by بیایم و join هم بزنیم :

میتونیم قرارداد بزاریم که نام هر فیلدی که اومد بعد از from همون رو بزاریم

نکته ای که در مورد تصویر بالا وجود داره اینه که وقتی که ما اومدیم گفتیم که بعد از این که join انجام بشد بیا و qty ها رو اومدیم و جمعشون زدیم با هم ، حالا وقتی که اینها رو با هم جمع میزنیم یعنی باید یه group by رو هم روشون انجام بدیم اگر انجام ندیم نمیشه و به ارور میخوریم

ما وقتی که از توابع سر جمعی استفاده میکنیم فقط یه مقدار به ما خروجی میده پس بنابراین اون سمت جدول هم باید یه جوری یکسان سازی کنیم با سمت راستش که ما از توابع سرجمعی استفاده کردیم و در اینجا باید از group by استفاده کنیم

یه نکته ای که اینجا هست اینه که ما کلا 18 تا کتاب دارم ولی اینجا 16 تاشو داره نمایش میده و دلیلش هم اینه که اون دو تا کتاب فروشی نداشته اند ، ولی با این حال باز هم میخوایم بیارمشون توی این لیست حالا برای این کار میایم و left join روش انجام میدیم :

نام کتاب و مبلغ فروش کتاب رو لیست کنه

اول تمامی فیلد هایی که میخوایم رو میاریم و بعد روشون میایم عملیات رو انجام میدیم

نکته : left join سرعتش بیشتر از inner join هستش چون فقط یک طرف رو چک میکنه ولی inner هر دو طرف رو چک میکنه

نام ناشر و مبلغ فروش هر ناشر

حالا اگر بخوایم تمامی ناشر ها توی این قسمت لیست بشن باید بیایم و left join بزنیم

اینجا گفتیم که تمامی ناشر ها باشند حتی اگر تا الان کتابی منتشر نکرده باشند

توی حالت بعدی گفتیم که ممکنه کتاب چاپ کرده باشن ولی فروش نداشته اند پس برای همین هم left join میزنیم

اگر میومدیم از title شروع میکردیم نوشتن کوئریمون رو اونجا باید از right join استفاده میکردیم

حالا اگر بخوایم null بنویسه 0 میایم از is null استفاده میکنیم :

ما یه oprator داریم که is null هستش و این برای چک کردن null بودن یا نبودن استفاده میشه، نکته ای که هست اینه که IsNull اینجا فانکشن هستش و فانکشن ها صورتی رنگ میشه متنشون

کوئری که نام خانوادگی نویسنده و تعداد کتاب هایی که نوشته رو لیست کنه

نکته : اینجا اتفاقی که افتاده اینه که ما دو نفر متفاوت رو داریم ولی فامیلیشون یکسان هست و با این مدل کد نتیجه ای که به ما میده اشتباه حتی اگر اسم رو هم اضافه کنیم ممکنه باز هم اشتباه پیش باید چرا که ممکنه دو نفر متفاوت باشن ولی اسم و فامیلیشون یکسان باشه بهترین راه اینه که از id استفاده کنیم بهترین راه اینه که دسته بندی براساس فیلد primery key انجام بشه حالا اگر دسته بندی رو روی فیلی به جر pk هم انجام دادیم بیایم و pk رو کنارش بزاریم اینجا اومدیم کنار au lname اومدیم و au_id رو اضافه کردیم نکته ای که اینجا هست اینه که ما au id که PK هستش رو توی group by اوردیم ولی توی select نیوردیم که این کار مجازه ولی برعکسش مجاز نیست

و توی دسته بندی میتونیم بر اساس هر چیزی که میخوایم اون رو انجام بدیم و لزومی نداره که همه اون ها رو توی Select بیاریم

هر فیلیدی رو که خارج از aggergate function توی select بنویسیم باید بر اساسش بیایم دسته بندی رو انجام بدیم

خوب میتونستیم که کوئری رو به صورت ساده تری بنویسیم »

و بعد اینطوری مینویسیم »

ما اومدیم و اون select اولی رو توی پرانتز گذاشتیم و اسمش رو k گذاشتیم که میشه یه جدول مجازی که خودمون درست کردیم و بعد هم اومدیم توی select اولی از tc که داخل جدول k هستش استفاده کردیم

توی کوئری های که میزنیم هر چقدر که تعداد رکورد های اطلاعاتی کمتری باشه کوئری بهتر عمل میکنه و سریع تره

اون جدول k که درست کردیم بهش میگن جدول مشتق شده یا همون drived table

هر چقدر عدد پایینتر باشه سرعتش بیشتره

نکته اینه که به طور مثال هر جا که داریم join میزنیم اطلاعات کمتری شامل باشه ، سرعت کوئری بیشتره

نکته ی دیگه اینه که اینجا به صورت تخمینی و براساس sytax که نوشته شده داره این اطلاعات رو به ما میده

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

اگر کوئری پیچیده و دیتا سنگین بود از این مورد استفاده نکنیم و از مورد تخمینی با SYNTAX استفاده کنیم چون که اگر بخواد به صورت همزمان دو تا کوئری سنگین رو اجرا کنه میپوکه

کوئری نام و نام خانواگی نویسنده و سهم نویسنده از مبلغ فروش کتاب ها رو لیست کنه

خوب اینجا میبینیم که این دو تا عددی که بدست آومده با هم تفاوت دارند و دلیلش هم اینه که ما برای کتاب هایی که دو تا نویسنده دارن تعداد فروش رو 2 برابر حساب کردیم یعنی اگر یک کتاب با دو نویسنده 1 بار فروخته شده ما چون اون به ازای هر نویسنده

این همون قضیه ای که بالاتر گفتیم

خوب حالا برای درصد این که هر نویسنده چقدر سهم داره باید به royal paper مراجعه کنیم »

اینجا به طور مثال نویسنده ی اول bu111 40 درصد سهم از فروش و دومی 60 درصد از سهم فروش

اینجا اومدیم برای چک کردن این کوئری رو نوشتیم

اینجا درست میشه :

اینجا عددی که بدست آوردیم با اون چکی که اون بالا انجام دادیم یکی شد که این یعنی درسته

برای عملیات wizard

کل دیتا بیس یا چیزهای دیگه

وقتی که روی دومی میزنیم میتونیم جدول ها رو تعیین کنیم

SQL Server