دانشیار ای تی دستورات SQL کاربردی که باید بدانید + فیلم آموزش اس کیو ال سرور - دانشیار آی تی

همانطور که می دانید دستورات اس کیو ال از ۴ دستور اصلی Select ،Update ،Delete و Insert تشکیل شده است. در این مقاله قصد داریم به صورت ساده دستورات مهم SQL را به شما آموزش دهیم، همچنین شما همراهان عزیز سایت دانشیار آی تی را با عملگرهای SQL آشنا خواهیم کرد. در واقع دستورات SQL و نحوه کوئری نویسی را به طور کامل و پیشرفته توضیح خواهیم داد.

در عصری هستیم که حجم‌هایی عظیم از داده به صورت روزانه تولید می‌شوند و لازم است این داده‌ها در پایگاه داده نگه داری شوند. پایگاه‌های داده‌ی رابطه‌ای (Relational Database) یکی از معروف‌ترین انواع پایگاه داده‌ هستند و دستورات SQL اساس این نوع پایگاه داده‌ها را تشکیل می‌دهند. به همین دلیل داشتنِ مهارت‌ در نوشتن و فهم دستورات SQL یکی از مهارت‌های شغلی مهم محسوب می‌شود. در این آموزش به معرفی دستورات و عبارات مهم SQL می‌پردازیم.

