آموزش هوش تجاری از ۰ تا ۱۰۰

۷ مطلب در مهر ۱۴۰۱ ثبت شده است

  • ۰
  • ۰

به عنوان بخشی از کار GA برای ExecuteQueries REST API، یک عملکرد Power Automate جدید برای اجرای پرس‌و‌جوها در برابر مجموعه داده‌های Power BI ارائه کردیم. این عمل یک تجربه ساده با کد پایین/بدون کد را به کاربران BI ارائه می دهد که می خواهند وظایف و فرآیندهای تکراری و پیش پا افتاده را ساده کنند. شما می توانید به راحتی فضای کاری و مجموعه داده مورد نظر را در رابط کاربری انتخاب کنید، پرس و جوی DAX خود را در جعبه متن پرس و جو قرار دهید، و به طور خودکار حذف کنید! خودشه! نیازی نیست در مورد REST API چیزی بدانید. حتی برای شروع نیازی به دانستن DAX ندارید زیرا می توانید با استفاده از آنالیز عملکرد، درخواست ها را مستقیماً از Power BI Desktop کپی کنید. اقدام جدید ما برای اجرای پرس‌وجوها در برابر مجموعه داده‌های Power BI، سناریوهای کاملاً جدید سلف سرویس BI را در Power Automate باز می‌کند!

مجموعه داده های Power BI نشان دهنده یک سرمایه گذاری قابل توجه و دارایی حیاتی است. سازمان‌ها در حال حاضر از مجموعه داده‌های مشترک و تایید شده برای حمایت از کارکنان اداری و تصمیم‌گیرندگان خود از طریق داده‌های انتخاب‌شده، منطق تجاری تأیید شده و تجزیه و تحلیل قابل اعتماد استفاده می‌کنند. این مجموعه داده‌ها پایه و اساس تجسم‌های داده‌های تعاملی و صفحه‌بندی‌شده غنی را فراهم می‌کنند که بینش‌های تجاری را ارائه می‌دهند که باعث موفقیت می‌شود. اما در مورد گردش کار و سایر فرآیندهای تجاری خودکار چطور؟ اغلب، سازمان‌ها باید چرخ را در اینجا دوباره اختراع کنند، زیرا استفاده مستقیم از مجموعه داده‌ها در این زمینه‌ها بسیار سخت است. شما باید یک توسعه دهنده باشید، باید کد بنویسید، باید خدمات وب و API های REST را بدانید، باید برنامه ها را در Azure Active Directory ثبت کنید، باید کتابخانه های مشتری را بارگیری کنید و غیره. بیایید این موانع را برداریم! شما در حال حاضر داده های نظارتی، منطق تجاری تأیید شده، معیارهای تحلیلی قابل اعتماد را دارید. کاربران شما قبلاً گزارش های Power BI فوق العاده ای را در بالای مجموعه داده های شما ایجاد می کنند. به آنها اجازه دهید از همان مجموعه داده های تایید شده و قابل اعتماد در جریان های ابری سلف سرویس استفاده کنند. بیایید بازده سرمایه گذاری را در مجموعه داده های Power BI که قبلاً دارید به حداکثر برسانیم!

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

صادرات داده ها به فایل های csv. این یک سناریوی محدود است زیرا ExecuteQueries REST API نتایج پرس و جو را به 100000 ردیف یا 1000000 مقدار در هر پرس و جو (هر کدام که ابتدا با آن مواجه می شود) و تعداد پرس و جوها را به 120 در دقیقه محدود می کند. ما هیچ برنامه ای برای افزایش این محدودیت ها نداریم. بنابراین، اگر باید نتایج پرس و جو را صادر کنید، مقادیر داده را قابل مدیریت نگه دارید.
آزمایش مجموعه داده های Power BI. عملکرد جدید Power Automate این کار را به یک پیاده روی شاد در پارک تبدیل می کند. در یک جدول با موارد آزمایشی بخوانید، ردیف به ردیف را تکرار کنید، یک پرس و جو از پیش تعریف شده را اجرا کنید، نتایج برگشتی را با نتایج مورد انتظار مقایسه کنید، کار انجام شده است! و اگر می‌خواهید امنیت سطح ردیف (RLS) را آزمایش کنید، هر پرس‌وجو می‌تواند هویت یک حساب کاربری متفاوت را جعل کند. توجه داشته باشید که برای استفاده از جعل هویت، باید مجوزهای نوشتن مجموعه داده داشته باشید، که معمولاً اگر مالک مجموعه داده یا عضوی از نقش‌های سرپرست، عضو یا مشارکت‌کننده فضای کاری هستید، دارید.
ایجاد جریان های ابری مبتنی بر BI. یک رویداد در جایی اتفاق می‌افتد، یک رویداد دیگر باید در جای دیگری رخ دهد، و منطق مبتنی بر BI در بین آن‌ها تعیین می‌کند که رویدادها چگونه رخ می‌دهند. Power Automate مجموعه گسترده ای از ماشه ها را ارائه می دهد. شاید شخصی یک فایل csv را در شیرپوینت آنلاین آپلود کرده باشد، رکوردی را در پایگاه داده پشتیبانی مشتری به روز کند، یا یک کلمه کلیدی مهم را توییت کرده باشد، یا شاید یک Power BI Metric یا یک هشدار داده که به تازگی فعال شده است را به روز کند. صدها محرک وجود دارد، اما هر رویدادی که باشد، جریان شما اکنون نیاز به اتخاذ برخی تصمیمات مبتنی بر داده دارد. به‌جای رفتن به سیلوهای داده‌های فردی و دوخت نتایج به‌صورت یک‌باره، اکنون می‌توانید به داده‌های تنظیم‌شده و معیارهای تأییدشده مجموعه داده‌های مشترک و تأییدشده خود که نتایج قابل اعتمادی را به شما می‌دهند تکیه کنید.
خیلی خوب به نظر می رسد که درست باشد؟ کمربند ایمنی خود را ببندید! برای شروع، برای صادر کردن نتایج جستجوی مجموعه داده در قالب csv، می‌توانید با یک جریان راه‌اندازی دستی شروع کنید. یک مرحله جدید اضافه کنید، Power BI را در قسمت جستجوی کانکتور جستجو کنید و Power BI را انتخاب کنید و سپس در برگه Actions، اقدامی را با عنوان Run a query در مقابل یک مجموعه داده انتخاب کنید. توجه داشته باشید که اگر می‌خواهید کل بدنه درخواست JSON را از ابتدا بسازید، یک پرس و جوی JSON در مقابل یک اقدام مجموعه داده نیز وجود دارد، اما اجرای یک پرس و جو در برابر یک عملکرد مجموعه داده بسیار کاربرپسندتر است زیرا می‌توانید پرس و جو DAX خود را مستقیماً در آن جای‌گذاری کنید. جعبه متن Query بدون نیاز به پرداختن به جزئیات JSON. یک پرس و جو ساده DAX می تواند "Evaluate <tablename>" یا شاید "EVALUATE TOPN(100, <tablename>)" باشد تا مطمئن شوید نتایج در محدوده تعداد ردیف باقی می مانند. البته، می توانید با استفاده از ابزار ویرایشگر DAX مورد علاقه خود، عبارات مفیدتر و واقعی تر DAX ایجاد کنید. با استفاده از داده های نمونه AdventureWorks، یک پرس و جو نمونه می تواند "EVALUATE TOPN(100, vFactInternetSalesReason)" باشد. فراموش نکنید که فضای کاری و مجموعه داده مورد نظر را به راحتی از کادرهای لیست موجود در کارت اکشن انتخاب کنید. جریان را ذخیره و آزمایش کنید. نتایج باید مانند تصویر زیر باشد.

مراحل باقیمانده، اقدامات روتین Power Automate هستند. برای خروجی csv باید سطرها را به جدول csv تبدیل کنید. دوباره جریان را ویرایش کنید، یک اکشن جدول ایجاد CSV را مانند تصویر زیر اضافه کنید، و شی محتوایی به نام ردیف‌های جدول اول را از Run a query در برابر یک عملکرد مجموعه داده به عنوان ورودی انتخاب کنید. ردیف های اول جدول حاوی نتایج پرس و جو شما هستند. (در آینده، API ExecuteQueries احتمالاً از پرس‌و‌جوهایی با بلوک‌های ارزیابی متعدد که منجر به ایجاد چندین جدول در پاسخ می‌شود، پشتیبانی می‌کند. با این حال، در حال حاضر، تنها یک Evaluate در هر کوئری پشتیبانی می‌شود.)

عمل ایجاد جدول CSV نتایج پرس و جو را به یک جدول CSV تبدیل می کند و به شما امکان می دهد سرصفحه های ستون را در صورت تمایل سفارشی کنید، اما داده ها را ذخیره نمی کند. برای ذخیره آن، یک اقدام ایجاد فایل را به عنوان مرحله بعدی انتخاب کنید، مانند ایجاد یک فایل در شیرپوینت آنلاین، و خروجی را از عملکرد جدول ایجاد CSV به عنوان محتوای فایل اختصاص دهید. جریان را ذخیره و آزمایش کنید. اسکرین شات زیر نتایج را نشان می دهد. البته، شما همچنین باید یک فایل csv جدید با داده های مورد انتظار در کتابخانه SharePoint هدف خود داشته باشید.

تا اینجای کار خیلی خوبه. با افزودن تصویری Power Automate به گزارش Power BI که یک جریان ابری را راه‌اندازی می‌کند که یک عکس فوری از داده‌های جالب را صادر می‌کند، یک قدم جلوتر برویم، مانند گزارش رویدادهای پشتیبانی روزانه که در تصویر زیر نشان داده شده است. این گزارش حجم تماس های پشتیبانی ساختگی را بر حسب روز و بر اساس منطقه ویژگی همراه با میانگین متحرک 30 روزه تعداد حوادث (خط سبز) و یک آستانه هشدار بر اساس همان میانگین متحرک به اضافه 2 برابر انحراف استاندارد 7 روزه (نور) نشان می دهد. خط بنفش). به هر حال، به دکمه Take Snapshot در گوشه سمت راست بالای گزارش توجه کنید؟ این دکمه به شما امکان می دهد حوادث پشتیبانی آخرین روز را مستقیماً از گزارش خود بر اساس انتخاب های فعلی در گزارش صادر کنید.

برای جزئیات در مورد نحوه افزودن تصویری Power Automate به گزارش Power BI، به مبحث راه اندازی یک جریان ابری از هر گزارش Power BI در مستندات محصول مراجعه کنید. در میان چیزهای دیگر، می توانید فیلدهای داده را به این تصویر اضافه کنید، که سپس به عنوان پارامترهای ورودی به جریان ابری عمل می کنند. به عنوان مثال، گزارش بالا به شما امکان می دهد تعداد حوادث پشتیبانی را بر اساس مناطق ویژگی تقسیم کنید. بنابراین منطقی است که مقادیر Area انتخاب شده را به تصویر منتقل کنیم تا جریان عکس فوری بتواند حوادث پشتیبانی صادر شده را به مناطق انتخاب شده فعلی نیز محدود کند. اگر دستورالعمل‌های موجود در مستندات محصول را برای ایجاد یک جریان ابری جدید دنبال کنید، تصویر Power Automate به طور خودکار پارامترهای ورودی را با کلیک روی دکمه On Power BI سیم‌کشی می‌کند. شما فقط باید پارامترهای ورودی را از روی دکمه On Power BI در متن جستجوی Run a query در برابر یک عملکرد مجموعه داده دریافت کنید. زیر نقطه شروع متن پرس و جو است.

تعریف کردن

         VAR selectedAreas = TREATAS({"دسترسی به داده ها"، "جلوهای"}، 'SupportRequests'[Area])


         VAR maxAbsDate = MAX('Support Requests'[ایجاد شده])

         VAR maxSelDate = CALCULATE(MAX('Support Requests'[Created])، ناحیه های انتخاب شده)

ارزیابی (

         SUMMARIZECOLUMNS(

                 "درخواست های پشتیبانی"[ایجاد شده]،

                 «درخواست‌های پشتیبانی»[مسئله]،

                 'Support Requests' [منطقه]،

                 'Support Requests' [Subarea]،

                 'Support Requests' [وضعیت]،

                 "درخواست های پشتیبانی" [مالک]،

                 FILTER(SupportRequests، maxAbsDate = maxSelDate && 'SupportRequests'[Created] = maxSelDate)

                 مناطق انتخاب شده

         )

)
پرس و جوی DAX بالا، حوادث پشتیبانی را برای دو ناحیه «دسترسی به داده» و «فرونت» بازیابی می کند. به استفاده از تابع TREATAS توجه کنید. همانطور که از تصویر زیر می توانید دریافت کنید، جریان ابری ما باید این مقادیر استاتیک را با یک رشته ساخته شده به صورت پویا جایگزین کند. بر این اساس، جریان ابری ما باید آرایه ای از مقادیر Area ارسال شده از گزارش را به رشته ای تبدیل کند که جریان آن را در متن پرس و جو درج می کند. این یک فرآیند چند مرحله ای است. ابتدا یک اقدام Select اضافه کنید، در کادر From کلیک کنید و شی داده Power BI را انتخاب کنید. سپس با کلیک بر روی دکمه کوچک T برای نقشه، اقدام Select را به حالت متنی تغییر دهید و سپس در کادر متن Map کلیک کنید. شما می توانید مستقیماً شیء محتوای Area را انتخاب کنید، اما بهتر است از عبارتی استفاده کنید که از هر علامت نقل قول در مقادیر با یک علامت نقل قول دوم فرار کند و هر مقدار را در علامت نقل قول قرار دهد. با این کار تبدیل آرایه به رشته ای با فرمت صحیح متعاقبا آسان تر می شود. اگر به درستی فرار کنید و علامت نقل قول بسته شده باشد، فقط باید اعضای آرایه را به هم بپیوندید تا رشته ای را ایجاد کنید که سپس می توانید آن را در پرس و جو وارد کنید. جدول زیر خلاصه مراحل را نشان می دهد.

نتیجه بیان عمل
انتخاب کنید concat(‘”’, replace(item()?[‘Area’], ‘”’, ‘””’), ‘”’) [
"\"دسترسی به داده\"",

"\"جلویی\"",

"\"ورود به سیستم/تایید\"",

"\"REST APIs\"",

"\"سرویس وب\""

]

