Học SQL Sever Căn Bản Cho Người Mới Học
Posted by
vkdt
at
Friday, April 17, 2015
- 1- Giới thiệu
- 2- Cơ sở dữ liệu học SQL (LearningSQL)
- 3- Bắt đầu nhanh
- 4- Các câu lệnh truy vấn (Query)
- 
 
- 4.1- SQL Select
- 4.2- SQL Distinct
- 4.3- SQL Where
- 4.4- SQL And Or (Và, hoặc)
- 4.5- SQL IN (Trong phạm vi..)
- 4.6- SQL Between (Nằm giữa ...)
- 4.7- SQL Wildcard
- 4.8- SQL Like (Giống với ...)
- 4.9- SQL Order By (Sắp xếp bởi)
- 4.10- SQL Group By (Nhóm bởi ...)
- 4.11- SQL Having
 
- 5- Các câu lệnh trèn dữ liệu (Insert)
- 6- Câu lệnh cập nhập (Update)
- 7- Câu lệnh xóa dữ liệu (Delete)
- 8- SQL Functions
- 9- SQL Join
- 10- Câu truy vấn con (Subquery)
- 11- Lập trình SQL Server Transact-SQL
- 
TÀI LIỆU ĐANG ĐƯỢC CẬP NHẬP 85%
- 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:- 
 SQLServer
 - 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 SQL riêng của SQLServer.
 
- 
 
- 2- 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:
 
- 3- Bắt đầu nhanh ▴
- 
- 3.1- Công cụ làm việc với SQLServer ▴
- 
Ở đây tôi sử dụng SQLServer Management Studio 2008, 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:
- 
 
- 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 (Kiểu dịch vụ của ngân hàng).
 
- 
- 
Đây là câu lệnh truy vấn dữ liệu trên bảng PRODUCT_TYPE
- 
1234567891011121314151617-- Truy vấn dữ liệu trên bảng Product_Type-- Truy vấn toàn bộ các cột.Select*FromProduct_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).SelectPty.*FromProduct_Type Pty;-- Truy vấn một vài cột-- Có thể liệt kê ra.SelectPty.Product_Type_Cd,Pty.NameFromProduct_Type Pty;
- 
Kết quả truy vấn:
- 
- 
Truy vấn dữ liệu trên bảng EMPLOYEE:
- 
12345678-- 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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_IdFromEmployee Emp;
- 
Kết quả truy vấn:
- 
- 
Đặt Alias cho cột:
- 
1234567891011121314151617-- 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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_Id,'EMP'+Convert(Varchar,Emp.Emp_Id)AsEmp_No2-- Cột mớiFromEmployee Emp;-- Có thể không cần sử dụng 'as' trong định nghĩa Alias cho cột.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_Id,'EMP'+Convert(varchar,Emp.Emp_Id ) Emp_No2-- Cột mớiFromEmployee 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à:
- 
1Selectdistinct<column1>, <column2> ....
- 
Xem ví dụ:
- 
12345678910111213-- 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.SelectPro.Product_Cd,Pro.Name,Pro.Product_Type_CdFromProduct 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.SelectPro.Product_Type_CdfromProduct Pro;-- Cần sử dụng Distinct để loại bỏ việc trùng lặp.SelectDistinctPro.Product_Type_CdfromProduct 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'.
 
- 
1234-- 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*FromProduct ProWherePro.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).
- 
123456789101112131415161718-- Câu lệnh tìm kiếm các Nhân viên có tên bắt đầu bởi chữ S.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_IdFromEmployee EmpWhereEmp.First_NameLike'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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_IdFromEmployee EmpWhereEmp.First_NameLike'S%'AndEmp.Dept_Id = 1;
- 
Kết quả chạy các câu truy vấn:
- 
- 
Ví dụ với câu lệnh Or.
- 
12345678910-- 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)SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_IdFromEmployee EmpWhere(Emp.First_NameLike'S%'OrEmp.First_NameLike'P%')AndEmp.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.
- 
12345678910-- 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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_IdFromEmployee EmpWhereEmp.First_NameIn('Susan','Paula','Helen');
- 
Kết quả chạy câu lệnh:
- 
- 4.6- SQL Between (Nằm giữa ...) ▴
- 
12345678910111213141516-- Tìm các nhân viên có Emp_Id trong khoảng từ 5 đến 10.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Start_DateFromEmployee EmpWhere(Emp.Emp_IdBetween5And10);-- Câu lệnh trên tương đương với:SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Start_DateFromEmployee EmpWhereEmp.Emp_Id >= 5AndEmp.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 từ- 03-05-2002 ==> 09-08-2002 (Theo dd-MM-yyyy)
 
