parsgreen.com
article

نحوه استفاده از WHERE در MySQL

mysql-where

همان طور که پیش تر در آموزش های مقدماتی MySQL گفتیم، هنگامی که با دستور SELECT FROM در MySQL کار می کنیم، نیاز به ایجاد محدودیت هایی داریم تا اطلاعات دقیق تری بدست آوریم، به عنوان مثال اگر لیست اسامی ده هزار نفر را در دیتابیس خود به صورت نام، نام خانوادگی و سن داشته باشیم و بخواهیم به فرض تنها افرادی را که اسم آنها بهرام است، در خروجی داشته باشیم، باید از WHERE و پارامترهای آن استفاده کنیم، WHERE در واقع نشانی دقیق ستون و سطرهایی که ما از MySQL پرس و جو می کنیم را تعریف می کند، از اینرو در کار با پایگاه داده و کدهای php اهمیت و کاربرد زیادی دارد، در ادامه آموزش، خواهیم دید که این عنصر تا چه میزان می تواند دقت و سرعت کار ما را افزایش دهد.

چگونه از WHERE استفاده کنیم؟


شیوه نگارش یا همان syntax عنصر WHERE و پارامترهای آن چندان سخت نیست، کافی است آن را در ادامه دستور SELECT FROM قرار دهید، مثال زیر یک نمونه از آن را نشان می دهد.
<?php 
mysql_query("SELECT * FROM table WHERE id = '1'");
?>
در مثال بالا از جدول فرضی table جایی که ستون id برابر یک است را انتخاب کرده ایم، با این کار اطلاعات کل یک ردیف که آی دی آن برابر یک است، در دسترس قرار می گیرد، مثلا ممکن است در آن ردیف اطلاعات دیگری نظیر نام، نام خانوادگی، سن و... را (از قبل) ذخیره کرده باشیم.

استفاده از علامت بزرگتر، کوچکتر و مساوی در WHERE


عبارت WHERE در یک دستور SELECT FROM، تعیین کننده منظور دقیق ما در انتخاب اطلاعات است، درست مثل اینکه در یک کتابخانه به کتابدار بگوییم ازمیان قفسه ها، بخش تاریخ، کتاب تاریخ جهان، انتشارات فلان و... را بیاورد،  تمام جزئیات در درخواست ما باید با عباراتی بیان شوند، این کار در MySQL با پارامترهای WHERE صورت می گیرد، یکی از این پارامترها علامت های بزرگتر، کوچکتر و مساوی (<=>) هستند، با این علامت ها مثلا می توانیم به دیتابیس بگوییم ردیف هایی را انتخاب کند که به فرض سن کاربر از 25 سال بیشتر باشد، این کار را به صورت زیر به پایگاه داده تفهیم می کنیم.
<?php 
//اطلاعات اتصال
mysql_connect("localhost", "user", "pass")
or die(mysql_error());
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//انتخاب از جدول
$age = mysql_query("SELECT * FROM table WHERE age > 25");
//پایان ارتباط
mysql_close;
?>
در واقع عبارت بالا به این معنی است: از جدول فرضی table ستون age، تنها ردیف هایی را انتخاب کن که مقادیر سن کمتر از 25 باشد.
همین کار در مثال زیر، این بار با علامت نا مساوی انجام شده است.
<?php 
//اطلاعات اتصال
mysql_connect("localhost", "user", "pass")
or die(mysql_error());
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//انتخاب از جدول
$age = mysql_query("SELECT * FROM table WHERE age != 20");
//پایان ارتباط
mysql_close;
?>
مفهوم عبارت بالا به این معنی است: از جدول فرضی table ستون age، ردیف هایی را انتخاب کن که مقادیر سن برابر 20 نباشد.
به خاطر داشته باشید، عبارات بزرگتر و کوچکتر، تنها در مقایسه اعداد کاربرد دارند و بهتر است نوع داده ها به صورت INT یا عددی باشند، اما از علامت مساوی (و نامساوی)، هم برای اعداد و هم برای مقادیر رشته ای (متنی) می توان استفاده کرد.

