Saturday, July 20, 2019

P1. Hướng dẫn học SQL cho người mới bắt đầu với SQL Server




1- Giới thiệu

Tài liệu này hướng dẫn cho những người mới bắt đầu làm quen với SQL. Tài liệu hướng dẫn dựa trên:
  • SQL Server (2008 - 2014)

Nội dung bao gồm
  • Ngôn ngữ SQL
  • Ngữ pháp SQL (Ngữ pháp cơ bản, tiêu chuẩn cho mọi loại DB)
  • Ngữ pháp 2- Công cụ làm việc với SQL Server
Ở đây tôi sử dụng SQLServer Management Studio, một công cụ sẵn có sau khi bạn cài đặt SQLServer. Bạn có thể xem qua hướng dẫn cài đặt SQLServer tại:

3- Cơ sở dữ liệu học SQL (LearningSQL)

Tài liệu này sử dụng cơ sở dữ liệu LearningSQL (phiên bản SQLServer). Bạn cần tạo cơ sở dữ liệu đó để tiện cho việc học (Bạn chỉ mất không quá 5 phút để làm việc này).

Script tạo cơ sở dữ liệu và cấu trúc của cơ sở dữ liệu này bạn có thể xem tại:

4- Các câu lệnh truy vấn (Query)

4.1- SQL Select

Câu lệnh Select là một câu lệnh cơ bản nhất trong SQL, mục đích là truy vấn dữ liệu trong các bảng (Table).
  • PRODUCT_TYPE: Bảng dữ liệu các kiểu sản phẩm (Service type of bank).
Đây là câu lệnh truy vấn dữ liệu trên bảng PRODUCT_TYPE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Truy vấn dữ liệu trên bảng Product_Type
-- Truy vấn toàn bộ các cột.
Select * From Product_Type;
-- Câu lệnh truy vấn trên và câu lệnh dưới đây là tương đương nhau.
-- Pty là alias (tên bí danh đặt cho bảng Product_Type).
Select Pty.* From Product_Type Pty;
-- Truy vấn một vài cột
-- Có thể liệt kê ra.
Select Pty.Product_Type_Cd
     ,Pty.Name
From   Product_Type Pty;
Kết quả truy vấn:
Truy vấn dữ liệu trên bảng EMPLOYEE:
1
2
3
4
5
6
7
8
-- Truy vấn 4 cột trên bảng Employee (Bảng nhân viên).
-- Sử dụng Emp là Alias (Tên bí danh) cho bảng Employee.
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Dept_Id
From   Employee Emp;
Kết quả truy vấn:

Đặt Alias cho cột:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- Hàm Convert(Varchar, <intvalue>) chuyển một số thành chữ (Varchar) (Hàm của SQLServer)
-- Sử dụng toán tử + để nối hai chuỗi (Có thể không được hỗ trợ bởi DB khác)
-- Chúng ta có một cột mới sử dụng 'as' để định nghĩa tên cột cho cột mới này.
Select Emp.Emp_Id
    ,Emp.First_Name
    ,Emp.Last_Name
    ,Emp.Dept_Id
    ,'EMP' Convert(Varchar,Emp.Emp_Id) As Emp_No2  -- Cột mới
From   Employee Emp;
-- Có thể không cần sử dụng 'as' trong định nghĩa Alias cho cột.
Select Emp.Emp_Id
    ,Emp.First_Name
    ,Emp.Last_Name
    ,Emp.Dept_Id
    ,'EMP' + Convert(varchar,Emp.Emp_Id ) Emp_No2  -- Cột mới
From   Employee Emp;
Kết quả truy vấn:

4.2- SQL Distinct

Câu lệnh distinct được sử dụng cùng với Select, dùng để select các dữ liệu, bỏ qua các dữ liệu trùng nhau. Cú pháp là:
1
Select distinct <column1>, <column2>  ....

Xem ví dụ:
1
2
3
4
5
6
7
8
9
10
11
12
13
-- Truy vấn sản phẩm (Sản phẩm dịch vụ của Ngân hàng)
-- Cột mã sản phẩm, tên và kiểu sản phẩm.
Select Pro.Product_Cd
    ,Pro.Name
    ,Pro.Product_Type_Cd