یک پرس و جو در برابر یک اتصال داده (متغیرها ('مناطق انتخابی')، ', ') "\"دسترسی به داده\", \"جلویی\", \"ورود/تأیید\"، \"REST APIs\" اجرا کنید ، \"سرویس وب\""
و در اینجا جریان ابری حاصل است که کار را انجام می دهد. مراحل ایجاد جدول CSV و ایجاد فایل مشابه نمونه صادرات قبلی است. اکنون می توانید داده ها را مستقیماً از راحتی گزارش Power BI خود صادر کنید! و این تمام چیزی است که در آن وجود دارد.

با این سناریوهای صادرات داده در زیر کمربند، بیایید اکنون توجه خود را به یک سناریوی پویاتر معطوف کنیم: آزمایش مجموعه داده. تصویر زیر جدولی را با چهار ستون نشان می دهد: شناسه آزمایشی، پرس و جو برای اجرا، هویت کاربر در قالب UPN برای جعل هویت، و نتیجه مورد انتظار پرس و جو. راه حل Power Automate ما هر ردیف را تجزیه می کند، پرس و جو را با هویت کاربر مشخص شده اجرا می کند و تأیید می کند که نتیجه برگشتی با نتیجه مورد انتظار مطابقت دارد. اگر نتایج مطابقت نداشت، ایمیلی برای ما ارسال می‌کند.

این بار اجازه دهید یک جریان برنامه ریزی شده برای اجرای روزانه آزمایش های مجموعه داده ایجاد کنیم. ردیف های لیست موجود در یک عملکرد جدول از Excel Online را اضافه کنید، مکان و مسیر صحیح را به کتاب کار اکسل خود مشخص کنید و جدول را با تعاریف تست انتخاب کنید. سپس به هر عمل کنترلی یک Apply اضافه کنید و مقدار شی خروجی پویا را از ردیف های List موجود در یک عملکرد جدول به عنوان ورودی انتخاب کنید. اکنون می‌توانید روی Add an action در Apply to every action card کلیک کنید و اکشن Power BI Run a query در مقابل یک مجموعه داده را انتخاب کنید. فضای کاری و مجموعه داده خود را انتخاب کنید و سپس در کادر متنی Query کلیک کنید تا کادر محاوره ای محتوای پویا نمایش داده شود. DAX Query را به عنوان ورودی متن Query انتخاب کنید. سپس بر روی Show advanced options کلیک کنید، در کادر متنی تقلید کاربر کلیک کنید و User UPN را از گفتگوی Dynamic Content انتخاب کنید. پیکربندی باید مانند تصویر زیر باشد.

تا اینجا، این کار نسبتا آسان است. شاید کمی پیچیده تر، مقایسه نتیجه بازگشتی برای هر پرس و جو با نتیجه مورد انتظار آن باشد. اجازه دهید ابتدا جریان را کامل کنیم و سپس جزئیات را مورد بحث قرار دهیم. به عنوان مرحله بعدی در Apply to every action card، یک کنش کنترل شرط اضافه کنید. برای نمایش کادر گفتگوی محتوای پویا، روی کادر متنی سمت چپ کلیک کنید، روی Expression کلیک کنید و عبارت زیر را وارد کنید: string(outputs('Run_a_query_against_a_dataset')?['body/firstTableRows']?[0]?['[نتیجه]'] ). روی OK کلیک کنید. مقایسه انتخاب شده باید برابر باشد و سپس در کادر سمت راست کلیک کنید و از ردیف های لیست موجود در یک عملکرد جدول، نتیجه مورد انتظار را انتخاب کنید. همانطور که گفته شد، اگر نتیجه برگشتی با نتیجه مورد انتظار مطابقت نداشته باشد، جریان باید یک اعلان ایمیل ارسال کند. فقط یک اقدام Send an email را به کارت If no اضافه کنید و گیرنده، خط موضوع و متن پیام را مشخص کنید. ممکن است مانند تصویر زیر، شناسه آزمون، نتیجه برگشتی، نتیجه مورد انتظار و درخواست آزمایش واقعی را در پیام ایمیل اضافه کنید. جریان را با مقدار اشتباه عمدی در ستون نتیجه مورد انتظار یک مورد آزمایشی آزمایش کنید. شما باید به سرعت یک ایمیل دریافت کنید.

عبارت برای رسیدن به نتایج برگشتی نیاز به توضیح عمیق تری دارد. همه پرس و جوهای آزمایشی از یک تابع SUMMARIZECOLUMNS با نتیجه محاسبه شده در ستونی به نام [نتیجه] استفاده می کنند. طبق کنوانسیون ExecuteQueries REST API، ستون هایی که تغییر نام داده یا در پرس و جو ایجاد می شوند، در داخل پرانتز بازگردانده می شوند. و از آنجایی که محاسبات هر کدام یک مقدار واحد را برمی گرداند، جدول خلاصه عملاً فقط یک ردیف دارد. جدول زیر عبارت string(outputs('Run_a_query_against_a_dataset')?['body/firstTableRows']?[0]?['[Result]']) را به بخش های جداگانه آن تقسیم می کند تا به آن مقدار محاسبه شده برسد.

شرح بیان
outputs('Run_a_query_against_a_dataset') کل پاسخ ExecuteQueries REST API را برای اقدامی به نام Run a query در برابر مجموعه داده دریافت می کند.
خروجی ها(...)؟['body/firstTableRows'] تمام ردیف های مجموعه نتیجه اول را در بدنه پاسخ انتخاب می کند.
خروجی ها(...)؟[…]؟[0] ردیف اول را در تمام ردیف های اولین مجموعه نتیجه انتخاب می کند.
خروجی ها(...)؟[…]؟[0]؟[‘[نتیجه]’] مقدار ستون [نتیجه] سطر اول را انتخاب می کند.
string(…) مقدار انتخاب شده را به رشته تبدیل می کند. این امر ضروری است زیرا نتایج بازگشتی ممکن است از هر نوع داده ای باشد در حالی که ردیف های لیست موجود در یک عملکرد جدول مقدار نتیجه مورد انتظار را به عنوان یک رشته می خواند.
و شما آن را دارید. آزمایش مجموعه داده‌ها می‌تواند بسیار آسان باشد، از جمله جعل هویت در صورتی که مجموعه داده شما دارای RLS باشد!

اما صبر کنید، بیشتر وجود دارد! BI محور جریان ابر! اگر به مثال قبلی «حوادث پشتیبانی روزانه» برگردیم، آیا نمی‌خواهید درباره این افزایش عظیم حجم پشتیبانی در روز اخیر بیشتر بدانید؟ خیلی بیشتر از آستانه! این بخش پشتیبانی در حال چکش خوردن است! چه چیزی باعث این جهش شد؟ و شاید مهمتر از آن، کدام مهندسان پشتیبانی برای کمک به کنترل سریع این وضعیت مناسب هستند؟ یک جریان ابری مبتنی بر BI می تواند این پاسخ ها را حتی قبل از اینکه سؤال بپرسید ارائه دهد!

گزارش رویدادهای پشتیبانی روزانه در حال حاضر آخرین حجم پشتیبانی را اندازه گیری می کند و آستانه هشدار را محاسبه می کند. از بین این دو پارامتر، ما می توانیم یک ماشه برای یک جریان ابری بسازیم. یک گزینه استفاده از هشدار داده است، همانطور که در راهنمای نحوه ادغام هشدارهای داده Power BI با Power Automate در مستندات محصول نشان داده شده است. با این حال، هشدارهای داده از مقادیر آستانه ایستا استفاده می کنند در حالی که آستانه هشدار ما ماهیت پویا دارد زیرا بر میانگین متحرک و انحراف استاندارد متکی است. خوشبختانه، این روزها انتخاب بسیار بسیار بهتری وجود دارد: Power BI Metrics متصل به مقادیر داده! Power BI Metrics نیز می‌تواند در جریان Power Automate ادغام شود، همانطور که در استفاده از Power Automate برای به‌روزرسانی خودکار اهداف در مستندات محصول توضیح داده شده است.

توجه داشته باشید که Power BI Metrics نام جدید ویژگی است که قبلاً به عنوان اهداف شناخته می شد. بازخورد مشتریان در طول پیش نمایش اهداف نشان داد که نام قدیمی باعث سردرگمی شده است. Power BI Metrics در واقع هدف سنجش موفقیت و پیشرفت در یک تلاش یا ابتکار را به طور شهودی تری بیان می کند، اما اقدامات Power Automate مربوط به Metrics همچنان با عنوان "اهداف" شناخته می شوند تا زمانی که تغییرات نام به طور کامل در Power Automate نیز اعمال شود. از آنجایی که تغییرات هنوز به طور کامل انجام نشده است، توضیحات زیر همچنان به اهداف در اقدامات Power Automate اشاره دارد.

مزیت بزرگ Power BI Metrics این است که Metrics متصل به داده می تواند برش دهنده ها و فیلترها را اعمال کند. این باعث می شود که تعریف سطح بالا و زیر متریک بسیار آسان شود. به کارت امتیازی زیر توجه کنید. برای هر ناحیه پشتیبانی یک زیر متریک دارد. این همان اقدامات برای حجم پشتیبانی و آستانه هشدار است، فقط با انتخاب های مختلف برش دهنده منطقه. قوانین وضعیت تعریف می‌کنند که اگر حجم پشتیبانی بیشتر از آستانه هشدار باشد، وضعیت متریک باید در معرض خطر باشد و در غیر این صورت در مسیر قرار دارد. نام متریک ناحیه پشتیبانی را منعکس می‌کند به طوری که می‌توانید اطلاعات وضعیت مهم را فقط از کارت امتیاز جمع‌آوری کنید. بلافاصله می توانید ببینید که قسمت Front-end داغ است.

شناسایی منطقه مشکل‌دار شروع خوبی است، اما ما می‌خواهیم وقتی یک موقعیت بحرانی پیش می‌آید، اطلاعات کاربردی‌تر به دست ما برسد. بر این اساس، جریان ابری ما می‌تواند از ماشه هنگامی که وضعیت یک هدف تغییر می‌کند استفاده کند. با این حال، کارت امتیازی پشتیبانی محصول ما چندین هدف/معیار دارد. خوشبختانه، کانکتور Power BI همچنین شامل یک اقدام چند هدفه است. یک جریان برنامه‌ریزی‌شده می‌تواند از این عمل برای بازیابی همه اهداف/معیارها از کارت امتیازی استفاده کند و سپس فهرست را به اهدافی که وضعیت «در معرض خطر» دارند فیلتر کند. سپس یک Apply برای هر حلقه روی این اهداف/معیارها تکرار می‌شود، مجموعه داده را برای اطلاعات کاربردی مورد نظر جستجو می‌کند، و سپس یک ایمیل اعلان برای مدیر صاحب منطقه پشتیبانی ارسال می‌کند. تصویر زیر جریان و پیام ایمیل حاصل را نشان می دهد.

پرس و جوهای مجموعه داده در تصویر بالا برای صرفه جویی در فضا به اختصار نوشته شده اند. یک پست وبلاگ بعدی ممکن است این سوالات را با جزئیات بیشتری بررسی کند. با این فرض که نام هدف/متریک با نام یک ناحیه پشتیبانی مطابقت دارد، اولین پرس‌وجو در برابر یک اقدام مجموعه داده، نام را به عنوان پارامتر ورودی می‌گیرد و شناسه‌ها یا کلیدهای تمام زیرمنطقه‌های سطح بعدی را که بیشتر از حوزه‌های زیرمجموعه آن‌ها است، برمی‌گرداند. آستانه هشدار این سطح دقیق‌تر از جزئیات در ناحیه پشتیبانی گسترده‌تر به محدود کردن سریع‌تر علل احتمالی کمک می‌کند. جریان از عبارت زیر برای فرار از علامت نقل قول احتمالی در نام هدف/متریک استفاده می‌کند و سپس دوباره کل رشته را در علامت نقل قول قرار می‌دهد، همانطور که قبلاً برای مثال صادرات داده توضیح داده شد: concat('"', replace(item()[ 'نام']، '"'، '""')، '"').

