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

درس اصلی select در دیتابیس بسیار مهم است دیتابیس آزمایشی Pubs داریم که با اسکریپت میزنیم و داخل sql server درستش میخوایم بکنیم با drag and drop یا double click روی اون فایل اسکریپت

بعد execute میکنیم

دیتابیس pubs ساخته میشه

حالا یه دیاگرام ERD میخوایم ببینیم که روابط بین جدوال رو بهمون نشون میده

خوب توی جدول title اسم کتاب

جدول publisher میشه جدول ناشران

خوب جدول titles جدول کتاب ها هستش ، tittle_id کد کتاب هستش و tittle نام کتاب هستش مورد بعدی type هستش که از چه نوعی هستش bussines , psychology و … ، بعدی price هستش که قیمت رو بهمون میگه

حالا جدول publishers خوب pub_id میشه کد ناشر ، Pub_name میشه نام ناشر و sate , country هم که معلومه

هر کتاب فقط یک ناشر داره

کد نویسنده اسم نویسنده فامیلی نویسنده

جدول فروش : 3 تا کلید داره و primery key شون conbinational هستش اولی store_id میشه کد فروشگاه دومی order_num که میشه شماره فاکتور سومی میشه تاریخ فاکتور خوب qty میشه تعداد ای که از tittle_id فروختیم رو داره میگه

سوال : اگر میومدیم و primery key رو میزاشتیم فقط tittle_id اینطوری میشد که فقط از هر کتاب یه دونه بفروشم حالا اگر tittle_id با Stor_id بود اینطوری میشد که از یه کتاب توی یه مغازه فقط یه بار میشه فروخت ، برای همین شماره فامتور رو هم به premery key ها اضافه کردیم

نرم افزار جانبی red Gate رو میشه روی sql server نصب کنیم و بهمون یه سری قابلیت میده ، یکیش اینه که shortcut های خوبی بهمون میده

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

اینجا داره میگه که اگر فقط primery key مون tittle id باشه در کل این برنامه فقط یه بار میشد که کتاب sql رو بفروشم که این میشه خطا

حالا اینجا tittle_id و Order_num رو هم در نظر میگرفتیم که اینجا هم به خطا میخوریم

برای همین به این ساختار در نظرش گرفتیم :

یعنی تمام دیتاهایی که داخل authors هستش رو Select کن ستاره یا * به معنی تمام ستون ها هستش

برای این که اسم گذاری بهتری انجام بدیم

توی جول تغییری نمیکنه فقط توی اون کوئری اینطوری هستش

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

یه فاصله هم بندازیم کار میکنه

بهش میگن alias

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

به طور مثال اینجا در دو جدول ما pub_id داریم مثلا وقتی که میخوایم join بزنیم باید تعیین کنیم که منظورمون استفاده از کدومه

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

اینجا اروری که گرفتیم اینه که توی دیتابیس master ما authors رو نداریم اگر بخوایم از دوتا دیتابیس استفاده کنیم از use استفاده میکنیم

خوب در عکس بالا دیتابیس انتخابی master هستش ولی چون به صورت خاص اومدیم و تعیین کردیم که توی کدوم دیتابیس چی میخوایم ، میره و دیتا رو میاره

خوب schima سطوح دسترسی رو مشخص میکنه و DBO دیفالت کل دیتابیس ها هستش

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

و بعدش admin میاد schima های مختلف رو دسترسیش رو میده

میتونیم schima ها رو هم تغییر بدیم

میتونیم schima های جدید بسازیم :

حالا اگر دیتا رو از دو تا instance جدا بیاریم یعنی این که وصل بشیم به یه دیتا بیس دیگه توی یه سیستم دیگه

اول باید با Sa وارد بشیم :

اینجا تعیین میکنیم که نوع دیتابیس چیه , عکس بالا

اون سیستمی که میخوایم بهش وصل بشیم باید بهمون یه user pass از مدل Sql بهمون بده که اینجا وارد کنیم تا بتونیم بهش وصل بشیم

نکته ای که اینجا هست اینه که اگر ما خودمون با یه یوزر windows authentication وارد شدیم اون سیستمی هم که میخوایم بهش وصل بشیم هم باید بهمون یه یوزر از همین نوع بهمون بده که بتونیم بهش وصل بشیم

