آموزش و سوالات مربوط به استفاده از دستورات Sql در دلفی

شروع موضوع توسط farhad110 ‏25 سپتامبر 2007 در انجمن منطق و الگوریتم برنامه‌نویسی

?

آموزشها تا اينجا چطور بود؟

  1. بابا تو ديگه كي هستي

    88.2%
  2. اي بد نبود

    11.8%
  3. برو بابا دلت خوشه

    0 رای
    0.0%
  4. حيف فضايي كه به تاپيك اختصاص داده شده

    0 رای
    0.0%
  1. Sampro

    Sampro Member

    ارسال‌ها:
    254
    تشکر شده:
    201
    امتیاز دستاورد:
    16
    سلام دوستان
    با عرض شرمندگی یه سوال دیگه هم داشتم.
    من تو دیتابیسم تعدادی رکورد دارم و این رکورد ها بر دو نوعند یه تعدادیشون مقدار یک کالا رو افزایش می دن مثلا کالا به انبار اضافه شده
    و
    یک تعدادیشون از مقدار کالا کم می کنند مثلا کالا از انبار کم شده . حالا من می خوام مقدار نهایی کالا رو داشته باشم یعنی همه ی این جمع و تفریق ها انجما بشه و مقدار نهایی رو بگیرم .

    می خواستم بدونم تو دستورات خود اس کیو ال راهی هست و یا اصلا می شه با خود دلفی هم این کار رو انجام داد .
     
    نوشته شده توسط Sampro در ‏9 آوریل 2008
  2. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    شما با دستورات sql ميتونيد هر عبارت جبري رو روي فيلدها پياده سازي كنيد. مثلا: field1*field2 (جاي پرسيدن اين سوال در تاپيك sql بود)
    در خود دلفي هم با calculatedfield ميشه اين كار رو انجام داد، اما با سرعت كمتر و كدنويسي و دردسر بيشتر
     
    نوشته شده توسط farhad110 در ‏9 آوریل 2008
  3. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    SELECT INTO
    این دستور اغلب برای BackUp گرفتن از جدول ها مورد استفاده قرار میگیره. دقت کنید که شما با کامپوننت ها هم میتونید backup بگیرید اما از تمام دیتابیس. پس زمانی که نیازی به backup تمام دیتابیس نیست بهتره که از select into استفاده کنید.
    شکل کلی دستور:

    کد (Text):
    SELECT column_name(s) INTO newtable [IN externaldatabase]
    FROM source
    این دستور فوق العاده انعطاف پذیر هست، چون هم میتونید پشتیبان جدولها رو در همون دیتابیس ذخیره کنید و هم میتونید به یک دیتابیس دیگه انتقال بدید.
    حالت اول:
    کد (Text):
    SELECT * INTO table_backup FROM table
    حالت دوم:
    کد (Text):
    SELECT * INTO table_backup IN backup.mdb FROM table
    حالتهای دیگر: انتخاب چند فیلد مشخص به جای استفاده از * ، به کار بردن عبارات شرطی مانند where و گرفتن پشتیبان از وضعیت جاری، پشتیبان گیری از چند جدول درون یک جدول.

    موفق باشید
     
    نوشته شده توسط farhad110 در ‏13 آوریل 2008
    winer3549 از این پست تشکر کرده است.
  4. Sampro

    Sampro Member

    ارسال‌ها:
    254
    تشکر شده:
    201
    امتیاز دستاورد:
    16
    به نام خدا
    سلام دوستان.
    با اجازه ی صاحب تاپیک

    برای سریعتر کردن و کم حجمتر کردن جداول و پایگاه داده ای که می سازید ترفند هایی وجود داره .
    می تونید فیلد هایی که در یک محدوده ی خاص واقع می شن رو به نوع داه ای (DataType) صحیح (int) تبدیل کنید . مثلا اگه شما یه فیلد با نام "برگشت کتاب" دارید (یه برنامه ی کتابخانه) شما می تونید برای این فیلد سه حالت بزارید
    مثلا:
    اگه این فیلد مقدارش 1 بود یعنی کتاب برگشت داده شده
    اگه 2 بود یعنی دیر برگشت داده شده و
    اگه 3 بود یعنی با مشکل برگشت داده شده

    خوب این جوری بهتر شد و پایگاه داده کمتر اشغال می شه . حتی برای مواردی که یه فیلد دو مقدار بشتر نداره (مثلا خانم یا آقا شب یا روز روشن یا خاموش) می تونید از نوع Bit استفاده کنین (Boolean) که در این صورت 1 یعنی True و 0 یعنی false .

    حالا یه مشکلی اینجا پیش می یاد .
    اون ور کاربر برنامه ی شما می خواد بیاد و کتابخانه رو ببینه که هر کی چی برده و چه طوری تحویل داده خوب شما هم به راحتی یه DBGrid رو فرم گذاشتی و مقادیر رو به کاربر نشون می دی . ولی کاربر برای ستون "برگشت کتاب" یک سری عدد رو می بینه که اصلا متوجه نمی شه چی به چیه .
    خوب امیدوارم که متوجه شدین می خوام چی بگم :

    این دستوری که می خوام بگم به جای برگشت دادن مقادیر مشخصی از یک کوئری اون هایی که شما می خواید رو برمی گردونه مثلا اگه 2 بود برمیگردونه "کتاب با تاخیر برگشت داده شد " . جالبه نه ؟
    با یه مثال عرض می کنم:
    کد (Text):

    SELECT Username,
            CASE Desposite_Status
               WHEN 1 THEN 'KETAB TAHVIL DADE SHOD'
               WHEN 2 THEN 'KETAB BA TAKHIR TAHVIL DADE SHOD'
               WHEN 3 THEN 'KETAB BA MOSHKEL TAHVIL DADE SHOD'
           END
    ,Date
    FROM Library
     
    این کوئری کامل نیست ولی منظورمو می رسونه Desposite_Status همون فیلد مورد نظرمون هست که سه حالت داره .
    به خاطر مشکلات فارسی اون قسمت رو به صورت فینگلیش نوشتم . برای هر حالت یه WHEN THEN دیگه ایجاد می کنیم.
    در آخر هم END یادتون نره.

    در ضمن این دستور هیچ تغییری روی مقادیر پایگاه داه ایجاد نمی کنه .
    ممنون و موفق باشید
     
    نوشته شده توسط Sampro در ‏16 آوریل 2008
    farhad110 از این پست تشکر کرده است.
  5. fatemeh_rose

    fatemeh_rose New Member

    ارسال‌ها:
    11
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    سلام. خسته نباشيد. يك سوال: جدولهاي بانك من در sql server 2005 داراي فيلدهايي است كه تاريخي است! مثل تاريخ تولد و ... اما sql تنها تاريخ ميلادي قبول ميكنه! چي كار بايد بكنم؟
     
    نوشته شده توسط fatemeh_rose در ‏20 آوریل 2008
  6. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    نوع فيلد رو string بگذاريد و از كامپوننتهاي تبديل تاريخ استفاده كنيد.
     
    نوشته شده توسط farhad110 در ‏21 آوریل 2008
  7. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    استفاده از كاراكتر هاي خاص براي دستورات شرطي:
    قبلا به همراه LIKE كاراكتر % رو به كار برده بودم. اين كاراكتر تمام فيلدهايي رو كه با شرط دستور مطابقت داشتند و داراي طول مساوي و يا بيشتر از رشته بودند رو بر مي گردوند.
    امروز ميخوام در مورد كاراكتر _ و [] توضيح بدم.
    فرض كنيد به دنبال فيلد هايي هستيم كه سه حرفي هستند و دو حرف اول اونها AB هست. اگر شرط رو به صورت
    کد (Text):
    [LEFT] LIKE AB_[/LEFT]
    بنويسيم تمام فيلدهاي abc, aba, abr, abz, … در نتيجه حاصل هست.
    حالا اگر از اين كه فيلد با چه كاراكتري شروع شده اطلاعي نداشته باشيم و مجموعه اي از كاراكترهاي فيلدها رو بخوايم چي؟ از [] استفاده ميكنيم
    مثال:
    کد (Text):
    [LEFT]LIKE [a-g]%[/LEFT]
    تمام فيلدها رو كه با حروف a,b,c,d,e,f,g شروع ميشند رو در نتيجه حاصل بر مي گردونه.
    پيروز باشيد
     
    نوشته شده توسط farhad110 در ‏26 آوریل 2008
    winer3549 از این پست تشکر کرده است.
  8. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    ساخت اشیا در پایگاه داده و تنظیم ویژگی ها و خصوصیات پایگاه داده (دستورات DDL)
    به عنوان مثال اضافه كردن فيلد در زمان اجرا:
    براي اين كار بايد از ALTER TABLE استفاده كنيم.
    شكل كلي دستور:
    کد (Text):
    ALTER TABLE table_name
    ADD column_name datatype
    table_name: نام جدول
    column_name: نام فيلد
    datatype: نوع فيلد

    فرض كنيد ميخوايم فيلد MyField رو با طول 50 كاراكتر به جدول inventory اضافه كنيم:

    کد (Text):
    [LEFT]alter table inventory add MyField varchar(50)[/LEFT]
    موفق باشيد
     
    نوشته شده توسط farhad110 در ‏29 آوریل 2008
    winer3549 از این پست تشکر کرده است.
  9. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    مقاله: آموزش دستورات Sql در دلفی

    اين آموزشها تا پست #48 به صورت مقاله تهيه شد. اميدوارم مورد توجه و استفاده عزيزان قرار بگيره

    لينك مقاله در پست اول قرار داده شد

    پيروز باشيد
     
    نوشته شده توسط farhad110 در ‏5 می 2008
    winer3549، .::Mehran::.، Sampro و یک نفر دیگر از این ارسال تشکر کرده اند.
  10. راحله-م

    راحله-م New Member

    ارسال‌ها:
    5
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    مرسی خیلی خوب توضیح دادید
     
    نوشته شده توسط راحله-م در ‏16 ژوئن 2008
  11. راحله-م

    راحله-م New Member

    ارسال‌ها:
    5
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    :sad: سلام خواهش میکنم یکی به من بگه وقتی بخوام تو delphi یه select رو تو یه listbox نشون بدم چیکار کم
     
    نوشته شده توسط راحله-م در ‏16 ژوئن 2008
  12. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    سلام. خوش آمديد
    من هم خواهش ميكنم :)
    کد (Text):
    listbox.items.add('string value')
    اگر در دستورات sql مشكل داشتيد اينجا بپرسيد، وگرنه تاپيك جديد ايجاد كنيد
    موفق باشيد
     
    نوشته شده توسط farhad110 در ‏17 ژوئن 2008
    راحله-م از این پست تشکر کرده است.
  13. راحله-م

    راحله-م New Member

    ارسال‌ها:
    5
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    سلام . میشه لطف کنید یه سری دیگه آموزش مربوط به استفاده از دستورات sql در دلفی بذارید .
    من بیشتر در رابطه با اینکه چطور اطلاعات در یافت شده از دلفی رو داخل مثلا edit یا stringgrid نشون بدم دارم .
    می خوام یه اسم رو که داخل edit نوشته میشه کدش رو جستجو کنه و داخل یه فرم دیگم از اطلاعات اون کد استفاده کنم . مرسی !!!
     
    نوشته شده توسط راحله-م در ‏18 ژوئن 2008
  14. راحله-م

    راحله-م New Member

    ارسال‌ها:
    5
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    چرا یکی جواب منو نمیده بابا تا بیستم باید پروژمو تحویل بدم !!!!!!!!!!!!!!!!!!:shock:
     
    نوشته شده توسط راحله-م در ‏21 ژوئن 2008
  15. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    اگر وقت شد چشم
    قبلا تذكر دادم: "اگر در دستورات sql مشكل داشتيد اينجا بپرسيد، وگرنه تاپيك جديد ايجاد كنيد"
    لطفا دقت بيشتري كنيد كه كجا سوال بپرسيد
    به تذكر بنده مراجعه كنيد
    موفق باشيد
     
    نوشته شده توسط farhad110 در ‏22 ژوئن 2008
  16. Sampro

    Sampro Member

    ارسال‌ها:
    254
    تشکر شده:
    201
    امتیاز دستاورد:
    16
    سلام به تمام دوستان گلم خصوصا فرهاد جان
    اینم یه اموزش کوچیک تقدیم به تمام بروبچز

    Paging در SQl Server 2005
    توسعه گارن و مدیران پایگاه داده ها تمایل دارند تا نتایج پایگاه داده هایشان را به صورت صفحه بندی ارائه دهند تا کارایی پابگاه داده بالانس شود . راه آسان تر یعنی دریافت یک باره ی کل داده ی که می خواهیم راه بهینه ای نیست و راه حل آن صفحه بندی نتایج البته با کد های پیچیده تر می باشد .
    در MySQL این کار به راحتی با استفاده از دستور Limit انجام می شود و شما جلو دستور شماره ی رکورد و بعد از کاما تعداد رکوردی که می خواین دریافت کنین رو می نویسین . به همین راحتی
    ولی در SQL Server فرق می کنه .

    در SQL Server دستوری به نام ROW_NUMBER وجود داره که اگه به همراه SELECT استفاده بشه خروجی SELECT رو شماره گذاری می کنه

    نتیجه ی دستور روبرو جدول زیر هستش ​

    کد (Text):

    SELECT ROW_NUMBER() OVER(ORDER BY person), person, income
    FROM Salaries
     
    برای استفاده از دستور ROW_Number حتما باید داده ها مرتب باشن و این کار رو دستور OVER و همچنین ORDER BY داخل پرانتش برامون انجام می ده . ​

    کد (Text):
    [RIGHT][B](No column name)........person................income...............[/B]
    1................Amelia..............36000.00..............
    2..................Anna..............49000.00..............
    3.............Constance..............51000.00..............
    4..............Danielle..............68000.00..............
    5.............Elizabeth..............23000.00..............
    6...............Emerson..............84000.00..............
    7...................Eva..............51000.00..............
    8...................Joe..............28000.00..............
    9..................John..............67000.00..............
    10................Jorge..............48000.00..............
    11................Karen..............73000.00..............[/RIGHT]

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

    برای رسیدن به مقصودمون (صفحه بندی) با استفاده از دستور ROW_NUMBER باید این SELECT رو داخل یه SELECT دیگه به کار بریم یعنی Nested Select .
    اینم دستورش : ​

    کد (Text):

    SELECT *
    FROM   (SELECT ROW_NUMBER() OVER(ORDER BY person) AS
           rownum, person, income FROM Salaries) AS Salaries1
    WHERE  rownum >= 5 AND rownum <= 9
     
    خوب برا توضیحش بگم که ما از اون ستونی که قبلا ایجاد شده بود و گفتم نامی بهش داده نشده استفاده کردیم . در حقیقت با با بخش WHERE دستور SELECT خارجی ما از اون ستونی که در داخل SELECT داخلی ایجاد شده استفاده کردیم و چون اون ستون از یک تا آخر مرتب هست و عدد هم هست , پس ما گفتیم که از یک شماره ی خاص تا یک شماره ی خاص دیگه داده ها رو برامون برگردون .
    اینم نتیجش : ​
    کد (Text):
    [RIGHT][B](No column name)........person................income...............[/B]
    5............Elizabeth..............23000.00..............
    6..............Emerson..............84000.00..............
    7..................Eva..............51000.00..............
    8..................Joe..............28000.00..............
    9.................John..............67000.00..............
    [/RIGHT]
    البته برای اینکه در خورجی اون ستونی که اعداد داخلش ذخیره شده نمایش داده نشه خوب می شه تو SELECT خارجی به جای علامت * ای که گذاشتیم نام ستون هایی که می خوایم رو بنویسیم .
    به همین راحتی

    حالا برای موارد استفادش باید بگم که دوستان اگه ASP کار کرده باشند یه سری کنترل با نام GrideView (اسمش دقیقا یادم نیست) که شما با استفاده از یه خاصیتش می تونستی داده هایی که می خواد نشون بده رو صفحه بندی کنی . پایینشم یه چند تا کنترل برای رفتن به صفحه ی بعد و قبل نشون می داد . همین تو انجمن , همه ی پست ها و تاپیک ها به یک باره نشون داده نمی شن و باید شما صفحات رو یکی یکی برای پیدا کردن یه مورد خاص برگدین (اگه سرچ بلد نباشین:D)

    با تشکر​
     
    نوشته شده توسط Sampro در ‏23 جولای 2008
    [email protected]، winer3549 و farhad110 از این ارسال تشکر کرده اند.
  17. winer3549

    winer3549 New Member

    ارسال‌ها:
    9
    تشکر شده:
    1
    امتیاز دستاورد:
    1
    سلام دوستان

    واقعا بابت این تاپیک های مفید دستتون درد نکنه

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

    1 - آیا باید روی اون کامپیوتر هم اس کیو ال رو نصب کنیم ؟

    2 - راهی هست که بشه مثل اکسس فقط فایل دیتا بیس رو همراه پروژه بفرستیم ؟

    ممنون میشم یه راهنمایی یا آموزش کلی رو بزارید .
     
    نوشته شده توسط winer3549 در ‏29 جولای 2008
  18. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    1. اگر از SDac استفاده كنيد، خير.
    2. چرا كه نه.
    ممنون ميشم كه در انتخاب محل سوال پرسيدن بيشتر دقت كنيد
    اين تاپيك فقط مختص دستورات sql هست. سوالات غير مرتبط رو در تاپيك هاي ديگر بپرسيد و يا تاپيك جديد ايجاد كنيد
    پيروز باشيد
     
    نوشته شده توسط farhad110 در ‏29 جولای 2008
  19. Sampro

    Sampro Member

    ارسال‌ها:
    254
    تشکر شده:
    201
    امتیاز دستاورد:
    16
    سلام دوستان
    امیدوارم خوب باشید .

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

    ولی این دستور در این گونه شرایط مشکلاتی داره
    این دستور به خاطر اینکه هر بار که کوردی رو حذف می کنه تغییر اون رو هم در بخش Log می نویسه کارایی کمی داره .
    یعنی برای هر رکورد حذف شده Log اون رو نیز در فایل ldf ذخیره می کنه .

    راه حل بهتر استفاده از دستور TRUNCATE TABLE هستش.
    این دستور نسبت به دستور DELETE کارایی بیشتری داشته و راحت تر هم هست. و log کمتری رو هم به نسبت DELETE ایجاد می کنه فقط کافیه نام جدول (به همراه نام دیتابیس) رو به عنوان آرگومان به هش بدید :

    مثال : دستور زیر جدول send_get از پایگاه داده جاری رو خالی می کنه
    کد (Text):
    TRUNCATE TABLE send_get
    تبصره:
    باید گفته بشه که این دستور فقط اطلاعات موجود در جدول تعیین شده رو حذف می کنه و کاری به تعریف جدول ، ایندکس ها ، ویو ها ، نقش ها و ... نداره
     
    نوشته شده توسط Sampro در ‏1 سپتامبر 2008
    farhad110 از این پست تشکر کرده است.
  20. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    178
    امتیاز دستاورد:
    16
    sampro عزيز تشكر ميكنم از مطلب مفيدي كه ارائه داديد. فقط چند توضيح تكميلي رو اضافه ميكنم.

    از اونجا كه truncate در transaction log ثبت نميشه سرعت اجراي اون چندين برابر delete هست اما به چند دليل هميشه مفيد نيست:
    اگر شما truncate رو در يك transaction به كار ببريد امكان rollback رو از خودتون ميگيريد
    اگر شما از trigger ها براي delete استفاده كرده باشيد، اين trigger ها در زمان استفاده از truncate عمل نخواهند كرد
    truncate در تمام ديتابيس ها پشتيباني نميشه و باعث ايجاد خطا ميشه

    اما مزاياي اون رو هم كه sampro عزيز گفتند علاوه بر اينكه اگر از فيلد identity استفاده كرده باشيد بعد از استفاده از truncate مقدار اون reset ميشه.

    به هر حال براي زماني كه بايد تمام ركوردها رو حذف كنيد و مواردي كه گفتم مشكلي براتون ايجاد نميكنه ميتونيد از truncate استفاده كنيد
    موفق باشيد
     
    نوشته شده توسط farhad110 در ‏2 سپتامبر 2008
    Sampro از این پست تشکر کرده است.

به اشتراک بگذارید