دستورات مورد بررسی به چهار دسته‌ی اساسی تقسیم می‌شوند:

  • (Data Definition Language (DDL: دستوراتی که از آنها برای تعریف ساختار پایگاه داده استفاده می‌شود.
  • (Data Manipulation Language (DML: دستوراتی که از آنها برای تغییر داده‌های موجود در پایگاه داده استفاده می‌شود.
  • (Data Control Language (DCL: دستوراتی که از آنها برای کنترل مجوزهای کاربری و کنترل سیستم پایگاه داده استفاده می‌شود.
  • (Transaction Control Language (TCL: دستوراتی که از آنها برای مدیریت تراکنش‌های (Transaction) پایگاه داده استفاده می‌شود.

در مثال‌های این آموزش، دستورات SQL را روی جدول زیر اجرا می‌کنیم.

mployeeID EmployeeName Emergency ContactName PhoneNumber Address City Country
۰۱ Shanaya Abhinay ۹۸۹۸۷۶۵۶۱۲ Oberoi Street 23  Mumbai India
۰۲ Anay Soumya ۹۴۳۲۱۵۶۷۸۳ Marathalli House No 23 Delhi India
۰۳ Preeti Rohan ۹۷۶۴۲۳۴۵۱۹ Queens Road 45 Bangalore India
۰۴ Vihaan Akriti ۹۹۶۶۴۴۲۲۱۱ Brigade Road Block 4 Hyderabad India
۰۵ Manasa Shourya ۹۵۴۳۱۷۶۲۴۶ Mayo Road 23 Kolkata India

حاضرید؟!

کامنت در SQL

دو روش برای نوشتن کامنت Comment SQL وجود دارد: کامنت‌های تک خطی (Single-Line Comment) و کامنت‌های چند خطی (Multi-Line Comment).

کامنت‌های تک خطی

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

مثال:

--Select all:
SELECT * FROM Employee_Info;

کامنت‌های چند خطی

کامنت‌های چند خطی با علامت /* شروع و با علامت */ خاتمه می‌یابند. کامپایلر تمام کلماتی را، که بین این دو علامت آمده‌اند، نادیده می‌گیرد.

مثال:

/*Select all the columns
of all the records
from the Employee_Info table:*/
SELECT * FROM Students;

 

دوره‌های مرتبط در دانشیار آی تی

آموزش دستورات DDL در SQL 

در این بخش با دستورات DDL در SQL آشنا می‌شویم که به ما در تعریف ساختار پایگاه داده کمک می‌کنند. این دستورات به شکل زیرند:

  • CREATE
  • DROP
  • TRUNCATE
  • ALTER
  • BACKUP DATABASE

 

دستور Create در SQL

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

عبارت ‘CREATE DATABASE’

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

سینتکس دستور

CREATE DATABASE DatabaseName;

مثال:
REATE DATABASE Employee;

عبارت ‘CREATE TABLE’

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

سینتکس دستور

CREATE TABLE TableName (Column1 datatype,Column2 datatype,Column3 datatype,…. ColumnN datatype);

مثال:
CREATE TABLE Employee_Info
(
EmployeeID int,
EmployeeName varchar(255),
Emergency ContactName varchar(255),
PhoneNumber int,
Address varchar(255),
City varchar(255),
Country varchar(255)
);

می‌توانید از جدولی دیگر برای ساخت یک جدول استفاده کنید. به عبارت زیر توجه کنید.

عبارت ‘CREATE TABLE AS’

سینتکس دستور

CREATE TABLE NewTableName ASSELECT Column1, column2,…, ColumnNFROM ExistingTableNameWHERE ….;

مثال:
CREATE TABLE ExampleTable AS
SELECT EmployeeName, PhoneNumber
FROM Employee_Info;

دستور Drop در SQL

از این دستور برای حذف یک پایگاه داده یا جدولِ موجود استفاده می‌شود.

عبارت ‘DROP DATABASE’

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

سینتکس دستور

DROP DATABASE DatabaseName;

مثال:
DROP DATABASE Employee;

عبارت ‘DROP TABLE’

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

سینتکس دستور

DROP TABLE DatabaseName;

مثال:
DROP Table Employee_Info;

دستور Truncate در SQL

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

سینتکس دستور

TRUNCATE TABLE TableName;

مثال:
TRUNCATE Table Employee_Info;

دستور Alter در SQL

از این دستور برای حذف، تغییر یا افزودن Constraint یا ستون (Column) به جداول موجود استفاده می‌شود.

عبارت ‘ALTER TABLE’

از این دستور برای حذف، تغییر یا افزودن ستون (Column) به جداول موجود استفاده می‌شود.

عبارت ‘ALTER TABLE’ به همراه ADD/DROP COLUMN

می‌توانید عبارت ALTER TABLE را طبق نیازهای خود و با استفاده از دستور ADD/DROP COLUMN تغییر دهید. برای افزودن یک ستون، از دستور ADD COLUMN و برای حذف ستون از دستور DROP COLUMN استفاده کنید.

سینتکس دستور

ALTER TABLE TableNameADD ColumnName Datatype; ALTER TABLE TableNameDROP COLUMN ColumnName;

 مثال:
--ADD Column BloodGroup:
 
ALTER TABLE Employee_Info
ADD BloodGroup varchar(255);
 
--DROP Column BloodGroup:
 
ALTER TABLE Employee_Info
DROP COLUMN BloodGroup ;

عبارت ‘ALTER TABLE’ به همراه ALTER/MODIFY COLUMN

از این دستور برای تغییر نوع داده‌ای (Datatype) یک ستونِ جدول استفاده می‌شود.

سینتکس دستور

ALTER TABLE TableNameALTER COLUMN ColumnName Datatype; ALTER TABLE TableNameDROP COLUMN ColumnName;

 مثال:
--Add a column DOB and change the data type to Date.
 
ALTER TABLE Employee_Info
ADD DOB year;
 
ALTER TABLE Employee_Info
ALTER DOB date;

SQL Backup Database Script

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

سینتکس دستور

BACKUP DATABASE DatabaseNameTO DISK = ‘filepath’;

 مثال:
BACKUP DATABASE Employee
TO DISK = 'C:UsersSahitiDesktop';

می‌توانید از Deferential Back Up نیز استفاده کنید. در این نوع بک‌آپ‌ گیری، تنها از قسمت‌هایی بک‌آپ گرفته می‌شود که بعد از بک‌آپ گیری قبلی تغییر کرده‌اند.

سینتکس دستور

BACKUP DATABASE DatabaseNameTO DISK = ‘filepath’WITH DIFFERENTIAL;

 مثال:
BACKUP DATABASE Employee
TO DISK = 'C:UsersSahitiDesktop'
WITH DIFFERENTIAL;

خُب، دستورات DDL را یاد گرفتیم. پیش از رفتن به سراغ دستوراتی که اطلاعات پایگاه داده را تغییر می‌دهند، بهتر است با انواع کلیدها (Key) و Constraintها آشنا شویم.

آموزش رایگان SQL از پایه 0 تا 100

پیشنهاد دانشیار آی تی به شما

آموزش SQL برای مبتدی‌ها

خواندن مطلب

انواع کلیدها در SQL Server

به طور کل ۷ نوع کلید را می‌توانیم در یک پایگاه داده در نظر بگیرید. جدول زیر را درنظر بگیرید، از آن برای توضیح انواع کلیدها در Sql server استفاده می‌کنیم.

  • کلید کاندید (Candidate Key): مجموعه‌ای از خصیصه‌ها (Attribute) که می‌توانند یک سطر جدول را از سایر سطرها جدا کنند، کلید کاندید خوانده می‌شوند. یک جدول می‌تواند بیش از یک کلید کاندید داشته باشد. یکی از این کلیدهای کاندید به عنوان کلید اصلی (Primary Key) درنظر گرفته می‌شود. در مثال بالا EmployeeID، InsuranceNumber و PanNumber کلید کاندید درنظر گرفته می‌شوند، چون هر یک می‌توانند به تنهایی یک تاپل (Tuple) را از سایر تاپل‌ها جدا کنند.
  • ابر کلید (Super Key): مجموعه‌ای از خصیصه‌ها که می‌توانند یک تاپل را از سایر تاپل‌ها جدا کنند، ابر کلید خوانده می‌شوند. پس کلیدهای کاندید، اصلی و منحصربه‌فرد، ابرکلید هستند. اما عکس این قضیه درست نیست.
  • کلید اصلی: مجموعه‌ای از خصیصه‌ها که می‌توانند یک تاپل را شناسایی کنند، نیز یک کلید اصلی نامیده می‌شوند. در مثال بالا چون EmployeeID، InsuranceNumber و PanNumber کلید کاندید هستند، پس می‌توان یکی از آنها را به عنوان کلید اصلی درنظر گرفت. در این مثال EmployeeID را به عنوان کلید اصلی درنظر گرفته‌ایم.
  • کلید فرعی (Alternate Key): کلیدهای فرعی، آن دسته از کلیدهای کاندیدی هستند که به عنوان کلید اصلی انتخاب نکرده‌ایم. در مثال بالا، InsuranceNumber و PanNumber کلید فرعی هستند.
  • کلید منحصر به فرد (Unique Key): کلید منحصر به فرد، شبیه کلید اصلی است، اما یکی از ستون‌ها می‌تواند مقدار Null داشته باشد. در این مثال می‌توانیم InsuranceNumber و PanNumber را کلیدهای منحصر به فرد درنظر بگیریم.
  • کلید خارجی (Foreign Key): یک خصیصه می‌تواند کلیدِ خارجیِ خصیصه‌ی دیگر محسوب شود. در این حالت تنها می‌تواند مقادیری را به خود بگیرد که مقادیر اصلی خصیصه‌ی مورد ارجاع هستند. در مثال بالا، خصیصه‌ی EmployeeID در جدول Employee_Information به خصیصه‌ی EmployeeID در جدول Employee_Salary ارجاع می‌دهد.
  • کلید ترکیبی (Composite Key): یک کلید ترکیبی، ترکیبی از دو یا چند ستون است که در کنار هم می‌توانند یک تاپل را از سایر تاپل‌های جدول جدا کنند. در این مثال می‌توانیم EmployeeID و Month-Year_Of_Salary را با هم درنظر بگیریم و هر تاپل جدول را از سایر تاپل‌ها جدا کنیم.

دستورات Constraint در SQL چیست

برای مشخص کردن قوانین روی داده‌های جدول از Constraintها استفاده می‌کنیم. در زیر انواع مختلف Constraintها را می‌بینید:

  • NOT NULL
  • UINIQUE
  • CHECK
  • DEFAULT
  • INDEX

 

NOT NULL

با این Constraint دیگر یک ستون نمی‌تواند مقدار NULL به خود بگیرد.

مثال:

--NOT NULL on Create Table
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL,
EmployeeName varchar(255) NOT NULL,
Emergency ContactName varchar(255),
PhoneNumber int NOT NULL,
Address varchar(255),
City varchar(255),
Country varchar(255)
);
 
--NOT NULL on ALTER TABLE
 
ALTER TABLE Employee_Info
MODIFY PhoneNumber int NOT NULL;

UNIQUE

با این Constraint تمام مقادیر یک ستون منحصر به فرد هستند.

مثال:

--UNIQUE on Create Table
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL UNIQUE,
EmployeeName varchar(255) NOT NULL,
Emergency ContactName varchar(255),
PhoneNumber int NOT NULL,
Address varchar(255),
City varchar(255),
Country varchar(255)
);
 
--UNIQUE on Multiple Columns
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL,
EmployeeName varchar(255) NOT NULL,
Emergency ContactName varchar(255),
PhoneNumber int NOT NULL,
Address varchar(255),
City varchar(255),
Country varchar(255),
CONSTRAINT UC_Employee_Info UNIQUE(Employee_ID, PhoneNumber)
);
 
--UNIQUE on ALTER TABLE
 
ALTER TABLE Employee_Info
ADD UNIQUE (Employee_ID);
 
--To drop a UNIQUE constraint
 
ALTER TABLE  Employee_Info
DROP CONSTRAINT UC_Employee_Info;

CHECK

با این Constraint تمام مقادیر یک ستون از شرط خاصی پیروی می‌کنند.

مثال:

--CHECK Constraint on CREATE TABLE
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL,
EmployeeName varchar(255),
Emergency ContactName varchar(255),
PhoneNumber int,
Address varchar(255),
City varchar(255),
Country varchar(255) CHECK (Country=='India')
);
 
--CHECK Constraint on multiple columns
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL,
EmployeeName varchar(255),
Emergency ContactName varchar(255),
PhoneNumber int,
Address varchar(255),
City varchar(255),
Country varchar(255) CHECK (Country = 'India' AND Cite = 'Hyderabad')
);
 
--CHECK Constraint on ALTER TABLE
 
ALTER TABLE Employee_Info
ADD CHECK (Country=='India');
 
--To give a name to the CHECK Constraint
 
ALTER TABLE Employee_Info
ADD CONSTRAINT CheckConstraintName CHECK (Country=='India');
 
--To drop a CHECK Constraint
 
ALTER TABLE Employee_Info
DROP CONSTRAINT CheckConstraintName;

DEFAULT

وقتی هیچ مقداری برای ستون مشخص نشده باشد، این Constraint حاوی مقادیر پیش‌فرض است.

مثال:

--DEFAULT Constraint on CREATE TABLE
 
CREATE TABLE Employee_Info
(
EmployeeID int NOT NULL,
EmployeeName varchar(255),
Emergency ContactName varchar(255),
PhoneNumber int,
Address varchar(255),
City varchar(255),
Country varchar(255) DEFAULT 'India'
);
 
--DEFAULT Constraint on ALTER TABLE
 
ALTER TABLE Employee_Info
ADD CONSTRAINT defau_Country
DEFAULT 'India' FOR Country;
 
--To drop the Default Constraint
 
ALTER TABLE Employee_Info
ALTER COLUMN Country DROP DEFAULT;

INDEX

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

سینتکس

–Create an Index where duplicate values are allowedCREATE INDEX IndexNameON TableName (Column1, Column2, …ColumnN); –Create an Index where duplicate values are not allowedCREATE UNIQUE INDEX IndexNameON TableName (Column1, Column2, …ColumnN);

مثال:

CREATE INDEX idex_EmployeeName
ON Persons (EmployeeName);
 
--To delete an index in a table
 
DROP INDEX Employee_Info.idex_EmployeeName;

دستورات DML در SQL چیست؟

در این بخش از دستورات SQL، دستوراتی را یاد می‌گیرید که به شما در تغییر پایگاه داده کمک می‌کنند. این دستورات به صورت زیرند:

  • USE
  • INSERT INTO
  • UPDATE
  • DELETE
  • SELECT

علاوه بر این دستورات، عمگرها/توابعی نیز برای تغییر داده‌های پایگاه داده داریم:

  • Operatorها (عملگرها)
  • توابع Aggregate
  • توابع NULL
  • Alias و عبارتCase

USE

از عبارت USE برای انتخاب پایگاه داده‌ای استفاده می‌شود که می‌خواهید با آن کار کنید.

سینتکس

USE DatabaseName;

مثال:

USE Employee;

INSERT INTO

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

سینتکس

INSERT INTO TableName (Column1, Column2, Column3, …,ColumnN)VALUES (value1, value2, value3, …); –If you don’t want to mention the column names then use the below syntax INSERT INTO TableNameVALUES (Value1, Value2, Value3, …);

مثال:

INSERT INTO Employee_Info(EmployeeID, EmployeeName, Emergency ContactName, PhoneNumber, Address, City, Country)
VALUES ('06', 'Sanjana','Jagannath', '9921321141', 'Camel Street House No 12', 'Chennai', 'India');
 
INSERT INTO Employee_Info
VALUES ('07', 'Sayantini','Praveen', '9934567654', 'Nice Road 21', 'Pune', 'India');

UPDATE

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

سینتکس

UPDATE TableNameSET Column1 = Value1, Column2 = Value2, …WHERE Condition;

مثال:

UPDATE Employee_Info
SET EmployeeName = 'Aahana', City= 'Ahmedabad'
WHERE EmployeeID = 1;

DELETE

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

سینتکس

DELETE FROM TableName WHERE Condition;

مثال:

DELETE FROM Employee_Info
WHERE EmployeeName='Preeti';

SELECT

از این عبارت برای انتخاب داده‌های موجود در جدول استفاده می‌شود و این داده‌ها به صورت یک جدول به نام result-set برگردانده می‌شوند.

سینتکس

SELECT Column1, Column2, …ColumNFROM TableName; –(*) is used to select all from the tableSELECT * FROM table_name; — To select the number of records to return use:SELECT TOP 3 * FROM TableName;

مثال:

SELECT EmployeeID, EmployeeName
FROM Employee_Info;
 
--(*) is used to select all from the table
SELECT * FROM Employee_Info;
 
-- To select the number of records to return use:
SELECT TOP 3 * FROM Employee_Info;

می‌توانید از کلیدواژه‌های زیر به همراه عبارت SELECT استفاده کنید:

  • DISTINCT
  • ORDER BY
  • GROUP BY
  • HAVING Clause
  • INTO

عبارت ‘SELECT DISTINCT’

این عبارت تنها مقادیر غیر مشابه را برمی‌گرداند.

سینتکس

SELECT DISTINCT Column1, Column2, …ColumnNFROM TableName;

مثال
SELECT DISTINCT PhoneNumber FROM Employee_Info;

عبارت ‘ORDER BY’

از عبارت ORDER BY برای مرتب کردن خروجی به صورت صعودی یا نزولی استفاده می‌شود. نتایج به طور پیش فرض به صورت صعودی مرتب می‌شوند. اگر می‌خواهید نتایج به صورت نزولی مرتب شوند، باید از واژه‌ی کلیدی DESC استفاده کنید.

سینتکس

SELECT Column1, Column2, …ColumnNFROM TableNameORDER BY Column1, Column2, … ASC|DESC;

مثال
-- Select all employees from the 'Employee_Info' table sorted by EmergencyContactName:
SELECT * FROM Employee_Info
ORDER BY EmergencyContactName;
 
-- Select all employees from the 'Employee_Info' table sorted by EmergencyContactName in Descending order:
SELECT * FROM Employee_Info
ORDER BY EmergencyContactName DESC;
 
-- Select all employees from the 'Employee_Info' table sorted by EmergencyContactName and EmployeeName:
SELECT * FROM Employee_Info
ORDER BY EmergencyContactName, EmployeeName;
 
/* Select all employees from the 'Employee_Info' table sorted by EmergencyContactName in Descending order and EmployeeName in Ascending order: */
SELECT * FROM Employee_Info
ORDER BY EmergencyContactName ASC, EmployeeName DESC;

عبارت ‘GROUP BY’

از عبارت GROUP BY برای تجمیع توابع استفاده می‌شود تا جدول result-set با یک یا چند ستون تشکیل شود.

سینتکس

SELECT Column1, Column2,…, ColumnNFROM TableNameWHERE ConditionGROUP BY ColumnName(s)ORDER BY ColumnName(s);

مثال
-- To list the number of employees from each city.
 
SELECT COUNT(EmployeeID), City
FROM Employee_Info
GROUP BY City;

‘HAVING’ Clause

چون نمی‌توانیم از کلیدواژه‌ی WHERE در همه‌جا استفاده کنیم، از HAVING استفاده می‌کنیم.

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ConditionGROUP BY ColumnName(s)HAVING ConditionORDER BY ColumnName(s);

مثال
/*  To list the number of employees in each city. The employees should be sorted high to low and only those cities must be included who have more than 5 employees:*/
 
SELECT COUNT(EmployeeID), City
FROM Employee_Info
GROUP BY City
HAVING COUNT(EmployeeID) > 2
ORDER BY COUNT(EmployeeID) DESC;

عبارت ‘SELECT INTO’

از عبارت SELECT INTO برای کپی داده از یک جدول به جدولی دیگر استفاده می‌شود.

سینتکس

SELECT *INTO NewTable [IN ExternalDB]FROM OldTableWHERE Condition;

مثال
-- To create a backup of database 'Employee'
SELECT * INTO EmployeeBackup
FROM Employee;
 
--To select only few columns from Employee
SELECT EmployeeName, PhoneNumber INTO EmployeeContactDetails
FROM Employee;
 
SELECT * INTO BlrEmployee
FROM Employee
WHERE City = 'Bangalore';

همراهان گرامی سایت دانشیار آی تی، در صورتیکه میخواهید تبدیل به یک مدیر بانک اطلاعاتی شوید این محصول را از دست ندهید:

شروع کار با SQL Server

عملگر ها در SQL

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

عملگرها در SQL
عملگرهای حسابی، عملگرهای بیتی، عملگرهای مقایسه‌ای، عملگرهای ترکیبی، عملگرهای منطقی

حالا به بررسی هر کدام می‌پردازیم.

عملگرهای حسابی

عملگر توضیحات
% باقی مانده [A % B]
/ تقسیم [A / B]
* ضرب [A * B]
تفریق  [A – B]
+ جمع [A + B]

عملگرهای بیتی

عملگر توضیحات
^ بیتیExclusive OR (XOR) [A ^ B]
| بیتی OR [A | B]
& بیتی AND [A & B]

عملگرهای مقایسه‌ای

عملگر توضیحات
  نابرابری [A B]
کوچک‌تر مساوی [A
>= بزرگ‌تر مساوی [A >= B]
کوچک‌تر از [A
بزرگ‌تر از [A > B]
= مساوی [A = B]

عملگرهای ترکیبی

عملگر توضیحات
|*= انتسابOR بیتی[A |*= B]
^-= انتساب Exclusive بیتی [A ^-= B]
&= انتساب AND بیتی [A &= B]
%= انتساب باقی مانده [A %= B]
/= انتساب تقسیم [A /= B]
*= انتساب ضرب [A*= B]
-= انتساب تفریق [A-= B]
+= انتساب جمع [A+= B]

عملگرهای منطقی

عملگرهای منطقی موجود در SQL به صورت زیرند:

  • AND
  • OR
  • NOT
  • BETWEEN
  • LIKE
  • IN
  • EXISTS
  • ALL
  • IN
AND

از این عملگر برای فیلتر کردن رکوردهایی استفاده می‌شود که به بیش از یک شرط وابسته هستند. با این عملگر آن دسته از رکوردهایی که تمام شروط را (که با AND از هم جدا می‌شوند) رعایت و خروجی را TRUE کنند، نمایش داده می‌شوند.

سینتکس

SELECT Column1, Column2, …, ColumnNFROM TableNameWHERE Condition1 AND Condition2 AND Condition3 …;

مثال
SELECT * FROM Employee_Info
WHERE City='Mumbai' AND City='Hyderabad';
عملگر OR

با این عملگر آن دسته از رکوردهایی که یکی از شروط را (که با OR از هم جدا می‌شوند) رعایت و خروجی را TRUE کنند، نمایش داده می‌شوند.

سینتکس

SELECT Column1, Column2, …, ColumnNFROM TableNameWHERE Condition1 OR Condition2 OR Condition3 …;

مثال
SELECT * FROM Employee_Info
WHERE City='Mumbai' OR City='Hyderabad';
عملگر NOT

وقتی می‌خواهیم رکوردهایی را نمایش دهیم که شرطی را رعایت نمی‌کنند، از این عملگر استفاده می‌کنیم.

سینتکس

SELECT Column1, Column2, …, ColumnNFROM TableNameWHERE NOT Condition;

مثال 
SELECT * FROM Employee_Info
WHERE NOT City='Mumbai';

نکته: می‌توانید سه عملگر بالا را با هم ترکیب کرده و یک پرس‌وجو به صورت زیر بنویسید:

SELECT * FROM Employee_Info
WHERE NOT Country='India' AND (City='Bangalore' OR City='Hyderabad');
عملگر BETWEEN

وقتی می‌خواهیم رکوردهایِ موجود در یک محدوده‌ی مشخص را انتخاب کنیم، از این عمگلر استفاده می‌کنیم. این عملگر Inclusive است و مقادیر مرزی را نیز درنظر می‌گیرد.

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ColumnName BETWEEN Value1 AND Value2;

مثال
SELECT * FROM Employee_Salary
WHERE Salary BETWEEN 40000 AND 50000;
عملگر LIKE

از این عملگر در WHERE و برای مشخص کردن الگویی خاص در یک ستون جدول استفاده می‌شود. در کل دو وایلدکارد (Wildcard) داریم که می‌توانیم در کنار LIKE از آنها استفاده کنیم.

  • % ۰ یا بیشتر کاراکترِ مشابه
  • _ دقیقاً ۱ کاراکتر مشابه
سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ColumnName LIKE pattern;

در جدول زیر می‌توانید الگوهای مختلفی را ببینید که ساخت آنها با عملگر LIKE ممکن است.

شرط عملگر LIKE توضیحات
WHERE CustomerName LIKE ‘v% هر مقداری را، که با ‘v’ شروع شود، پیدا می‌کند
WHERE CustomerName LIKE ‘%v’ هر مقداری را، که با ‘v’ تمام شود، پیدا می‌کند
WHERE CustomerName LIKE ‘%and%’ هر مقداری را، که دارای عبارت ‘and’ باشد، پیدا می‌کند
WHERE CustomerName LIKE ‘_q%’ هر مقداری را، که دارای حرف ‘q’ در دومین مکان باشد، پیدا می‌کند
WHERE CustomerName LIKE ‘u_%_%’ هر مقداری را، که با حرف ‘u’ شروع شود و حداقل سه حرفی باشد، پیدا می‌کند
WHERE ContactName LIKE ‘m%a’ هر مقداری را، که با ‘m’ شروع و با ‘a’ تمام شود، پیدا می‌کند

 

مثال
SELECT * FROM Employee_Info
WHERE EmployeeName LIKE 'S%';
عملگر IN

از این عملگر برای شروط چندگانه‌ی OR استفاده می‌شود. با این عملگر می‌توانید چندین مقدار را در یک WHEREمشخص کنید.

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ColumnName IN (Value1,Value2…);

مثال
SELECT * FROM Employee_Info
WHERE City IN ('Mumbai', 'Bangalore', 'Hyderabad');

نکته: می‌توانید از IN در نوشتن پرس‌وجوهای تودرتو نیز استفاده کنید.

عملگر EXISTS

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

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE EXISTS(SELECT ColumnName FROM TableName WHERE condition);

مثال
SELECT EmergencyContactName
FROM Employee_Info
WHERE EXISTS (SELECT EmergencyContactName FROM Employee_Info WHERE EmployeeId = 05 AND City = 'Kolkata');
عملگر ALL

از عملگر ALL در یک WHERE یا HAVING استفاده می‌شود و اگر تمام پرس‌وجوهای داخلی، شرط را رعایت کنند، مقدار TRUE برمی‌گرداند.

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ColumnName operator ALL(SELECT ColumnName FROM TableName WHERE condition);

مثال
SELECT EmployeeName
FROM Employee_Info
WHERE EmployeeID = ALL (SELECT EmployeeID FROM Employee_Info WHERE City = 'Hyderabad');
عملگر ANY

مانند عملگر ALL، از عملگر ANY نیز در یک WHERE یا HAVING استفاده می‌شود و اگر یکی از پرس‌وجوهای داخلی شرط را رعایت کند، مقدار TRUE برمی‌گرداند.

سینتکس

SELECT ColumnName(s)FROM TableNameWHERE ColumnName operator ANY(SELECT ColumnName FROM TableName WHERE condition);

مثال
SELECT EmployeeName
FROM Employee_Info
WHERE EmployeeID = ANY (SELECT EmployeeID FROM Employee_Info WHERE City = 'Hyderabad' OR City = 'Kolkata');

 

دوره‌های مرتبط در دانشیار آی تی

توابع Aggregate

در این بخش از دستوراتِ SQL، به توابع زیر می‌پردازیم:

  • MIN()
  • MAX()
  • COUNT()
  • SUM()
  • AVG()

تابع MIN()

این تابع کوچک‌ترین مقدار را در ستون انتخابی بر می‌گرداند.

سینتکس

SELECT MIN(ColumnName)FROM TableNameWHERE Condition;

مثال
SELECT MIN(EmployeeID) AS SmallestID
FROM Employee_Info;

تابع MAX()

این تابع بزرگ‌ترین مقدار را در ستون انتخابی بر می‌گرداند.

سینتکس

SELECT MAX(ColumnName)FROM TableNameWHERE Condition;

مثال
SELECT MAX(Salary) AS LargestFees
FROM Employee_Salary;

تابع COUNT()

این تابع تعداد سطرهایی را برمی‌گرداند که با معیاری خاص همخوانی دارند.

سینتکس

SELECT COUNT(ColumnName)FROM TableNameWHERE Condition;

مثال
SELECT COUNT(EmployeeID)
FROM Employee_Info;

تابع SUM()

این تابع مجموعِ مقادیر ستونی را برمی‌گرداند که نوع داده‌ی عددی دارد.

سینتکس

SELECT SUM(ColumnName)FROM TableNameWHERE Condition;

مثال
SELECT SUM(Salary)
FROM Employee_Salary;

تابع AVG()

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

سینتکس

SELECT AVG(ColumnName)FROM TableNameWHERE Condition;

مثال
SELECT AVG(Salary)
FROM Employee_Salary;

توابع NULL

توابع NULL به شما این امکان را می‌دهند که اگر عبارتی NULL بود، مقداری جایگزین را برگردانید. در SQL Server این تابع ISNULL() است.

مثال

SELECT EmployeeID * (Month_Year_of_Salary + ISNULL(Salary, 0))
FROM Employee_Salary;

عبارات Case و Alias

در این بخش از دستورات SQL، به ترتیب به معرفی Aliasها و Case می‌پردازیم.

Alias

با Aliasها می‌توانیم به ستون/جدول نامی موقتی بدهیم که تنها در یک بازه از پرس و جو فعال است.

سینتکس

–Alias Column Syntax SELECT ColumnName AS AliasNameFROM TableName; –Alias Table Syntax SELECT ColumnName(s)FROM TableName AS AliasName;

مثال
SELECT EmployeeID AS ID, EmployeeName AS EmpName
FROM Employee_Info;
 
SELECT EmployeeName AS EmpName, EmergencyContactName AS [Contact Name]
FROM Employee_Info;

عبارت Case

این عبارت تمام شروط را بررسی می‌کند و زمانی که اولین شرط برقرار شد، مقداری را برمی‌گرداند. بنابراین، اگر هیچ شرطی TRUE نشد، مقدار موجود در قسمت ELSE را برمی‌گرداند. اگر هیچ شرطی TRUE نشد و قسمت ELSE نداشتیم، مقدار NULLرا برمی‌گرداند.

سینتکس

CASEWHEN Condition1 THEN Result1WHEN Condition2 THEN Result2WHEN ConditionN THEN ResultNELSE ResultEND;

مثال
SELECT EmployeeName, City
FROM Employee_Info
ORDER BY
(CASE
    WHEN City IS NULL THEN 'Country is India by default'
    ELSE City
END);

خُب، حالا وقت آن رسیده که به سراغِ پرس و جوهای تودرتو (Nested Query)، الحاق‌ها (Join)، عملگرهای SET و تاریخ (Date) و افزایش خودکار (Auto Increment) برویم.

 

پرس و جوهای تودرتو در SQL

پرس و جوهای تو در تو در اس کیو ال داری یک پرس و جوی خارجی و یک پرس و جوی داخلی هستند. در کل یک پرس و جوی داخلی، در یک پرس و جوی دیگر مثل SELECT،INSERT،UPDATE یا DELETE قرار می‌گیرد.

دستورات SQL
پرس و جوی خارجی، پرس و جوی داخلی

دستور Join (الحاق) در SQL

با استفاده از الحاق‌ها، سطرهای دو یا چند جدول را بر اساس ستونِ مشترک با هم ترکیب می‌کنیم. در زیر انواع الحاق یا دستورات Join در SQL را مشاهده می‌کنید:

  • الحاق داخلی (INNER JOIN): این الحاق رکوردهایی را برمی‌گرداند که در ستون مشترک هر دو جدول دارای مقدار یکسانی هستند.
  • الحاق کامل (FULL JOIN): این الحاق تمام رکوردهایی را برمی‌گرداند که دارای مقداری مشابه در جدول سمتِ چپ یا راست هستند.
  • الحاق چپ (LEFT JOIN): این الحاق مقادیر جدول چپ و مقادیری از جدول راست را برمی‌گرداند که در شرط صدق می‌کنند.
  • الحاق راست (RIGHT JOIN): این الحاق مقادیر جدول راست و مقادیری از جدول چپ را برمی‌گرداند که در شرط صدق می‌کنند.

شکل زیر را درنظر بگیرید.

الحاق داخلی، الحاق کامل، الحاق چپ، الحاق راست
الحاق داخلی، الحاق کامل، الحاق چپ، الحاق راست

بیایید برای فهم سینتکس الحاق‌ها از جدول زیر استفاده کنیم.

TechID EmpID TechName ProjectStartDate
۱ ۱۰ DevOps ۰۴-۰۱-۲۰۱۹
۲ ۱۱ Blockchain ۰۶-۰۷-۲۰۱۹
۳ ۱۲ Python ۰۱-۰۳-۲۰۱۹

 

الحاق داخلی

سینتکس

SELECT ColumnName(s)FROM Table1INNER JOIN Table2 ON Table1.ColumnName = Table2.ColumnName;

مثال

SELECT Technologies.TechID, Employee_Info.EmployeeName
FROM Technologies
INNER JOIN Employee_Info ON Technologies.EmpID = Employee_Info.EmpID;

الحاق کامل

سینتکس

SELECT ColumnName(s)FROM Table1FULL OUTER JOIN Table2 ON Table1.ColumnName = Table2.ColumnName;

مثال

SELECT Employee_Info.EmployeeName, Technologies.TechID
FROM Employee_Info
FULL OUTER JOIN Orders ON Employee_Info.EmpID=Employee_Salary.EmpID
ORDER BY Employee_Info.EmployeeName;

الحاق چپ

سینتکس

SELECT ColumnName(s)FROM Table1LEFT JOIN Table2 ON Table1.ColumnName = Table2.ColumnName;

مثال

SELECT Employee_Info.EmployeeName, Technologies.TechID
FROM Employee_Info
LEFT JOIN Technologies ON Employee_Info.EmployeeID = Technologies.EmpIDID
ORDER BY Employee_Info.EmployeeName;

الحاق راست

سینتکس

SELECT ColumnName(s)FROM Table1RIGHT JOIN Table2 ON Table1.ColumnName = Table2.ColumnName;

مثال

SELECT Technologies.TechID
FROM Technologies
RIGHT JOIN Employee_Info ON Technologies.EmpID = Employee_Info.EmployeeID
ORDER BY Technologies.TechID;

عملگر Set در SQL

در کل سه عملگر Set داریم: UNION، INTERSECT و EXCEPT. می‌توانید در شکل زیر عملگرهای Set را ببینید.

اجتماع: پرس و جوی چپ، پرس و جوی راست، سطرهای این دو را با هم ترکیب می‌کند

اشتراک: پرس و جوی چپ، پرس و جوی راست، تنها سطرهای مشترکِ هر دو را نگه می‌دارد

تفاضل: پرس و جوی چپ، پرس و جوی راست، سطرهایی از پرس و جوی چپ را نگه می‌دارد که در پرس و جوی راست نیستند

عملگرهای Set
عملگرهای Set

اجتماع (UNION)

از این عمگلر برای ترکیبِ جدول result-set حاصل از دو یا چند SELECT استفاده می‌شود.

سینتکس

SELECT ColumnName(s) FROM Table1UNIONSELECT ColumnName(s) FROM Table2;

 

اشتراک (INTERSECT)

از این عمگلر برای ترکیبِ دو SELECT استفاده می‌شود و اشتراکِ جداول result-set دو SELECT را برمی‌گرداند.

سینتکس

SELECT Column1 , Column2 ….FROM TableNameWHERE Condition INTERSECT SELECT Column1 , Column2 ….FROM TableNameWHERE Condition

 

EXCEPT

این عملگر تاپل‌هایی را برمی‌گرداند که خروجی عملگر SELECT اول هستند و در عملگر SELECT دوم وجود ندارند.

سینتکس

SELECT ColumnNameFROM TableName EXCEPT SELECT ColumnNameFROM TableName;

 

تاریخ و افزایش خودکار یک فیلد در SQL

در این بخش درباره‌ی تابع Date و فیلدهای Auto Increment صحبت می‌کنیم.

تاریخ

می‌توانید از انواع تاریخ زیر در SQL Server استفاده و مقادیر تاریخ/زمان را در پایگاه داده ذخیره کنید.

نوع داده‌ای فرمت
DATE YYYY-MM-DD
DATETIME YYYY-MM-DD HH:MI:SS
SMALLDATETIME YYYY-MM-DD HH:MI:SS
TIMESTAMP یک عدد منحصر به فرد

 

مثال:

SELECT * FROM Technologies WHERE ProjectStartDate='2019-04-01'

Auto Increment

این فیلد هنگامِ اضافه شدن مقداری جدید به جدول، به صورت خودکار عددی منحصر به فرد تولید می‌کند. SQL Server از واژه‌ی کلیدی IDENTITY به این منظور استفاده می‌کند.

مثال

/* To define the "EmployeeID" column to be an auto-increment primary key field in the "Employee_Info" table */
 
CREATE TABLE Employee_Info (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
EmployeeName VARCHAR(255) NOT NULL
EmergencyContactName VARCHAR(255) NOT NULL,
);

آشنایی با دستورات DCL

در این بخش از دستورات SQL، درباره‌ی دستوراتی صحبت می‌کنیم که برای اعمال امنیت پایگاه داده در محیط‌های چند کاربره‌ی پایگاه داده استفاده می‌شوند. دستورات DCL به شرح زیرند:

GRANT

این دستور به یک کاربر مجوز دسترسی به پایگاه داده و اشیاء موجود در آن را می‌دهد.

سینتکس

GRANT PrivilegeNameON ObjectNameTO {UserName |PUBLIC |RoleName}[WITH GRANT OPTION];

 

  • PrivilegeName: نامِ مجوزی است که به کاربر اعطاء می‌شود.
  • ObjectName: نام شئ‌ای از پایگاه داده است مثل جدول، VIEW یا STORED PROCEDURE.
  • UserName: نام کاربری که مجوز به او اعطاء می‌شود.
  • PUBLIC: در این حالت مجوز به تمام کاربران اعطاء می‌شود.
  • RoleName: نام مجموعه‌ای از مجوزها که با هم یک گروه شده‌اند.
  • WITH GRANT OPTION: به کاربر این حق داده می‌شود که این مجوزها را به سایر کاربران اعطاء کند.

 

مثال:

-- To grant SELECT permission to Employee_Info table to user1
GRANT SELECT ON Employee_Info TO user1;

REVOKE

با این دستور، مجوزهای اعطایی به کاربر توسط مجوز GRANT، پس گرفته می‌شوند.

سینتکس

REVOKE PrivilegeName ON ObjectName FROM {UserName |PUBLIC |RoleName}

مثال

-- To revoke the granted permission from user1
REVOKE SELECT ON Employee_Info TO user1;

آموزش View در SQL

یک View در SQL، جدولی است که از سایر جداول گرفته شده است. یک View شامل ردیف‌ها و ستونی‌های یک جدول واقعی است و فیلدهایِ یک یا چند جدول را دارد.

دستورات SQL: Viewها
پرس و جو، سطرها، ستون‌ها، VIEWها

عبارت ‘CREAT VIEW’

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

سینتکس

CREATE VIEW ViewName ASSELECT Column1, Column2, …, ColumnNFROM TableNameWHERE Condition;

مثال

CREATE VIEW [Kolkata Employees] AS
SELECT EmployeeName, PhoneNumber
FROM Employee_Info
WHERE City = "Kolkata";

عبارت ‘CREAT OR REPLACE VIEW’

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

سینتکس

CREATE VIEW OR REPLACE ViewName ASSELECT Column1, Column2, …, ColumnNFROM TableNameWHERE Condition;

مثال

CREATE VIEW OR REPLACE [Kolkata Employees] AS
SELECT EmployeeName, PhoneNumber
FROM Employee_Info
WHERE City = "Kolkata";

عبارت ‘DROP VIEW’

برای حذف یک ویو از این عبارت استفاده می‌شود.

سینتکس

DROP VIEW ViewName;

مثال

DROP VIEW [Kolkata Employees];

دستور Stored Procedures در SQL

Stored Procedure ها در SQL کدهایی هستند که ذخیره کرده‌اید و می‌توانید مجدداً از آنها استفاده کنید.

سینتکس

CREATE PROCEDURE ProcedureNameASSQLStatementGO;

مثال

EXEC ProcedureName;

ساختار Trigger در SQL

تریگرها (TRIGER) مجموعه‌ای از عبارات SQL هستند که در کاتالوگ (Catalog) یک پایگاه داده ذخیره می‌شوند. هرگاه رخدادی مرتبط با یک جدول رخ می‌دهد، این عبارت‌ها اجرا می‌شوند. پس یک تریگر قبل یا بعد از تغییر داده‌ها توسط دستورات INSERT، UPDATE یا DELETE فعال می‌شود. شکل زیر را ببینید.

دستورات SQL: تریگرها
دستورات SQL: تریگرها

قبل از INSERT: قبل از افزودن داده به جدول فعال می‌شود.

بعد از INSERT: بعد از افزودن داده به جدول فعال می‌شود.

قبل از UPDATE: قبل از آپدیت شدن داده‌های جدول فعال می‌شود.

بعد از UPDATE: بعد از آپدیت شدن داده‌های جدول فعال می‌شود.

قبل از DELETE: قبل از حذف داده از جدول فعال می‌شود.

بعد از DELETE: بعد از حذف داده از جدول فعال می‌شود.

سینتکس

CREATE TRIGGER [TriggerName][BEFORE | AFTER]{INSERT | UPDATE | DELETE}on [TableName][FOR EACH ROW][TriggerBody]

دستورات (TCL (Transaction Control Language در SQL

در این بخش از دستورات SQL درباره‌ی دستوراتی می‌آموزیم که می‌توانیم از آنها برای مدیریت تراکنش‌های پایگاه داده استفاده کنیم. این دستورات به شرح زیرند:

  • COMMIT
  • ROLEBACK
  • SAVEPOINT

 

COMMIT

از این دستور برای ذخیره‌ی تراکنش در پایگاه داده استفاده می‌شود.

سینتکس

COMMIT;

ROLLBACK

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

سینتکس

ROLLBACK;

می‌توانید در یک تراکنش جاری، با استفاده از ROLLBACK و SAVEPOINT مستقیماً به یک Savepoint بپرید.

SAVEPOINT

از این دستور برای ذخیره‌ی موقتی یک تراکنش استفاده می‌شود. پس اگر می‌خواهید به نقطه‌ای دلخواه ROLLBACK کنید، می‌توانید آن نقطه را به صورت یک SAVEPOINT ذخیره کنید.

سینتکس

SAVEPOINT SAVEPOINTNAME;

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

EmployeeID EmployeeName
 ۰۱ Ruhaan
۰۲ Suhana
۰۳ Aayush
۰۴ Rashi

 

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

INSERT INTO Employee_Table VALUES(05, 'Avinash');
COMMIT;
UPDATE Employee_Table SET name = 'Akash' WHERE id = '05';
SAVEPOINT S1;
INSERT INTO Employee_Table VALUES(06, 'Sanjana');
SAVEPOINT S2;
INSERT INTO Employee_Table VALUES(07, 'Sanjay');
SAVEPOINT S3;
INSERT INTO Employee_Table VALUES(08, 'Veena');
SAVEPOINT S4;
SELECT * FROM Employee_Table;

خروجی پرس و جوهای بالا به صورت زیر است:

EmployeeID EmployeeName
 ۰۱ Ruhaan
۰۲ Suhana
۰۳ Aayush
۰۴ Rashi
۰۵ Akash
۰۶ Sanjana
۰۷ Sanjay
۰۸ Veena

 

حالا اگر با استفاده از پرس و جوی زیر، به S2 رول‌بک کنید، خروجی به صورت جدول زیر خواهد شد.

ROLLBACK TO S2;
SELECT * FROM Employee_Table;
EmployeeID EmployeeName
 ۰۱ Ruhaan
۰۲ Suhana
۰۳ Aayush
۰۴ Rashi
۰۵ Akash
۰۶ Sanjana

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

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

 

فیلم آموزش SQL Server

مفاهیم اولیه SQL را در این ویدیو ببینید:

دوره‌های مرتبط در دانشیار آی تی

به این پست امتیاز دهید.
بازدید : 291 views بار دسته بندی : برنامه‌نویسی تاريخ : 12 نوامبر 2022 به اشتراک بگذارید :
دیدگاه کاربران
    • دیدگاه ارسال شده توسط شما ، پس از تایید توسط مدیران سایت منتشر خواهد شد.
    • دیدگاهی که به غیر از زبان فارسی یا غیر مرتبط با مطلب باشد منتشر نخواهد شد.