استفاده از عبارت LIKE در WHERE


استفاده از علامت بزرگتر، کوچکتر و مساوی در WHERE به تنهایی تمام خواسته های ما را پوشش نمی دهد، فرض کنید اسامی چند نفر جهت نمونه به صورت زیر در جداول ما ذخیره شده اند.
Arash
Behdad
Behzad
Arman
Sasan
Sajad
Armin
اکنون می خواهیم تنها کسانی که دو حرف اول نام آنها با حروف A و R شروع شده را انتخاب کنیم، واضح است که این کار با علامت هایی که پیشتر گفتیم ممکن نیست، چرا که آنها یک عدد یا یک مقدار صحیح را مقایسه می کنند، مثلا با عبارت مساوی تنها می توانیم بنویسیم:
mysql_query("SELECT * FROM table WHERE name = 'Arman'");
این دستور فقط ردیف یا ردیف هایی را که مقادیر نام در آن Arman باشد، انتخاب می کند، اما با استفاده از عبارتی دیگر در WHERE، این مشکل قابل حل است، این عبارت نیز LIKE و علامت  % (percent Wildcard) است، در مثال زیر با کاربرد آن بیشتر آشنا می شوید.
<?php 
//اطلاعات اتصال
mysql_connect("localhost", "user", "pass")
or die(mysql_error());
//نام دیتابیس
mysql_select_db("db")
or die(mysql_error());
//انتخاب از جدول
$name = mysql_query("SELECT * FROM table WHERE name LIKE 'Ar%'");
//پایان ارتباط
mysql_close;
?>
وقتی پس از دو حرف Ar علامت % را قرار می دهیم، در واقع به دیتابیس می گوییم که فقط دو حرف اول برایمان اهمیت دارد و بقیه عبارت، هر چیزی می تواند باشد، دستور بالا اسامی زیر را برایمان انتخاب می کند.
Arash
Arman
Armin
حال تصور کنید کاربری با نام فرضی PHPArmin نیز در بین کاربران خود داریم، دستور بالا این کاربر را انتخاب نمی کند، چرا که حروف ابتدایی عبارت  PHPArmin با Ar شروع نشده است، اما تغییر آن به صورت زیر، شامل این نوع اسامی نیز می شود.
mysql_query("SELECT * FROM table WHERE name LIKE '%Ar%'");
در واقع با افزودن یک % در ابتدا و انتهای عبارت مورد پرس و جو، دیتابیس چنین برداشت می کند که تنها برایمان وجود عبارت Ar در بین یک اسم مهم است و به ابتدا یا انتهای آن کاری ندارد.
ذکر این نکته ضروری است که در کار با  عبارت LIKE و علامت  %، باید دقت کنید که دامنه انتخاب ردیف ها را بیش از حد مورد انتظار، توسعه ندهید، برای اعداد نیز بهتر است از علامت های <=> به جای LIKE استفاده کنید.
در مباحث بعدی در رابطه با تکمیل WHERE با پارامترهای بیشتر و نحوه نمایش و دسته بندی اطلاعات، صحبت خواهیم کرد.
sectionدسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
» توابع تجمعی (Aggregate Functions) در MySQL
» حذف مقادیر از MySQL با دستور DELETE
» آشنایی با mysql_query در php و دیتابیس
» نگاهی به MySQL، پرکاربردترین سیستم مدیریت پایگاه داده
» به روز رسانی ردیف ها در MySQL با UPDATE
commentنظرات (۱۸ یادداشت برای این مطلب ارسال شده است)
نویسنده: reza
زمان: ۱۹:۳۶:۰۱ - تاریخ: ۱۳۹۱/۰۹/۲۲
سلام.
ببخشید من از دستور select option و از method POST استفاده کردم.
می خواستم بپرسم که چطوری می تونم با انتخاب هر کدوم از گزینه هایی که وجود داره همون لحظه مقدار دستور option را بدست بیارم.
الان با انتخاب یکی از مقادیر option و فشار دادن یک دکمه این کار رو می کنم.
پاسخ: 
سلام
برای این گونه موارد و ارسال هم زمان اطلاعات باید از آژاکس (Ajax) و جاوا اسکریپت استفاده کنید، یک مثال:
ajax-select-option.php
در این مثال نیز از متد POST استفاده کرده ایم.
نویسنده: ابوالفضل
زمان: ۱۱:۴۱:۳۹ - تاریخ: ۱۳۹۲/۰۴/۰۵
سلام ممنون از سایت عالیتون
من در سایتم شماره تلفن همراه کاربران را دریافت می کنم می خوام در صورتی که شماره تلفن همراه کاربر ایرانسل است یک پیام نشان دهم مثلا شما از اپراتور ایرانسل استفاده می نمایید و اگر همراه اول هست یک پیام دیگر نمایش دهم مثلا شما از اپراتور همراه اول استفاده می نمایید و اگر هیچ کدام نبود پیام اپراتور تلفن همراه شما توسط ما پشتیبانی نمی شود را نمایش دهد
ممنون می شم در این زمینه منو راهنمایی بفرمایید
پاسخ: 
سلام
هرچند پاسخ به سوال شما نیازمند داشتن اطلاعات بیشتری از کدها، نوع و فرم شماره ها و اطلاعات ذخیره شده در دیتابیس است، اما با فرض شروع اعداد به صورت 0935، 0912 و... می توان از نمونه کد زیر استفاده کرد (این تنها یکی از روش ها است):
<?php
function CheckOperator($num){
//حذف +98
$num = str_replace('+98', NULL, $num);

//دریافت سه رقم اول
$num_3 = substr($num, 0, 3);
//بررسی
switch($num_3){
case '935':
case '936':
case '937':
return 'ایرانسل';
break;
case '911':
case '912':
case '913':
return 'همراه اول';
break;
}

//دریافت چهار رقم اول
$num_4 = substr($num, 0, 4);
//بررسی
switch($num_4){
case '0935':
case '0936':
case '0937':
return 'ایرانسل';
break;
case '0911':
case '0912':
case '0913':
return 'همراه اول';
break;
}

return 'اپراتور پشتیانی نمی شود!';
}
echo CheckOperator('+98935*******');
//echo CheckOperator('0935*******');
?>
نویسنده: shahin
زمان: ۲۰:۵۰:۴۸ - تاریخ: ۱۳۹۲/۰۴/۳۰
سلام
من یه جدول به نام test دارم میخوام فیلدهای ان را نمایش بدم به شرط انکه که فیلد کلید اصلی ان که در جدول دیگه کلید خارجی مقدارش نباشد
یعنی در جدول test فیلد idtest مقدارش در جدول it و در فیلد idtest نباشد با همچین شرطی برام نمایش داده بشن
این هم کد sql ان شرطش رو چی بزارم ممنون میشم کمکم کنید؟؟؟؟؟
$sql="select test.idtest,test.day,test.time,test.date From test
Inner join it
On test.idtest=it.idtest
where
پاسخ: 
سلام
نیازی به تنظیم قسمت WHERE نیست، در قسمت ON به جای علامت = از =! استفاده کنید:
SELECT test.idtest, test.day, test.time, test.date
FROM test
INNER JOIN it ON test.idtest != it.idtest
راه حل استفاده از LEFT JOIN:
SELECT test.idtest, test.day, test.time, test.date
FROM test
LEFT JOIN it ON test.idtest = it.idtest
WHERE it.idtest IS NULL
و همچنین راه حل معمولی:
SELECT *
FROM test
WHERE NOT
EXISTS (
SELECT idtest
FROM it
WHERE test.idtest = it.idtest
)
نویسنده: shahin
زمان: ۰۰:۱۱:۵۰ - تاریخ: ۱۳۹۲/۰۴/۳۱
ممنون جواب این سوالم و گرفتم الان اگر بخوام تمام فیلد های دو جدولم نمایش بدم چطور جدول test جدول it ؟؟؟
"select test.idtest,test.day,test.time,test.date,it.idb,it.name,it.tel,it.bime,it.idtest from test
inner join it
پاسخ: 
قاعدتا دستوراتی که در پاسخ قبل نوشتیم کاربرد خواهند داشت، کافی است در قسمت SELECT به همین صورتی که در سوال مطرح کردید، ستون های هر دو جدول را انتخاب کنید (تست نشده)، اگر راه حل درست نبود، از نمونه زیر استفاده کنید:
SELECT tbl_1.name, tbl_2.name
FROM `tbl_1`
LEFT JOIN `tbl_2` on tbl_1.id = tbl_2.id
UNION
SELECT tbl_1.name, tbl_2.name
FROM `tbl_1`
RIGHT JOIN `tbl_2` on tbl_1.id = tbl_2.id;
این کد را با توجه به پاسخ قبل می توانید ویرایش کنید.
نویسنده: shahin
زمان: ۲۲:۲۵:۳۳ - تاریخ: ۱۳۹۲/۰۴/۳۱
ببخشید من در جدول اولم فیلد idtest را به عنوان کلید اصلی تعریف کردم
و در جدول دوم این فیلد idtest را به عنوان کلید خارجی است و در جدول دوم کلید idb را کلید اصلی تعریف کردم
در محیط phpmyadmin در جدول دوم باید هر دو فیلد را به عنوان کلید در نظر بگیرم؟؟
پاسخ: 
خیر، تفاوتی ندارد که ستون دارای ویژگی primary key باشد یا خیر (کاربرد این ویژگی برای جلوگیری از ایجاد مقادیر تکراری در یک جدول است)، مهم هدف از پرس و جو و ساختار جدول است، به طور مثال زمانی لازم است که از ستون primary key استفاده شود، زمانی هم ممکن است از مقادیر ستون دیگر برای بررسی استفاده کنیم.
نویسنده: مصطفی
زمان: ۰۱:۴۸:۲۴ - تاریخ: ۱۳۹۲/۰۷/۲۴
ممنون از مطبتون
چطور میشه نتیجه ی یه ستون رو از حاصل جمع دو ستون دیگه بدست اورد یعنی حاصل اون دو ستون در یک ستون دیگه قرار بگیره
پاسخ: 
انجام این کار به راحتی امکانپذیر است، نمونه کد:
UPDATE `table_name` SET col_3 = col_1 + col_2
نویسنده: خلیل
زمان: ۱۴:۰۵:۱۳ - تاریخ: ۱۳۹۲/۰۷/۳۰
ممنون از راهنمایی هایی که می کنین و مطالبتون استاد .
نویسنده: مجید
زمان: ۱۰:۰۳:۴۶ - تاریخ: ۱۳۹۲/۰۸/۳۰
سلام من می خوام در پایگاه داده چنین شرطی تعریف کنم ولی نمی دونم چطور باید بنویسم مثلا اگه مقدار x در جدول a مساوی با 1 بود مقدار y در جدول b برابر 2 شود و یه سوال دیگه اینکه چطور می تونیم به شرط های تعریف شده دسترسی داشته باشیم یا تغییرشون بدیم. ممنون
پاسخ: 
سلام
در مورد قسمت اول سوال، می توانید از نمونه پرس جوی زیر استفاده کنید:
UPDATE tbl_1 INNER JOIN tbl_2 ON tbl_1.id = tbl_2.id SET tbl_1.col_1 = '2' WHERE tbl_2.col_1 = '1'
اما در مورد بخش دوم؛ منظورتان از دسترسی مشخص نیست، برای تغییر هم باید با نحوه نوشتن پرس و جوهای ترکیبی با JOIN و مشتقات آن در MySQL آشنا باشید.
نویسنده: مجید
زمان: ۰۳:۰۱:۵۲ - تاریخ: ۱۳۹۲/۰۹/۰۵
اقا ممنون خیلی به کارم اومد فقط یه مشکل کوچیک داشتم اگه این شرط مربوط به یک جدول باشه چطور باید نوشت مثلا اگر مقدار x در جدول a برابر 1 باشه مقدار y در همان جدول برابره با 2 قرار بگیره. باز هم ممنون
پاسخ: 
می توانید از پارامتر WHERE استفاده کنید، نمونه:
UPDATE tbl SET col_1 = '2' WHERE col_2 = '1'
نویسنده: مجید
زمان: ۱۳:۱۴:۱۱ - تاریخ: ۱۳۹۲/۰۹/۰۷
ببخشید منظورم برا زمانی هست که ما یه شرط تعریف کردیم و یه جدول داریم با id های مختلف حالا می خوایم اون شرط روی تمام این id ها در صورت برقرار بودن اجرا بشه برای مثال اگه مقدار x برای id مشخص برابر 1 بود مقدار y برای همان id برابر 2 قرار بگیره و این عمل برای تمام id های موجود در جدول صورت بگیره
پاسخ: 
برای این حالت بهتر است یک پرس و جو با دستور SELECT در ابتدا اجرا، سپس در حلقه while دستور UPDATE را مطابق با نیازتان تعریف نمائید.
نویسنده: مجید
زمان: ۱۶:۱۳:۰۶ - تاریخ: ۱۳۹۳/۰۱/۲۰
سلام من از این روش برای طی کردن تمام سطرهای جدول استفاده می کنم اگه ایرادی داره یا روش ساده تری وجود داره لطفا بگید من مطمئن نیستم
begin
declare i,min,max int;
set min=0;
set max=1;
select count(user) from table into i;
while i>=max do
//mycode
set min=min+1;
set max=max+1;
end while;
end
پاسخ: 
سلام
دوست گرامی آموزش در رابطه با MySQL است، اما کدهای شما ظاهرا مربوط به دیتابیس Oracle Java است!
لطفا به وبسایت های مرتبط مراجعه کنید.
نویسنده: حسین
زمان: ۲۳:۱۱:۱۱ - تاریخ: ۱۳۹۳/۰۲/۱۱
سلام. ممنون از سایت خوبتون.سوالی داشتم.
من اطلاعاتی رو در بانک اطلاعاتی به این صورت ذخیره می کنم:
INSERT INTO rating VALUES('','".$uid."','".$page."','".$vote."','".$stars."','".$ip."',NULL)")
حالا میخوام با انتخاب آدرس صفحه، تمام اطلاعاتی رو که از این صفحه در متغیر vote (امتیاز کاربر) ذخیره شده رو جمع کنم.
این برنامه، بصورت امیتازدهی ستاره ای هست و مثلا یک نفر 5 رو میده یا یه نفر 3. میخوام همه اینا رو جمع کنم.
واقعا لطفا دارید. کمکم می کنید؟؟؟
پاسخ: 
سلام
دقیقا متوجه سوالتان نشدیم! اما به نظر با نوشتن یک دستور SELECT و انتخاب ستون vote می توانید در یک حلقه while با علامت =+ متغیر را با مقدار هر ستون در هر دور افزایش دهید تا در نهایت مقدار کل بدست بیاید.
نویسنده: سامان
زمان: ۱۶:۲۲:۱۳ - تاریخ: ۱۳۹۳/۰۶/۱۷
سلام
ایا اولویت شرط ها در بخش where تاثیری بر سرعت داره؟ برای مثال من در بخش where از 3 شرط استفاده کردم شرط اول 100 سطر رو انتخاب میکنه و شرط دوم از بین این 100 تا 40 تا رو انتخاب میکنه و شرط سوم از بین این 40 تا 10 تا رو انتخاب میکنه در صورتی که اگه شرط ها رو برعکس میذاشتم ممکن بود اول 600 سطر رو انتخاب کنه و بعد 300 سطر و بعد 10 سطر مورد نظر. ایا روش اول سریعتر از روش دومه؟
پاسخ: 
سلام
سرعت اجرای پرس و جو در شرایطی می تواند ارتباط به پس و پیش بودن شرط ها داشته باشد، به طور مثال زمانی که از OR بین آنها استفاده شده باشد و در نهایت تعداد کل ردیف های انتخاب شده (دقت کنید: ردیف ها زمانی انتخاب می شوند که شرط برقرار باشد) در پایان اجرای پرس و جو مهم است.
نکته: سرعت پردازش دستورات به موارد دیگری (از جمله تعداد و حجم کاراکتر، نوع ستون داده ها و...) نیز بستگی دارد.
نویسنده: رضا اخلاقی
زمان: ۱۸:۲۹:۳۲ - تاریخ: ۱۳۹۳/۰۹/۰۴
با سلام و عرض ادب
سوالی در رابطه با این موضوع داشتم.
چگونه می توان از WHERE استفاده نمود زمانی که اطلاعات دیتابیس با حروف فارسی ذخیره شده است برای حروف انگلیسی مشکلی ندارم.
با تشکر
پاسخ: 
سلام
دستور WHERE به خودی خود فرقی بین زبان انگلیسی و فارسی ندارد! باید سایر مواردی که جهت کار با اطلاعات زبان فارسی نیاز است رعایت کنید، در مجموع برای اینکه مشکلی از لحاظ ذخیره و نمایش حروف فارسی در دیتابیس نداشته باشید باید تمام مراحل زیر را به صورت صحیح انجام دهید:
در درجه اول باید Server connection collation دیتابیس را
utf8_persian_ci
انتخاب کنید، سپس مراحل زیر را انجام دهید:
- از متاتگ زیر در تمام صفحات استفاده کنید:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- علاوه بر دیتابیس، جداول و ستون ها را نیز با یونیکد
utf8_persian_ci
بسازید.
- پس از اتصال با دیتابیس، پرس و جوی زیر را هم اجرا کنید:
mysql_query ("SET NAMES 'utf8' ");
- اگر مشکل همچنان حل نشد، فایل های خود را با ویرایشگر ++Notepad باز کرده و سپس از قسمت Encoding گزینه Encoding UTF-8 without BOM را انتخاب و فایل خود را مجددا ذخیره نمائید.
نویسنده: هادی
زمان: ۱۷:۴۴:۳۱ - تاریخ: ۱۳۹۵/۰۱/۱۸
سلام به ادمین عزیز و کاربران سایت
دوتا سوال برام پیش اومده :
1- یک جدول داریم که بطور مثال فیلدهای userId , productId , userStatus , productStatus رو داره. میشه در این کوئری
select count(userId),count(productId) from tblTest where 
چطور دوتا شرط بنویسیم که برای count(userId) چک کنه userStatus!=0 و برای count(productId) مقدار productStatus!=0 رو چک کنه؟
2- یک جدول فروش داریم که ممکنه هر نوع محصول به چند نفر فروخته شده باشه و می خواهیم به ترتیب 10 محصول پرفروش را انتخاب کنیم کوئری اون به چه صورتی هست؟ لطفا یک روش بهینه ارائه کنید.
ممنون از سایت خوبتون
پاسخ: 
برای سوال اول و نوشتن دو شرط در یک کوئری می توانید به شیوه نمونه زیر عمل کنید:
SELECT COUNT(userId) AS count FROM tbl WHERE userStatus != 0 
UNION ALL
SELECT COUNT(productId) AS count FROM tbl WHERE productStatus != 0
در مورد بخش دوم سوال، ساختار دیتابیس شما مشخص نیست، با این حال با فرض اینکه id هر محصول در لیست فروش وجود داشته باشد، می توانید با دستور SELECT و GROUP BY و هچنین ASC و DESC این کار را انجام دهید، مثال:
SELECT id, COUNT(id) AS id_occurrence FROM tbl GROUP BY id ORDER BY id_occurrence DESC LIMIT 10
paged صفحه 1 از 2




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

1 × 4
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...