نکته ای که هست اینه که ما میتونیم به چند مدل این ارتباط و دسترسی به یه سیستم دیگه رو تعریف کنیم که به طور مثال اگر ما وقتی که توی سیستم خودمون هستیم هم با یوزر sql و هم با user windows بتونیم به اون یکی سیستم وصل بشیم :

خوب حالا ما تعریف کردیم که user sa میتونه به اون یکی کامپیوتر وصل بشه ولی انیجا ما در حال حاضر با user adminstarator هستیم :

برای همین میزنیم روی change connection و بعد با یوزر sa وارد میشیم :

حالا برای کوئری زدن به این شکل مینویسیم

اینجا قبل از زدن اسم دیتابیس میایم آدرس link server رو میزنیم

سطح دسترسی native client بیشتره توی OLE DB دستور ادمینی قبول نمیکنه و این که فقط یک یوزر برای دسترسی رو قبول میکنه

اینجا به خاطر این که اسم به جای ip نمایش داده بشه میایم این کارو میکنیم :

نکته مهم اینه که provide string برای زمانیه که بخوایم از C# به این دیتابیس وصل بشیم

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

اگر بخوایم کتاب هایی که قیمتشون بیشتر از 20 هستش رو پیدا کنیم

برای کامنت کردن از — استفاده میکنیم، یا با /* میتونیم چند خط رو کامنت کنیم

مخالف <> مخالف =!

اگر از جنس string باشه باید از تک کوتیشن استفاده کنیم

نکته همون طورکه در عکس پایین میبنید بعضی از قیمت ها null هستش ، ما برای این که به این ها دسترسی پیدا کنیم ، نمیتونیم اینطوری بنویسیم:

برای چک کردن null بودن نمیتونیم اینطوری بنویسیم:

باید از is استفاده کنیم

برای این که خلافش رو هم چک کنیم اینطوری ازش استفاده میکنیم :


وقتی که بخوایم از OR استفاده کنیم نکته ای که اینجا داریم اینه که میتونیم به جای کوئری اولی از دومی استفاده کنیم در دومی ما اومدیم و از in استفاده کردیم و با , اومدیم اسم تایپ هایی که میخوایم رو اضافه کردیم.

وقتی که بخوایم از دو تا شرط رو or کنیم و کلش رو با یه شرط دیگه AND کنیم

اینجا همونطور که میدونید دیتایی که هر کدوم از این ها برمیگردونن متفاوت هستش

برای این که بخوایم یه مورد خاص رو پیدا کنیم هم میتونیم با = و هم میتونیم با like این کار کنیم که البته like کاربرد هایی دیگه ای هم توی سرچ کردن داره

نکته ی خیلی مهم اینه که وقتی که برای like درصد نزاریم مثل = عمل میکنه ولی خیلی کند تره و در دستورات و کوئرها تا جای ممکن از نوشتن like باید پرهیز کنیم

حالا برای مواردی که اسم مثلا اون کتاب رو کامل نمیدونیم و میخوایم با بخشی از اون اسم بیایم و اون کتاب رو پیدا کنیم، برای همین از این مواردی که گفته شده استفاده میکنیم :

این یعنی همه کتاب هایی که قسمت انتهاییشون the هستش رو برو بیار

این یعنی کتابهایی رو بیار که با the شروع میشن

این یعنی این که هر جای چه اول چه آخر چه وسط بود هر جاییش که the بود اون رو بیار

یه سری قابلیت های دیگه هم داره ، مثل این که اینجا _ به معنی اینه که هر چی بود ، بود و حرف دومش e باشه و بعدش هم هر چی بود ، بود و میگه که این دیتاهارو بردار بیار

این به معنی این هستش که اولین حرف یا m باشه یا n باشه و یا o باشه و حرف بعدیش e باشه

حالا اگر بخوایم مخالفش رو پیدا کنیم ، یعنی حرف اولش m n o نباشه و حرف بعدیش e باشه

به صورت بازه حرفی هم میتونیم براش تعیین کنیم ، اینجا یعنی از حرف a تا o

حالا اگر بخوایم دیتا ها رو مرتب کنیم از order by استفاده میکنیم

خوب اینجا نکته ای که هستش اینه که اول میاد دیتا ها رو بر اساس au_lname میاد sort میکنه و بعد میاد در حالت هایی که مساوی شدن میاد sort شدن رو روی au_fname پیاده میکنه

توی این قسمت به طور مثال :

اینجا چون هر دو تا اسم یکسان هستند و بعدیش اومده توی فامیلی ها و sort رو بر اساس حروف الفبا تعیین کرده ، در اینجا ab بالاتر از an قرار میگیره

میتونیم ترتیب صعودی و نزولیش رو هم تعیین کنیم

میتونیم برای هر کدوم رو هم به صورت جداگانه صعودی و نزولیش رو تعیین کنیم

شروع join

https://stevestedman.com/

https://blog.bytebytego.com/p/ep90-how-do-sql-joins-work

خوب اینجا فرض میکنیم که جدول سمت چپ T1 هستش و جدول سمت راست T2 هدف این هستش که شهر هایی هر استان رو توی یک جدول ببینیم

حالا اتفاقی که میوفته اینه که اول میاد از جدول استان دیتای 1 که pk هستش رو نگاه میکنه و بعد میره به جدول T2 و متناظر با اون PK دیتا رو میاره که در اینجا 1 و P هستش و همه اینها رو با هم در جدول آبی مینویسه

حالا همنوطری که میبنید در جدول FK ما 2 تا شهر از استان b داریم برای همین هر دوتای اونها رو میاریم در جدول آبی

نکته ای که هست اینه که در inner join دیتا هایی که در دو جدول مشترک هستند رو نشون میده

حالا در left join اینطوریه که اون اشتراکات هستن + این که دیتاهایی که جدول سمت چپ هستند ولی هیچ اشتراکی با جدول سمت راست ندارند

خوب right join میشه دیتاهای مشترک + اطلاعاتی که در جدول راست هستش

خوب full هم میشه همه اطلاعات

https://www.scaler.com/topics/cartesian-join-sql/

کوئری که نام کتاب و نام ناشر کتاب ها رو لیست کنه : بعد از این که اسم جدول ها رو به t و p تغییر دادیم میایم select مون رو تغییر میدیم میایم از نام های alias استفاده میکنیم تا بعدا بدونیم که مثلا title از t اومده که t هم میشه alias جدول titles یا pub_name از p اومده که p میشه alias جدول publishers

حالا اینجا اگر left join بزنیم تمام کتاب ها رو میاریم حتی اون هایی که هیچ ناشری ندارند

خوب تعداد این left join با تعداد inner join یکی هستش که این نتیجه رو میده که تمامی کتاب ها حتما ناشر دارند ، هر دو 18 تا دارند

اگر right join بزنیم تمام ناشرها رو میاره حتی اون هایی که هیچ کتابری رو منتشر نکردن تعدادش 23 تاست

نتیجه ی full join

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

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

اینجا همونطور که میبینید اگر بیایم از where استفاده کنیم و بگیم که کتاب هایی که قیمتشون null رو بیار برای این که به هدفمون برسیم اشتباهه ، چون که درسته که تمامی فیلد ها برای ناشر هایی که کتاب منتشر نکردن ، در سمت چپ null هستش ولی اتفاقی که افتاده اینه که یه سری کتابی هم که چاپ شدن قیمتشون null هستش

برای این بخوایم وجود یا عدم جود چیزی رو در جدوال چک کنیم باید از PK استفاده کنیم، که در اینجا میشه title_id

این درسته :

همیشه تمامی جداول PK اشون مخالف null هستن و اگر در جایی مثل join ها وقتی که دیدمشون که null هستن ، این به این معنیه که اون ها اصلا وجود ندارن

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

اینجا ما چون رابطه چند به چند داریم نیاز به یه جدول واسط داریم ، اینجا یک کتاب میتونه چندین تا نویسنده داشته باشه و یک نویسنده میتونه چندین تا کتاب داشته باشه

اینجا ما یه طور مثال یک نفر رو داریم که دو تا کتاب رو چاپ کرده یعنی کتاب هایی با tittle_d این ها BU1032 , bu2075 و به این شکل هم نمایش داده شده

حالا نتیجه ی کوئری دومی میشه این :

در این جا کتاب bu1032 چون توسط دو نفر نوشته شده پس در دو جا اومده

اینجا اومدیم جدول authors رو به جدول واسط join کردیم

SQL Server