آموزش پی اچ پی -> قسمت پنجم ، اتصال به SQL و انجام عمل
نویسنده : مهرداد دیزاین | تاریخ ارسال : شنبه 19 / 10 / 1388 | 13 : 12 | تعداد بازدید : 637

سلام به همه دوستان عزيز،
امروز در مورد SQL مي گيم.
SQL چيه ؟ مخفف Structured Query Language و به معني زبان پرس و جوي ساخت يافته است.

پرس جو ؟
اصطلاح پرس و جو يا Query به اين معني است كه ما اطلاعاتي كه داريم رو ميخواييم باهاش چكار كنيم. مثلا اون رو بخونيم ، قسمتي از اون رو بخونيم ، تغييرش بديم ، بهش يه چيزايي اضافه كنيم و ...

مثال :
1- ليست تمام كاربراني كه از تاريخ 12 فروردين 1385 به بعد ثبت نام كرده اند را مي خواهم.
2- حساب كاربري فلاني را قفل كن.
3- پسورد كاربري كه يوزر اون برابر با ali هست رو به 123 تغيير بده .

حال ما مي خواييم بدونيم كه چطوري اين ها رو به كامپيوتر بفهمونيم.

اكثر Query هايي كه ما استفاده مي كنيم از 4 حالت زير خارج نيستند.
1- Select خواندن ، جستجو ...
2- Insert درج اطلاعات جديد.
3- Update به هنگام سازي.
4- Delete حذف اطلاعات.

SELECT:
اول يه مثال ميزنيم تا گيج نشويد:
SELECT user FROM userTable
اين Query از تمامي ركورد هاي جدول userTable فيلد user را پيدا مي كند.
يكي ديگه :

SELECT user, name, lastName, Id FROM userTable
اين يكي تمامي فيلد هاي ذكر شده جلوي دستور SELECT را از جدول userTable پيدا مي كنه.
اگه همه فيلد ها رو بخواييم نشون بده چي ؟ بايد همه فيلد ها رو جلوي SELECT بنويسيم؟
براي اين كار به جاي اين كه نام همه فيلد ها رو بنويسيد مي تونيد از * استفاده كنيد يعني :

SELECT * FROM userTable
اگه يه شرط داشتيم چي؟ مثلا "كاربري رو پيدا كن كه نام كاربري اون ali و پسورد اون 123 است"...
براي شرط در query ها از WHERE استفاده ميكنيم. اينطوري:

SELECT * FROM userTable WHERE userName = "ali"
معني اين: تمام ركورد هاي جدول userTable رو پيدا كن كه شرط

userName = "ali"
رو داشته باشند.

اگه شرط هامون چند حالت داشته باشند ؟ مثلا اين:

SELECT * FROM userTable WHERE userName = "ali" AND userPassword="123"
يعني: تمام ركورد هاي جدول userTable را پيدا كن كه فيلد userName اون برابر با ali و فيلد userPassword اون برابر با 123 باشه.
به همين ترتيب ميتونه به جاي AND كلمه OR را قرار بدين همچنين ميتونين هر شرطي خواستيد اضاف كنيد.

مرتب سازي داده هاي خروجي:
براي مرتب كردن خروجي براساس يك فيلد از اين دستور توي Query استفاده ميكنيم.

ORDER BY FieldName ASC
كه FieldName نام فيلدي هست كه مرتب سازي بر اساس اون صورت مي گيره و اون ASC ميگه كه مرتب سازي صعودي باشه ؛ اگه بخواييم مرتب سازي نزولي باشه به جاي ASC از DESC استفاده مي كنيم.
مثال:

SELECT * FROM postTable WHERE postId>50 ORDER BY postTitle ASC
يعني چه ..؟
تمام ركورد هاي جدول postTable رو پيدا كن كه مقدار فيلد postId اون بزرگتر از 50 باشه و اون رو بر اساس فيلد postTitle به صورت صعودي مرتب كن.
 اگه نخواييم داده هاي تكراري نشون داده بشن چي ؟
از

GROUP BY FieldName
استفاده ميكنيم.
مثلا :

SELECT * FROM postTable WHERE senderId=103 GROUP BY postID
يعني؟ : تمام ركورد ها را از جدول postTable نمايش بده كه فيلد postID (كد ارسال كننده) اون برابر 103 است. و پست هاي تكراري رو حذف كن.(اون ركورد هايي كه postID مشابهي دارند فقط يكي شون رو نشون بده)
شايد مثال خوبي نباشه.. 
جستجو:
براي جستجو در داده هاي يه جدول به صورتي كه مثلا اگه ali رو جستجو گرديم تمامي نتايجي كه شامل عبارت ali ميشود را نشان دهيم.