- 
123456789101112131415161718192021-- 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)SelectEmp.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_VnFromEmployee EmpWhere-- 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_DateBetweenConvert(Datetime,'03-05-2002',105)AndConvert(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:- Ký tự %
- Ký tự _
 - % mô tả 0, 1 hoặc nhiều ký tự
- _ mô tả chính xác một ký tự.
 
- 
12345678910-- 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ự).SelectCus.Cust_Id,Cus.Fed_Id,Cus.AddressFromCustomer Cuswherecus.fed_idlike'%-__-%';
- 
Kết quả chạy ví dụ:
- 
- 4.8- SQL Like (Giống với ...) ▴
- 
Câu lệnh này chúng ta đã làm quen trên một số 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ề.
- 
12345678910-- Cú phápSELECT"column_name"FROM"table_name"[WHERE"condition"]ORDERBY"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ụ:
- 
123456789101112131415161718192021222324252627-- 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)SelectPro.Product_Cd,Pro.Product_Type_Cd,Pro.NameFromProduct ProOrderByPro.Product_Type_CdAsc,Pro.NameAsc;-- Trong Order BY, ASC là mặc định.-- Vì vậy có thể ko cần viết ASC.SelectPro.Product_Cd,Pro.Product_Type_Cd,Pro.NameFromProduct ProOrderByPro.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)SelectPro.Product_Cd,Pro.Product_Type_Cd,Pro.NameFromProduct ProOrderByPro.Product_Type_CdDesc,Pro.NameAsc;
- 
Kết quả chạy ví dụ:
- 
- 
Order By bao giờ cũng đứng sau where.
- 
123456789-- 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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Start_DateFromEmployee EmpWhereEmp.First_NameLike'S%'OrderByEmp.Start_DateDesc;
- 
Kết quả chạy câu lệnh:
- 
- 
Cú pháp SQLServer: (Không phải là tiêu chuẩn của SQL, do vậy có thể không được hỗ trợ bởi Database khác)
- 
12345678910-- Đây là cú pháp của SQLServer(Có thể không được hỗ trợ bởi Database khác).-- 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.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Start_DateFromEmployee EmpOrderBy2Desc;
- 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
 