From   Product Pro;
-- Truy vấn các kiểu sản phẩm  (Product_Type_Cd) trong bảng Product.
-- Dữ liệu là nhiều, nhưng trùng nhau.
Select Pro.Product_Type_Cd from Product Pro;
-- Cần sử dụng Distinct để loại bỏ việc trùng lặp.
Select Distinct Pro.Product_Type_Cd from Product Pro;
Kết quả chạy các câu lệnh trên:

4.3- SQL Where

Where là câu lệnh nhằm giới hạn phạm vi tìm kiếm. Chẳng hạn bạn muốn tìm kiếm những sản phẩm dịch vụ có kiểu "Cho vay cá nhân và kinh doanh".
  • Product_Type_Cd = 'LOAN'.
Bạn cần truy vấn trong bảng PRODUCT, tại các vị trí có Product_Type_Cd= 'LOAN'.
1
2
3
4
-- Truy vấn bảng Product tìm các sản phẩm dịch vụ có kiểu:
-- "Cho vay cá nhân và kinh doanh".
-- Ứng với cột Product_Type_Cd = 'LOAN'.
Select * From Product Pro Where Pro.Product_Type_Cd = 'LOAN';
Kết quả truy vấn:
Một ví dụ khác sử dụng where và nhiều điều kiện kèm theo.

4.4- SQL And Or (Và, hoặc)

And và Or là 2 lệnh điều kiện sử dụng trong where:
Chẳng hạn bạn muốn tìm danh sách các nhân viên có tên bắt đầu bởi chữ 'S' và thuộc phòng điều hành (Operations).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- Câu lệnh tìm kiếm các Nhân viên có tên bắt đầu bởi chữ S.
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Dept_Id
From   Employee Emp
Where  Emp.First_Name Like 'S%';
-- Câu lệnh tìm kiếm các nhân viên có tên bắt đầu bởi chữ S
-- và thuộc phòng điều hành (Operations)  Dept_Id  = 1.
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Dept_Id
From   Employee Emp
Where  Emp.First_Name Like 'S%'
And    Emp.Dept_Id = 1;
Kết quả chạy các câu truy vấn:
Ví dụ:
1
2
3
4
5
6
7
8
9
-- Tìm kiếm các nhân viên có tên bắt đầu bởi chữ S hoặc P.
-- và trong phòng điều hành (Operations). (Dept_Id = 1)
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Dept_Id
From   Employee Emp
Where  (Emp.First_Name Like 'S%' Or Emp.First_Name Like 'P%')
And    Emp.Dept_Id = 1;
Kết quả chạy câu lệnh:

4.5- SQL IN (Trong phạm vi..)

Câu lệnh in trong where sử dụng trong tình huống tìm kiếm giá trị thuộc một tập hợp nhất định.
1
2
3
4
5
6
7
8
9
10
-- Câu lệnh này tìm kiếm các nhân viên có tên
-- hoặc Susan hoặc Paula hoặc Helen.
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Dept_Id
From   Employee Emp
Where  Emp.First_Name In ('Susan'
                        ,'Paula'
                        ,'Helen');
Kết quả chạy câu lệnh:

4.6- SQL Between (Nằm giữa ...)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Tìm các nhân viên có Emp_Id trong khoảng từ 5 đến 10.
Select Emp.Emp_Id
    ,Emp.First_Name
    ,Emp.Last_Name
    ,Emp.Start_Date