پرس و جوی دوم کلیدهای زیر ناحیه و نام مدیر پشتیبانی را به عنوان ورودی انتظار دارد. یک اقدام Select آرایه را با کلیدهای زیر ناحیه از پاسخ پرس و جو اول ایجاد می کند، که جریان آن را با استفاده از تابع join() به یک رشته تبدیل می کند، مانند مثال قبلی صادر کردن داده. از سوی دیگر، مدیر پشتیبانی را می‌توان در ویژگی مالک هدف/متریک (آیتم()['owner'] یافت. مجدداً، تمام مقادیر با استفاده از همان تابع concat() مانند قبل خارج شده و در علامت نقل قول قرار می گیرند. این پرسش دوم مهندسان پشتیبانی را که به مدیر مشخص شده گزارش می دهند، جستجو می کند و سپس موارد کار پشتیبانی گذشته و فعلی آنها را تجزیه و تحلیل می کند تا تجربیات و حجم کاری فعلی هر مهندس را خلاصه کند. به عنوان مثال، مهندسی که روی بیش از 20 مورد پشتیبانی در همان زیرحوزه کار کرده است، با تجربه در نظر گرفته می شود، در حالی که مهندسان بدون سابقه کار، تجربه ندارند.

مراحل باقی مانده بدنه پیام ایمیل را جمع آوری می کند. آنها نسبتاً بی حادثه هستند. شما می توانید یک جدول HTML را به همان روشی که جدول CSV قبلا در این پست وبلاگ نشان داده شده است ایجاد کنید. این جریان همچنین تعدادی لوازم آرایشی HTML و CSS را اعمال می کند و سپس پیام ایمیل را در مسیر شادی خود به گیرنده مورد نظر ارسال می کند.

و این برای یک گشت و گذار طوفانی از طریق جریان های Power Automate است که از عملکرد جدید برای اجرای پرس و جوها در برابر مجموعه داده های Power BI استفاده می کند. امیدواریم که نمونه‌های تحت پوشش را مرتبط با سناریوهای خود بیابید و برای شروع بازی سلف سرویس BI خود به سطح بعدی مفید باشد. ادغام ExecuteQueries REST API با Power Automate به کارمندان اداری و تصمیم‌گیرندگان به روش‌های جدید و خلاقانه قدرت می‌دهد و در عین حال بازده سرمایه‌گذاری سازمان را در مجموعه داده‌های مشترک و تایید شده به حداکثر می‌رساند. می‌توانید با ترکیب کردن عبارت Run a Query در برابر عملکرد مجموعه داده با سایر اقدامات Power BI، مانند خواندن، به‌روزرسانی و حتی ایجاد Power BI Metrics، مزایا را بیشتر ترکیب کنید. دیگر نیازی به شکار سیلوهای داده و اختراع مجدد چرخ ندارید. Power BI و Power Automate به شما این امکان را می دهند که از داده های انتخاب شده، منطق تجاری تأیید شده و تجزیه و تحلیل قابل اعتمادی که قبلاً در مجموعه داده های خود دارید استفاده مجدد کنید. شما می توانید جریان های مبتنی بر BI را در عرض چند دقیقه بدون نیاز به نوشتن کد پیچیده ایجاد کنید. چند عبارت اساسی برای دسترسی به خواص و مقادیر رشته فرار تنها چیزی است که لازم است. با سناریوهای سلف سرویس BI در Power Automate، فرآیندهای کسب و کار مبتنی بر بینش شما حتی بیشتر بینش محور می شوند. شما واقعاً می توانید قبل از اینکه سؤالات را بپرسید، پاسخ دریافت کنید. ما امیدواریم که شما نیز مانند ما در مورد این امکانات جدید پیشگامانه هیجان زده باشید. و مثل همیشه، لطفاً هنگام امتحان کردن اقدامات Power BI در Power Automate، بازخورد خود را به ما ارائه دهید. دوست داریم بیشتر از شما بشنویم!

  • sahar saha sql
  • ۰
  • ۰

Power BI داده ها را از Google Sheets دریافت می کند
Power BI اکنون می تواند داده ها را از Google Sheet دریافت کند. این قابلیت همین دیروز منتشر شد و در هر دو وبلاگ Power BI و Power Query اعلام شد. این ویژگی همچنان پیش‌نمایش (بتا) است، اما ارزش آن را دارد که در یک مقاله و ویدیوی سریع به نحوه عملکرد آن نگاه کنید.

ویدئو

URL برگه Google
برای دریافت داده‌ها از برگه Google، به URL Sheet نیاز دارید، که وقتی صفحه Google را باز کردید، می‌توانید آن را از نوار آدرس مرورگر دریافت کنید. فقط URL را از نوار آدرس کپی کنید.


اکنون که URL را در اختیار دارید، می توانید از آن در پنجره دریافت داده در Power BI Desktop استفاده کنید

دریافت داده از Google Sheet
از Get Data در Power BI Desktop استفاده کنید و More را انتخاب کنید.


اکنون Google Sheet را جستجو کنید.


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


اگر اولین باری است که از Power BI به این Google Sheet متصل می شوید، باید وارد سیستم شوید،


روند ورود به سیستم را در مرورگر ادامه دهید


و پس از اتمام، این پیام را مشاهده می کنید.


در صورت تمایل می توانید برگه مرورگر را ببندید و به Power BI Desktop بازگردید


باید ببینید که در حال حاضر وارد سیستم شده اید و می توانید متصل شوید. با این کار پنجره Navigator ظاهر می شود و همه برگه های آن Google Sheet را خواهید دید.


بقیه مراحل بسیار شبیه دریافت داده از اکسل در Power BI است. برگه(های) مورد نظر خود را انتخاب کنید و به مرحله بعدی (بارگذاری یا تبدیل داده) بروید. من قویاً به Transform Data همیشه پیشنهاد می کنم تا بتوانید داده ها را با مواردی مانند استفاده از ردیف اول به عنوان سرصفحه و فیلتر کردن داده ها و غیره قبل از بارگیری در Power BI آماده کنید.

سرویس Power BI و بازخوانی برنامه
هنگامی که داده ها را تجسم کردید، سپس می توانید آن را در Power BI Service منتشر کنید و یک به روز رسانی برنامه ریزی شده را تنظیم کنید.

به‌روزرسانی زمان‌بندی شده راه‌اندازی آسانی خواهد بود زیرا برای اتصال به Google Sheet به Gateway نیاز ندارید. تنها چیزی که برای راه اندازی نیاز دارید، اعتبارنامه و ورود به کانکتور GoogleSheets است.


و سپس می توانید آن را برای به روز رسانی برنامه ریزی کنید.


همانطور که می بینید، این نه تنها در Power BI Desktop کار می کند، بلکه پس از انتشار مجموعه داده در سرویس نیز کار می کند و نیازی به دروازه نخواهد داشت. اکنون، بیایید کمی بیشتر در مورد آن بیاموزیم.

محدودیت ها و تغییرات آتی
این رابط به تازگی منتشر شده است و هنوز در نسخه بتا است. ما انتظار داریم که در ماه های آینده پیشرفت های زیادی برای آن ایجاد شود و بسیاری از محدودیت های زیر ممکن است تا آن زمان برداشته شوند. با این حال، در حال حاضر، این محدودیت‌های شناخته شده هستند.

اگر می‌خواهید به چندین کاربرگ‌نگار Google متصل شوید، باید برای هر یک از صفحات جداگانه به سیستم وارد شوید، زیرا آنها از URLهای مختلف استفاده می‌کنند.
در حال حاضر این رابط در Dataflow در دسترس نیست. اما جدول زمانی مورد انتظار برای آن اواسط سال 2022 است.
این برای دریافت داده از پوشه کار نمی کند. شما نمی توانید فقط از یک مسیر پوشه Google Drive استفاده کنید و همه برگه ها را از آن دریافت کنید. آنها باید یکی یکی پر شوند.
امکان مرور صفحه Google در آینده از Power Query وجود خواهد داشت. هنوز جدول زمانی برای آن وجود ندارد.
برای کسب اطلاعات بیشتر در مورد محدودیت ها و ویژگی های آینده، این مقاله را از تیم Power Query بخوانید.
خلاصه
قابلیت اتصال به Google Sheets از Power BI یکی از ویژگی های مورد علاقه بوده است و این ایده بیش از 3000 رای داشت. از نظر من، این به بسیاری از کاربران با داده های خود در Google Sheets امکان می دهد تا بتوانند از Power BI به صورت خودکار استفاده کنند. تشکر ویژه از تیم Power Query برای ساخت کانکتور. مانند بسیاری دیگر از ویژگی های پیش نمایش، محدودیت هایی وجود دارد، با این حال، می توان انتظار داشت که بسیاری از آنها در ماه های آینده برداشته شوند. تجربه خود را با رابط Google Sheet در نظرات زیر به من بگویید.

رضا راد در فیسبوک رضا راد در لینکدین رضا راد در توییتر رضا راد در یوتیوب
رضا راد
رضا راد
مربی، مشاور، راهنما
رضا راد مدیر منطقه ای مایکروسافت، نویسنده، مربی، سخنران و مشاور است. او دارای لیسانس مهندسی کامپیوتر است. او بیش از 20 سال تجربه در تجزیه و تحلیل داده ها، BI، پایگاه های داده، برنامه نویسی و توسعه عمدتاً بر روی فناوری های مایکروسافت دارد. او به مدت 9 سال متوالی (از سال 2011 تا کنون) MVP پلتفرم داده مایکروسافت به دلیل تعهد خود در Microsoft BI است. رضا یک وبلاگ نویس فعال و یکی از بنیانگذاران RADACAD است. رضا همچنین یکی از بنیانگذاران و یکی از سازمان دهندگان کنفرانس Difinity در نیوزیلند است.
مقالات او در مورد جنبه های مختلف فناوری، به ویژه در مورد MS BI را می توان در وبلاگ او یافت: https://radacad.com/blog.
او چند کتاب در MS SQL BI نوشت و همچنین در حال نوشتن برخی دیگر است، او همچنین عضو فعال انجمن های فنی آنلاین مانند MSDN و Experts-Exchange بود و مدیر انجمن های MSDN SQL Server بود و MCP, MCSE است. و MCITP از BI. او رهبر گروه کاربران هوش تجاری نیوزلند است. او همچنین نویسنده کتاب بسیار محبوب Power BI از تازه کار تا راک استار است که رایگان با بیش از 1700 صفحه محتوا و Power BI Pro Architecture منتشر شده توسط Apress است.
او یک سخنران بین المللی در Microsoft Ignite، Microsoft Business Applications Summit، Data Insight Summit، PASS Summit، SQL Saturday و گروه های کاربری SQL است. و او یک مربی معتبر مایکروسافت است.
اشتیاق رضا این است که به شما کمک کند بهترین راه حل داده را پیدا کنید، او مشتاق داده است.
این مطلب در Power BI, Power BI from Rookie to Rockstar, Power Query ارسال شده است و با برچسب Get Data, Power BI, Power BI from Rookie to Rock Star, Power Query برچسب گذاری شده است. پیوند ثابت را نشانه گذاری کنید.
ناوبری پست
← نام‌های نماد Power BI برای قالب‌بندی شرطی با استفاده از DAXPower BI از فیلتر کردن تاریخ و تاریخ با یک برش دهنده →

  • sahar saha sql
  • ۰
  • ۰

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

Power BI Slicer بدون گزینه جستجو

اگر یک برش دهنده در Power BI برای مقدار متنی (مانند نام مشتریان) ایجاد کنید، برش دهنده بدون هیچ گزینه جستجویی مانند زیر به نظر می رسد.

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

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


این یک نوار جستجو در بالای برش دهنده اضافه می کند


تنظیم مداوم
نوار جستجوی اضافه شده همانجا در اسلایسر باقی می ماند، مگر اینکه آن را غیرفعال کنید. غیرفعال کردن آن شبیه به فعال کردن آن است، یعنی برای گزینه های بیشتر روی (…) بیضی کلیک کنید و سپس روی جستجو کلیک کنید.

این بدان معناست که اگر می‌خواهید نوار جستجو برای کاربران نهایی در دسترس باشد، باید آن را فعال کنید و سپس گزارش را در سرویس Power BI منتشر کنید.

بیشتر بخوانید: برش دهنده ها
امیدوارم این نکته سریع به شما کمک کند تجسم بهتری از Power BI داشته باشید.

اگر می خواهید یاد بگیرید که چگونه برش چند انتخابی را در Power BI به عنوان مطالعه بیشتر تغییر دهید، مقاله من را اینجا بخوانید.
اگر علاقه مند به ایجاد یک اسلایسر با اولین کاراکترهای متن هستید، مقاله دیگر من را در اینجا بخوانید.
برای آشنایی با Sync slicers در Power BI، مقاله لیلا را اینجا بخوانید.
برش تاریخ نسبی می تواند برای یادگیری از مقاله من در اینجا مفید باشد.
شما می توانید با استفاده از روشی که در اینجا توضیح دادم، یک برش دهنده از به روز را پیاده سازی کنید.
برش تاریخ نسبی برای منطقه زمانی شما را می توان در مقاله من در اینجا مطالعه کرد.
من روشی را برای ایجاد یک کل شفاف برای اسلایسرها در Power BI در اینجا توضیح دادم.
برای اینکه بدانید چگونه یک بعد می تواند بعد دیگری را در اسلایسر فیلتر کند، مقاله من را اینجا بخوانید.
رضا راد در فیسبوک رضا راد در لینکدین رضا راد در توییتر رضا راد در یوتیوب
رضا راد
رضا راد
مربی، مشاور، راهنما
رضا راد مدیر منطقه ای مایکروسافت، نویسنده، مربی، سخنران و مشاور است. او دارای لیسانس مهندسی کامپیوتر است. او بیش از 20 سال تجربه در تجزیه و تحلیل داده ها، BI، پایگاه های داده، برنامه نویسی و توسعه عمدتاً بر روی فناوری های مایکروسافت دارد. او به مدت 9 سال متوالی (از سال 2011 تا کنون) MVP پلتفرم داده مایکروسافت به دلیل تعهد خود در Microsoft BI است. رضا یک وبلاگ نویس فعال و یکی از بنیانگذاران RADACAD است. رضا همچنین یکی از بنیانگذاران و یکی از سازمان دهندگان کنفرانس Difinity در نیوزیلند است.
مقالات او در مورد جنبه های مختلف فناوری، به ویژه در مورد MS BI را می توان در وبلاگ او یافت: https://radacad.com/blog.
او چند کتاب در MS SQL BI نوشت و همچنین در حال نوشتن برخی دیگر است، او همچنین عضو فعال انجمن های فنی آنلاین مانند MSDN و Experts-Exchange بود و مدیر انجمن های MSDN SQL Server بود و MCP, MCSE است. و MCITP از BI. او رهبر گروه کاربران هوش تجاری نیوزلند است. او همچنین نویسنده کتاب بسیار محبوب Power BI از تازه کار تا راک استار است که رایگان با بیش از 1700 صفحه محتوا و Power BI Pro Architecture منتشر شده توسط Apress است.
او یک سخنران بین المللی در Microsoft Ignite، Microsoft Business Applications Summit، Data Insight Summit، PASS Summit، SQL Saturday و گروه های کاربری SQL است. و او یک مربی معتبر مایکروسافت است.
اشتیاق رضا این است که به شما کمک کند بهترین راه حل داده را پیدا کنید، او مشتاق داده است.
این مطلب در Power BI, Power BI from Rookie to Rockstar, Visualization ارسال شده است و Power BI, Power BI Desktop, Power BI from Rookie to Rock Star, Visualization برچسب گذاری شده است. پیوند ثابت را نشانه گذاری کنید.
ناوبری پست
← تاریخ Power BI یا جدول تقویم بهترین روش: DAX یا Power Query؟ Power BI Calendar Visual →

  • sahar saha sql
  • ۰
  • ۰

عبارت جدول مشترک (CTE) یک ساختار قدرتمند در SQL است که به ساده سازی یک پرس و جو کمک می کند. CTE ها به عنوان جداول مجازی (با رکوردها و ستون ها) کار می کنند، که در طول اجرای یک پرس و جو ایجاد می شوند، توسط پرس و جو استفاده می شوند و پس از اجرای پرس و جو حذف می شوند. CTE ها اغلب به عنوان پلی برای تبدیل داده ها در جداول منبع به فرمت مورد انتظار پرس و جو عمل می کنند.

یک عبارت جدول رایج یا CTE یک مجموعه نتیجه با نام موقت است که از یک دستور SELECT ساده ایجاد شده است که می تواند در دستور SELECT بعدی استفاده شود. هر SQL CTE مانند یک پرس و جو با نام است که نتیجه آن در یک جدول مجازی (یک CTE) ذخیره می شود تا بعداً در پرس و جو اصلی به آن ارجاع داده شود.

بهترین راه برای یادگیری عبارات رایج جدول از طریق تمرین است. من دوره پرس و جوهای بازگشتی تعاملی LearnSQL.com را توصیه می کنم. این شامل بیش از 100 تمرین است که CTE ها را با اصول اولیه و پیشرفت به موضوعات پیشرفته مانند عبارات جدول رایج بازگشتی آموزش می دهد.

CTE ها به ساده سازی پرس و جوها کمک می کنند
بیایید با نحو یک عبارت جدول مشترک شروع کنیم.

با my_cte AS (
  a,b,c را انتخاب کنید
  از T1
)
a,c را انتخاب کنید
از my_cte
جایی که ....
نام این CTE my_cte است و کوئری CTE SELECT a,b,c از T1 است. CTE با کلمه کلیدی WITH شروع می شود، پس از آن نام CTE خود را مشخص می کنید، سپس محتوای پرس و جو را در پرانتز مشخص می کنید. پرس و جو اصلی بعد از پرانتز بسته می شود و به CTE اشاره می کند. در اینجا، پرس و جو اصلی (همچنین به عنوان پرس و جو خارجی شناخته می شود) SELECT a,c FROM my_cte WHERE ... است.

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

در این مقاله مقدماتی عالی در مورد CTE، نمونه‌های سطح ورودی زیادی وجود دارد. سایر مقالات مقدماتی عبارتند از: «بهبود خوانایی پرس و جو با عبارات رایج جدول» و «چه زمانی باید از عبارت جدول رایج (CTE) استفاده کنم؟» که عبارات جدول رایج را توضیح می دهند.

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

تعداد اقلام تاریخ شعبه فروشنده مقدار واحد_قیمت
Paris-1 2021-12-07 چارلز هدفون A2 1 80
London-1 2021-12-06 John Cell Phone X2 2 120
London-2 2021-12-07 Mary Headphones A1 1 60
Paris-1 2021-12-07 Charles Battery Charger 1 50
London-2 2021-12-07 مری تلفن همراه B2 2 90
London-1 2021-12-07 John Headphones A0 5 75
London-1 2021-12-07 Sean Cell Phone X1 2 100
در مثال اول، گزارشی با همان رکوردها از جدول فروش به دست می آوریم اما یک ستون اضافی با قیمت گران ترین کالای فروخته شده در همان شعبه در آن روز اضافه می کنیم. برای به دست آوردن قیمت گران ترین کالا، از عبارت جدول رایج مانند زیر استفاده می کنیم:

با بالاترین AS (
  انتخاب کنید
    شاخه،
    تاریخ،
    MAX(unit_price) AS بالاترین_قیمت
  از فروش
  گروه به شاخه، تاریخ
)
انتخاب کنید
  حراجی.*،
  h.highest_price
از فروش
به بالاترین h بپیوندید
  ON sales.branch = h.branch
    AND sales.date = h.date
این کوئری یک SQL CTE به نام بالاترین را تعریف می کند که نتیجه آن یک جدول مجازی ایجاد می کند. جدول مجازی دارای ستون های شاخه، تاریخ و بالاترین_قیمت است که به ترتیب شامل نام شعبه، تاریخ و بالاترین قیمت واحد فروخته شده در آن روز در این شعبه است.

سپس کوئری بیرونی اجرا می شود که از بالاترین جدول مجازی مانند یک جدول معمولی استفاده می کند. در نهایت با جدول فروش به نتیجه بالاترین CTE می‌پیوندیم.

نتیجه کل پرس و جو در زیر نشان داده شده است:

تاریخ شعبه فروشنده مقدار واحد_قیمت بالاترین_ قیمت
Paris-1 2021-12-07 چارلز هدفون A2 1 80 80
London-1 2021-12-06 John Cell Phone X2 2 120 120
London-2 2021-12-07 Mary Headphones A1 1 60 90
Paris-1 2021-12-07 Charles Battery Charger 1 50 80
London-2 2021-12-07 مری تلفن همراه B2 2 90 90
London-1 2021-12-07 John Headphones A0 5 75 100
London-1 2021-12-07 Sean Cell Phone X1 2 100 100
در مثال بعدی، گزارشی با بیشترین درآمد روزانه به تفکیک شعب تهیه می کنیم.

WITH daily_revenue AS (
  انتخاب کنید
    شاخه،
    تاریخ،
    جمع (قیمت_واحد * مقدار) به عنوان درآمد_روزانه
  از فروش
  WHERE EXTRACT (سال از تاریخ) = 2021
  گروه 1،2
)
انتخاب کنید
  شاخه،
  MAX(درآمد_روزانه) حداکثر_درآمد_روزانه
از روزانه_درآمد
گروه 1
سفارش با 2 تخفیف
در این پرس و جو، یک CTE به نام daily_revenue دارای ستون های شاخه، تاریخ، و daily_revenue برای هر تاریخ در سال 2021 است. سپس در پرس و جو بیرونی، بالاترین میزان درآمد را برای هر شعبه در سال 2021 به دست می آوریم. این گزارش بر اساس max_daily_revenue به ترتیب نزولی مرتب می شود. .

در زیر نتایج این پرس و جو آورده شده است.

شعبه حداکثر_درآمد_روزانه
لندن-1 575
لندن-2 240
پاریس-1 135
دوره پرس و جوهای بازگشتی تعاملی ما را امتحان کنید. 114 تمرین عملی برای کمک به شما در مقابله با این مفهوم پیشرفته!

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

فرض کنید گزارشی با کل درآمد ماهانه در لندن در سال 2021 می‌خواهیم، ​​اما درآمد هر شعبه در لندن را نیز در همان گزارش می‌خواهیم. در اینجا، ما دو CTE ایجاد می کنیم و سپس آنها را در پرس و جو اصلی می پیوندیم.

با london1_monthly_revenue AS (
  انتخاب کنید
    EXTRACT (MONTH FROM تاریخ) به عنوان ماه،
    SUM(unit_price * مقدار) درآمد AS
  از فروش
  WHERE EXTRACT (سال از تاریخ) = 2021
    AND شاخه = 'London-1'
  گروه 1
)
london2_monthly_revenue AS (
  انتخاب کنید
    EXTRACT (MONTH FROM تاریخ) به عنوان ماه،
    SUM(unit_price * مقدار) درآمد AS
  از فروش
  WHERE EXTRACT (سال از تاریخ) = 2021
    AND شعبه = 'London-2'
  گروه 1
)
انتخاب کنید
  l1 ماه،
  l1.revenue + l2.revenue AS london_revenue,
  l1.revenue AS london1_revenue,
  l2.revenue AS london2_revenue
از london1_monthly_revenue l1, london2_monthly_revenue l2
WHERE l1.month = l2.month
در پرس و جوی بالا، دو CTE، london1_monthly_revenue و london2_monthly_revenue تعریف می کنیم تا درآمد ماهانه در سال 2021 را برای هر شعبه در لندن به دست آوریم. در نهایت با استفاده از ستون ماه به هر دو CTE ملحق می‌شویم و کل درآمد لندن را با جمع کردن درآمدهای دو شعبه محاسبه می‌کنیم.

نتیجه پرس و جو به شرح زیر است:

ماه london_revenue london1_revenue london2_revenue
11 755 575 180
12 1055 815 240
در مثال زیر، گزارشی به دست می‌آوریم تا به هر شعبه از تاریخ فروخته شدن بزرگترین بلیط (یعنی مقدار ترکیب کالا-مقدار) و مقدار این بلیط اطلاع دهیم. برای انجام این کار، باید یک CTE ایجاد کنیم که بلیط ها را (موقعیت ستون، رتبه بندی است) برای هر شعبه بر اساس مبلغ بلیط رتبه بندی می کند.

با بلیط AS (
  متمایز را انتخاب کنید
    شاخه،
    تاریخ،
    واحد_قیمت * مقدار AS بلیط_مبلغ،
    ROW_NUMBER() بیش از (
      پارتیشن به شاخه
      سفارش بر اساس واحد_قیمت * مقدار DESC
    ) موقعیت AS
  از فروش
  سفارش با 3 تخفیف
)
انتخاب کنید
  شاخه،
  تاریخ،
  بلیط_مبلغ
از بلیط
موقعیت WHERE = 1
در کوئری بالا، یک CTE با شاخه ستون، تاریخ، بلیط_مبلغ و موقعیت ایجاد می کنیم. سپس در پرس و جو بیرونی، ما فقط برای آن رکوردهایی با موقعیت = 1 فیلتر می کنیم تا آنچه را که می خواهیم به دست آوریم، بزرگترین بلیط به شاخه.

نتیجه پرس و جو در زیر نشان داده شده است:

تاریخ شعبه بلیط_مبلغ
London-1 2021-11-2 450
London-2 2021-11-1 270
Paris-1 2021-12-7 80
CTE های تودرتو در پرس و جوهای SQL

مثال بعدی یک CTE تو در تو را نشان می دهد. ایده این است که گزارشی با قیمت تمام اقلام بیش از 90 دلار و تعداد این اقلام فروخته شده توسط شعبه London-2 تهیه شود.

با بیش از_90_ آیتم AS (
  متمایز را انتخاب کنید
    مورد،
    قیمت واحد
  از فروش
  WHERE واحد_قیمت>=90
)
london2_over_90 AS (
  انتخاب کنید
    o90.item،
    o90.unit_price,
    coalesce(SUM(s.quantity)، 0) as total_sold
  از بیش از 90_ آیتم o90
  LEFT JOIN فروش s
  ON o90.item = s.item AND s.branch = 'London-2'
  GROUP BY o90.item, o90.unit_price
)
انتخاب مورد، واحد_قیمت، کل_فروش
از london2_over_90;
اولین CTE over_90_items است که تمام اقلامی را با قیمت بیشتر یا مساوی 90 دلار انتخاب می کند. دومین CTE london2_over_90 است که مقدار فروخته شده توسط London-2 را برای هر کالای موجود در بیش از 90_ آیتم انتخاب می کند. این پرس و جو دارای یک CTE تو در تو است - FROM را در CTE دوم با اشاره به اولی توجه کنید. ما از فروش LEFT JOIN استفاده می کنیم زیرا لندن-2 ممکن است همه موارد را در بیش از 90_ آیتم فروخته باشد.

نتیجه پرس و جو این است:

واحد کالا_قیمت کل_فروخته شد
تلفن همراه X1 100 0
تلفن همراه X2 120 0
تلفن همراه B2 90 7
قبل از رفتن به بخش بعدی، چند مقاله در مورد عبارات رایج جدول پیشنهاد می کنم. هر دو "SQL CTEs توضیح داده شده با مثال" و "از کجا می توانم تمرین های خوب SQL CTE را پیدا کنم؟" مثال ها و تمرین های زیادی داشته باشید.

پرس و جوهای بازگشتی و عبارات جدول رایج
در پایگاه‌های داده رابطه‌ای، داشتن جداول نشان دهنده سلسله مراتب داده‌ها مانند مدیر-کارمند، بخش جزئی یا والد-فرزند معمول است. برای پیمایش این سلسله مراتب در هر جهت (از بالا به پایین یا از پایین به بالا)، پایگاه های داده از ساختاری به نام CTE های بازگشتی استفاده می کنند.

بازگشتی یک کلمه رزرو شده برای تعریف CTE برای عبور از یک ساختار داده بازگشتی است. شکل کوئری بازگشتی به این صورت است:

با بازگشتی cte_name AS (
     CTE_query_definition -- عبارت پرس و جو غیر بازگشتی
اتحاد همه
     CTE_query_definition - عبارت جستجوی بازگشتی
)
SELECT * FROM cte_name;
پرس و جوهای بازگشتی خارج از محدوده این مقاله مقدماتی هستند، اما من سه مورد دیگر را برای کسانی که می خواهند درباره این موضوع بیشتر می خواهند پیشنهاد کنم: "چگونه پرس و جوهای SQL را با CTE سازماندهی کنیم"، "این کار را در SQL انجام دهید: پیمایش درخت بازگشتی SQL" و "با قدرت پرس و جوهای بازگشتی SQL آشنا شوید." آنها پرس و جوهای بازگشتی را با مثال های فراوان به تفصیل توضیح می دهند.

SQL CTE ها یک منبع قدرتمند هستند

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

من دوره پرس و جوهای بازگشتی را در LearnSQL.com توصیه می کنم، جایی که به صورت تعاملی نحوه کار با عبارات جدول رایج در SQL را یاد می گیرید. همچنین می آموزید که چگونه ساختارهای داده بازگشتی مانند نمودارها و درختان را در SQL با استفاده از CTE های بازگشتی پردازش کنید.

از دوره تعاملی با رتبه برتر ما، SQL Recursive Queries بیاموزید و یک متخصص حرفه ای SQL شوید!

همچنین، آهنگ Advanced SQL را بررسی کنید، جایی که شما فراتر از اصول اولیه می روید تا به یک استاد SQL تبدیل شوید. اگر نیاز به آماده شدن برای مصاحبه SQL دارید، یک مقاله جالب با عنوان "5 سوال برتر مصاحبه SQL CTE" وجود دارد که عبارات جدول رایج را از منظر دیگری مورد بحث قرار می دهد.

اگر نحوه استفاده از CTE ها را یاد گرفته اید، یک قدم جلوتر به سمت توسعه دهنده SQL هستید. حفظ رشد!

  • sahar saha sql
  • ۰
  • ۰

ساختارهای درختی والد-فرزند در SQL چیست؟ در این مقاله، ما به این سوال پاسخ می‌دهیم، در مورد سلسله‌مراتب پرس و جو صحبت می‌کنیم و پنج مورد رایج‌ترین پرس‌وجوهای SQL را که برای این ساختارهای داده نیاز دارید، نشان می‌دهیم.

بله، می توانید از SQL در ساختار درختی والدین-فرزند استفاده کنید. من در این مقاله به شما نشان خواهم داد که چگونه. در طول راه، پنج مثال پرس و جو را برای شما شرح خواهم داد، که با ساده ترین آنها شروع می شود و با پیچیده ترین آنها خاتمه می یابد. اینها از عبارات جدول مشترک بازگشتی (CTEs) استفاده خواهند کرد.

اگر با CTE ها آشنایی ندارید، دوره پرس و جوهای بازگشتی تعاملی ما را توصیه می کنم. این شامل بیش از 100 تمرین است که به شما می آموزد چگونه از CTE ها در SQL استفاده کنید، از اصول اولیه شروع کنید و تا موضوعات پیشرفته مانند CTE های بازگشتی پیش بروید.

قبل از اینکه کد را بررسی کنیم، بیایید به یک نمای کلی از ساختار درخت والد-فرزند و نحوه ذخیره آن در یک پایگاه داده رابطه ای نگاه کنیم.

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

به یادگیری پرس و جوهای بازگشتی SQL علاقه مند هستید؟ دوره تعاملی ما را بررسی کنید.

گره ریشه - اولین گره، جایی که درخت والد-فرزند شروع می شود.
گره والد - هر گره ای است که دارای یک یا چند نود (یا فرزند) باشد.
گره فرزند - هر گره ای که دارای گره قبلی یا والد باشد.
درخت والد-فرزند چیست
نمونه‌های واقعی ساختارهای والد-فرزند شامل ساختارهای سازمانی شرکت‌ها (یک شرکت متشکل از بخش‌ها، بخش‌ها از تیم‌ها و تیم‌ها متشکل از کارمندان)، درختان خانواده (والدین، فرزندان، نوه‌ها، نوه‌ها و غیره هستند). .)، و طبقه بندی های طبیعی (جانداران متعلق به یک حوزه، پادشاهی، شاخه، طبقه، نظم، خانواده، جنس، و گونه هستند). حتی پوشه های کامپیوتر (دیسک C، فایل های برنامه، مایکروسافت SQL Server...)، منوها (نوشیدنی ها، نوشیدنی های غیر الکلی، چای...)، ژانرهای هنری و موسیقی (به عنوان مثال، بلوز وجود داشت که ریتم و بلوز را توسعه داد، که منجر به روح، فانک و غیره) و پروژه ها (یک پروژه دارای پروژه های فرعی است که دارای وظایف، وظایف فرعی و غیره است) را می توان ساختار داده سلسله مراتبی در نظر گرفت.

