آموزش SQL
آموزش SQL-محدودیت Check
محدودیت CHECK
Wiki
محدودیت CHECK داده هایی را که در ستون ها وارد می شوند، به دامنه ای از مقادیر محدود می کند.
اگر محدودیت CHECK را روی یک ستون مجزا تعریف می کنید تنها مقادیر خاصی را برای این ستون می توانید وارد کنید.
اگر محدودیت CHECK را روی یک جدول (ستون های ترکیبی) تعریف کنید این محدودیت می تواند ستون های خاصی از جدول را بسته به مقادیر موجود در دیگر ستون ها در همان سطر محدود کند.
محدودیت CHECK در دستور CREATE TABLE
Wiki
دستور زیر در ستون P_Id هنگامی که جدول Persons ایجاد می شود محدودیت CHECK را ایجاد می کند. محدودیت CHECK تعیین می کند که ستون P_Id باید مقدار صحیح بیشتر از صفر داشته باشد.
در MySQL:
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
در SQL Server / Oracle / MS Access:
(
P_Id int NOT NULL CHECK (P_Id>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
برای تعریف محدودیت CHECK روی ستون های ترکیبی (ترکیب دو یا چند ستون) از دستور زیر استفاده کنید. (منظور این است که داده های چند ستون با هم چک شوند)
در MySQL / SQL Server / Oracle / MS Access:
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
محدودیت CHECK در دستور ALTER TABLE
Wiki
برای ایجاد محدودیت CHECK روی ستون P_Id هنگامی که جدول قبلا ایجاد شده از دستور زیر استفاده می کنیم.
در MySQL / SQL Server / Oracle / MS Access:
ADD CHECK (P_Id>0)
برای اضافه کردن محدودیت CHECK روی ستون های ترکیبی( ترکیب دو یا چند ستون) از دستور زیر استفاده کنید(منظور این است که داده های چند ستون با هم چک شوند)
MySQL / SQL Server / Oracle / MS Access:
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
حذف محدودیت CHECK
Wiki
برای حذف محدودیت CHECK از دستور زیر استفاده می کنیم.
در SQL Server / Oracle / MS Access:
DROP CONSTRAINT chk_Person
در MySQL:
DROP CHECK chk_Person
آموزش SQL-محدودیت Default
محدودیت DEFAULT
Wiki
محدودیت DEFAULT برای وارد کردن مقداری به صورت پیش فرض در یک ستون استفاده می شود.
مقدار DEFAULT به تمام رکوردهای جدید اضافه می شود، البته اگر هیچ مقدار دیگری به جای آن درج نشود.
محدودیت DEFAULT در دستور CREATE TABLE
Wiki
دستور زیر در ستون City هنگامی که جدول Persons ایجاد می شود مقدار پیش فرضی را وارد می کند.
در My SQL / SQL Server / Oracle / MS Access:
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
همچنین محدودیت DEFAULT می تواند برای درج کردن مقادیری که مقدار خود را از سیستم می گیرند نیز استفاده شود، با استفاده از توابعی همچون ()GETDATE:
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
محدودیت DEFAULT در دستور ALTER TABLE
Wiki
برای ایجاد محدودیت DEFAULT روی ستون City هنگامی که جدول، قبلا ایجاد شده از دستور زیر استفاده می کنیم.
درMySQL:
ALTER City SET DEFAULT 'SANDNES'
درSQL Server / Oracle / MS Access:
ALTER COLUMN City SET DEFAULT 'SANDNES'
حذف محدودیت DEFAULT
Wiki
برای حذف محدودیت DEFAULT از دستور زیر استفاده می کنیم.
درMySQL:
ALTER City DROP DEFAULT
درSQL Server / Oracle / MS Access:
ALTER COLUMN City DROP DEFAULT
آموزش SQL-دستور Create Index
دستور CREATE INDEX برای ایجاد INDEX (شاخص) در جداول استفاده می شود.
شاخص ها به پایگاه داده این اجازه را می دهند که داده ها را سریع پیدا کنند. بدون اینکه تمام جدول را بخواند.
INDEX
Wiki
یک شاخص می تواند در یک جدول برای پیدا کردن آسانتر و مؤثرتر داده ها ایجاد شود.
کاربران نمی توانند INDEXها را ببینند ، آنها تنها برای سریعتر کردن جستجوها کاربرد دارند.
فرم دستور CREATE INDEX:
ایجاد یک شاخص در یک جدول، تکرار داده ها مجاز است.
ON table_name (column_name)
فرم دستور CREATE UNIQUE INDEX:
ایجاد شاخص یکتا در جدول، تکرار داده ها مجاز نمی باشد.
ON table_name (column_name)
مثال:
Wiki
دستور زیر یک شاخص با نام PIndex را روی ستون LastName در جدول Persons ایجاد می کند.
ON Persons (LastName)
اگر می خواهید یک شاخص را روی مجوعه ای از ستون ها تعریف کنید، می توانید نام آن ستون ها را در یک پرانتز بنویسید و آنها را با کاما از هم جدا کنید.
ON Persons (LastName, FirstName)
آموزش SQL-دستور Drop
شاخص ها، جداول و پایگاه داده ها به آسانی می توانند با دستور DROP حذف شوند.
دستور DROP INDEX
Wiki
دستور DROP INDEX برای حذف index از یک جدول استفاده می شود.
فرم دستور DROP INDEX در MS Access:
فرم دستور DROP INDEX در MS SQL Server:
فرم دستور DROP INDEX در DB2/Oracle:
فرم دستور DROP INDEX در MySQL:
دستور DROP TABLE
Wiki
دستور DROP TABLE برای حذف یک جدول استفاده می شود.
دستور DROP DATABASE
Wiki
دستور DROP DATABASE برای حذف یک پایگاه داده استفاده می شود.
دستور TRUNCATE TABLE
Wiki
فرض کنید می خواهیم داده های درون یک جدول را (نه خود جدول را) حذف کنیم.
در این صورت، از دستور TRUNCATE TABLE استفاده می کنیم:
آموزش SQL-دستور Alter
دستور ALTER TABLE :
Wiki
دستور ALTER TABLE برای اضافه کردن(Add) ، حذف کردن(Drop Column)، یا تغییر ستون ها (Alter Column)در جدول موجود استفاده می شود.
فرم دستور ALTER TABLE :
برای اضافه کردن یک ستون به یک جدول ، از دستور زیر استفاده می کنیم :
ADD column_name datatype
برای حذف کردن یک ستون از یک جدول از دستور زیر استفاده می کنیم ( توجه داشته باشید که بعضی از پایگاه داده ها اجازه پاک کردن ستون را نمی دهند )
DROP COLUMN column_name
برای تغییر data type (نوع داده ) یک ستون در یک جدول ، از دستور زیر استفاده می کنیم :
ALTER COLUMN column_name datatype
مثال :
Wiki
در جدول Persons:
| P_Id | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes |
| 2 | Svendson | Tove | Borgvn 23 | Sandnes |
| 3 | Pettersen | Kari | Storgt 20 | Stavanger |
می خواهیم تا ستونی را با نام DateOfBirth به جدول اضافه کنیم .
از دستور زیر استفاده می کنیم:
ADD DateOfBirth date
توجه کنید که ستون جدید DateOfBirth از نوع date می باشد و تاریخ را در خود نگه می دارد.
data type تعیین می کند که چه نوع داده ای را در یک ستون می توان وارد کرد. برای اینکه لیست کاملی از data type های موجود در MS Access, MySQL, SQL Server را ببینید به لینک SQL Data Types مراجعه کنید.
حال جدول Persons به شکل زیر نمایش داده خواهد شد :
| P_Id | LastName | FirstName | Address | City | DateOfBirth |
|---|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes | |
| 2 | Svendson | Tove | Borgvn 23 | Sandnes | |
| 3 | Pettersen | Kari | Storgt 20 | Stavanger |
مثال( تغییر Data Type) :
Wiki
می خواهیم data type ستون DateOfBirth در جدول Persons را تغییر دهیم.
از دستور زیر استفاده می کنیم:
ALTER COLUMN DateOfBirth year
توجه کنید که ستون DateOfBirth از نوع سال می باشد و سالی با تعداد ارقام دو یا چهار رقم را در خود نگه می دارد.
مثال DROP COLUMN :
Wiki
می خواهیم تا ستون DateOfBirth را از جدول Persons حذف کنیم.
از دستور زیر استفاده می کنیم:
DROP COLUMN DateOfBirth
جدول Persons به شکل زیر خواهد شد:
| P_Id | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Hansen | Ola | Timoteivn 10 | Sandnes |
| 2 | Svendson | Tove | Borgvn 23 | Sandnes |
| 3 | Pettersen | Kari | Storgt 20 | Stava |
آموزش SQL-افزایش خودکار فیلد
Auto-increment یا افزایش خودکار، اجازه می دهد که یک شماره منحصر به فرد، برای سطر جدیدی که درجدول وارد می شود، تولید شود.
AUTO INCREMENT (افزایش خودکار یک فیلد)
Wiki
خیلی اوقات می خواهیم زمانی که رکورد جدیدی وارد می شود، مقدار فیلد primary key (کلید اصلی) به طور خودکار ایجاد شود.
در این صورت از فیلد auto-increment در جدول استفاده می کنیم.
فرم دستور در MySQL
دستور زیر تعیین می کند که ستون P_Id در جدول Persons کلید اصلی با حالت افزایش خودکار باشد.
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
MySQL از کلید واژه AUTO_INCREMENT برای اعمال حالت افزایش خودکار استفاده می کند.
به طور پیش فرض، مقدار شروع برای AUTO_INCREMENT عدد یک می باشد و مقدار آن برای رکورد جدید، یک عدد افزایش می یابد.
برای اینکه مقدار شروع AUTO_INCREMENT را مقداری غیر از یک تعیین کنیم از دستور زیر استفاده می کنیم:
برای وارد کردن یک رکورد جدید در جدول Persons دیگر نباید مقداری برای ستون P_Id تعیین کنیم (مقداری منحصر به فرد، به صورت خودکار در این فیلد وارد می شود)
VALUES ('Lars','Monsen')
دستور بالا سطر جدیدی را در جدول Persons وارد می کند. برای ستون P_Id یک مقدار منحصر به فرد تعیین می شود. در ستون FirstName مقدار Lars و در ستون LastName مقدار Monsen می آید.
فرم دستور در SQL Server
Wiki
دستور زیر تعیین می کند که ستون P_Id در جدول Persons کلید اصلی با حالت افزایش خودکار باشد.
(
P_Id int PRIMARY KEY IDENTITY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS SQL Server از کلید واژه IDENTITY برای اعمال حالت افزایش خودکار استفاده می کند.
به طور پیش فرض، مقدار شروع برای IDENTITY عدد یک می باشد و مقدار آن برای رکورد جدید، یک عدد افزایش می یابد.
برای اینکه تعیین کنیم که ستون P_Id با مقدار 10 شروع شود و 5 تا 5 تا افزایش یابد IDENTITY به ( IDENTITY(10,5 تغییر می یابد.
برای اینکه سطر جدیدی را در جدول Persons وارد کنیم، دیگر نیازی نیست مقداری برای ستون P_Id وارد کنیم. (مقداری منحصر به فرد، به طور خودکار در این ستون وارد می شود)
VALUES ('Lars','Monsen')
دستور بالا سطر جدیدی را در جدول Persons وارد می کند. به ستون P_Id یک مقدار منحصر به فرد داده می شود. در ستون FirstName مقدار Lars و در ستون LastName مقدار Monsen می آید.
فرم دستور در Access
Wiki
دستور زیر تعیین می کند که ستون P_Id در جدول Persons کلید اصلی با حالت افزایش خودکار باشد.
(
P_Id PRIMARY KEY AUTOINCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
MS Access از کلید واژه AUTOINCREMENT برای اعمال حالت افزایش خودکار استفاده می کند.
به طور پیش فرض، مقدار شروع برای AUTOINCREMENT عدد یک می باشد و مقدار آن برای رکورد جدید، یک عدد افزایش می یابد.
برای اینکه تعیین کنیم که ستون P_Id با مقدار 10 شروع شود و 5 تا 5 تا افزایش یابد AUTOINCREMENT به ( AUTOINCREMENT(10,5 تغییر می یابد.
برای اینکه سطر جدیدی را در جدول Persons وارد کنیم، دیگر نیازی نیست مقداری برای ستون P_Id وارد کنیم. (مقدار منحصر به فردی به طور خودکار در این ستون وارد می شود)
VALUES ('Lars','Monsen')
دستور بالا سطر جدیدی را در جدول Persons وارد می کند. به ستون P_Id یک مقدار منحصر به فرد داده می شود. در ستون FirstName مقدار Lars و در ستون LastName مقدار Monsen می آید.
فرم دستور در Oracle
Wiki
در Oracle کار کمی پیچیده تر است.
شما باید فیلد auto-increment را با یک شیء sequence ایجاد کنید. (این شیء، یک توالی از اعداد را تولید می کند)
برای تولید اعداد متوالی، از دستور CREATE SEQUENCE که در زیر آمده استفاده کنید.
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
دستور بالا یک شی sequence با نام seq_person ایجاد می کند، که با عدد یک شروع و یک عدد یک عدد افزایش می یابد. همچنین برای کارآیی و سرعت دسترسی بیشتر تا 10 مقدار در حافظه نگهداشته می شود (Cache).
برای درج یک رکورد جدید در جدوف "Persons"، باید از تابع nextval استفاده کنیم. (این تابع، مقدار بعدی sequence تعریف شده در بالا را برمی گرداند)
VALUES (seq_person.nextval,'Lars','Monsen')
دستور بالا سطر جدیدی را در جدول Persons وارد می کند. به ستون P_Id یک مقدار منحصر به فرد داده می شود. در ستون FirstName مقدار Lars و در ستون LastName مقدار Monsen می آید.
آموزش SQL-دیدگاه یا View
View یک جدول مجازی است.
این فصل نشان می دهد که چگونه یک View را ایجاد، حذف و یا تغییر دهیم.
دستور CREATE VIEW
Wiki
در SQL یک View یک جدول مجازی است که نتیجه حاصل از عبارات و دستورات SQL می باشد.
یک view شامل سطر و ستونهایی دقیقا شبیه یک جدول واقعی است. فیلدها در یک View فیلدهایی هستند که از یک یا چند جدول واقعی در پایگاه داده گرفته شده اند.
شما می توانید توابع موجود در SQL، عبارت WHERE و JOIN را به یک View اضافه کنید و داده های نتیجه را به همان صورت که داده ها در یک جدول آورده می شوند، نشان دهید.
فرم CREATE VIEW:
SELECT column_name(s)
FROM table_name
WHERE condition
مثال:
Wiki
اگر پایگاه داده Northwind را دارید شما می توانید چندین view را که به طور پیش فرض روی آن نصب شده است را ببینید.
View با نام Current Product List، لیست محصولات جاری (محصولاتی که تولید آنها متوقف نشده است) را از جدول Products نشان می دهد. این view توسط دستور زیر ایجاد می شود.
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
می توانیم View فوق را به صورت زیر فراخوانی کنیم:
مثال دیگری از View در پایگاه داده Northwind، تمام محصولاتی را که در جدول Products قیمت واحدشان بزرگتر از میانگین قیمت هاست را بر می گرداند:
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
می توانیم view فوق را به صورت زیر فراخوانی کنیم:
مثال دیگری از View در پایگاه داده Northwind، کل فروش را برای هر طبقه از محصولات در سال 1997 محاسبه می کند. توجه کنید که این view داده هایش را از view ی دیگری که Product Sales for 1997 نامیده می شود می گیرد.
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
می توانیم view فوق را به صورت زیر اجرا کنیم:
همچنین می توان یک شرط روی Query فوق تعریف کرد. می خواهیم فروش کل محصولاتی که در گروه Beverages هستند را ببینیم.
WHERE CategoryName='Beverages'
تغییر (به روز رسانی) یک View
Wiki
می توانیم یک View را به وسیله دستور زیر به روز رسانی کنیم:
فرم دستور CREATE OR REPLACE VIEW:
SELECT column_name(s)
FROM table_name
WHERE condition
می خواهیم ستون Category را به Current Product List اضافه کنیم. به وسیله دستور زیر view را تغییر می دهیم:
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
حذف یک View
Wiki
می توانید یک view را به وسیله فرمان DROP VIEW حذف کنیم.
فرم DROP VIEW:
آموزش SQL-تاریخ ها در SQL
تاریخ در SQL
Wiki
سخت ترین قسمت کار با Date این است که مطمئن شویم فرمت تاریخی که شما سعی می کنید وارد کنید با فرمت ستون تاریخ در پایگاه داده هم خوانی داشته باشد.
تا زمانی که داده فقط شامل تاریخ باشد، Query شما همان طور که انتظار دارید کار خواهد کرد. اما اگر با بخش زمان درگیر شوید، کار کمی پیچیده خواهد شد.
قبل از صحبت درباره پیچیدگی های کار با تاریخ، توابع مهم آن را با هم مرور می کنیم:
توابع تاریخ در MySQL
Wiki
جدول زیر، لیستی از مهم ترین توابع تاریخ در MySQL است:
| تابع | توضیحات |
|---|---|
| NOW() | تاریخ و زمان جاری را برمی گرداند |
| CURDATE() | تاریخ جاری را برمی گرداند |
| CURTIME() | زمان جاری را برمی گرداند |
| DATE() | بخش تاریخ را از یک عبارت date/time بیرون می کشد |
| EXTRACT() | یکی از بخش های عبارت date/time مانند سال، ماه، روز، ساعت و ... را برمی گرداند |
| DATE_ADD() | یک فاصله زمانی مشخص را به تاریخ اضافه می کند |
| DATE_SUB() | یک فاصله زمانی مشخص را از تاریخ کم می کند |
| DATEDIFF() | تعداد روز بین دو تاریخ را برمی گرداند |
| DATE_FORMAT() | نمایش تاریخ و زمان در فرمت های مختلف |
توابع تاریخ در SQL Server
Wiki
جدول زیر، لیستی از مهم ترین توابع تاریخ در SQL Server است:
| تابع | توضیحات |
|---|---|
| GETDATE() | تاریخ و زمان جاری را برمی گرداند |
| DATEPART() | یکی از بخش های عبارت date/time مانند سال، ماه، روز، ساعت و ... را برمی گرداند |
| DATEADD() | یک فاصله زمانی مشخص را به تاریخ اضافه یا کم می کند |
| DATEDIFF() | زمان بین دو تاریخ را برمی گرداند |
| CONVERT() | نمایش تاریخ و زمان در فرمت های مختلف |
انواع داده های تاریخ در SQL
Wiki
MySQL:
- DATE - format YYYY-MM-DD
- DATETIME - format: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - format: YYYY-MM-DD HH:MM:SS
- YEAR - format YYYY or YY
SQL Server:
- DATE - format YYYY-MM-DD
- DATETIME - format: YYYY-MM-DD HH:MM:SS
- SMALLDATETIME - format: YYYY-MM-DD HH:MM:SS
- TIMESTAMP - format: a unique number
اگر مایل هستید کلیه ی انواع داده را مرور کنید به مطلب SQL Data Types مراجعه نمایید.
کار با تاریخ در SQL
Wiki
فرض کنید جدول "Orders" را داریم:
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 |
| 2 | Camembert Pierrot | 2008-11-09 |
| 3 | Mozzarella di Giovanni | 2008-11-11 |
| 4 | Mascarpone Fabioli | 2008-10-29 |
حالا می خواهیم رکوردهایی با تاریخ "2008-11-11" را انتخاب کنیم.
از Query زیر استفاده می کنیم:
نتیجه به شکل زیر خواهد بود:
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 |
| 3 | Mozzarella di Giovanni | 2008-11-11 |
حالا، فرض کنید که جدول "Orders" شبیه زیر باشد. (بخش زمان به فیلد OrderDate اضافه شده است)
| OrderId | ProductName | OrderDate |
|---|---|---|
| 1 | Geitost | 2008-11-11 13:23:44 |
| 2 | Camembert Pierrot | 2008-11-09 15:45:21 |
| 3 | Mozzarella di Giovanni | 2008-11-11 11:12:01 |
| 4 | Mascarpone Fabioli | 2008-10-29 14:56:59 |
اگر از Query بالا استفاده کنیم نتیجه ای نخواهیم داشت، بنابراین اگر می خواهید Queryی ساده ای داشته باشید، اجازه ندهید بخش زمان در تاریخ وارد شود.
آموزش SQL-عبارت IS Null
مقدار NULL بیانگر داده ای است که مشخص نشده و فیلدی خالی است.
به طور پیش فرض، یک ستون از جدول می تواند مقدار NULL را در خود نگه دارد.
در این فصل می خواهیم، عملگرهای IS NULL و IS NOT NULL را توضیح دهیم.
مقدار NULL
Wiki
اگر وارد کردن مقدار در ستونی در یک جدول، اختیاری باشد، می توانیم در رکورد جدید یا رکورد موجود بدون اضافه کردن مقداری در این ستون، مقدار NULL را در این فیلد داشته باشیم.
با مقدار NULL نسبت به مقادیر دیگر، رفتار متفاوتی می شود.
در فیلدهای نامشخص یا نامعلوم که مقداری وارد نمی شود، مقدار NULL وجود دارد.
کار با NULL
Wiki
به جدول Persons در زیر نگاه کنید:
| P_Id | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Hansen | Ola | Sandnes | |
| 2 | Svendson | Tove | Borgvn 23 | Sandnes |
| 3 | Pettersen | Kari | Stavanger |
فرض کنید که وارد کردن مقدار در ستون Address اختیاری باشد. این بدان معناست که اگر رکوردی را بدون وارد کردن مقداری در ستون Address درج کنیم، ستون Address با مقدار NULL ذخیره می شود.
چگونه می توانیم تست کنیم فیلدی مقدار NULL دارد؟
با عملگر های مقایسه ای مثل (=, <, >) نمی توان مقدار NULL را تست کرد.
بلکه باید از عملگرهای IS NULL و IS NOT NULL استفاده کنیم.
IS NULL
Wiki
چگونه می توان رکوردهایی را که در ستون Address مقدار NULL دارند را انتخاب کرد؟
باید از عملگر IS NULL برای این کار استفاده کرد:
WHERE Address IS NULL
نتیجه چنین خواهد بود:
| LastName | FirstName | Address |
|---|---|---|
| Hansen | Ola | |
| Pettersen | Kari |
IS NOT NULL
Wiki
چگونه رکوردهایی را که مقدارشان NULL نیست را از ستون Address انتخاب کنیم؟
باید از عملگر IS NOT NULL استفاده کنیم:
WHERE Address IS NOT NULL
نتیجه چنین خواهد شد:
| LastName | FirstName | Address |
|---|---|---|
| Svendson | Tove | Borgvn 23 |
در فصل بعد به توابع () ISNULL() ,NVL() ,IFNULL() ,COALESCE نظری خواهیم داشت.
آموزش SQL-تابع IsNull
توابع ISNULL و NVL و IFNULL و COALESCE
Wiki
به جدول Products در زیر توجه فرمایید:
| P_Id | ProductName | UnitPrice | UnitsInStock | UnitsOnOrder |
|---|---|---|---|---|
| 1 | Jarlsberg | 10.45 | 16 | 15 |
| 2 | Mascarpone | 32.56 | 23 | |
| 3 | Gorgonzola | 15.67 | 9 | 20 |
فرض کنید که وارد کردن مقدار ستون UnitsOnOrder اختیاری باشد و ممکن است حاوی مقدار NULL باشد.
دستور SELECT زیر را داریم:
FROM Products
در مثال فوق، اگر هر یک از مقادیر ستون UnitsOnOrder حاوی NULL باشند نتیجه آن NULL خواهد بود.
از تابع ISNULL استفاده می شود تا مشخص کنیم چگونه می خواهیم با مقدار NULL رفتار کنیم.
توابع NVL و IFNULL و COALESCE نیز می توانند برای رسیدن به نتیجه ای مشابه استفاده شوند.
در این مورد می خواهیم تا مقدار NULL صفر در نظر گرفته شود.
در زیر، اگر UnitsOnOrder مقدار NULL داشت، دیگر مشکلی برای محاسبه وجود ندارد، زیرا تابع ISNULL آن را به صفر بر می گرداند.
SQL Server / MS Access
FROM Products
Oracle
در Oracle تابع ISNULL وجود ندارد. اما می توانیم از تابع NVL برای رسیدن به نتیجه ای مشابه استفاده کنیم:
FROM Products
MySQL
در MySQL تابع ISNULL وجود دارد. اما عملکرد آن کمی با تابع ISNULL در ماکروسافت (ACCESS,SQL SERVER) متفاوت است.
در MySQL از تابع IFNULL برای این امر استفاده می کنیم:
FROM Products
از تابع COALESCE می توانیم به شکل زیر استفاده کنیم:
FROM Products
آموزش SQL-انواع داده
انواع داده ها (Data type) و دامنه آن ها در Microsoft Access ,MySQL و SQL Server
انواع داده ها در Microsoft Access
Wiki
| نوع داده | توضیحات | فضا |
|---|---|---|
| Text |
متن یا ترکیب متن و اعداد، حداکثر 255 کاراکتر |
|
| Memo |
متن های طولانی، حدکثر 65,536 کاراکتر توجه: فیلدهای از نوع Memo را نمی توان مرتب (sort) کرد، اما قابل جستجو هستند |
|
| Byte |
اجازه می دهد هرعددی از 0 تا 255 را وارد کرد |
1 byte |
| Integer |
اجازه می دهد هرعددی بین 32767 تا 32768- وارد شود |
2 bytes |
| Long |
اجازه می دهد هرعددی بین 2,147,483,647 تا 2,147,483,648- وارد شود |
4 bytes |
| Single |
اعداد اعشاری با دقت واحد |
4 bytes |
| Double |
اعداد اعشاری با دقت مضاعف |
8 bytes |
| Currency |
از این نوع داده ها برای نگهداری مقادیر پولی یا ارزی استفاده می شود. اکسس تمامی مقادیر پولی/ارزی را با ۱۵ رقم در سمت چپ و چهار رقم در سمت راست نقطه اعشار نگه می دارد, لذا می توانید اعداد با دقت بالا را در فیلدهای پولی نگه دارید |
8 bytes |
| AutoNumber |
وقتی که فیلدی را را از نوع داده Auto number تعریف می کنید، با هر رکوردی که به جدول اضافه شود اکسس به طور خودکار عددی را در این فیلد نگه می دارد |
4 bytes |
| Date/Time |
برای نگهداری داده های از نوع تاریخ و زمان استفاده می شود |
8 bytes |
| Yes/No |
فیلدی که از نوع Yes/No تعریف می شود به ازای Yes عدد ۱- و به ازای No عدد ۰ را دارا می شود. با استفاده از بخش Filed Properties در پنجره مذکور می توانید بسته به دلیل استفاده از فیلد, یکی از سه حالت Yes/No, True/False (درست یا غلط) یا On/Off (روشن و خاموش) را به کار ببرید. |
1 bit |
| Ole Object |
OLE مخفف Object Linking and Embedding (اتصال و نشاندن شی) است. |
up to 1GB |
| Hyperlink |
شامل لینک هایی به دیگر فایل ها یا صفحات وب است |
|
| Lookup Wizard |
هنگام تعریف این نوع داده، یک لیست از گزینه های انتخابی را مشخص می کنید و هنگام ورود اطلاعات یک لیست کشویی نمایش داده خواهد شد |
4 bytes |
انواع داده ها در MySQL
Wiki
در MySQL سه نوع اصلی داده وجود دارد: نوع متنی، نوع عددی و نوع تارخ/زمان
داده های متنی
| نوع داده | توضیحات |
|---|---|
| CHAR(size) |
رشته ای با طول ثابت (می تواند شامل حروف، اعداد و کاراکترهای خاص باشد) |
| VARCHAR(size) |
رشته ای با طول متغییر (می تواند شامل حروف، اعداد و کاراکترهای خاص باشد) حداکثر طول رشته در پرانتز مشخص می شود و حداکثر 255 کاراکتر است توجه: اگر رشته ای با طول بیش از 255 کاراکتر را در آن قرار دهید، به نوع TEXT تبدیل خواهد شد |
| TINYTEXT |
رشته ای با طول حداکثر 255 کاراکتر |
| TEXT |
رشته ای با طول حداکثر 65,535 کاراکتر |
| BLOB |
داده باینتری با طول حداکثر 65,535 بایت (Binary Large OBject) |
| MEDIUMTEXT |
رشته ای با طول حداکثر 16,777,215 کاراکتر |
| MEDIUMBLOB |
داده باینتری با طول حداکثر 16,777,215 بایت (Binary Large OBject) |
| LONGTEXT |
رشته ای با طول حداکثر 4,294,967,295 کاراکتر |
| LONGBLOB |
داده باینتری با طول حداکثر 4,294,967,295 بایت (Binary Large OBject) |
| ENUM(x,y,z,etc.) |
فقط یکی از مقادیری که در پرانتز لیست شده است، اجازه ورود دارد. می توانید حداکثر 65535 کاراکتر در ENUM لیست کنید
اگر مقداری که در لیست وجود ندارد، درج شود، یک blank یا فضای خالی بجای آن در نظر گرفته می شود |
| SET |
مانند ENUM است با این تفاوت که، حداکثر 64 آیتم می توانید لیست کنید و همچنین بیشتر از یک انتخاب دارید |
داده های عددی
| نوع داده | توضیحات | فضا |
|---|---|---|
| TINYINT(size) |
محدوده اعداد مجاز به صورت علامت دار: 128- تا 127 |
1 byte |
| SMALLINT(size) |
محدوده اعداد مجاز به صورت علامت دار: 32768- تا 32767 |
2 byte |
| MEDIUMINT(size) |
محدوده اعداد مجاز به صورت علامت دار: 8388608- تا 8388607 |
3 byte |
| INT(size) |
محدوده اعداد مجاز به صورت علامت دار: 2147483648- تا 2147483647 |
4 byte |
| BIGINT(size) |
محدوده اعداد مجاز به صورت علامت دار: 9223372036854775808- تا 9223372036854775807 |
8 byte |
| FLOAT(size,d) |
از این دو نوع داده برای ذخیره اعداد اعشاری با ممیز شناور استفاده می شود |
4 یا 8 byte |
| DOUBLE(size,d) |
از این دو نوع داده برای ذخیره اعداد اعشاری با ممیز شناور استفاده می شود پارامتر size حداکثر تعداد ارقام و پارمتر d حداکثر تعداد ارقام سمت راست ممیز اعشار را مشخص می کند |
8 byte |
| DECIMAL(size,d) |
از این نوع داده برای نگهداری اعداد اعشاری با ممیز ثابت استفاده می شود. این نوع داده برای هر ۹ رقم ، ۴ بایت فضا اشغال می کند |
- اگر هنگام تعریف فیلد از کلمه کلیدی UNSIGNED استفاده کنیم میتوانیم مقادیر بدون علامت را درون فیلد بریزیم، ولی بطور پشفرض فیلد ها مقادیر علامت دار (SIGNED) را می پذیرند.
- میتوان تعداد ارقامی که به نوع دادهٔ Integer نسبت داده می شود را محدود نمود، به عنوان مثال: (INT(5 یعنی فیلدی از جنس INT که 5 رقم را در خود جای می دهد.
- وقتی از کلمه کلیدی ZEROFILL استفاده می کنیم، اگر مقدار نسبت داده شده به فیلد از تعداد ارقام مشخص شده کمتر باشد، با اضافه کردن 0 به سمت چپ عدد، آن مقدار را هم اندازه تعداد ارقام مشخص شده می کند.
داده های تاریخ/زمان
| نوع داده | توضیحات | فضا |
|---|---|---|
| DATE() |
این نوع داده برای نگهداری تاریخ (بدون ساعت)، با غالب 'YYYY-MM-DD' استفاده می شود |
3 byte |
| DATETIME() |
این نوع داده برای نگهداری زمان (هم تاریخ و هم ساعت بصورت تفکیک شده و بدون توجه به منطقه زمانی)، با غالب 'YYYY-MM-DD HH:MM:SS' استفاده می شود |
8 byte |
| TIMESTAMP() |
هر زمان سطری ایجاد یا تغییر داده می شود، یک عدد یکتا بصورت اتوکاتیک در این فیلد ذخیره می شود. داده timestamp وابسته به ساعت داخلی سیستم می باشد و با زمان واقعی مطابقت ندارد. هر جدولی ممکن است یک timestamp متفاوت داشته باشد. به عبارت دیگر در این فیلد ۸ بایتی، تایم لحظهای اجرای دستور نگهداری میشود و کاربرد آن کنترل بروزرسانی همزمان (Concurrency) اطلاعات توسط چند کاربر است. البته در تعداد رکوردهای پایین به کار نمیآید و بیشتر زمانی مورد نیاز است که تعداد رکوردها خیلی زیاد باشد مثلاً ۱۰۰ میلیون رکورد! توجه: محدوده زمانی بصورت '00:00:00 01-01-1000' UTC تا '23:59:59 31-12-9999' UTC می باشد. یعنی هنگام ذخیره سازی زمان ، آن را از زمان محلی (Time Zone) سیستم به زمان UTC (گیرینویچ) تبدیل می کند و هنگام بازیابی ، آنرا از UTC به زمان محلی سیستم تبدیل می کند. |
4 byte |
| TIME() |
این نوع داده برای نگهداری زمان (فقط ساعت ، بدون تاریخ)، با غالب 'HH:MM:SS' یا 'HHH:MM:SS' استفاده می شود |
3 byte |
| YEAR() |
ذخیره سال به فرمت: دو رقمی یا چهار رقمی |
1 byte |
انواع داده ها در SQL Server
Wiki
داده های متنی
| نوع داده | توضیحات | فضا |
|---|---|---|
| char(n) |
رشته ای با طول ثابت، حداکثر 8000 کاراکتر n می تواند عددی بین 1 تا 8000 باشد توجه: اگر 5=n باشد و 2 کاراکتر وارد کنید، 3 کاراکتر باقی مانده با Space پر می شود مزیت این نوع داده در جستجوی سریع آن است |
n |
| varchar(n) |
رشته ای با طول متغییر، حداکثر 8000 کاراکتر توجه: اگر 5=n باشد و 2 کاراکتر وارد کنید، فقط به اندازه 2 کاراکتر فضا اشغال می شود (3 کاراکتر باقی مانده در نظر گرفته نمی شود) مزیت این نوع داده در میزان فضای استفاده شده است |
|
| varchar(max) |
رشته ای با طول متغییر، حداکثر 1,073,741,824 کاراکتر به جای n در مورد قبلی می توان از عبارت max استفاده کرد تا حداکثر فضای امکان پذیر در دسترس باشد |
|
| text |
رشته کاراکتر با طول متغییر، حداکثر 2GB داده متنی |
داده های متنی Unicode
| نوع داده | توضیحات | فضا |
|---|---|---|
| nchar(n) |
داده Unicode با طول ثابت، حداکثر 4,000 کاراکتر میزان مصرف این نوع داده دو بایت به ازای هر کاراکتر است. بخاطر این موضوع، n باید بین یک تا چهار هزار تعیین شود |
|
| nvarchar(n) |
داده Unicode با طول متغیر، حداکثر 4,000 کاراکتر |
|
| nvarchar(max) |
داده Unicode با طول متغیر، حداکثر 536,870,912 کاراکتر |
|
| ntext |
داده Unicode با طول متغیر، حداکثر 2GB داده متنی |
داده های Binary
| نوع داده | توضیحات | فضا |
|---|---|---|
| bit |
0، 1 یا NULL |
|
| binary(n) |
داده باینری با طول ثابت حداکثر 8000 بایت |
|
| varbinary(n) |
داده باینری با طول متغیر حداکثر 8000 بایت |
|
| varbinary(max) |
داده باینری با طول متغیر حداکثر 2GB |
|
| image |
داده باینری با طول متغیر حداکثر 2GB |
داده های عددی
| نوع داده | توضیحات | فضا |
|---|---|---|
| tinyint |
اعداد صحیح بین 0 تا 255 |
1 byte |
| smallint |
اعداد صحیح بین 32,767 تا 32,768- |
2 bytes |
| int |
اعداد صحیح بین 2,147,483,647 تا 2,147,483,648 - |
4 bytes |
| bigint |
اعداد صحیح بین 9,223,372,036,854,775,807 تا 9,223,372,036,854,775,808- که معادل از منفی 263 تا 263 منهای یک است |
8 bytes |
| decimal(p,s) |
اعداد با مقیاس (scale) و دقت (precision) ثابت |
5-17 bytes |
| numeric(p,s) |
اعداد با مقیاس (scale) و دقت (precision) ثابت |
5-17 bytes |
| smallmoney |
داده های ارزی بین 214,748.3648- تا 214,748.3647 |
4 bytes |
| money |
داده های ارزی بین 922,337,203,685,477.5808- تا 922,337,203,685,477.5807 |
8 bytes |
| float(n) |
برای نگهداری اعداد غیر صحیح با تعداد ارقام اعشار متغیر و یا تخمـینـی استفاده میشود (from -1.79E + 308 to 1.79E + 308) |
4 یا 8 bytes |
| real |
برای نگهداری اعداد غیر صحیح با تعداد ارقام اعشار متغیر و یا تخمـینـی استفاده میشود (from -3.40E + 38 to 3.40E + 38) |
4 bytes |
داده های تاریخ و زمان
این نوع فیلدها برای نگهداری تاریخ میلادی و ساعت استفاده میشود و برای تاریخ شمسی کاربردی ندارد.
| نوع داده | توضیحات | فضا |
|---|---|---|
| datetime |
از تاریخ اول January سال 1753 تا سی ویکم December سال 9999 با دقت 3.33 میلی ثانیه |
8 bytes |
| datetime2 |
از تاریخ اول January سال 0001 (01/01/0001) تا سی ویکم December سال 9999 (31/12/9999) با دقت 100 نانو ثانیه |
6-8 bytes |
| smalldatetime |
از تاریخ اول January سال 1900 تا ششم June سال 2079 با دقت یک دقیقه |
4 bytes |
| date |
فقط تاریخ را ذخیره می کند. از تاریخ اول January سال 0001 (01/01/0001) تا سی ویکم December سال 9999(31/12/9999) |
3 bytes |
| time |
فقط زمان را ذخیره می کند با دقت 100 نانو ثانیه |
3-5 bytes |
| datetimeoffset |
مشابه datetime2 می باشد به علاوه timeoffset را ذخیره می کند |
8-10 bytes |
| timestamp |
هر زمان سطری ایجاد یا تغییر داده می شود، یک عدد یکتا ذخیره می شود. داده timestamp وابسته به ساعت داخلی سیستم می باشد و با زمان واقعی مطابقت ندارد. هر جدولی ممکن است یک timestamp متفاوت داشته باشد. به عبارت دیگر در این فیلد ۸ بایتی، تایم لحظهای اجرای دستور نگهداری میشود و کاربرد آن کنترل بروزرسانی همزمان (Concurrency) اطلاعات توسط چند کاربر است. البته در تعداد رکوردهای پایین به کار نمیآید و بیشتر زمانی مورد نیاز است که تعداد رکوردها خیلی زیاد باشد مثلاً ۱۰۰ میلیون رکورد! |
انواع داده ای دیگر
| نوع داده | توضیحات |
|---|---|
| sql_variant |
این نوع فیلد، به جز داده های text, ntext, timestamp برای نگهداری انواع داده های دیگر استفاده میشود و نوع آن با توجه به اولین مقداری که در آن قرار میگیرد تعیین خواهد شد. (حداکثر 8000 بایت) چون نوع و حجم فیلد مشخص نیست، لذا تنها یک اشارهگر ۱۶ بایتی در آن قرار گرفته و داده اصلی در فایل جداگانه نگهداری میشود. استفاده از این نوع فیلد، توصیه نمیگردد. |
| uniqueidentifier |
این فیلد ۱۶ بایتی، به ما کدی Unique یا یکتا میدهد که به اصطلاح GUID میگویند. یکی از کاربردهای آن در Replication است. |
| xml |
داده هایی با فرمت XML را ذخیره می کند. (حداکثر 2GB) این فیلد بیشتر برای انتقال اطلاعات و دستورات تحت web استفاده میشود و شامل انواع MetaData های مختلف است. این فیلد در SQL 2005 معرفی گردید. |
| cursor |
این فیلد مربوط به كنترل Cursor است و مرجع یک Cursor در آن ذخیره می شود |
| table |
نتیجه یک کوری را برای عملیاتهای بعدی ذخیره می کند. |
آموزش توابع SQL
آموزش SQL-توابع در SQL
SQL توابع تعریف شده زیادی برای انجام محاسبات بر روی داده ها دارد.
توابع Aggregate:
Wiki
توابع Aggregate تنها یک مقدار را براساس داده های یک ستون برمی گردانند.
توابع پرکاربرد Aggregate:
- AVG- میانگین مقادیر یک ستون را بر می گرداند.
- COUNT- تعداد سطرهای یک ستون را برمی گرداند.
- FIRST- اولین مقدار ستون را بر می گرداند.
- LAST- آخرین مقدار ستون را بر می گرداند.
- MAX- بزرگترین مقدار ستون را بر می گرداند.
- MIN- کوچکترین مقدار ستون را بر می گرداند.
- SUM- مجموع داده های ستون را بر می گرداند.
توابع Scalar:
Wiki
توابع Scalar تنها یک مقدار را بر اساس داده ورودی برمی گردانند.
توابع پرکاربرد Scalar:
- UCASE: یک فیلد را به حروف بزرگ (upper case) تبدیل می کند.
- LCASE- یک فیلد را به حروف کوچک (lower case) تبدیل می کند.
- MID- کاراکترهایی را از یک فیلد متنی بیرون می کشد.
- LEN- طول یک فیلد متنی را بر می گرداند.
- ROUND- یک فیلد عددی را به عددی با تعداد اعشار مشخص گرد می کند.
- NOW- تاریخ و ساعت جاری سیستم را بر می گرداند.
- FORMAT- مشخص می کند یک فیلد با چه فرمتی نمایش داده شود.
- LEFT- این تابع از سمت چپ یک عبارت، به تعدادی مشخص، کاراکتر برمی گرداند.
- RIGHT- این تابع از سمت راست یک عبارت، به تعدادی مشخص، کاراکتر برمی گرداند.
- CONVERT & CAST- یک عبارت را به نوعی دیگر تبدیل می کند.
توابع Aggregate و Scalar به صورت کامل در فصل های بعد توضیح داده خواهند شد.
آموزش SQL-تابع avg
تابع AVG:
Wiki
تابع AVG میانگین مقادیر یک ستون عددی را بر می گرداند.
نحوه استفاده:
مثال:
Wiki
جدول Orders را در زیر داریم:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/11/12 | 1000 | Hansen |
| 2 | 2008/10/23 | 1600 | Nilsen |
| 3 | 2008/09/02 | 700 | Hansen |
| 4 | 2008/09/03 | 300 | Hansen |
| 5 | 2008/08/30 | 2000 | Jensen |
| 6 | 2008/10/04 | 100 | Nilsen |
می خواهیم میانگین فیلد OrderPrice را به دست آوریم.
از دستور زیر استفاده می کنیم:
نتیجه به شکل زیر خواهد بود:
| OrderAverage |
|---|
| 950 |
می خواهیم مشتریانی را پیدا کنیم که مقدار سفارش آنها بزرگتر از میانگین باشد.
از دستور زیر استفاده می کنیم:
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
نتیجه به شکل زیر خواهد بود:
| Customer |
|---|
| Hansen |
| Nilsen |
|
Jensen |
آموزش SQL-تابع count
تابع COUNT تعداد سطرهایی را بر می گرداند که در شرط صدق می کنند.
فرم تابع (COUNT(column_name
Wiki
تابع (COUNT(column_name تعداد مقادیر ستون مشخص شده را بر می گرداند (مقدار NULL شمرده نمی شود.)
فرم تابع (*)COUNT
تابع (*)COUNT تعداد رکوردهای یک جدول را بر می گرداند.
فرم تابع ( COUNT(DISTINCT column_name
تابع (COUNT(DISTINCT column_name تعداد مقادیر متمایز (داده های تکراری را یک بار حساب می کند) از یک ستون را بر می گرداند.
تابع (COUNT(DISTINCT در ORACLE و Microsoft SQL Server کار می کند و در Microsoft Access کار نمی کند.
مثالی از ( COUNT(column_name
Wiki
جدول Orders را در زیر داریم:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/11/12 | 1000 | Hansen |
| 2 | 2008/10/23 | 1600 | Nilsen |
| 3 | 2008/09/02 | 700 | Hansen |
| 4 | 2008/09/03 | 300 | Hansen |
| 5 | 2008/08/30 | 2000 | Jensen |
| 6 | 2008/10/04 | 100 | Nilsen |
می خواهیم تعداد سفارشات مشتری با نام Nilsen را بیابیم:
از دستور زیر استفاده می کنیم:
WHERE Customer='Nilsen'
نتیجه دستور فوق عدد 2 خواهد بود زیرا مشتری با نام Nilsen در کل دو سفارش داده است.
| CustomerNilsen |
|---|
| 2 |
مثالی از (*)COUNT
Wiki
اگر عبارت WHERE را از دستور بالا حذف کنیم، به این صورت:
نتیجه چنین خواهد بود:
| NumberOfOrders |
|---|
| 6 |
که تعداد کل سطرهای جدول را بر می گرداند.
مثالی از (COUNT(DISTINCT column_name
Wiki
می خواهیم تعداد مشتریان را در جدول Orders به دست آوریم (داده های تکراری یک بار شمرده شوند.)
از دستور زیر استفاده می کنیم:
نتیجه چنین خواهد بود:
| NumberOfCustomers |
|---|
| 3 |
که تعداد مشتریان منحصر به فرد در جدول Orders می باشد.(Hansen, Nilsen, Jensen)
آموزش SQL-تابع first
تابع FIRST
Wiki
تابع FIRST اولین داده را از ستون انتخابی بر می گرداند.
فرم دستور FIRST:
مثال:
Wiki
جدول Orders را در زیر داریم:
| O_Id | OrderDate | OrderPrice | Customer |
|---|---|---|---|
| 1 | 2008/11/12 | 1000 | Hansen |
| 2 | 2008/10/23 | 1600 | Nilsen |
| 3 | 2008/09/02 | 700 | Hansen |
| 4 | 2008/09/03 | 300 | Hansen |
| 5 | 2008/08/30 | 2000 | Jensen |
| 6 | 2008/10/04 | 100 | Nilsen |
می خواهیم اولین مقدار از ستون OrderPrice را پیدا کنیم:
از دستور زیر استفاده می کنیم:
توجه: اگر دستور فوق جواب نداد از دستور زیر استفاده کنید:
نتیجه به شکل زیر خواهد بود:
| FirstOrderPrice |
|---|
|
1000 |