From   Employee Emp
Where  (Emp.Emp_Id Between 5 And 10);
-- Câu lệnh trên tương đương với:
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Start_Date
From   Employee Emp
Where  Emp.Emp_Id >= 5
And    Emp.Emp_Id <= 10;
Kết quả câu lệnh:
Câu lệnh BETWEEN cũng được sử dụng trong việc giới hạn thời gian. Chẳng hạn bạn tìm kiếm các nhân viên bắt đầu làm trong khoảng thời gian:
  • 03-05-2002 ==> 09-08-2002  (dd-MM-yyyy)
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    -- Câu lệnh này tìm kiếm các nhân viên bắt đầu vào làm việc trong 1 khoảng thời gian
    -- xác định trong mệnh đề where.
    -- 03-05-2002 ==> 09-08-2002  (Theo dd-MM-yyyy)
    Select Emp.Emp_Id
         ,Emp.First_Name
         ,Emp.Last_Name
         ,Emp.Start_Date
         , -- Hàm Convert(Varchar, <Date>, 105) chuyển Date thành Varchar dạng DD-MM-YYYY
          -- Đây là hàm của SQLServer. không dùng cho DB khác.
          Convert(Varchar, Emp.Start_Date
                 ,105) Start_Date_Vn
    From   Employee Emp
    Where
    -- Hàm Convert(Datetime, <Varchar>, 105) chuyển text dạng DD-MM-YYYY sang Datetime
    -- (Đây là hàm của SQLServer, có thể ko có trên các DB khác)
    ( --
     Emp.Start_Date Between Convert(Datetime, '03-05-2002'
                                   ,105) And
     Convert(Datetime,'09-08-2002'
            ,105) --
    );
    Kết quả chạy câu lệnh:

    4.7- SQL Wildcard

    Có 2 ký tự đặc biệt trong SQL:
    1. Ký tự %
    2. Ký tự _
    Ý nghĩa:
    • % mô tả 0, 1 hoặc nhiều ký tự bất kỳ.
    • _ mô tả chính xác một ký tự.
    Hai ký tự này thường được sử dụng trong điều kiện LIKE.
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- Tìm kiếm các Khách hàng (Customer) có số FED_ID theo định dạng:
    -- Phần trước bất kỳ, rồi tới dấu - , rồi tới 2 ký tự, rồi tới dấu -, và cuối bất kỳ.
    -- Sử dụng 2 dấu _ để minh họa rằng đó là 2 ký tự.
    -- (Mỗi dấu _ là chính xác một ký tự).
    Select Cus.Cust_Id
         ,Cus.Fed_Id
         ,Cus.Address
    From   Customer Cus
    where cus.fed_id like '%-__-%';
    Kết quả chạy ví dụ:

    4.8- SQL Like (Giống với ...)

    Câu lệnh này bạn đã quen thuộc qua các ví dụ ở trên.

    4.9- SQL Order By (Sắp xếp bởi)

    Việc query dữ liệu cho một tập kết quả, mà có thể nó sắp xếp không như ý muốn, sử dụng Order by để sắp xếp kết quả trả về.
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- Cú pháp
    SELECT "column_name"
    FROM "table_name"
    [WHERE "condition"]
    ORDER BY "column_name1" [ASC, DESC], "column_name2" [ASC, DESC];
    -- Ghi chú:
    -- ASC: nghĩa là sắp xếp tăng dần (Mặc định)
    -- DESC: Nghĩa là sắp xếp giảm dần.
    Ví dụ:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    -- Sắp xếp ưu tiên Product_Type_Cd tăng dần
    -- Sau đó mới tới Name (Cũng tăng dần)
    Select Pro.Product_Cd
         ,Pro.Product_Type_Cd
         ,Pro.Name
    From   Product Pro
    Order  By Pro.Product_Type_Cd Asc
            ,Pro.Name            Asc;
            
            
    -- Trong Order BY, ASC là mặc định.
    -- Vì vậy có thể ko cần viết ASC.
    Select Pro.Product_Cd
         ,Pro.Product_Type_Cd
         ,Pro.Name
    From   Product Pro
    Order  By Pro.Product_Type_Cd
            ,Pro.Name;
    -- Sắp xếp ưu tiên Product_Type_Cd giảm dần
    -- Sau đó mới tới Name (Tăng dần)
    Select Pro.Product_Cd
         ,Pro.Product_Type_Cd
         ,Pro.Name
    From   Product Pro
    Order  By Pro.Product_Type_Cd Desc
            ,Pro.Name            Asc;
    Kết quả chạy ví dụ:
    Order By bao giờ cũng đứng sau where.
1
2
3
4
5
6
7
8
9
-- Tìm các nhân viên có tên bắt đầu bởi S.
-- Sắp xếp giảm dần theo ngày bắt đầu vào làm việc.
Select Emp.Emp_Id
     ,Emp.First_Name
     ,Emp.Last_Name
     ,Emp.Start_Date