ساختار درختی والد-فرزند در پایگاه های داده رابطه ای
برای اینکه SQL هر کاری را با آن انجام دهد، ساختار درختی والد-فرزند باید در یک پایگاه داده رابطه ای ذخیره شود.

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

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

شناسه first_name last_name parent_id
1 جیم کلیفی NULL
2 مارک کلیفی 1
3 ورونیکا کلیفی 2
در اینجا، شناسه ستون، شناسه کودک را نشان می دهد. برای اینکه بدانید والدین آن فرزند چه کسی هستند، باید به ستون parent_id نگاه کنید، همان شماره شناسه را در ستون id پیدا کنید و در آن ردیف به دنبال نام والدین بگردید.

به عبارت دیگر، جیم کلیفی هیچ پدر و مادری در این جدول ندارد. مقدار در ستون parent_id او NULL است. این بدان معناست که او گره ریشه این ساختار درختی است.

مارک کلیفی پسر جیم کلیفی است. از کجا بدانم؟ زیرا Mark's parent_id = 1، که شناسه Jim Cliffy است. مارک کلیفی یک گره فرزند است، اما او همچنین یک گره والد است. چرا؟ زیرا ورونیکا کلیفی دختر مارک کلیفی است. من این را می دانم زیرا والد او parent_id = 2 دارد و جدول به من می گوید که مارک کلیفی است. ورونیکا کلیفی به شدت یک گره کودک است. او یک گره والد دارد، اما هیچ گره فرزندی از او منشعب نمی شود.

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

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