- 
1234567-- Truy vấn dữ liệu trong bảng Account.SelectAcc.Account_Id,Acc.Product_Cd,Acc.Avail_Balance,Acc.Pending_BalanceFromAccount 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.
- 
123456SelectAcc.Product_Cd,Count(Acc.Product_Cd)AsCount_Acc-- Số tài khoản,Sum(Acc.Avail_Balance)AsSum_Avail_Balance-- Tổng số tiền trong tài khoản,Avg(Acc.Avail_Balance)AsAvg_Avail_Balance-- Số tiền trung bìnhFromAccount AccGroupByAcc.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 ▴
- 
Having là một câu lệnh điều kiện của 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.
- 
1234567SelectAcc.Product_Cd,Count(Acc.Product_Cd)AsCount_Acc-- Số tài khoản,Sum(Acc.Avail_Balance)AsSum_Avail_Balance-- Tổng số tiền trong tài khoản,Avg(Acc.Avail_Balance)AsAvg_Avail_Balance-- Số tiền trung bìnhFromAccount AccGroupByAcc.Product_CdHavingCount(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.
- 
- 
12345678910SelectAcc.Product_Cd,Count(Acc.Product_Cd)AsCount_Acc,Sum(Acc.Avail_Balance)AsSum_Avail_Balance,Avg(Acc.Avail_Balance)AsAvg_Avail_BalanceFromAccount Acc-- Sử dụng Where lọc bớt dữ liệu trước khi group.WhereAcc.Open_Branch_Id = 1GroupByAcc.Product_Cd-- Sử dụng Having lọc bớt dữ liệu sau khi đã groupHavingCount(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:
- 
1234-- Cú pháp câu lệnh Insert Into:INSERTINTO"table_name"("column1","column2", ...)VALUES("value1","value2", ...);
- 
Ví dụ bạn trèn thêm một giao dịch khách hàng vào bảng ACC_TRANSACTION:
- 
1234567891011121314151617181920212223-- 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.InsertIntoAcc_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.
- 
12345-- Ngữ pháp câu lệnh INSERT INTO .. SELECTINSERTINTO"table1"("column1","column2", ...)SELECT"column3","column4", ...FROM"table2";
- 
Ví dụ:
- 
1234567891011121314151617-- 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.InsertIntoAcc_Transaction( Txn_Date,Account_Id,Txn_Type_Cd,Amount,Funds_Avail_Date)SelectAcc.Open_Date-- Txn_Date,Acc.Account_Id-- Account_Id,'CDT'-- Txn_Type_Cd,200-- Amount,Acc.Open_Date-- Funds_Avail_DateFromAccount AccWhereAcc.Product_Cd ='CD';
 
- 6- Câu lệnh cập nhập (Update) ▴
- 
12345-- 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%.Theo logic, mỗi khách hàng có thể có một hoặc nhiều tài khoản, mỗi tài khoản ứng với 1 sản phẩm dịch vụ của ngân hàng. 
 
- 
- 
Câu lệnh Update:
- 
12345-- Update, tăng số tiền trong tài khoản lên 2% cho khách hàng CUST_ID = 1.UpdateAccountSetAvail_Balance = Avail_Balance + 2 * Avail_Balance / 100,Pending_Balance = Pending_Balance + 2 * Pending_Balance / 100WhereCust_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.
- 
1234-- Cú pháp xóa các dòng dữ liệu trong bảng.DELETEFROM"table_name"WHERE"condition";
- 
- 
12345-- Xóa 2 dòng dữ liệu trong bảng Acc_Transaction:DeleteFromAcc_TransactionWhereTxn_IdIn(25,26);
- 8- SQL Functions ▴
- 
- 8.1- SQL Count ▴
- 
Count là một hàm, đếm số dòng trong câu Query. Thông thường nó thường được sử dụng cùng với Group by.
- 
123-- Đếm số row (dòng) có trong bảng AccountSelectCount(Acc.Account_Id)AsCount_AccFromAccount Acc;
- 
- 
Đếm số tài khoản ngân hàng, có giao dịch với ngân hàng (Bảng Acc_Transaction)
- 
123-- Đếm số tài khoản có giao dịch với ngân hàng.SelectCount(distincttxn.Account_id)asDistinct_AccFromAcc_Transaction txn;
- 
- 
Sử dụng với Group by:
- 
Một khách hàng có thể mở nhiều tài khoản, mỗi tài khoản ứng với một sản phẩm dịch vụ của ngân hàng.
- 
- 
Bạn muốn liệt kê các khách hàng (CUST_ID) và tương ứng là số tài khoản họ đã mở.
- 
123456-- Đếm số tài khoản đã mở ứng với mỗi khách hàng.SelectAcc.Cust_Id,Count(Acc.Account_Id)AsCount_AccFromAccount AccGroupByAcc.Cust_Id;
- 
- 8.2- SQL Sum ▴
- 
Sum là hàm dùng để tính tổng giá trị một cột trong câu SQL.
- 
12345-- Cú pháp:SELECTSUM("column_name")FROM"table_name";
- 
Ví dụ:
- 
123456789101112-- Tính tổng số tiền trong các tài khoản của khách hàng với Cust_ID = 1SelectSum(Acc.Avail_Balance)AsSum_Avail_BalanceFromAccount AccWhereAcc.Cust_Id = 1;-- Sử dụng với Group by.-- Tính tổng số tiền trong tài khoản ứng với mỗi khách hàngSelectAcc.Cust_Id,Sum(Acc.Avail_Balance)AsSum_Avail_BalanceFromAccount AccGroupByAcc.Cust_Id;
- 
- 8.3- SQL AVG ▴
- 
AVG là hàm tính trung bình trên cột.
- 
1234-- Cú pháp:SELECTAVG("column_name")FROM"table_name";
- 
1Ví dụ:
- 
123456789101112131415-- Tính số tiền trung bình ứng với loại hình gửi tiết kiêm.SelectAvg(Acc.Avail_Balance)AsAvg_Avail_BalanceFromAccount AccWhereAcc.Product_Cd ='SAV';-- Sử dụng với Group by.-- Một khách hàng có thể có 1 hoặc nhiều tài khoản.-- Tính số tiền trung bình mỗi tài khoản ứng với từng khách hàng-- (tại ngân hàng Branch_ID = 1)SelectAcc.Cust_Id,Avg(Acc.Avail_Balance)AsAvg_Avail_BalanceFromAccount AccWhereAcc.Open_Branch_Id = 1GroupByAcc.Cust_Id;
- 
- 8.4- SQL MIN ▴
- 
Min là hàm tìm giá trị nhỏ nhất trên cột.
- 
1234-- Cú pháp:SELECTMIN("column_name")FROM"table_name";
- 
Ví dụ:
- 
1234567891011121314-- Tìm số tiền gửi tiết kiệm nhỏ nhất.SelectMin(Acc.Avail_Balance)AsMin_Avail_BalanceFromAccount AccWhereAcc.Product_Cd ='SAV';-- Sử dụng với Group by.-- Một khách hàng có thể có 1 hoặc nhiều tài khoản.-- Mở tại các chi nhánh khác nhau.-- Tìm số tiền trong tài khoản nhỏ nhất ứng với từng chi nhánhSelectAcc.Open_Branch_Id,Min(Acc.Avail_Balance)AsMin_Avail_BalanceFromAccount AccGroupByAcc.Open_Branch_Id;
- 
- 8.5- SQL MAX ▴
- 
Min là hàm tìm giá trị lớn nhất trên cột. Cách sử dụng giống MIN, bạn có thể tham khảo các ví dụ tại MIN.
- 
1234-- Cú pháp:SELECTMAX("column_name")FROM"table_name";
 
- 9- SQL Join ▴
- 
Đặt ra một tình huống bạn xem thông tin một nhân viên trong bảng EMPLOYEE. Bạn có thể thấy nhân viên biết ID phòng ban của nhân viên này. Nhưng đó là một con số vô nghĩa. Muốn biết tên phòng ban, bạn phải tra cứu sang bảng DEPARTMENT. Việc nối 2 bảng đó với nhau để có một thông tin đầy đủ được gọi là JOIN.
- 
- 
Có 4 hình thức Join:- INNER JOIN (JOIN)
- LEFT OUTER JOIN (LEFT JOIN)
- RIGHT OUTER JOIN (RIGHT JOIN)
- FULL OUTER JOIN (OUTER JOIN)
- CROSS JOIN
 
- 
- 9.1- INNER JOIN (Hoặc JOIN) ▴
- 
INNER JOIN từ khóa chọn tất cả các dòng từ hai bảng miễn là có sự ăn khớp dữ liệu giữa các cột trong cả hai bảng.
- 
- 
Cú pháp:
- 
123456789101112131415-- Cú phápSELECTcolumn_name(s)FROMtable1INNERJOINtable2ONtable1.column_name=table2.column_name;-- Có thể thay INNER JOIN bởi JOIN-- Ý nghĩa và kết quả là như nhau.SELECTcolumn_name(s)FROMtable1JOINtable2ONtable1.column_name=table2.column_name;
- 
- 
Ví dụ:
- 
1234567891011-- INNER JOIN 2 bảng EMPLOYEE và DEPARTMENT.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_Id,Dep.NameDept_NameFromEmployee EmpInnerJoinDepartment DepOnEmp.Dept_Id = Dep.Dept_IdOrderByEmp.Emp_Id;
- 
Cú pháp riêng của SQLServer:
- 
12345678910111213-- Cú pháp này cũng được hỗ trợ bởi Oracle & MySQL-- Việc INNER JOIN theo cách viết khác của SQLServer thực sự đơn giản.-- SQLServer đẩy điều kiện JOIN hai bảng xuống WHERE.SelectEmp.Emp_Id,Emp.First_Name,Emp.Last_Name,Emp.Dept_Id,Dep.NameDept_NameFromEmployee Emp,Department DepWhereEmp.Dept_Id = Dep.Dept_IdOrderByEmp.Emp_Id;
- 9.2- LEFT OUTER JOIN (Hoặc LEFT JOIN) ▴
- 
LEFT OUTER JOIN là từ khóa trả về tất cả các hàng (rows) từ bảng bên trái (table1), với các hàng tương ứng trong bảng bên phải (table2). Chấp nhận cả dữ liệu NULL ở bảng 2.
- 
- 
Hãy xem hình minh họa dưới đây:
- 
- 
Ví dụ:
- 
123456789101112-- Customer LEFT OUTER JOIN Officer-- Có thể thay thế LEFT OUTER JOIN bởi LEFT JOIN (Ý nghĩa và kết quả là giống nhau)SelectCus.Cust_Id,Cus.Fed_Id,Cus.State,Ofc.Cust_IdAsOfc_Cust_Id,Ofc.Officer_Id,Ofc.Start_Date,Ofc.TitleFromCustomer Cus-- Table1LeftOuterJoinOfficer Ofc-- Table2OnCus.Cust_Id = Ofc.Cust_Id;
- 
Kết quả:
- 
- 9.3- RIGHT OUTER JOIN (Hoặc RIGHT JOIN) ▴
- 
RIGHT OUTER JOIN ngược lại với LEFT OUTER JOIN:
- 
- 9.4- FULL OUTER JOIN (Hoặc OUTER JOIN) ▴
- 
FULL OUTER JOIN là sự kết hợp của LEFT OUTER JOIN và RIGHT OUTER JOIN
- 
- 
12345678-- Cú pháp: (FULL OUTER JOIN)-- Có thể viết FULL JOINSELECTcolumnsFROMtable1FULL[OUTER]JOINtable2ONtable1.column= table2.column;
 
- 10- Câu truy vấn con (Subquery) ▴
- 
Trong SQLServer, một subquery là một truy vấn trong một truy vấn. Bạn có thể tạo các truy vấn con trong câu lệnh SQL của bạn. Những truy vấn con có thể nằm trong mệnh đề WHERE, mệnh đề FROM, hoặc mệnh đề SELECT.
- 
- 10.1- Subquery trong mệnh đề Where ▴
- 
Khá thường xuyên, các subquery sẽ được tìm thấy trong mệnh đề WHERE. Những truy vấn con còn được gọi là truy vấn con lồng nhau.
- 
1234567SelectAcc.Account_Id,Acc.Open_Date,Acc.Product_Cd,Acc.Avail_BalanceFromAccount AccWhereAcc.Cust_IdIn(SelectCus.Cust_IdFromCustomer CusWhereCus.Cust_Type_Cd ='B')
- 10.2- Subquery trong mệnh đề From ▴
- 
Một truy vấn phụ cũng có thể được tìm thấy trong mệnh đề FROM. Chúng được gọi là inline views.
- 
123456789101112SelectCus.Cust_Id,Cus.Address,Cus.Fed_Id,Acc2.Sum_Avail_BalanceFromCustomer Cus,-- Câu Subquery định nghĩa 1 bảng ảo (inline view)(SelectAcc.Cust_Id,Sum(Acc.Avail_Balance)AsSum_Avail_BalanceFromAccount AccGroupByAcc.Cust_Id) Acc2WhereCus.Cust_Id = Acc2.Cust_Id;
- 10.3- Subquery trong mệnh đề Select ▴
- 
Một truy vấn phụ cũng có thể được tìm thấy trong mệnh đề SELECT.
- 
12345678SelectCus.Cust_Id,Cus.Address,Cus.Fed_Id,(SelectSum(Acc.Avail_Balance)FromAccount AccWhereAcc.Cust_Id = Cus.Cust_Id)AsSum_Avail_BalanceFromCustomer Cus;
- 
Bí quyết để đặt một truy vấn phụ trong mệnh đề select là subquery phải trả lại một giá trị duy nhất. Đây là lý do tại sao một các hàm tổng hợp như hàm SUM, COUNT, MIN, hoặc MAX thường được sử dụng trong subquery.
 
 
 
 
 
 
 
 
 
 
 
0 comments:
Post a Comment