From   Employee Emp
Where  Emp.First_Name Like 'S%'
Order  By Emp.Start_Date Desc;
Kết quả chạy câu lệnh:
Hoặc:
1
2
3
4
5
6
7
8
9
-- Sử dụng thứ tự của cột vào trong câu Order by.
-- First_Name là cột thứ 2 trong câu Select
-- Có thể sử dụng: Order by 2 thay cho Order by First_Name.
Select Emp.Emp_Id
    ,Emp.First_Name
    ,Emp.Last_Name
    ,Emp.Start_Date
From   Employee Emp
Order  By 2 Desc;

4.10- SQL Group By (Nhóm bởi ...)

Trước hết chúng ta cần hiểu các hàm tổng hợp ( Aggregate Functions) là gì:
  • Sum: Hàm tính tổng
  • Avg: Hàm lấy trung bình
  • Count: Hàm tính số lần
  • Min: Hàm tìm giá trị nhỏ nhất
  • Max: Hàm tìm giá trị lớn nhất
Đó là một số hàm tổng hợp ( Aggregate) thông dụng. Chúng có thể tham gia vào câu lệnh nhóm ( Group by).
1
2
3
4
5
6
7
-- Truy vấn dữ liệu trong bảng Account.
Select Acc.Account_Id
     ,Acc.Product_Cd
     ,Acc.Avail_Balance
     ,Acc.Pending_Balance
From   Account Acc;
Câu hỏi đặt ra bạn muốn xem tổng số tiền có trong tài khoản, ứng với mỗi loại dịch vụ ( Product_Cd) khác nhau. Điều đó có nghĩa là bạn cần nhóm trên các Product_Cd.
1
2
3
4
5
6
Select Acc.Product_Cd
     ,Count(Acc.Product_Cd) As Count_Acc -- Số tài khoản
     ,Sum(Acc.Avail_Balance) As Sum_Avail_Balance -- Tổng số tiền trong tài khoản
     ,Avg(Acc.Avail_Balance) As Avg_Avail_Balance -- Số tiền trung bình
From   Account Acc
Group  By Acc.Product_Cd;
Kết quả:
Như vậy bạn có một cái nhìn đánh giá:
  • Có 4 tài khoản tham gia dịch vụ "Tiền gửi tiết kiệm" (SAV) với tổng số tiền là 1855.76 và trung bình mỗi tài khoản có 463.94.
  • ...

4.11- SQL Having

Mệnh đề HAVING cho phép bạn chỉ định các điều kiện lọc kết quả nhóm nào sẽ xuất hiện trong kết quả cuối cùng.

Mệnh đề WHERE đặt các điều kiện vào các cột đã chọn, trong khi mệnh đề HAVING đưa ra các điều kiện đối với các nhóm được tạo bởi mệnh đề GROUP BY.
Giả sử bạn muốn nhóm các loại hình dịch vụ ( Product_Cd) trên bảng Account, và chỉ hiển thị ra các loại hình nào có số người tham gia > 3.
1
2
3
4
5
6
7
Select Acc.Product_Cd
     ,Count(Acc.Product_Cd) As Count_Acc -- Số tài khoản
     ,Sum(Acc.Avail_Balance) As Sum_Avail_Balance -- Tổng số tiền trong tài khoản
     ,Avg(Acc.Avail_Balance) As Avg_Avail_Balance -- Số tiền trung bình
From   Account Acc
Group  By Acc.Product_Cd
Having Count(Acc.Product_Cd) > 3;
Kết quả chạy ví dụ:

Phân biệt Where & Having

Bạn cần phân biệt Where và Having trong cùng một câu lệnh.
  • Where là câu lệnh lọc bớt dữ liệu trước khi nhóm (Group)
  • Having là câu lệnh lọc bớt dữ liệu sau khi đã nhóm (Group)
Trường hợp bạn muốn có các thông tin tổng hợp của một chi nhánh ngân hàng (Bảng BRANCH). Bạn có thể sử dụng where để lọc bớt dữ liệu trước khi group.