SELECT * FROM postTable WHERE postBody LIKE "%ali%"
تمام چيزهايي كه توش ali باشه رو پيدا ميكنه اگه بخواييم فقط اونايي كه اولشون با ali شروع مي شه به جاي "%ali%" فقط آخرش % مي گذاريم يعني :

SELECT * FROM postTable WHERE postBody LIKE "ali%"
براي اونايي كه به ali‏ ختم مي شن وارونه فقط اولش % مي گذاريم.
داشت يادم مي رفت براي شمردن نتيجه يك SELECT كه فقط تعداد برامون مهم باشه از تابع COUNT استفاده مي كنيم:

SELECT COUNT(*) FROM userTable WHERE registerDate < "85/10/15"
البته توابع ديگه اي هم هست كه فعلا نمي گم چون ممكنه سر در گم بشيد.

INSERT:
اين query براي درج ركود جديد توي جدول استفاده ميشه.
اين طوري:

INSERT INTO myTable (userName, userPassword, userReallyName)
VALUES
("ali", "123", "Ali Agho")

(تو چند خط نوشتم كه راحتتر خونده بشه البته توصيه مي شه توي برنامه هاتون هم اينطوري بنويسيد)
خوب اين query يه ركورد جديد رو توي جدول myTable درج ميكنه كه مقدار فيلد userName اون ali و مقدار فيلد userPassword اون 123 و مقدار فيلد userReallyName اون Ali Agho هست. تو پرانتز اولي اگه فيلدي رو ننويسيد اشكالي نداره (البته اگه فيلد اون Not NULL نباشه) مقدار Default توش قرار ميگيره كه اگه موقع ساختن جدول تعيين نشده باشه Null خواهد شد. در هر صورت بايستي تعداد فيلدي كه توي پرانتز اولي مي نويسيد با تعداد فيلد پرانتز دوم برابر باشه. در ضمن ميتونيد كلا پرانتز اول رو نگذاريد اونوقت توي پرانتز دوم براي تمام فيلد ها بايستي مقدار تعيين كنيد.
يه نكته :
توي MySQL ميتونيد n تا ركورد رو با يه query درج كنيد. مثال:

INSERT INTO myTable
VALUES
("ali", "123", "Ali Agho"),
("mojataba", "1100012", "Agh Mojtaba"),
("reza", "1545587ax1", "Agha Reza")

به همين سادگي.

UPDATE:
براي ويرايش يه چيز استفاده ميشه. مثلا تغيير پسورد، ويرايش يه مطلب و ...
مثال:

UPDATE myTable SET userName="ali"
يعني : براي تمام ركورد هاي جدول myTable مقدار فيلد userName رو به ali‏ تغيير بده ...
تمام ركورد ها  چرا ؟
براي اين كه شرطي تعيين نكرديم. اگه اين طوري بنويسيم اون وقت محدود به ركورد (هاي) خاصي مي شه:

UPDATE myTable SET userName="ali" WHERE userID=53
فقط ركورد هايي كه مقدار فيلد userID اونا برابر با 53 باشه تغيير ميكنند.
ما ميتونيم همزمان چند تا فيلد رو با هم تغيير بديم:

UPDATE myTable
SET userName="ali",
userPassword="123",
userReallyName = "Ali Aghoye Gol"
WHERE userID=53

WHERE اينجا مثل توي SELECT هست.

DELETE:
براي حذف ركورد از جدول استفاده ميشه. مثلا:

DELETE FROM myTable
تمامي ركورد هاي جدول myTable‏ رو حذف ميكنه.
توجه :
1- اينجا بعد از DELETE و قبل از FROM چيزي نيست با SELECT اشتباه نكنيد.
2- بايد خيلي مواظب اين جور query‏ ها باشيد. چون بعضي وقت ها به خاطر يه اشتباه كوچولو خيلي چيزا از دست ميروند.
اگه بخواهيم ركورد(هاي) خاصي رو حذف كنيم بايستي از شرط استفاده كنيم مثل update :
DELETE FROM myTable WHERE userID=662
فقط ركورد هايي رو حذف مي كنه كه مقدار فيلد userID اونا برابر 662 باشه.
---------------
خوب و اين بود query.
من سعي كردم خيلي ساده بگم و چيزهايي كه فعلا لازم نبود نگفتم، به موقع كه بهش رسيديم چيزهايي كه لازمه رو ميگم.
موفق و پيروز باشيد. 


کلمات کلیدی : آموزش پی اچ پی ، کار با MYSQL