SlideShare a Scribd company logo
1 of 14
Căn bản SQL cho người lập trình C#                         Author : Xcross87   2007


Căn bản SQL cho người lập trình C#

Bài này mình giới thiệu cho các bạn các thành phần cơ bản của SQL mà bạn cần
biết để có thể viết một chương trình làm việc với cơ sở dữ liệu bằng C#.

              Query
              Câu lệnh INSERT
              Câu lệnh UPDATE
              Câu lệnh DELETE
              Kiểu dữ liệu T-SQL

SQL là cái gì ?

Nếu như bạn đã từng làm việc với hệ quản trị cơ sở dữ liệu, tất nhiên sẽ biết sử
dụng SQL. SQL là ngôn ngữ database chuẩn quốc tế. Bạn có thể dùng SQL để tạo
thêm dữ liệu, lấy thông tin, thay đổi hay xóa dữ liệu (và nhiều thứ khác). Tóm lại,
SQL tiếng Anh là “Structured Query Language”, ngôn ngữ có cấu trúc.Được phát
triển từ những năm 70, được IBM sáng tạo ra và gọi với tên là : SEQUEL
“Structured English Query Language”, sau này được thay đổi đi một chút gọi là SQL
nhưng có khác với SEQUEL, cần tránh nhầm lẫn. SEQUEL hiện được sử dụng trong
hệ thống của IBM. Về cách phát âm, trong thế giới của Microsoft và Oracle gọi là
“sequel” ( xi-quờ ). Còn trong khu vực làm việc với DB2 và MySQL thì hay gọi là
“ess cue ell” ( ét-kiu-eo ). Các bạn thích gọi thế nào cũng được, tùy :D..Tớ thì hay
gọi nó là “ess cue ell”. Bắt đầu về SQL cấu trúc và query.

Yêu cầu cần thiết để thực hiện các thao tác trong bài viết này :

   1.   Microsoft Visual C# 2005 Express Edition
   2.   Microsoft SQL Server 2005 Express Edition
   3.   Cài đặt thêm : MS SQL Server Management Studio 2005 Express
   4.   Database : Northwind

Các bạn có thể download free trong trang Downloads của Microsoft.

Sau đó cài đặt tất cả và bắt đầu vào thao tác trong database.




                                     Page 1 of 14
Căn bản SQL cho người lập trình C#                          Author : Xcross87   2007


Lấy dữ liệu (RETRIEVING DATA)

Một query của SQL dùng để lấy thông tin từ database. Dữ liệu được chứa trong các
hàng (rows) của bảng (tables). Hàng (Rows) gồm một nhóm các cột (Columns)
chứa dữ liệu tương ứng. Biểu thức query lấy dữ liệu có cấu trúc :

              Một danh sách SELECT (lựa chọn), tại vị trí các cột được gọi để lấy dữ
              liệu chỉ định.
              Một mệnh đề WHERE, xác định bảng (tables) cần truy cập để lấy dữ
              liệu.

Bây giờ những từ nào tiếng Anh cần thiết thì tớ viết tiếng Anh nhé để khi lập trình
đỡ bị loạn giữa Anh và Việt. Khi viết các query SQL thì viết hoa, đơn giản là để xác
định nó là từ khóa của SQL; SQL không phân biệt chữ hoa chữ thường cho nên nếu
viết thường không ảnh hưởng gì cả; chẳng qua viết hoa tránh nhầm lẫn. Cái này
theo chuẩn lập trình ANSI để phân biệt thôi.

Viết một query đơn giản

[code]

SELECT

         *

FROM

         Employees;

[/code]

Dấu * nghĩa là lấy dữ liệu của tất cả các cột nằm trong bảng. Khi thực thì (!
Execute) query này trong “Northwind” thì sẽ thu được tất cả các hàng và cột nằm
trong „Employees‟ Table.