1
2
3
4
5
6
7
8
9
10
Select Acc.Product_Cd
     ,Count(Acc.Product_Cd) As Count_Acc
     ,Sum(Acc.Avail_Balance) As Sum_Avail_Balance
     ,Avg(Acc.Avail_Balance) As Avg_Avail_Balance
From   Account Acc
-- Sử dụng Where lọc bớt dữ liệu trước khi group.
Where  Acc.Open_Branch_Id = 1
Group  By Acc.Product_Cd
-- Sử dụng Having lọc bớt dữ liệu sau khi đã group
Having Count(Acc.Product_Cd) > 1;
Kết quả chạy ví dụ:

5- Các câu lệnh trèn dữ liệu (Insert)

5.1- Câu lệnh Insert Into

Cú pháp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- Trèn 1 dòng dữ liệu vào bảng Acc_Trasaction
-- Cột Txn_ID tự động được sinh ra.
-- (Txn_ID không tham gia vào trong câu Insert)
-- Current_Timestamp là hàm của SQLServer lấy ra giờ hệ thống (System Date)
-- Current_Timestamp : Giờ hiện tại.
Insert Into Acc_Transaction
  (Amount
  ,Funds_Avail_Date
  ,Txn_Date
  ,Txn_Type_Cd
  ,Account_Id
  ,Execution_Branch_Id
  ,Teller_Emp_Id)
Values
  (100 -- Amount
  ,Current_Timestamp -- Funds_Avail_Date
  ,Current_Timestamp -- Txn_Date
  ,'CDT' -- Txn_Type_Cd
  ,2 -- Account_Id
  ,Null -- Execution_Branch_Id
  ,Null -- Teller_Emp_Id
   );

5.2- Câu lệnh Insert Into Select

Bạn có thể sử dụng câu Select để cung cấp dữ liệu trèn vào bảng. Thông qua câu lệnh Insert Into ... Select.
1
2
3
4
5
-- Ngữ pháp câu lệnh INSERT INTO .. SELECT
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2";
Ví dụ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-- Txn_Id tự sinh ra (Không cần phải tham gia vào câu Insert)
-- Trèn nhiều dòng dữ liệu vào bảng Acc_Transaction
-- Lấy dữ liệu từ câu Select.
Insert Into Acc_Transaction
 ( Txn_Date
 ,Account_Id
 ,Txn_Type_Cd
 ,Amount
 ,Funds_Avail_Date)
 Select Acc.Open_Date -- Txn_Date
       ,Acc.Account_Id -- Account_Id
       ,'CDT' -- Txn_Type_Cd
       ,200 -- Amount
       ,Acc.Open_Date -- Funds_Avail_Date
 From   Account Acc
 Where  Acc.Product_Cd = 'CD';

6- Câu lệnh cập nhập (Update)

1
2
3
4
5
-- Cú pháp câu lệnh Update:
UPDATE "table_name"
SET "column_1" = "new value 1", "column_2"= "new value 2"
WHERE "condition";

Ví dụ bạn muốn tăng tiền trong các tài khoản của khách hàng có CUST_ID = 1 lên 2%.
Câu lệnh 
1
2
3
4
5
-- Update, tăng số tiền trong tài khoản lên 2% cho khách hàng CUST_ID = 1.
Update Account
Set    Avail_Balance   = Avail_Balance + 2 * Avail_Balance / 100
     ,Pending_Balance = Pending_Balance + 2 * Pending_Balance / 100
Where  Cust_Id = 1;
Truy vấn lại, sau khi Update.

7- Câu lệnh xóa dữ liệu (Delete)

Cú pháp xóa dữ liệu trong bảng.
1
2
3
4
-- Cú pháp xóa các dòng dữ liệu trong bảng.
DELETE FROM "table_name"
WHERE "condition";

1
2
3
4
5
-- Xóa 2 dòng dữ liệu trong bảng Acc_Transaction:
Delete From Acc_Transaction
Where Txn_Id In (25
                   ,26);



Over 50 Ebooks Excel and VBA free Download

1. Statistics and Probability for Engineering Applications With Microsoft Excel by W.J. DeCoursey - PDF Free Download Download Siz...