معرفی نمونه داده ها
جدول parent_child نام دارد و دارای ستون های زیر است:

شناسه – شناسه کودک و کلید اصلی جدول (PK).
first_name - نام کوچک کودک.
last_name - نام خانوادگی کودک.
parent_id - شناسه والدین کودک.
این هم کل جدول:

شناسه first_name last_name parent_id
1 روزا ولینگتون NULL
2 جان ولینگتون 1
3 جونی ولینگتون 1
4 مارج ولینگتون 1
5 مری دایکسترا 2
6 فرانک ولینگتون 2
7 جیسون ولینگتون 3
8 بابی ولینگتون 4
9 سامی ولینگتون 4
10 سارا ولینگتون 4
11 سام فرانسیس دایکسترا 5
12 استیون ولینگتون 6
13 ترنت ولینگتون 6
14 ژوئن ولینگتون 9
15 ژوزفین ولینگتون 9
16 سوزی ولینگتون 9
می‌توانید از این جدول برای بررسی اینکه آیا پرس‌و‌جوهایی که می‌خواهم نشان دهم خروجی درستی دارند یا خیر استفاده کنید.

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

سوال کوچک اینجاست:

نام_نام را انتخاب کنید،
     نام خانوادگی
از والدین_فرزند
WHERE parent_id = 4;
من به سادگی نام و نام خانوادگی را از جدول انتخاب کرده ام و از عبارت WHERE برای نشان دادن تنها ردیف هایی که در ستون parent_id یک عدد 4 وجود دارد استفاده کرده ام.

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

first_name نام خانوادگی
بابی ولینگتون
سامی ولینگتون
سارا ولینگتون
به من می گوید که بابی، سامی و سارا ولینگتون همه فرزندان مارج ولینگتون هستند. به جدول اصلی نگاه کنید، متوجه خواهید شد که درست است.

این فقط یک گرم کردن بود! بریم سراغ بعدی

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

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

پرس و جو برای این است:

SELECT child.id AS child_id،
     child.first_name AS child_first_name،
     child.last_name AS child_last_name،
     parent.first_name AS parent_first_name،
     parent.last_name AS parent_last_name،
     parent.id AS parent_id
از فرزند والدین_فرزند
به پدر و مادر_فرزند بپیوندید
  ON child.parent_id = parent.id
WHERE child.id = 11;
مفهوم اصلی که من در اینجا معرفی می کنم، خود پیوستن است. من نام مستعار را به جدول parent_child دادم و با استفاده از نام مستعار والد آن را به خودش ملحق کردم. با انجام این کار، من در حال کار با دو جدول مختلف هستم. یکی حاوی داده های مربوط به کودکان است. به همین دلیل نام آن را فرزند گذاشته ام. دیگری اطلاعاتی درباره والدین دارد، بنابراین من آن را والدین نامیده ام.

ستون های انتخاب شده منعکس کننده آن هستند. نام و شناسه کودکان از جدول "اول" انتخاب می شود. نام و شناسه والدین از جدول "دوم" انتخاب می شود. "جدول" در جایی که parent_id برابر با id است به هم می پیوندند.

جدول اصلی به من می‌گوید که شناسه Sam Francis Dijkstra 11 است. من از عبارت WHERE برای فیلتر کردن داده‌ها استفاده کرده‌ام و فقط والد Sam Francis را نشان می‌دهم. همچنین می‌توانید از عبارت WHERE در ستون‌های child.first_name و child.last_name استفاده کنید. من انتخاب کرده‌ام که داده‌ها را با استفاده از ID فیلتر کنم، زیرا پرس و جو از این طریق کمی کوتاه‌تر است.

این خروجی است:

child_id child_first_name child_last_name parent_first_name parent_last_name parent_id
11 سام فرانسیس دایکسترا مری دایکسترا 5
این نشان می دهد که مادر سام فرانسیس مری دایکسترا است که درست است.

همه چیز تا الان روشن شده؟ خوب در حال حرکت!

مثال 3: یک شماره نسل (یا سطح درخت) برای هر گره دریافت کنید

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

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

سوال من اینجاست:

با نسل بازگشتی AS (
    انتخاب شناسه،
        نام کوچک،
        نام خانوادگی،
        شناسه اصلی،
        0 نسل_شماره AS
    از والدین_فرزند
    WHERE parent_id IS NULL است
 
اتحاد همه
 
    SELECT child.id،
        child.first_name,
        child.last_name,
        child.parent_id،
        Generation_number+1 AS Generation_number
    از فرزند والدین_فرزند
    به نسل g بپیوندید
      ON g.id = child.parent_id
)
 
نام_نام را انتخاب کنید،
     نام خانوادگی،
     نسل_شماره
از نسل؛
مانند هر CTE بازگشتی، کلمه من با دو کلمه کلیدی شروع می شود: WITH Recursive. من نسل CTE را نامگذاری کرده ام. در اولین عبارت SELECT، من شناسه ها و نام ها را انتخاب می کنم. علاوه بر این، یک ستون جدید به نام Generation_number با 0 برای تمام ردیف هایی که در آن parent_id = NULL وجود دارد. چرا NULL؟ چون می‌دانم شخصی که سلف همه افراد دیگر است، پدر و مادری در جدول ندارد. بنابراین، مقدار باید NULL باشد.

من از UNION ALL برای ادغام نتیجه این عبارت SELECT با مورد دوم استفاده می کنم که مسئول بازگشت خواهد بود. برای اینکه UNION ALL کار کند، تعداد ستون ها و انواع داده ها باید در هر دو دستور SELECT یکسان باشد.

عضو بازگشتی دوباره شناسه ها و نام ها را انتخاب می کند. همچنین ستون Generation_number با مقدار Generation_number+1 وجود دارد. با هر بازگشت، 1 به مقدار قبلی این ستون اضافه می شود. همانطور که پرس و جو با 0 شروع می شود، اولین بازگشت به 1 در ستون Generation_number، دوم به 2 و غیره منجر می شود.

برای اینکه همه اینها کار کند، جدول parent_child را با خود CTE که در آن id = parent_id است، پیوستم. همان اصل در مورد جداول خود پیوسته اعمال می شود: جدول به عنوان داده در مورد کودکان عمل می کند، CTE به عنوان داده برای والدین عمل می کند.

پس از نوشتن CTE، باید از داده های آن استفاده کنم. من این کار را با نوشتن یک دستور SELECT ساده انجام داده‌ام که نام‌ها و شماره‌های نسل را از CTE برمی‌گرداند. خوب است، اینطور نیست؟

در اینجا نتیجه به نظر می رسد:

first_name_name_name_generation_number
رزا ولینگتون 0
جان ولینگتون 1
جونی ولینگتون 1
مارج ولینگتون 1
مری دایکسترا 2
فرانک ولینگتون ۲
جیسون ولینگتون ۲
بابی ولینگتون 2
سامی ولینگتون 2
سارا ولینگتون ۲
سام فرانسیس دایکسترا 3
استیون ولینگتون 3
ترنت ولینگتون 3
جون ولینگتون 3
جوزفین ولینگتون 3
سوزی ولینگتون 3
با این نتیجه، من می بینم که روزا ولینگتون گره ریشه است زیرا تعداد نسل او 0 است. همه افرادی که ارزش 1 دارند فرزندان او، ارزش 2 نوه ها و ارزش 3 نوه هستند. اگر این را در جدول منبع بررسی کنید، متوجه خواهید شد که همه چیزهایی که گفتم درست است.

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

مثال 4: لیست همه فرزندان
این مثال پسوند نمونه قبلی است. من می خواهم به شما نشان دهم که چگونه همه فرزندان والدین را فهرست کنید و نام والدین و فرزندان را نشان دهید.

این پرس و جو است:

با نسل بازگشتی AS (
    انتخاب شناسه،
         نام کوچک،
         نام خانوادگی،
         شناسه اصلی،
         0 نسل_شماره AS
    از والدین_فرزند
    WHERE parent_id IS NULL است
 
اتحاد همه
 
    SELECT child.id،
         child.first_name,
         child.last_name,
         child.parent_id،
         Generation_number+1 AS Generation_number
    از فرزند والدین_فرزند
    به نسل g بپیوندید
      ON g.id = child.parent_id
 
)
 
g.first_name AS child_first_name را انتخاب کنید،
        g.last_name AS child_last_name،
        g.generation_number،
        parent.first_name AS parent_first_name،
        parent.last_name AS parent_last_name
از نسل g
به پدر و مادر_فرزند بپیوندید
ON g.parent_id = parent.id
سفارش بر اساس نسل_شماره;
اگر این پرس و جو را با درخواست قبلی مقایسه کنید، خواهید دید که بخش CTE یکسان است. نیازی نیست که دوباره آن را مرور کنم.

آنچه متفاوت است عبارت SELECT است که به CTE ارجاع می دهد. اما مفاهیم جدید SQL نیز در اینجا وجود ندارد. پرس و جو نام فرزند و والدین و شماره نسل آنها را انتخاب می کند. من این کار را با پیوستن مجدد به CTE با جدول parent_child انجام دادم. CTE حاوی داده هایی برای کودکان است، در حالی که جدول حاوی داده هایی در مورد والدین است. آخرین خط کد نتیجه را با شماره تولید مرتب می کند.

پرس و جو دقیقا همان چیزی را که می خواستم برمی گرداند:

نام فرزند
مارج ولینگتون 1 روزا ولینگتون
جونی ولینگتون 1 رزا ولینگتون
جان ولینگتون 1 رزا ولینگتون
فرانک ولینگتون 2 جان ولینگتون
Mary Dijkstra 2 Jon Wellington
جیسون ولینگتون 2 جونی ولینگتون
سارا ولینگتون 2 مارج ولینگتون
سامی ولینگتون 2 مارج ولینگتون
بابی ولینگتون 2 مارج ولینگتون
سام فرانسیس دایکسترا 3 مری دایکسترا
ترنت ولینگتون 3 فرانک ولینگتون
استیون ولینگتون 3 فرانک ولینگتون
سوزی ولینگتون 3 سامی ولینگتون
جوزفین ولینگتون 3 سامی ولینگتون
ژوئن ولینگتون 3 سامی ولینگتون
یا این کار را می کند؟ مطمئناً، نام هر کودک و والدینش را نشان می دهد. اما رزا ولینگتون، گره اصلی و مادرزاد این خانواده، گم شده است. و من هیچ فیلتری برای حذف او اعمال نکردم.