Chú ý: khi bạn làm việc với cơ sở dữ liệu của SQL Server 2k5 thì dùng GUI dễ xác
định các thành phần và đặc điểm của cấu trúc khi làm việc với cơ sở dữ liệu. Query
có thể hiểu là làm việc theo kiểu code. Thực tế để code với cơ sở dữ liệu một cách
chuẩn thì câu lệnh sẽ rất phức tạp và tốn nhiều dòng (có khi lên đến hàng trăm
dòng code.



Nếu bạn chưa biết thực thi (! Execute) query như thế nào thì làm như sau :

   1. Mở Mircrosoft SQL Server Management Studio 2005 Express ra.
   2. Chọn db „Northwind‟.

                                      Page 2 of 14
Căn bản SQL cho người lập trình C#                         Author : Xcross87   2007


   3.    Chọn nút „New Query‟ trên Toolbar (thanh công cụ).
   4.    Viết query vào.
   5.    Phải chuột và chọn „! Execute‟.
   6.    Sẽ thấy kết quả tại tab „Results‟ ngay bên dưới phần mà bạn vừa code query
         xong.

Giải thích câu query

Câu query vừa thực hiện là :

[code] SELECT * FROM Employees; [/code]

Nghĩa là : lấy dữ liệu của tất cả các cột các hàng của bảng „Employees‟. Hoặc là :
lấy tất cả dữ liệu có trong bảng „Employees‟.

Giả sử muốn lấy dữ liệu của một số columns thôi vì có nhiều cột không cần thiết,
lấy vào chỉ tốn tài nguyên khi thực thi thì query như sau :

[code]

SELECT

         <column 1>,

         <column 2>,

         ….

         <column n>

FROM

         Employees;

[/code]

Trong đó <column X> là tên column bạn cần lấy dữ liệu. Chẳng hạn tớ chỉ muốn lấy
tên của nhân viên trong bảng „Employees‟ thôi thì query như sau :

[code]

SELECT

         Lastname

FROM

         Employees;


                                      Page 3 of 14
Căn bản SQL cho người lập trình C#                        Author : Xcross87   2007


[/code]

Hoặc lấy số ID của nhân viên và họ tên của nhân viên :

[code]

SELECT

         employeeid,

         firstname,

         lastname

FROM

         Employees;

[/code]

Giảm bớt số lượng dữ liệu không cần thiết sẽ rất tiết kiệm tài nguyên khi bạn làm
việc với một cơ sở dữ liệu lớn, đồ sộ.

Mệnh đề WHERE

Yếu tố thêm trong query này là WHERE để xác định hàng có tính chất nào đó.

Cấu trúc câu lệnh :

[code] WHERE <column1> <operator> <column2> [/code]

Trong đó : <column1> <column2> là tên 2 cột với toán tử so sánh „operator‟.

Thử dùng WHERE trong câu query vừa viết xong nhé :

[code]

SELECT

         employeeid,

         firstname,

         lastname

FROM

         Employees

WHERE

                                     Page 4 of 14
Căn bản SQL cho người lập trình C#                           Author : Xcross87   2007


      country = „USA‟;

[/code]

Rồi, ấn F5 để thực thi query hoặc phải chuột->! Execute ^_^!

Chú ý: nếu là string thì phải để trong dấu „ như ở trên.

Toán tử so sánh của mệnh đề WHERE

          Toán tử                       Giải thích                  Ví dụ
=                               Bằng                       EmployeeID = 1
<                               Nhỏ hơn                    EmployeeID < 1
>                               Lớn hơn                    EmployeeID > 1
<=                              Nhỏ hơn hoặc bằng          EmployeeID <= 1
>=                              Lớn hơn hoặc bằng          EmployeeID >= 1
<>, !=                          Khác                       EmployeeID <> 1
!<                              Không nhỏ hơn              EmployeeID !< 1
!>                              Không lớn hơn              EmployeeID !> 1


Chú ý: trong chuẩn SQL không có toán tử „!=‟; chỉ áp dụng với kiểu dữ liệu T-SQL.

Toán tử LIKE

Toán tử này đưa ra kết quả theo kiểu pattern cho trước (cái này liên quan Regular
Expression). Ví dụ

[code] WHERE Title LIKE „Sale%‟ [/code]

Sẽ lấy ra tất cả các hàng nào có cột có tiêu đề bắt đầu với cụm từ Sale , có thể là
„Sale‟ , „Sale0‟,‟Saleman‟……

Có 4 trường hợp để xác định pattern :

      % : bất cứ kí tự hoặc một nhóm nào đều hợp lệ kể cả rỗng (empty).
      _ : một kí tự bất kì . Ví dụ : LIKE „_ales‟ có thể là : Sales,Bales,Cales…nhưng
      chỉ 1 kí tự.
      [ ] : Một vài kí tự xác định cho phép là hợp lệ. Ví dụ: LIKE „[bs]ales‟ thì chỉ có
      2 kết quả là : bales và sales.
      [^] : kí tự không phải nhóm kí tự xác định. Ví dụ : [^a-h] thì không lấy kí tự
      nào từ a đến h.

   Cái này giống hệt Regular Expression nha. :D

Đôi lúc bạn sẽ thấy những cột chẳng có giá trị gì được gắn cho nó cả, ta gọi là NULL
(column is NULL). Vì vậy có toán tử giúp ta xác định các giá trị này :

                                       Page 5 of 14
Căn bản SQL cho người lập trình C#                                  Author : Xcross87   2007


Toán tử IS NULL và IS NOT NULL

         IS NULL : Cho phép lấy ra hàng có cột chẳng có giá trị gì.
         Ví dụ : WHERE Region IS NULL
         IS NOT NULL : Cho phép lấy ra hàng có cột có giá trị.
         Ví dụ : WHERE Region IS NOT NULL

Một query đúng :

[code]

SELECT * FROM Employees WHERE Region IS NULL;

[/code]

Một query sai :

[code]

SELECT * FROM Employees WHERE Region = NULL;

[/code]

Tại sao sai ? Sai vì chẳng có cái gì „= NULL‟ cả :D. Sai toán tử.

Toán tử BETWEEN và IN

Nhiều lúc muốn lấy kết quả trong một khu vực mình muốn thu hẹp lại (range), ước
chừng khoảng thế nào đó. Ta dùng BETWEEN và IN

         BETWEEN : trả về true nếu giá trị nằm trong một khoảng.
         Ví dụ : WHERE extension BETWEEN 400 AND 500
         Lấy hàng có cột „extension‟ có giá trị trong khoảng 400 và 500
         IN : trả về true nếu giá trị nằm trong một danh sách (list). Danh sách có thể là một
         query con (sub-query)
         Ví dụ : WHERE city IN („Seattle‟, „London‟)
         Lấy hàng có cột „city‟ mang giá trị là „Seattle‟ và „London‟.

Toán tử Logic : AND – NOT – OR

         AND : ví dụ : WHERE ( title LIKE „Sale%‟ AND lastname = „Peacock‟ )
         NOT : ví dụ : WHERE NOT ( title LIKE „Sale%‟ AND lastname = „Peacock‟)
         OR : ví dụ : WHERE ( title = „Anh Tuấn‟ OR title = „Pete‟ )

Cái này dễ hiểu khỏi giải thích. ^^!

Sắp xếp dữ liệu


                                           Page 6 of 14
Căn bản SQL cho người lập trình C#                        Author : Xcross87   2007


Khi lọc ra được các dữ liệu muốn tìm nhưng mà nó không theo trật tự nào cả. Bạn
muốn kết quả thu được tự sắp xếp theo một hướng nào đó để bạn dễ hiểu dễ nhìn.

Dùng mệnh đề ORDER BY

Cấu trúc :

[code] ORDER BY <column_name> [ASC | DESC] {, n}

         ASC : Ascending
         DESC : Descending

   Nếu bạn không có ASC hay DESC thì mặc định (default) là ASC

Query chung mẫu :

[code]

SELECT <column_list>

FROM <table>

WHERE <predicate>

ORDER BY <column_name> ASC | DESC

Bây giờ sử dụng những cái đã biết ở trên vào làm vài query phức tạp chơi nhé ^&^!

Viết Query phức tạp

Bây giờ tớ muốn :

         Lấy các đơn đặt hàng (orders) được nhận bởi nhân viên có id là 5
         (employeeid = 5 )
         Đơn đặt hàng chuyển tới Pháp (France) hoặc Brazil.
         Chỉ lấy thông tin : OrderID, EmployeeID, CustomerID, OrderDate và
         ShipCountry.
         Sắp xếp theo nước nhận hàng và ngày đặt hàng

Hooooohohohoo…Nghe phức tạp chưa..Đọc mù mắt, đếch ra cái gì :D

Mở New Query và dùng code sau :

[code]

SELECT

         Orderid,


                                      Page 7 of 14
Căn bản SQL cho người lập trình C#                    Author : Xcross87   2007


       Employeeid,

       Customerid,

       Orderdate,

       Shipcountry,

FROM

       Orders

WHERE

       Employeeid = 5

       AND

       Shipcountry IN ( „Brazil‟ , „France‟)

ORDER BY

       Shipcountry ASC,

       Orderdate ASC

[/code]

Bạn sẽ thu được 10 hàng có kết quả tương ứng nha.

Kết thúc mục lấy dữ liệu từ database.




                                       Page 8 of 14
Căn bản SQL cho người lập trình C#                        Author : Xcross87   2007


Chèn thêm dữ liệu (INSERTING DATA)

Bạn đã biết cách lấy dữ liệu từ db bây giờ phải biết thêm chèn thêm dữ liệu vào db
nữa chứ. Để thêm dữ liệu vào dùng câu lệnh „INSERT‟. Rất đơn giản không phức tạp
lắm vì khi thêm dữ liệu đâu cần phải lọc,sắp xếp phân loại nên không xài WHERE và
ORDER BY khi thêm dữ liệu.

Cấu trúc câu lệnh INSERT :

[code]

INSERT INTO <table_name>

         ( <colum-1>, <column-2>,… , <column-N>)

VALUES

         ( <value-1>,<value-2>, …, <value-N)

[/code]

Bây giờ thử nha. Mở thằng „Northwind‟ rấu đó chọn bảng ‘Shippers’. Cột đầu tiên là
‘ShippersID’ là khóa của bảng này. Tiếp theo là „CompanyName‟ và „Phone‟

Ta thử thêm một người ship hàng :

[code]

INSERT INTO shippers

         ( CompanyName, Phone )

VALUES

         ( „CongDongCViet.COM‟, „000-123456‟);

[/code]

Sau đó run query này, có một Message trong reporting “ (1 row(s) affected “. Sau
đó xem lại table ‘Shipper’ thì có thêm một hàng mới (new row) mà ta vừa chèn vào
bảng xong.

Kết thúc mục chèn thêm dữ liệu vào database.




                                     Page 9 of 14
Căn bản SQL cho người lập trình C#                         Author : Xcross87   2007


Thay đổi dữ liệu (UPDATING DATA)

Bây giờ một việc quan trọng là thay đổi dữ liệu. ta dùng câu lệnh „UPDATE‟. Khi làm
việc với câu lệnh „UPDATE‟ nên rất cẩn thận vì sự thay đổi sẽ có tác dụng ảnh
hưởng tất cả các hàng trong mệnh đề WHERE; bạn nên chú ý điều này.

Cấu trúc câu lệnh UPDATE

[code]

UPDATE <table_name>

SET

         <col-1> = <val-1>,

         <col-2> = <val-2>,

         …,

         <col-N> = <val-N>

WHERE <predicate>

[/code]

Vừa nãy khi chèn thêm dữ liệu ta thêm vào một hàng, hàng đó có „ShipperID = 4‟

với CompanyName = „CongDongCViet.COM‟; bây giờ ta đổi cái CompanyName
thành „Pete – Vo Danh Tieu Tot‟ nhé ^~^!

[code]

UPDATE shippers

SET

         CompanyName = „Pete – Vo Danh Tieu Tot‟

WHERE

         ShipperID = 4

[code]

Thấy reporting “ (1 row(s) affected) “. Refresh table thấy sự thay đổi ngay.

Đơn giản nhưng rất cẩn thận với câu lệnh này nhé.

Kết thúc mục thay đổi dữ liệu trong database.

                                     Page 10 of 14
Căn bản SQL cho người lập trình C#                           Author : Xcross87   2007


Xóa dữ liệu (DELETING DATA)

Để xóa dữ liệu ta dùng câu lệnh „DELETE‟, giống như „UPDATE‟ bạn cần cẩn thận với
query này luôn nếu không data sẽ bị xóa không tưởng đó. ^^

Cấu trúc câu lệnh „DELETE‟

[code]

DELETE FROM <table_name>

WHERE <predicate>

[/code]

Áp dụng luôn, thử xóa luôn cái hàng mà ta vừa chèn thêm và sau đó thay đổi
Companyname trong table „Shippers‟ nhé.

[code]

DELETE FROM Shippers

WHERE ShipperID = 4

[/code]

Report “ (1 row(s) affected) “. Refresh table lại -> mất tiêu rồi.

NHƯNG : nếu mà bạn thử xóa 3 cái ShipperID còn lại trong table Shipper dùng
query trên thì sẽ gặp ERROR (lỗi). Tất nhiên là lỗi vì ở đây mỗi shipper handle nhiều
đơn đặt hàng (orders) và mỗi order chỉ tồn tại khi nó được gán với một shipper. Cái
này gọi là „Foreign-Key Relationship‟ của Orders và Shippers. Vì vậy cơ sở dữ liệu sẽ
chống lại sự xóa Shippers.

Nhiều lúc bạn muốn xóa từng hàng trong bảng dữ liệu thì TRUNCATE là sự lựa chọn
tốt hơn là DELETE. Vì khi xóa mỗi hàng DELETE thường log lại thông tin xóa trong
khi TRUNCATE thì không log lại gì. MSDN để tham khảo thêm nhé ^_@!.




                                      Page 11 of 14
Căn bản SQL cho người lập trình C#                         Author : Xcross87   2007


Kiểu dữ liệu T-SQL

T-SQL cung cấp một cơ sở kiểu dữ liệu rất tốt – có chính xác 27 kiểu. Trong đó có
cả UDT (User-defined data type : kiểu dữ liệu người dùng định nghĩa).

Dữ liệu kiểu số (Numeric Data Types)

Có 8 kiểu số trong T-SQL và tương ứng với C#.

    Kiểu dữ liệu SQL              Kiểu tương ứng trong            Giải thích
                                           C#
Bigint                          Long                     64-bit integer
Bit                             Bool                     0,1 hoặc NULL
Decimal (numeric)               Decimal                  128-bit signed integer
Float                           Double                   64-bit floating-point num
Int                             Int                      32-bit signed integer
Real                            Float                    32-bit floating-point num
Smallint                        Short                    16-bit signed integer
Tinyint                         Byte                     8-bit unsigned integer


Dữ liệu kiểu tiền tệ (Money Data Types)

    Kiểu dữ liệu SQL            Kiểu tương ứng trong                Giải thích
                                         C#
Money                          Decimal                   Giá trị trong khoảng :
                                                         -922,337,203,685,477.5808
                                                         đến
                                                         922,337,203,685,477.5807

Smallmoney                     Decimal                   Giá trị trong khoảng :
                                                         -214,748.3648
                                                         Đến
                                                         214,748.3647


Kiểu dữ liệu chuỗi kí tự (Character String Data Types)

Kiểu dữ liệu SQL                Kiểu tương ứng trong     Giải thích
                                C#
Char                            String                   1->8k bytes
Nchar                           String                   1->4k bytes
Text                            String                   1->231-1 characters
Ntext                           String                   1->230-1 bytes
Varchar                         String                   1->231-1 bytes
Nvarchar                        String                   1->231-1 bytes


                                         Page 12 of 14
Căn bản SQL cho người lập trình C#                           Author : Xcross87   2007


Kiểu dữ liệu ngày giờ ( Date and Time Data Types )

Kiểu dữ liệu SQL                Kiểu tương ứng trong        Giải thích
                                C#
Datetime                        SqlDateTime                 Từ Jan-01-1753 đến Dec-
                                                            31-9999, chính xác 1/300
                                                            giây.Tương đương kiểu
                                                            timestamp của chuẩn SQL
Smalldatetime                   SqlDateTime                 Từ Jan-01-1900 đến Jun-
                                                            06-2079, chính xác đến
                                                            phút.


Kiểu dữ liệu nhị phân ( Binary Data Types )

                                 Kiểu tương ứng trong
    Kiểu dữ liệu SQL                                                Giải thích
                                          C#
Binary                          Byte[]                      Fixed_1->8k bytes
Image                           Byte[]                      Var_0->231-1 bytes
Varbinary                       Byte[]                      Var_0->231-1 bytes


Kiểu dữ liệu khác (Other Data Types)

    Kiểu dữ liệu SQL                 Kiểu tương ứng trong           Giải thích
                                              C#
Cursor                                                      Sử dụng trong SQL Server
Sql_variant                     Object                      Chứa int, binary, char
Table                                                       Sử dụng trong SQL Server
Timestamp                       Byte[]                      8-byte int db unique
Uniqueidentifier                System.Guid                 128-bit unique int
Xml                             String                      Chứa XML đến 2GB


Độ ưu tiên các kiểu dữ liệu (Data Type Precedence)

Sắp xếp theo thứ tự ưu tiên cao đến thấp

    Kiểu dữ liệu SQL
UDT
Sql_variant
Xml
Datetime
Smalldatetime
Float
Real
Decimal (numeric)

                                          Page 13 of 14
Căn bản SQL cho người lập trình C#                         Author : Xcross87   2007


Money
Smallmoney
Bigint
Int
Smallint
Tinyint
Bit
Ntext
Text
Image
Timestamp
Uniqueidentifier
Nvarchar
Nchar
Varchar
Varbinary
binary


Kết thúc loạt bài viết về SQL cơ bản cho lập trình cơ sở dữ liệu C#.




                                     Page 14 of 14

More Related Content

More from Dao Uit

7.databinding
7.databinding7.databinding
7.databindingDao Uit
 
6.adapterset
6.adapterset6.adapterset
6.adaptersetDao Uit
 
5.cach su dung data reader
5.cach su dung data reader5.cach su dung data reader
5.cach su dung data readerDao Uit
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieuDao Uit
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#Dao Uit
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#Dao Uit
 

More from Dao Uit (6)

7.databinding
7.databinding7.databinding
7.databinding
 
6.adapterset
6.adapterset6.adapterset
6.adapterset
 
5.cach su dung data reader
5.cach su dung data reader5.cach su dung data reader
5.cach su dung data reader
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#
 

1.gioi thieu co ban sql cho nguoi lap trinh c#

  • 1. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Căn bản SQL cho người lập trình C# Bài này mình giới thiệu cho các bạn các thành phần cơ bản của SQL mà bạn cần biết để có thể viết một chương trình làm việc với cơ sở dữ liệu bằng C#. Query Câu lệnh INSERT Câu lệnh UPDATE Câu lệnh DELETE Kiểu dữ liệu T-SQL SQL là cái gì ? Nếu như bạn đã từng làm việc với hệ quản trị cơ sở dữ liệu, tất nhiên sẽ biết sử dụng SQL. SQL là ngôn ngữ database chuẩn quốc tế. Bạn có thể dùng SQL để tạo thêm dữ liệu, lấy thông tin, thay đổi hay xóa dữ liệu (và nhiều thứ khác). Tóm lại, SQL tiếng Anh là “Structured Query Language”, ngôn ngữ có cấu trúc.Được phát triển từ những năm 70, được IBM sáng tạo ra và gọi với tên là : SEQUEL “Structured English Query Language”, sau này được thay đổi đi một chút gọi là SQL nhưng có khác với SEQUEL, cần tránh nhầm lẫn. SEQUEL hiện được sử dụng trong hệ thống của IBM. Về cách phát âm, trong thế giới của Microsoft và Oracle gọi là “sequel” ( xi-quờ ). Còn trong khu vực làm việc với DB2 và MySQL thì hay gọi là “ess cue ell” ( ét-kiu-eo ). Các bạn thích gọi thế nào cũng được, tùy :D..Tớ thì hay gọi nó là “ess cue ell”. Bắt đầu về SQL cấu trúc và query. Yêu cầu cần thiết để thực hiện các thao tác trong bài viết này : 1. Microsoft Visual C# 2005 Express Edition 2. Microsoft SQL Server 2005 Express Edition 3. Cài đặt thêm : MS SQL Server Management Studio 2005 Express 4. Database : Northwind Các bạn có thể download free trong trang Downloads của Microsoft. Sau đó cài đặt tất cả và bắt đầu vào thao tác trong database. Page 1 of 14
  • 2. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Lấy dữ liệu (RETRIEVING DATA) Một query của SQL dùng để lấy thông tin từ database. Dữ liệu được chứa trong các hàng (rows) của bảng (tables). Hàng (Rows) gồm một nhóm các cột (Columns) chứa dữ liệu tương ứng. Biểu thức query lấy dữ liệu có cấu trúc : Một danh sách SELECT (lựa chọn), tại vị trí các cột được gọi để lấy dữ liệu chỉ định. Một mệnh đề WHERE, xác định bảng (tables) cần truy cập để lấy dữ liệu. Bây giờ những từ nào tiếng Anh cần thiết thì tớ viết tiếng Anh nhé để khi lập trình đỡ bị loạn giữa Anh và Việt. Khi viết các query SQL thì viết hoa, đơn giản là để xác định nó là từ khóa của SQL; SQL không phân biệt chữ hoa chữ thường cho nên nếu viết thường không ảnh hưởng gì cả; chẳng qua viết hoa tránh nhầm lẫn. Cái này theo chuẩn lập trình ANSI để phân biệt thôi. Viết một query đơn giản [code] SELECT * FROM Employees; [/code] Dấu * nghĩa là lấy dữ liệu của tất cả các cột nằm trong bảng. Khi thực thì (! Execute) query này trong “Northwind” thì sẽ thu được tất cả các hàng và cột nằm trong „Employees‟ Table. Chú ý: khi bạn làm việc với cơ sở dữ liệu của SQL Server 2k5 thì dùng GUI dễ xác định các thành phần và đặc điểm của cấu trúc khi làm việc với cơ sở dữ liệu. Query có thể hiểu là làm việc theo kiểu code. Thực tế để code với cơ sở dữ liệu một cách chuẩn thì câu lệnh sẽ rất phức tạp và tốn nhiều dòng (có khi lên đến hàng trăm dòng code. Nếu bạn chưa biết thực thi (! Execute) query như thế nào thì làm như sau : 1. Mở Mircrosoft SQL Server Management Studio 2005 Express ra. 2. Chọn db „Northwind‟. Page 2 of 14
  • 3. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 3. Chọn nút „New Query‟ trên Toolbar (thanh công cụ). 4. Viết query vào. 5. Phải chuột và chọn „! Execute‟. 6. Sẽ thấy kết quả tại tab „Results‟ ngay bên dưới phần mà bạn vừa code query xong. Giải thích câu query Câu query vừa thực hiện là : [code] SELECT * FROM Employees; [/code] Nghĩa là : lấy dữ liệu của tất cả các cột các hàng của bảng „Employees‟. Hoặc là : lấy tất cả dữ liệu có trong bảng „Employees‟. Giả sử muốn lấy dữ liệu của một số columns thôi vì có nhiều cột không cần thiết, lấy vào chỉ tốn tài nguyên khi thực thi thì query như sau : [code] SELECT <column 1>, <column 2>, …. <column n> FROM Employees; [/code] Trong đó <column X> là tên column bạn cần lấy dữ liệu. Chẳng hạn tớ chỉ muốn lấy tên của nhân viên trong bảng „Employees‟ thôi thì query như sau : [code] SELECT Lastname FROM Employees; Page 3 of 14
  • 4. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 [/code] Hoặc lấy số ID của nhân viên và họ tên của nhân viên : [code] SELECT employeeid, firstname, lastname FROM Employees; [/code] Giảm bớt số lượng dữ liệu không cần thiết sẽ rất tiết kiệm tài nguyên khi bạn làm việc với một cơ sở dữ liệu lớn, đồ sộ. Mệnh đề WHERE Yếu tố thêm trong query này là WHERE để xác định hàng có tính chất nào đó. Cấu trúc câu lệnh : [code] WHERE <column1> <operator> <column2> [/code] Trong đó : <column1> <column2> là tên 2 cột với toán tử so sánh „operator‟. Thử dùng WHERE trong câu query vừa viết xong nhé : [code] SELECT employeeid, firstname, lastname FROM Employees WHERE Page 4 of 14
  • 5. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 country = „USA‟; [/code] Rồi, ấn F5 để thực thi query hoặc phải chuột->! Execute ^_^! Chú ý: nếu là string thì phải để trong dấu „ như ở trên. Toán tử so sánh của mệnh đề WHERE Toán tử Giải thích Ví dụ = Bằng EmployeeID = 1 < Nhỏ hơn EmployeeID < 1 > Lớn hơn EmployeeID > 1 <= Nhỏ hơn hoặc bằng EmployeeID <= 1 >= Lớn hơn hoặc bằng EmployeeID >= 1 <>, != Khác EmployeeID <> 1 !< Không nhỏ hơn EmployeeID !< 1 !> Không lớn hơn EmployeeID !> 1 Chú ý: trong chuẩn SQL không có toán tử „!=‟; chỉ áp dụng với kiểu dữ liệu T-SQL. Toán tử LIKE Toán tử này đưa ra kết quả theo kiểu pattern cho trước (cái này liên quan Regular Expression). Ví dụ [code] WHERE Title LIKE „Sale%‟ [/code] Sẽ lấy ra tất cả các hàng nào có cột có tiêu đề bắt đầu với cụm từ Sale , có thể là „Sale‟ , „Sale0‟,‟Saleman‟…… Có 4 trường hợp để xác định pattern : % : bất cứ kí tự hoặc một nhóm nào đều hợp lệ kể cả rỗng (empty). _ : một kí tự bất kì . Ví dụ : LIKE „_ales‟ có thể là : Sales,Bales,Cales…nhưng chỉ 1 kí tự. [ ] : Một vài kí tự xác định cho phép là hợp lệ. Ví dụ: LIKE „[bs]ales‟ thì chỉ có 2 kết quả là : bales và sales. [^] : kí tự không phải nhóm kí tự xác định. Ví dụ : [^a-h] thì không lấy kí tự nào từ a đến h. Cái này giống hệt Regular Expression nha. :D Đôi lúc bạn sẽ thấy những cột chẳng có giá trị gì được gắn cho nó cả, ta gọi là NULL (column is NULL). Vì vậy có toán tử giúp ta xác định các giá trị này : Page 5 of 14
  • 6. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Toán tử IS NULL và IS NOT NULL IS NULL : Cho phép lấy ra hàng có cột chẳng có giá trị gì. Ví dụ : WHERE Region IS NULL IS NOT NULL : Cho phép lấy ra hàng có cột có giá trị. Ví dụ : WHERE Region IS NOT NULL Một query đúng : [code] SELECT * FROM Employees WHERE Region IS NULL; [/code] Một query sai : [code] SELECT * FROM Employees WHERE Region = NULL; [/code] Tại sao sai ? Sai vì chẳng có cái gì „= NULL‟ cả :D. Sai toán tử. Toán tử BETWEEN và IN Nhiều lúc muốn lấy kết quả trong một khu vực mình muốn thu hẹp lại (range), ước chừng khoảng thế nào đó. Ta dùng BETWEEN và IN BETWEEN : trả về true nếu giá trị nằm trong một khoảng. Ví dụ : WHERE extension BETWEEN 400 AND 500 Lấy hàng có cột „extension‟ có giá trị trong khoảng 400 và 500 IN : trả về true nếu giá trị nằm trong một danh sách (list). Danh sách có thể là một query con (sub-query) Ví dụ : WHERE city IN („Seattle‟, „London‟) Lấy hàng có cột „city‟ mang giá trị là „Seattle‟ và „London‟. Toán tử Logic : AND – NOT – OR AND : ví dụ : WHERE ( title LIKE „Sale%‟ AND lastname = „Peacock‟ ) NOT : ví dụ : WHERE NOT ( title LIKE „Sale%‟ AND lastname = „Peacock‟) OR : ví dụ : WHERE ( title = „Anh Tuấn‟ OR title = „Pete‟ ) Cái này dễ hiểu khỏi giải thích. ^^! Sắp xếp dữ liệu Page 6 of 14
  • 7. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Khi lọc ra được các dữ liệu muốn tìm nhưng mà nó không theo trật tự nào cả. Bạn muốn kết quả thu được tự sắp xếp theo một hướng nào đó để bạn dễ hiểu dễ nhìn. Dùng mệnh đề ORDER BY Cấu trúc : [code] ORDER BY <column_name> [ASC | DESC] {, n} ASC : Ascending DESC : Descending Nếu bạn không có ASC hay DESC thì mặc định (default) là ASC Query chung mẫu : [code] SELECT <column_list> FROM <table> WHERE <predicate> ORDER BY <column_name> ASC | DESC Bây giờ sử dụng những cái đã biết ở trên vào làm vài query phức tạp chơi nhé ^&^! Viết Query phức tạp Bây giờ tớ muốn : Lấy các đơn đặt hàng (orders) được nhận bởi nhân viên có id là 5 (employeeid = 5 ) Đơn đặt hàng chuyển tới Pháp (France) hoặc Brazil. Chỉ lấy thông tin : OrderID, EmployeeID, CustomerID, OrderDate và ShipCountry. Sắp xếp theo nước nhận hàng và ngày đặt hàng Hooooohohohoo…Nghe phức tạp chưa..Đọc mù mắt, đếch ra cái gì :D Mở New Query và dùng code sau : [code] SELECT Orderid, Page 7 of 14
  • 8. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Employeeid, Customerid, Orderdate, Shipcountry, FROM Orders WHERE Employeeid = 5 AND Shipcountry IN ( „Brazil‟ , „France‟) ORDER BY Shipcountry ASC, Orderdate ASC [/code] Bạn sẽ thu được 10 hàng có kết quả tương ứng nha. Kết thúc mục lấy dữ liệu từ database. Page 8 of 14
  • 9. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Chèn thêm dữ liệu (INSERTING DATA) Bạn đã biết cách lấy dữ liệu từ db bây giờ phải biết thêm chèn thêm dữ liệu vào db nữa chứ. Để thêm dữ liệu vào dùng câu lệnh „INSERT‟. Rất đơn giản không phức tạp lắm vì khi thêm dữ liệu đâu cần phải lọc,sắp xếp phân loại nên không xài WHERE và ORDER BY khi thêm dữ liệu. Cấu trúc câu lệnh INSERT : [code] INSERT INTO <table_name> ( <colum-1>, <column-2>,… , <column-N>) VALUES ( <value-1>,<value-2>, …, <value-N) [/code] Bây giờ thử nha. Mở thằng „Northwind‟ rấu đó chọn bảng ‘Shippers’. Cột đầu tiên là ‘ShippersID’ là khóa của bảng này. Tiếp theo là „CompanyName‟ và „Phone‟ Ta thử thêm một người ship hàng : [code] INSERT INTO shippers ( CompanyName, Phone ) VALUES ( „CongDongCViet.COM‟, „000-123456‟); [/code] Sau đó run query này, có một Message trong reporting “ (1 row(s) affected “. Sau đó xem lại table ‘Shipper’ thì có thêm một hàng mới (new row) mà ta vừa chèn vào bảng xong. Kết thúc mục chèn thêm dữ liệu vào database. Page 9 of 14
  • 10. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Thay đổi dữ liệu (UPDATING DATA) Bây giờ một việc quan trọng là thay đổi dữ liệu. ta dùng câu lệnh „UPDATE‟. Khi làm việc với câu lệnh „UPDATE‟ nên rất cẩn thận vì sự thay đổi sẽ có tác dụng ảnh hưởng tất cả các hàng trong mệnh đề WHERE; bạn nên chú ý điều này. Cấu trúc câu lệnh UPDATE [code] UPDATE <table_name> SET <col-1> = <val-1>, <col-2> = <val-2>, …, <col-N> = <val-N> WHERE <predicate> [/code] Vừa nãy khi chèn thêm dữ liệu ta thêm vào một hàng, hàng đó có „ShipperID = 4‟ với CompanyName = „CongDongCViet.COM‟; bây giờ ta đổi cái CompanyName thành „Pete – Vo Danh Tieu Tot‟ nhé ^~^! [code] UPDATE shippers SET CompanyName = „Pete – Vo Danh Tieu Tot‟ WHERE ShipperID = 4 [code] Thấy reporting “ (1 row(s) affected) “. Refresh table thấy sự thay đổi ngay. Đơn giản nhưng rất cẩn thận với câu lệnh này nhé. Kết thúc mục thay đổi dữ liệu trong database. Page 10 of 14
  • 11. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Xóa dữ liệu (DELETING DATA) Để xóa dữ liệu ta dùng câu lệnh „DELETE‟, giống như „UPDATE‟ bạn cần cẩn thận với query này luôn nếu không data sẽ bị xóa không tưởng đó. ^^ Cấu trúc câu lệnh „DELETE‟ [code] DELETE FROM <table_name> WHERE <predicate> [/code] Áp dụng luôn, thử xóa luôn cái hàng mà ta vừa chèn thêm và sau đó thay đổi Companyname trong table „Shippers‟ nhé. [code] DELETE FROM Shippers WHERE ShipperID = 4 [/code] Report “ (1 row(s) affected) “. Refresh table lại -> mất tiêu rồi. NHƯNG : nếu mà bạn thử xóa 3 cái ShipperID còn lại trong table Shipper dùng query trên thì sẽ gặp ERROR (lỗi). Tất nhiên là lỗi vì ở đây mỗi shipper handle nhiều đơn đặt hàng (orders) và mỗi order chỉ tồn tại khi nó được gán với một shipper. Cái này gọi là „Foreign-Key Relationship‟ của Orders và Shippers. Vì vậy cơ sở dữ liệu sẽ chống lại sự xóa Shippers. Nhiều lúc bạn muốn xóa từng hàng trong bảng dữ liệu thì TRUNCATE là sự lựa chọn tốt hơn là DELETE. Vì khi xóa mỗi hàng DELETE thường log lại thông tin xóa trong khi TRUNCATE thì không log lại gì. MSDN để tham khảo thêm nhé ^_@!. Page 11 of 14
  • 12. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Kiểu dữ liệu T-SQL T-SQL cung cấp một cơ sở kiểu dữ liệu rất tốt – có chính xác 27 kiểu. Trong đó có cả UDT (User-defined data type : kiểu dữ liệu người dùng định nghĩa). Dữ liệu kiểu số (Numeric Data Types) Có 8 kiểu số trong T-SQL và tương ứng với C#. Kiểu dữ liệu SQL Kiểu tương ứng trong Giải thích C# Bigint Long 64-bit integer Bit Bool 0,1 hoặc NULL Decimal (numeric) Decimal 128-bit signed integer Float Double 64-bit floating-point num Int Int 32-bit signed integer Real Float 32-bit floating-point num Smallint Short 16-bit signed integer Tinyint Byte 8-bit unsigned integer Dữ liệu kiểu tiền tệ (Money Data Types) Kiểu dữ liệu SQL Kiểu tương ứng trong Giải thích C# Money Decimal Giá trị trong khoảng : -922,337,203,685,477.5808 đến 922,337,203,685,477.5807 Smallmoney Decimal Giá trị trong khoảng : -214,748.3648 Đến 214,748.3647 Kiểu dữ liệu chuỗi kí tự (Character String Data Types) Kiểu dữ liệu SQL Kiểu tương ứng trong Giải thích C# Char String 1->8k bytes Nchar String 1->4k bytes Text String 1->231-1 characters Ntext String 1->230-1 bytes Varchar String 1->231-1 bytes Nvarchar String 1->231-1 bytes Page 12 of 14
  • 13. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Kiểu dữ liệu ngày giờ ( Date and Time Data Types ) Kiểu dữ liệu SQL Kiểu tương ứng trong Giải thích C# Datetime SqlDateTime Từ Jan-01-1753 đến Dec- 31-9999, chính xác 1/300 giây.Tương đương kiểu timestamp của chuẩn SQL Smalldatetime SqlDateTime Từ Jan-01-1900 đến Jun- 06-2079, chính xác đến phút. Kiểu dữ liệu nhị phân ( Binary Data Types ) Kiểu tương ứng trong Kiểu dữ liệu SQL Giải thích C# Binary Byte[] Fixed_1->8k bytes Image Byte[] Var_0->231-1 bytes Varbinary Byte[] Var_0->231-1 bytes Kiểu dữ liệu khác (Other Data Types) Kiểu dữ liệu SQL Kiểu tương ứng trong Giải thích C# Cursor Sử dụng trong SQL Server Sql_variant Object Chứa int, binary, char Table Sử dụng trong SQL Server Timestamp Byte[] 8-byte int db unique Uniqueidentifier System.Guid 128-bit unique int Xml String Chứa XML đến 2GB Độ ưu tiên các kiểu dữ liệu (Data Type Precedence) Sắp xếp theo thứ tự ưu tiên cao đến thấp Kiểu dữ liệu SQL UDT Sql_variant Xml Datetime Smalldatetime Float Real Decimal (numeric) Page 13 of 14
  • 14. Căn bản SQL cho người lập trình C# Author : Xcross87 2007 Money Smallmoney Bigint Int Smallint Tinyint Bit Ntext Text Image Timestamp Uniqueidentifier Nvarchar Nchar Varchar Varbinary binary Kết thúc loạt bài viết về SQL cơ bản cho lập trình cơ sở dữ liệu C#. Page 14 of 14