چی شد؟ من در واقع یک فیلتر را با استفاده از JOIN در آخرین عبارت SELECT اعمال کردم. به یاد داشته باشید، JOIN فقط ردیف‌های منطبق را از جداول متصل برمی‌گرداند. رزا ولینگتون گم شده است زیرا هیچ اطلاعاتی در مورد والدینش ندارد. در مورد او، هیچ داده ای وجود ندارد که شناسه بتواند با parent_id مطابقت داشته باشد. اگر می‌خواهید او را هم بگنجانید، از LEFT JOIN در آخرین SELECT استفاده کنید:


FROM نسل g LEFT JOIN parent_child والد ON g.parent_id = parent.id

و نتیجه کامل اینجاست:

نام فرزند
رزا ولینگتون 0 NULL NULL
جونی ولینگتون 1 رزا ولینگتون
جان ولینگتون 1 رزا ولینگتون
مارج ولینگتون 1 روزا ولینگتون
Mary Dijkstra 2 Jon Wellington
جیسون ولینگتون 2 جونی ولینگتون
سارا ولینگتون 2 مارج ولینگتون
سامی ولینگتون 2 مارج ولینگتون
بابی ولینگتون 2 مارج ولینگتون
فرانک ولینگتون 2 جان ولینگتون
ترنت ولینگتون 3 فرانک ولینگتون
استیون ولینگتون 3 فرانک ولینگتون
سوزی ولینگتون 3 سامی ولینگتون
جوزفین ولینگتون 3 سامی ولینگتون
ژوئن ولینگتون 3 سامی ولینگتون
سام فرانسیس دایکسترا 3 مری دایکسترا
اگر می خواهید درباره این پرس و جو پیچیده بیشتر بدانید، در اینجا مقاله ای به این مثال اختصاص داده شده است.

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

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

بریم سر کار! دوباره، CTE بازگشتی روز را نجات می دهد:

با بازگشت درخت_نما به عنوان (
    انتخاب شناسه،
         شناسه اصلی،
         نام کوچک،
         نام خانوادگی،
         0 سطح AS،
         CAST(id AS varchar(50)) AS order_sequence
    از والدین_فرزند
    WHERE parent_id IS NULL است
     
اتحاد همه
 
    SELECT parent.id،
         parent.parent_id،
         parent.first_name,
         parent.last_name,
         سطح + 1 سطح AS،
         CAST(order_sequence || '_' || CAST(parent.id AS VARCHAR (50)) AS VARCHAR(50)) AS order_sequence
    از پدر و مادر_فرزند
    به تلویزیون tree_view بپیوندید
      ON parent.parent_id = tv.id
)
 
انتخاب کنید
   RIGHT('------------'،سطح*3) || نام_نام || '' || نام خانوادگی
     AS parent_child_tree
FROM tree_view
ORDER BY order_sequence;
شما از قبل می دانید که پرس و جوهای بازگشتی چگونه کار می کنند. این بار CTE نام درختی دارد. اولین دستور SELECT برخی از داده ها را از جدولی که parent_id NULL است انتخاب می کند. سطح ستون با مقدار 0 وجود دارد. و من از تابع CAST() برای تغییر نوع داده id به VARCHAR استفاده کرده ام. خواهید دید که چرا به آن نیاز دارم.

ما دوباره از UNION ALL برای ادغام نتایج دو پرس و جو استفاده می کنیم. دستور دوم SELECT دوباره برخی از داده ها را انتخاب می کند، با جدول parent_child که به خود CTE ملحق شده است. نکته مهم این است که با هر بازگشت، 1 به سطح قبلی اضافه می شود. همچنین، خط زیر و مقدار از شناسه ستون با هر بازگشت اضافه می شود. من به این ترفند کوچک نیاز دارم زیرا بعداً از این ستون برای مرتب کردن خروجی استفاده خواهم کرد. به این ترتیب، نمای درختی را به درستی نشان خواهم داد. برای اطمینان از اینکه متوجه شدید، در اینجا یک ردیف از جدول آمده است:

شناسه first_name last_name parent_id order_sequence
1 روزا ولینگتون NULL 1
2 جان ولینگتون 1 1_2
6 فرانک ولینگتون 2 1_2_6
مقدار ستون برای فرانک ولینگتون 1_2_6 خواهد بود. چرا؟ از آنجا که رزا، به عنوان سطح اول، ارزش 1 را دریافت می کند. جان ولینگتون پسر او است. شناسه او به order_sequence می رود که اکنون 1_2 می شود. سپس شناسه فرانک اضافه می شود و 1_2_6 می شود. با انجام این کار در سراسر ساختار سلسله مراتبی، ستونی را دریافت می کنم که می توانم از آن برای نشان دادن خروجی به روش دلخواه استفاده کنم.

بازگشت به پرس و جو. برای به دست آوردن نتیجه، به یک SELECT نیاز دارید که از داده های CTE استفاده کند. من از تابع RIGHT() در اینجا استفاده می کنم. تعداد مشخصی از کاراکترها را از سمت راست استخراج می کند. در مورد من، سطح * 3 عدد خط تیره برای هر سطح را حذف می کند. من همچنین این خط تیره ها را با نام و نام خانوادگی پیوند زده ام. نتیجه بر اساس order_sequence مرتب شده است.

آیا برای دیدن نمای درخت آماده هستید؟ ایناهاش:

والدین_درخت_فرزند
رزا ولینگتون
---جان ولینگتون
------مری دایکسترا
---------سام فرانسیس دایکسترا
------ فرانک ولینگتون
---------استیون ولینگتون
---------ترنت ولینگتون
--- جونی ولینگتون
------جیسون ولینگتون
---مارج ولینگتون
------سارا ولینگتون
------بابی ولینگتون
------سامی ولینگتون
--------- جون ولینگتون
--------- جوزفین ولینگتون
--------- سوزی ولینگتون
این نمایش گرافیکی ساده کاملاً به وضوح سطوح نسلی و اینکه چه کسی در این شجره خانوادگی است را نشان می دهد. با تعداد خط تیره ها، به راحتی می توانید ببینید که جان، جونی و مارج ولینگتون فرزندان رزا هستند. مری دایکسترا، فرانک، جیسون، سارا، بابی و سامی ولینگتون نوه های رزا هستند. همچنین به راحتی می توان فهمید که والدین آنها چه کسانی هستند. شما همچنین می توانید ببینید که نوه ها چه کسانی هستند، اما من آن را به شما واگذار می کنم.

قبل از اتمام این کار، من همچنین می خواهم این مقاله را در مورد نحوه عملکرد ساختارهای درختی پرس و جو در اوراکل توصیه کنم.

پرس و جو از درختان والد-فرزند فقط جالب تر می شود

ساختار درختی والد-فرزند بسیار هیجان انگیز است. آنها مجموعه ای کاملاً متفاوت از داده هایی هستند که معمولاً در پایگاه داده های رابطه ای جستجو می کنید. من به شما نشان دادم که این ساختارهای سلسله مراتبی چیست و چگونه در یک جدول نمایش داده می شوند.

مهمتر از همه، من به شما پنج پرس و جو را نشان داده ام که می توانید از آنها برای حل برخی از رایج ترین مشکلات مربوط به داده های سلسله مراتبی استفاده کنید. همانطور که دیدید، CTE ها و CTE های بازگشتی برای پرس و جو از درختان والد-فرزند حیاتی هستند.

LearnSQL.com پلتفرمی است که به شما امکان می دهد تمام موضوعات SQL را مرور کنید و مسیر درست را برای خود انتخاب کنید، با این تضمین که می توانید در هر زمان بدون هیچ عواقبی نظر خود را تغییر دهید.

من مطمئن هستم که شما قبلاً با داده های سلسله مراتبی در کار خود روبرو شده اید. احتمالاً متوجه شده اید که برای مقابله با چنین داده هایی باید خود را با دانش جستجوی بازگشتی دقیق مجهز کنید. ما یک دوره پرس و جوهای بازگشتی داریم که به طور سیستماتیک شما را از طریق CTE ها به طور کلی، پرس و جوهای بازگشتی و نحوه عملکرد داده ها و نمودارهای سلسله مراتبی پرس و جو در SQL هدایت می کند.

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

  • sahar saha sql
  • ۰
  • ۰

چه نوع داده ای در پایگاه داده MySQL موجود است؟ در این مقاله، با انواع داده های عددی، انواع داده های متنی و موارد دیگر آشنا خواهید شد!

ممکن است مقاله ما را در مورد انواع داده در SQL دیده باشید. در اینجا، ما بر روی انواع داده های MySQL تمرکز می کنیم. ما در مورد پرکاربردترین آنها بحث خواهیم کرد: عددی، متنی، و تاریخ و زمان.

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

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

LearnSQL.com یک فروشگاه واحد برای همه چیزهای SQL فراهم می کند که مفاهیم اولیه تا پیشرفته را در یک پلت فرم واحد پوشش می دهد. LearnSQL.com به طور خاص برای SQL طراحی شده است. این برنامه 30 دوره SQL تعاملی را ارائه می دهد که از مبتدی تا پیشرفته و چالش های ماهانه SQL برای تمرین مهارت های SQL شما دشوار است.

بیا شروع کنیم!

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

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

انواع داده های عددی دقیق در MySQL
عدد صحیح (INT)
نوع داده INTEGER (یا INT که به جای هم استفاده می شود) در MySQL اعداد کامل را ذخیره می کند. این اعداد می توانند مثبت یا منفی باشند، اما نمی توانند جزء کسری داشته باشند. زمانی که می دانیم داده های ستون باید همیشه یک عدد کامل باشند، از INTEGER استفاده می کنیم. به عنوان مثال، می توان از آن برای ذخیره تعداد دانش آموزان یک کلاس یا تعداد تی شرت های فروخته شده توسط یک فروشگاه استفاده کرد.

نوع داده INTEGER نیز نامزد خوبی برای کلید اصلی است. کلید اصلی یک ستون یا مجموعه ای از ستون ها است که برای هر ورودی در جدول متفاوت است و بنابراین می توان از آن برای شناسایی یک ردیف خاص استفاده کرد. اگر از INTEGER برای ذخیره کلید اصلی استفاده کنیم، آنگاه به هر سطر یک عدد متفاوت اختصاص داده می شود. INTEGER در MySQL همچنین دارای یک ویژگی مفید است، ویژگی AUTO_INCREMENT. به کد SQL زیر نگاه کنید:

کتاب ایجاد جدول (
id INT AUTO_INCREMENT PRIMARY KEY،
    عنوان VARCHAR(255)
)
این یک کتاب جدول با دو ستون ایجاد می کند: شناسه و عنوان. ستون id یک کلید اصلی است. نوع داده آن INT است و از ویژگی AUTO_INCREMENT استفاده می کند.

حالا بیایید این کد را اجرا کنیم:

درج کنید
    عنوان کتاب)
ارزش های
    ("داستان دو شهر")؛
صبر کنید، ما شناسه را ارائه نکردیم! اینجاست که AUTO_INCREMENT جادوی خود را انجام می دهد. هنگامی که NULL را در ستون INT AUTO_INCREMENT وارد می کنید یا مقدار آن را به طور کامل حذف می کنید (همانطور که در مثال بالا انجام دادیم)، به طور خودکار تنظیم می شود. AUTO_INCREMENT دنباله ای است که به طور پیش فرض از 1 شروع می شود و با هر رکورد درج شده 1 عدد افزایش می یابد.

مقادیر INTEGER در MySQL می توانند امضا یا بدون علامت باشند. یک INT بدون علامت مقادیر منفی را نمی پذیرد. اگر اعداد صحیح بدون علامت می خواهید، به سادگی کلمه کلیدی unsigned را اضافه کنید:

کتاب ایجاد جدول (
id INT بدون علامت AUTO_INCREMENT کلید اولیه،
    عنوان VARCHAR(255)
)
یک مقدار INTEGER به 4 بایت فضای ذخیره سازی نیاز دارد. بنابراین، حداکثر مقداری که یک INT بدون علامت می تواند ذخیره کند 4294967295 است.

کوچک

SMALLINT در MySQL بسیار شبیه به INT است. تفاوت اصلی این است که SMALLINT فضای کمتری را اشغال می کند - فقط به 2 بایت نیاز دارد. با این حال، این همچنین به این معنی است که محدوده اعدادی که می تواند ذخیره کند کمتر است. حداکثر مقدار بدون علامت آن 65535 است.

اعشاری (NUMERIC)
نوع DECIMAL در MySQL مقادیر دقیق داده های عددی را ذخیره می کند. با این حال، برخلاف INTEGER و SMALLINT، می تواند دارای قطعات کسری باشد. در MySQL، NUMERIC به عنوان مترادف برای DECIMAL در نظر گرفته می شود.

هنگام کار با داده های مالی، از DECIMAL استفاده کنید، زیرا دقت اعشاری را ارائه می دهد. محاسبات پولی باید دقیق باشد. استفاده از تقریب ها قابل قبول نیست (در مورد آن در وبلاگ Vertabelo بیشتر بخوانید).

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

بیایید یک کتاب جدول با ستون قیمت ایجاد کنیم:

کتاب ایجاد جدول (
id INT بدون علامت AUTO_INCREMENT کلید اولیه،
    عنوان VARCHAR(255)،
قیمت DECIMAL(4،2)
)
در مثال بالا، حداقل مقدار برای قیمت ستون 99.99- و حداکثر آن 99.99 است.

آرگومان مقیاس ممکن است حذف شود. مقدار پیش فرض آن 0 است، به این معنی که کسرها ذخیره نمی شوند. یعنی قیمت DECIMAL(4) معادل قیمت DECIMAL(4,0) است.

شما همچنین می توانید از DECIMAL بدون آرگومان استفاده کنید. مقدار پیش فرض برای دقت در MySQL 10 است. یعنی قیمت DECIMAL معادل قیمت DECIMAL (10,0) است.

مقدار فضای مورد نیاز مقادیر DECIMAL به تعداد ارقام ذخیره شده بستگی دارد و برای قطعات صحیح و کسری جداگانه محاسبه می شود. ارقام به مجموعه های 9 تایی تقسیم می شوند و هر مجموعه به 4 بایت نیاز دارد. الزامات ذخیره سازی برای ارقام باقی مانده در جدول زیر آورده شده است:

ارقام باقیمانده تعداد بایت
0 0
1-2 1
3-4 2
5-6 3
7-9 4
در مثال بالا، برای DECIMAL(4,2)، 2 رقم برای قسمت صحیح و 2 رقم برای قسمت کسری داریم که طبق جدول به 1 + 1 = 2 بایت نیاز دارد.

انواع داده های عددی تقریبی در MySQL
شناور
FLOAT یکی دیگر از انواع داده های MySQL است که برای ذخیره اعداد استفاده می شود. با این حال، تفاوت آن با DECIMAL در این است که دقیق نیست. FLOAT فقط مقادیر تقریبی را ارائه می دهد زیرا اعداد را در قالب باینری ذخیره می کند (از پایه 2 به جای پایه 10 استفاده می کند) و بسیاری از کسرهای اعشاری را نمی توان دقیقاً با استفاده از کسرهای باینری بیان کرد.

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

ایجاد اندازه گیری جدول (
فاصله شناور
)
FLOAT به 4 بایت فضای ذخیره سازی نیاز دارد. محدوده آن 3.402823466E+38 تا 1.175494351E-38، 0 و 1.175494351E-38 تا 3.402823466E+38 است. توجه داشته باشید که در نماد علمی، E+n به معنای 10 به توان n است. بنابراین، 3.402823466E+38 همان 3.402823466E × 1038 است.

همچنین می توانید از نحو FLOAT(n) استفاده کنید، که در آن n دقت را در بیت ها مشخص می کند. n می تواند هر مقداری از 0 تا 53 را بگیرد و برای تعیین اینکه آیا از FLOAT یا DOUBLE برای نوع داده حاصل استفاده شود استفاده می شود. اگر 24 یا کمتر باشد، نوع داده مورد استفاده FLOAT است. در غیر این صورت، دو برابر است.

LearnSQL.com یک پلت فرم آنلاین است که برای کمک به شما در تسلط بر SQL طراحی شده است. این برنامه 30 دوره تعاملی را ارائه می دهد که از مبتدی تا پیشرفته دارای مشکل هستند. هر دوره هم دانش نظری و هم تمرینات عملی را ارائه می دهد تا بتوانید این ایده های جدید را تقویت کنید.

دقت مضاعف (دوبل، واقعی)

در MySQL، DOUBLE و REAL مترادف DOUBLE PRECISION هستند. DOUBLE به 8 بایت فضای ذخیره‌سازی نیاز دارد، با مقادیری از -1.7976931348623157E+308 تا -2.2250738585072014E-308، 0، و از 2.2250738585072014 - 2.2250738585072014 E-308. از آنجایی که E+n در نماد علمی به معنای 10 به توان n است، -1.7976931348623157E+308 برابر است با –1.7976931348623157 × 10308.

همانطور که می بینید، DOUBLE از FLOAT دقیق تر است. اگر دقت بیشتری می خواهید، به جای FLOAT از DOUBLE استفاده کنید:

ایجاد اندازه گیری جدول (
فاصله دو برابر
)
با این حال، به خاطر داشته باشید که هنوز کاملاً دقیق نیست و فقط می تواند یک مقدار تقریبی را ارائه دهد.

درباره انواع داده های عددی در SQL در وبلاگ ما بیشتر بخوانید!

انواع داده های متنی در MySQL
انواع داده های متنی برای ذخیره دنباله ای از کاراکترها از جمله حروف، اعداد و نمادها استفاده می شود که معمولاً به آنها "رشته" می گویند. برای مثال، می‌توانیم از رشته‌ها برای ذخیره ایمیل کاربر، عنوان کتاب یا محتوای یک پست وبلاگ استفاده کنیم.

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

هر کاراکتر در MySQL به 1 بایت داده نیاز دارد. این بدان معنی است که اندازه جدول را می توان با کاهش طول CHAR اعلام شده به طور قابل توجهی کاهش داد. زمانی از نوع داده CHAR استفاده کنید که طول همه مقادیر یکسان باشد. در غیر این صورت بهتر است VARCHAR را انتخاب کنید.

برای مثال، می‌توانید از CHAR برای ذخیره شماره‌های کتاب ISBN استفاده کنید (ISBN مخفف شماره استاندارد بین‌المللی کتاب است و همیشه از 13 کاراکتر تشکیل شده است):

کتاب ایجاد جدول (
id INT بدون علامت AUTO_INCREMENT کلید اولیه،
    عنوان VARCHAR(255)،
isbn CHAR(13)
)
VARCHAR
یک ستون VARCHAR دارای اندازه متغیر است. این باعث صرفه جویی در فضا می شود زمانی که مدخل ها از نظر طول متفاوت باشند (به عنوان مثال، عنوان کتاب).

هر کاراکتر در MySQL به 1 بایت نیاز دارد. با این حال، برای ذخیره طول رشته به فضای بیشتری نیاز دارد: 1 بایت اگر رشته ذخیره شده کوتاهتر از 255 کاراکتر باشد یا 2 بایت اگر بیشتر از 255 کاراکتر باشد.

MySQL نسخه 5.0.3 یا بالاتر 65535 کاراکتر را در یک ستون VARCHAR ذخیره می کند. در نسخه های قبلی، VARCHAR فقط تا 255 کاراکتر را ذخیره می کرد.

بیایید VARCHAR را در عمل ببینیم:

کتاب ایجاد جدول (
id INT بدون علامت AUTO_INCREMENT کلید اولیه،
    عنوان VARCHAR(255)
)
پیشوند اضافی با اندازه رشته باید ابتدا هنگام پردازش داده های ستون خوانده شود. این باعث افزایش زمان پردازش می شود. به همین دلیل، نمایه سازی VARCHAR کندتر از نمایه سازی CHAR است.

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

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

در نسخه‌های MySQL قبل از 5.0.3، TEXT کاراکترهای بیشتری نسبت به VARCHAR ذخیره می‌کرد (65535 کاراکتر در مقایسه با 255). در MySQL نسخه 5.0.3 یا بالاتر، حداکثر اندازه برای هر دو 65535 است.

آیا این بدان معناست که آنها اکنون می توانند همان تعداد کاراکتر را ذخیره کنند؟ لازم نیست.

MySQL اجازه نمی دهد که اندازه ردیف از 65535 بیشتر شود. این بدان معنی است که اگر جدول دارای ستون های دیگری باشد، اندازه VARCHAR نمی تواند به حداکثر اندازه نظری خود برسد. با TEXT، داده ها در خارج ذخیره می شوند و در این حد حساب نمی شوند.

ما می توانیم از TEXT برای ذخیره خلاصه کتاب طولانی تر استفاده کنیم:

کتاب ایجاد جدول (
id INT بدون علامت AUTO_INCREMENT کلید اولیه،
    عنوان VARCHAR(255)،
خلاصه متن
)
TEXT حداکثر 64 کیلوبایت داده (که معادل 65535 کاراکتر است) ذخیره می کند. همچنین به 2 بایت اضافی برای ذخیره اشاره گر به داده های واقعی نیاز دارد.

آیا نیاز به ذخیره شخصیت های بیشتری دارید؟ شما می توانید از نوع داده MEDIOMTEXT یا حتی LONGTEXT استفاده کنید!

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

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

تاریخ
نوع DATE برای ذخیره تاریخ ها (بدون قسمت زمانی) استفاده می شود. تاریخ ها را در قالب «YYYY-MM-DD» نمایش می دهد و از مقادیری از «1000-01-01» تا «9999-12-31» پشتیبانی می کند. یک ستون DATE به 3 بایت فضای ذخیره سازی نیاز دارد.

به عنوان مثال، می توانیم از آن برای ذخیره تاریخ تولد کاربران استفاده کنیم:

کاربر CREATE TABLE (
id INT AUTO_INCREMENT PRIMARY KEY،
    تاریخ تولد DATE
)
وقت قرار
نوع DATETIME مقادیری را که شامل هر دو قسمت تاریخ و زمان هستند ذخیره می کند. از فرمت «YYYY-MM-DD hh:mm:ss» استفاده می‌کند و از مقادیری از «1000-01-01 00:00:00» تا «9999-12-31 23:59:59» پشتیبانی می‌کند.

به عنوان مثال، اگر بخواهیم تاریخ تولد را با ساعت دقیق ذخیره کنیم (مثلاً در پایگاه داده بیمارستان)، DATETIME گزینه خوبی است:

ایجاد جدول بیمار (
id INT AUTO_INCREMENT PRIMARY KEY،
    تاریخ تولد DATETIME
)
DATETIME به 5 بایت فضای ذخیره سازی به اضافه بایت های اضافی بسته به دقت ثانیه های کسری نیاز دارد (جدول زیر را ببینید). البته توجه داشته باشید که در نسخه های MySQL قبل از 5.6.4 8 بایت است.

دقت ثانیه های کسری تعداد بایت های اضافی
0 0
1-2 1
3-4 2
5-6 3
دقت ثانیه های کسری با استفاده از نحو DATETIME(n) تعریف می شود، که در آن n مقادیر 0 تا 6 را می گیرد و تعداد ارقام در قسمت کسری را نشان می دهد. مقدار پیش فرض 0 است، یعنی هیچ ثانیه کسری وجود ندارد.

LearnSQL.com به شما امکان می دهد SQL را با نوشتن کد SQL به تنهایی یاد بگیرید. شما مهارت های SQL خود را به تدریج ایجاد می کنید. هر مفهوم جدید با یک تمرین تعاملی تقویت می شود. در واقع با نوشتن کد SQL، اعتماد به نفس خود را افزایش می دهید.

TIMESTAMP
نوع TIMESTAMP مقادیری را که شامل هر دو قسمت تاریخ و زمان هستند ذخیره می کند. مقادیر آن می تواند از '1970-01-01 00:00:01' UTC تا '2038-01-19 03:14:07' UTC باشد.

بخش UTC را می بینید؟ این تفاوت اصلی بین DATETIME و TIMESTAMP است. TIMESTAMP داده‌ها را با تبدیل آن‌ها از منطقه زمانی فعلی به UTC هنگام ذخیره داده‌ها در پایگاه داده و انجام معکوس آن هنگام بازیابی، تنظیم می‌کند. TIMESTAMP به شما امکان می دهد بدون توجه به منطقه زمانی، نقطه دقیق زمانی را مشخص کنید. اگر برنامه در چندین منطقه زمانی کار کند، می تواند مفید باشد.

TIMESTAMP به 4 بایت فضای ذخیره سازی نیاز دارد (نسخه MySQL 5.6.4 و نسخه های بعدی بسته به دقت ثانیه های کسری به بایت های اضافی نیاز دارد - جدول بالا را در بخش DATETIME ببینید). به فضای کمتری نسبت به DATETIME نیاز دارد اما محدوده پشتیبانی شده کمتری دارد.

TIMESTAMP ممکن است برای ستون‌هایی با تاریخ‌های قبل از 1970 یا بعد از 2038 کار نکند. با این حال، می‌توانید آن را برای ثبت اقدامات کاربر یا رویدادهای برنامه، مانند مهر زمانی آخرین ورود کاربر، انتخاب کنید:

کاربر CREATE TABLE (
id INT AUTO_INCREMENT PRIMARY KEY،
    last_login TIMESTAMP(3)
)
توجه داشته باشید که ما از نحو TIMESTAMP(n) برای ذخیره ثانیه های کسری در اینجا استفاده می کنیم.

زمان
نوع داده TIME برای ذخیره مقادیر زمان استفاده می شود. همچنین می تواند زمان یا فواصل زمانی سپری شده را نشان دهد. به همین دلیل، مقادیر می توانند منفی باشند و قسمت ساعت می تواند بزرگتر از 24 باشد.

TIME در قالب «hh:mm:ss» یا «hhh:mm:ss» نمایش داده می‌شود. از مقادیری از '-838:59:59' تا '838:59:59' پشتیبانی می کند و به 3 بایت نیاز دارد (نسخه MySQL 5.6.4 و نسخه بعدی بسته به دقت ثانیه های کسری به بایت های اضافی نیاز دارد - جدول را ببینید. بخش DATETIME).

ممکن است از TIME برای ذخیره برنامه سخنرانی دانشگاه استفاده کنیم:

سخنرانی ایجاد جدول (
id INT AUTO_INCREMENT PRIMARY KEY،
    start_time TIME
end_time TIME
)
سایر انواع داده های MySQL
بسیاری از انواع داده های دیگر در MySQL وجود دارد. می توانید اطلاعات بیشتری در مورد آنها در اسناد MySQL بخوانید. ممکن است به انواع داده های عددی مانند TINYINT، MEDIUMINT، و BIGINT و همچنین به انواع داده های رشته ای مانند باینری، VARBINARY، BLOB، ENUM و SET علاقه مند باشید.

علاوه بر این، دسته بندی های دیگری از نوع داده در MySQL وجود دارد: فضایی و JSON. انواع داده های مکانی می توانند داده های مکانی مانند مختصات را ذخیره کنند. نوع داده JSON می تواند اشیاء را در قالب جاوا اسکریپت Object Notation ذخیره کند.

از دانش جدید خود در مورد انواع داده MySQL استفاده کنید
برای امروز کافی است! شما اکنون با درک بهتری از انواع داده های MySQL مسلح شده اید. اگر می‌خواهید حتی بیشتر درباره MySQL بیاموزید، قطعاً نمی‌خواهید SQL جدید ما را از A تا Z در MySQLcourse از دست بدهید!

اگر دوست دارید SQL را با استفاده از تمرینات عملی یاد بگیرید، باید LearnSQL.com را امتحان کنید.

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

و در صورتی که می خواهید نگاهی به انواع داده در موتورهای پایگاه داده دیگر بیندازید، مقالات ما را در مورد انواع داده های سرور MS SQL و انواع داده PostgreSQL بررسی کنید.

موفق باشید!

  • sahar saha sql
  • ۰
  • ۰

با داده های متنی در SQL کار می کنید؟ نحوه بدست آوردن مقادیر از هر نقطه در رشته را توضیح می دهیم.

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

آنها یک موضوع ضروری برای هر کسی که SQL یاد می گیرد یا استفاده می کند. توابع متن، همراه با توابع عددی و تاریخ و زمان، تمرکز اصلی دوره تعاملی توابع استاندارد SQL ما هستند. علاوه بر این، به شما می آموزد که چگونه با مقادیر NULL در پایگاه داده ها رفتار کنید، داده ها را جمع آوری کنید و از CASE WHEN استفاده کنید. برای انجام 211 تمرین تعاملی که دوره ارائه می دهد فقط به اتصال به اینترنت و درک اولیه SQL نیاز دارید.

اگر دوست دارید SQL را با استفاده از تمرینات عملی یاد بگیرید، باید LearnSQL.com را امتحان کنید.

یکی از توابع متنی رایجی که دوره پوشش می دهد SUBSTRING () است. در این مقاله، پنج مثال کسب و کار واقعی داریم که کاربردهای اصلی این تابع را پوشش می دهد. اگر با توابع متن آشنایی ندارید، ممکن است برخی از مثال‌ها پیچیده به نظر برسند، بنابراین مطمئن شوید که برگه تقلب استاندارد SQL Functions یا یک نمای کلی از توابع متنی SQL را در کنار خود داشته باشید.

تابع SUBSTRING () چیست؟
SUBSTRING () یک تابع متنی است که به شما امکان می دهد کاراکترها را از یک رشته استخراج کنید. نحو آن است

SUBSTRING (بیان، شروع، طول)
برای آرگومان عبارت، یک رشته به معنای واقعی کلمه می نویسید یا ستونی را مشخص می کنید که می خواهید رشته فرعی را از آن استخراج کنید. آرگومان start یک عدد صحیح است که موقعیت عددی کاراکتر را در رشته ای که رشته فرعی شروع می شود نشان می دهد. آرگومان length، همانطور که از نامش می‌گوید، طول، یک مقدار صحیح، رشته فرعی را که باید برگردانده شود را تعریف می‌کند.

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

اینطوری کار میکنه:

تابع زیر رشته sql
در رشته بالا، رشته فرعی که از موقعیت 1 شروع می شود و طول آن سه کاراکتر است "STR" است.

اکنون که اصول را پوشش داده ایم، اجازه دهید چندین نمونه را به شما نشان دهم. شروع، البته، با ساده ترین!

مثال 1: زیر رشته از یک رشته تحت اللفظی
تابع ()SUBSTRING یک رشته فرعی را از هر رشته ای که می خواهید برمی گرداند. شما می توانید رشته را به صراحت به عنوان یک آرگومان بنویسید، مانند این:

SELECT SUBSTRING('This is the first substring مثال', 9, 10) AS substring_extraction;
این به این معنی است: من می خواهم یک زیر رشته از متن "This is the first substring example" پیدا کنم. آرگومان ها می گویند که رشته فرعی از نهمین کاراکتر رشته شروع می شود و طول آن 10 کاراکتر است.

بیایید ببینیم این کد چه چیزی را برمی گرداند:

substring_extraction
اولین
یک ستون و یک ردیف وجود دارد. زیررشته استخراج شده "اولین" است. این ابتدایی ترین کاربرد SUBSTRING(); کد حتی از هیچ جدولی استفاده نمی کند!

جدول کارمندان
برای نشان دادن مثال‌های جالب‌تر، به اطلاعاتی نیاز دارم. بگذارید جدولی به نام کارکنان را به شما معرفی کنم.

این جدول اطلاعات مربوط به کارمندان یک شرکت خیالی کولر را در ستون های زیر ذخیره می کند:

شناسه - شناسه کارمند.
first_name - نام کوچک کارمند.
last_name - نام خانوادگی کارمند.
ایمیل - ایمیل کارمند.
job_title - عنوان شغلی کارمند.
بخش - بخش کارمند.
start_date - تاریخ شروع کار کارمند در کولر.
در اینجا چندین ردیف اول وجود دارد تا بتوانید درک درستی از داده ها داشته باشید:

شناسه first_name last_name ایمیل job_title بخش start_date
1 کلارنس ویلکینسون cwilkinson@kooler.com دستیار فروش جونیور فروش 09/2021
2 میراندا براون mbrown@kooler.com کارشناس ارشد فروش فروش 01/2020
3 فرانک دربین fdrebin@kooler.com مدیر فروش جوان 2019/08
مثال 2: زیر رشته از یک ستون
همانطور که می توانید تصور کنید، نوشتن عبارت رشته ای به طور صریح تنها راه استفاده از SUBSTRING () نیست. شما همچنین می توانید آن را در یک ستون از یک جدول استفاده کنید.

در اینجا یکی از این نمونه ها وجود دارد. من می خواهم حروف اول همه کارمندان را پیدا کنم. من از ستون ایمیل استفاده می کنم زیرا می دانم که دو حرف اول آدرس ایمیل حروف اول هستند:

نام_نام را انتخاب کنید،
     نام خانوادگی،
     پست الکترونیک،
     SUBSTRING(ایمیل، 1، 2) AS working_initials
از کارکنان؛
ایمیل ستون را در تابع مشخص می کنم. دریافت دو حرف اول از آدرس ایمیل به این معنی است که رشته فرعی از اولین کاراکتر به طول دو کاراکتر شروع می شود. این نتیجه مطلوب را برمی گرداند:

first_name last_name ایمیل staff_initials
کلارنس ویلکینسون cwilkinson@kooler.com cw
میراندا براون mbrown@kooler.com mb
فرانک دربین fdrebin@kooler.com fd
ویوین کلی vkelly@kooler.com vk
استیو استفنز sstephens@kooler.com ss
Nastassja Harrison nharrison@kooler.com nh
توماس پترسون tpeterson@kooler.com tp
ماتیلد کینسکی mkinski@kooler.com mk
Mateusz Wozniak mwozniak@kooler.com mw
آگهی آینه دویل adoyle@kooler.com
لورنزو آلفیری aalfieri@kooler.com aa
پترا بابیچ pbabic@kooler.com pb
Duarte Simoes dsimoes@kooler.com ds
اولنا کوستنکو okostenko@kooler.com خوب
Laurens Grotenhuis lgrotenhuis@kooler.com lg
مثال 3: رشته فرعی بدون آرگومان طول

می توانید آرگومان length را در SUBSTRING() حذف کنید و تابع همچنان کار می کند. یک مثال خوب زمانی است که می خواهید فقط سال تاریخ شروع استخدام را نشان دهید. ببینید، ستون start_date برای آن کمی غیر دوستانه است. این تاریخ به عنوان داده متنی در قالب MM/YYYY نوشته می شود.

خوشبختانه SUBSTRING() این مشکل را حل می کند:

نام_نام را انتخاب کنید،
     نام خانوادگی،
     تاریخ شروع،
     SUBSTRING (تاریخ_شروع، 4) AS شروع_سال
از کارکنان؛
برای دریافت سال از ستون start_date، تعریف شروع رشته فرعی کافی است. در این کد زیر رشته از کاراکتر چهارم شروع می شود. از آنجایی که من آرگومان length را حذف می‌کنم، طول رشته فرعی هر چند تا انتهای رشته از کاراکتر چهارم طولانی باشد. همانطور که در زیر می بینید، من به راحتی سال را به این ترتیب دریافت می کنم:

first_name last_name start_date start_year
کلارنس ویلکینسون 09/2021 2021
میراندا براون 01/2020 2020
فرانک دربین 08/2019 2019
ویوین کلی 03/2019 2019
استیو استفنز 07/2021 2021
Nastassja Harrison 03/2022 2022
توماس پترسون 01/2022 2022
ماتیلد کینسکی 01/2022 2022
Mateusz Wozniak 01/2022 2022
آینه دویل 10/2021 2021
لورنزو آلفیری 10/2021 2021
پترا بابیچ 05/2021 2021
Duarte Simoes 04/2020 2020
اولنا کوستنکو 11/2019 2019
Laurens Grotenhuis 06/2017 2017
مثال 4: POSITION() و CHARINDEX()
بازگشت به کار با ایمیل. طبق خط‌مشی شرکت، نقطه محلی یک آدرس ایمیل (یعنی قسمت قبل از «@») همچنین نام کاربری کارمند برای ورود به همه برنامه‌های تجاری است. شما باید این نام کاربری را استخراج کنید. در اینجا چگونه است:

نام_نام را انتخاب کنید،
       نام خانوادگی،
     SUBSTRING (ایمیل، 1، POSITION('@' در ایمیل)-1) به عنوان نام کاربری
از کارکنان؛
دو استدلال اول همان چیزی است که قبلاً دیده اید. من می خواهم یک زیر رشته را از ایمیل ستون استخراج کنم و می خواهم از اولین کاراکتر رشته شروع شود. اما اکنون، طول رشته فرعی برای هر کارمند متفاوت است. چگونه به تابع بگویم همه کاراکترها را قبل از علامت «@» برگرداند؟

بهترین مکان برای تسلط بر توابع SQL دوره تعاملی استاندارد توابع SQL ما است.

من از POSITION() که معادل CHARINDEX() در SQL Server یا MySQL است استفاده می کنم. کاراکتر مشخص شده را در رشته قرار می دهد و موقعیت کاراکتر عددی آن را برمی گرداند. بنابراین، طول رشته فرعی که نام کاربری کارمند است برابر با POSITION('@' IN email) -1 است. چرا منهای یک؟ چون نمی‌خواهم «@» در نام کاربری کارمند درج شود.

این هم نتیجه:

first_name last_name نام کاربری
کلارنس ویلکینسون کویلکینسون
میراندا براون قهوه ای
فرانک دربین fdrebin
ویوین کلی ویکلی
استیو استفنز استفنز
Nastassja Harrison nharrison
توماس پترسون پترسون
ماتیلد کینسکی مکینسکی
Mateusz Wozniak mwozniak
آینه دویل آدویل
لورنزو آلفیری آلفیری
پترا بابیچ pbabic
Duarte Simoes dsimoes
اولنا کوستنکو اوکوستنکو
Laurens Grotenhuis lgrotenhuis
مثال 5: LENGTH() + POSITION()

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

با استفاده از SQL، می توانم این را به عنوان زیر رشته استخراج کنم:

نام_نام را انتخاب کنید،
       نام خانوادگی،
       عنوان_کار،
       SUBSTRING(عنوان_شغل، LENGTH(عنوان_شغل) - POSITION(' ' در REVERSE(عنوان_شغل))+2) AS
از کارکنان؛
این مثال دیگری از حذف آرگومان طول است، البته کمی پیچیده تر. مثل همیشه، ابتدا ستون رشته – job_title را در این مورد مشخص می کنم. پس از آن، من به نحوی نیاز دارم که زیر رشته ای را پیدا کنم که فقط از آخرین کلمه در عنوان شغل تشکیل شده باشد.

من این کار را ابتدا با استفاده از LENGTH(). طول رشته را در ستون job_title برمی گرداند. این یک شروع است؛ این طول هر سه کلمه با هم است، از جمله فضاهای خالی. اگر بتوانم به نحوی تعداد کاراکترهای کلمه آخر را از آن کم کنم، آنگاه طول دو کلمه اول را خواهم داشت، که سپس شروع رشته فرعی را به من می دهد.

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

تابع POSITION () روز را دوباره ذخیره می کند، اما این بار با ()REVERSE ترکیب شده است. تابع ()REVERSE عبارت رشته را معکوس می‌کند تا «دستیار فروش جوان» به «tnatsissA selaS roinuJ» تبدیل شود. حرف آخر تبدیل به حرف اول می شود. خود کلمه نیز معکوس است، اما اینجا مهم نیست.

POSITION() موقعیت فضای خالی را بعد از اولین کلمه رشته معکوس پیدا می کند. این برابر با جای خالی قبل از آخرین کلمه در رشته اصلی (غیر معکوس) است.

اوه! حالا اگر این عدد را از طول کل رشته اصلی کم کنم، شروع رشته فرعی را دریافت می کنم، درست است؟

خوب، نه کاملا! با استفاده از این تفاوت، زیر رشته ای تولید می شود که شامل آخرین حرف کلمه دوم و فضای خالی قبل از آخرین کلمه است. چرا اینطور است؟

دو چیز. آرگومان شروع تابع ()SUBSTRING شامل است. همچنین، POSITION () موقعیت فضای خالی را محاسبه می کند، نه تعداد کاراکترها را تا فضای خالی. بنابراین، برای بدست آوردن این نتیجه باید 2 را اضافه کنم:

first_name last_name job_title موقعیت
دستیار فروش کلارنس ویلکینسون
میراندا براون کارشناس ارشد فروش
فرانک دربین مدیر فروش جوان
Vivien Kelly مدیر ارشد فروش
استیو استفنز، کارشناس فروش جوان
ناستاسیا هریسون، کارشناس فروش جوان
توماس پترسون، کارشناس گزارشگری جوان
ماتیلد کینسکی تحلیلگر گزارشگری جوان
Mateusz Wozniak کارشناس ارشد گزارشگری
آینه دویل، مدیر گزارشگری جوان
لورنزو آلفیری مدیر ارشد گزارشگری
پترا بابیچ جونیور دستیار منابع انسانی
Duarte Simoes دستیار HR Junior
اولنا کوستنکو، دستیار ارشد منابع انسانی
Laurens Grotenhuis مدیر ارشد مدیریت منابع انسانی
اکنون که من چند توابع دیگر را معرفی کردم، ممکن است بخواهید به برخی از توابع متنی دیگر که ممکن است برای شما مفید باشند نگاهی بیندازید.

درباره SUBSTRING () و کار با داده های متنی بیشتر بیاموزید
اکنون می دانید که چه زمانی و چگونه از SUBSTRING() استفاده کنید. وقت تمرین است!

آیا از قبل SQL را می دانید اما نمی دانید با آن چه کار کنید؟ دوره SQL Practice Set تعاملی ما را بررسی کنید!

توابع متن دیگری نیز وجود دارد، نه تنها SUBSTRING(). شما می توانید آنها را (و خیلی بیشتر!) در دوره استاندارد SQL Functions پیدا کنید.

تا زمانی که مطمئن نیستید که آیا دوره برای شما مناسب است؟ در اینجا شرح مفصلی از آنچه این دوره پوشش می دهد و چگونه به شما کمک می کند ارائه شده است.

  • sahar saha sql