CSDL - Bài 5: Thực hành truy vấn dữ liệu trên SQL Server


1) Trên cơ sở dữ liệu (database)

Các phiên bản của SQL Server: Enterprise, Personal, Desktop, Developer,..

Các bộ phận của SQL Server: Enterprise Manager, Query Analyzer, Books Online,..

Các loại tập tin của SQL Server: data file (primary, secondary), log file

Các loại cơ sở dữ liệu của SQL Server: system database, user database

create database: tạo cơ sở dữ liệu

create database HoSoSinhViencreate database HoSoSinhVien
on (name=’HSSV_data’, filename=’c:HSSV_data.mdf’)
log on (name=’HSSV_log’, filename=’c:HSSV_log.ldf’)

drop database: xóa cơ sở dữ liệu

drop database HoSoSinhVien

alter database: sửa các thông tin của cơ sở dữ liệu

alter database HoSoSinhVienmodify name = HSSV

exec sp_dboption: sửa các thông tin của cơ sở dữ liệu

exec sp_dboption HoSoSinhVien, ‘read only’, ‘true’exec sp_dboption HoSoSinhVien, ‘autoshrink’, ‘true’
exec sp_dboption HoSoSinhVien, ‘single_user’

dbcc: điều khiển cơ sở dữ liệu

dbcc shrinkdatabase(HoSoSinhVien, 10)

2) Trên bảng (table)

Nhớ các kiểu số liệu: text, binary, numberic, money, datetime, bit, variant

Nhớ các các ràng buộc: default, check, unique, foreign, primary

Nhớ các kiểu toàn vẹn: entity, domain, referential, user

Nhớ các thuộc tính bổ trợ: identity, null

create table: tạo bảng

  • Tạo bảng với các cột
create table SinhVien (MaSV int,TenSV nchar(50))
  • Tạo với các ràng buộc
create table SinhVien (MaSV int primary key,TenSV nvarchar(50) not null,QueQuan int references DiaPhuong(MaDP))

drop table: xóa bảng

drop table SinhVien

alter table..add: thêm cột

Thêm cột bằng cách dùng lệnh alter table

alter table SinhVienadd QueQuan int

alter table..drop column: xóa cột

alter table SinhVien drop column QueQuan

alter table..alter column: thêm thuộc tính not null

alter table SinhVienalter column TenSV nchar(50) not null

alter table..add primary key: thêm khóa chính

Thêm ràng buộc khóa chính cần phải biến một cột null thành not null trước khi thêm. Nếu để lệnh chuyển đổi thuộc tính not null ngay cạnh lệnh thêm khóa chính thì phải chèn từ khóa go vào vì có thể lệnh trên chưa được thực hiện do đó lệnh dưới báo lỗi

alter table SinhVienalter column MaSV int not null

go

alter table SinhVien

add primary key (MaSV)

Xem tiếp...

alter table..add foreign key: thêm ràng buộc khóa ngoài

alter table SinhVien add foreign key (QueQuan) references DiaPhuong(MaDP)

alter table..add default: thêm ràng buộc mặc định

alter table SinhVien add default 'khong ten' for TenSV

exec sp_help: xem thông tin bảng

exec sp_help SinhVien

3) Trên bản ghi (record)

Nhớ thêm phần biểu thức điều kiện

Nhớ thêm phần ký tự thay thế

insert..values: thêm các bản ghi vào bảng

insert into SinhVien (MaSV, TenSV, QueQuan)values (1, N’Nguyễn Văn A’, 1)

insert..select: thêm các bản ghi từ bảng khác vào bảng

insert into DocGiaselect MaSV, TenSV, QueQuan from SinhVien

insert into DocGia

select MaGV, TenGV, QueQuan from GiaoVien

select..into: đưa kết quả lựa chọn vào bảng mới

select MaSV, TenSV, Dieminto SinhVienKha

from SinhVien

where Diem > 7.0

delete: xóa các bản ghi từ bảng

delete from SinhViendelete from SinhVien where MaSV=1234

truncate: xóa toàn bộ bản ghi của bảng

truncate table SinhVien

update: sửa các bản ghi trong bảng

update SinhVienset NhomTruong = 1

where MaSV < 4

update SinhVien

set NhomTruong = 4

where (MaSV > 3 and MaSV < 8)

Xem tiếp...

4) Truy vấn (query)

Hỗ trợ truy vấn: distinct, top, as, identity

Phép toán tập hợp: in, like, between

Các hàm tổng nhóm: sum, max, min, avg

4.1) Truy vấn đơn giản

select *: Hiện tất cả bảng

select *from SinhVien

select: Hiện một số cột

select TenSV, DiemTBfrom SinhVien

select..where: Hiện một số dòng / bản ghi

select TenSV, DiemTBfrom SinhVien

where DiemTB > 6.0

select..order by: Hiện và sắp xếp theo điểm rồi theo tên

select TenSV, DiemTBfrom SinhVien

order by DiemTB desc, TenSV asc // asc sắp sếp tăng dần, desc là giảm dần

select..distinct: Hiện danh sách giá trị không trùng lặp

select distinct QueQuanfrom SinhVien

select..top: Hiện các dòng đầu tiên trong bảng

select top 3 TenSV, DiemTBfrom SinhVien
order by DiemTB desc, TenSV asc

4.2) Truy vấn lồng nhau (nested query)

select..where (select)

Hiện tất cả những người trong bảng nhân viên có lương bằng lương lớn nhất của những người có trong công ty:

select TenNV, Luongfrom NhanVien
where Luong = (select max(Luong) from NhanVien)

select..where (in)

Hiện tất cả những người trong bảng nhân viên có lương lớn nhất hoặc lớn nhì của những người có trong công ty:

select TenNV, Luongfrom NhanVien
where Luong in (select top 2 Luong from NhanVien order by Luong)

Câu lệnh select trong sẽ tạo ra một tập hai giá trị (top 2) đó là lương lớn nhất và lương lớn nhì. Và câu lệnh select thứ nhất sẽ chọn ra những người mà lương nằm trong tập lớn nhất và lớn nhì

select..where (in sub)

Hiện ra tất cả những người có lương lớn nhất phòng của anh ta (không phải lớn nhất trong công ty mà lớn nhất trong phòng hoặc đơn vị mà anh ta thuộc về)

select nv1.TenNV, nv1.Luongfrom NhanVien as nv1
where nv1.Luong = (select max(Luong) from NhanVien where Phong=nv1.Phong)

Câu lệnh select trong sẽ trả về giá trị lương lớn nhất nhưng không phải lớn nhất trong toàn công ty mà lớn nhất trong phòng của nv1. Sau đó câu lệnh select ngoài cùng sẽ xác định xem nv1 có được chọn không bằng cách kiểm tra lương anh ta với lương lớn nhất của phòng anh ta.

4.3) Truy vấn tổng nhóm (subtotal query / grouping query)

select..group by: Thống kê theo tiêu chí

Hiện ra số lượng các nhân viên ứng với từng quê

select QueQuan, count(*)from NhanVien
group by QueQuan

Đếm số nam và số nữ trong công ty

select GioiTinh, count(*)from NhanVien
group by GioiTinh

Tính tổng thu nhập theo từng phòng

select Phong, sum(Luong)from NhanVien
group by Phong

select..having: Hiện ra một số nhóm phù hợp

Chỉ đếm số lượng người ở Hải Phòng và số lượng người ở Hà nội

select QueQuan, count(*)from NhanVien
group by QueQuan
having (QueQuan = ‘HP’, QueQuan = ‘HN’)

Chỉ hiện ra những phòng nào có tổng thu nhập lớn hơn 500000

select Phong, sum(Luong)from NhanVien
group by Phong
having sum(Luong) > 5000000

Chỉ hiện ra những tỉnh nào có số lượng người lớn hơn 10

select QueQuan, count(*)from NhanVien
group by QueQuan
having count(*) > 10

4.4) Truy vấn liên bảng (cross table query / joining query)

select..inner join: ghép các cặp bản ghi thỏa mãn điều kiện

Ghép bảng nhân viên và hiện ra tên nhân viên và tên địa phương

select NhanVien.TenNV, DiaPhuong.TenDP
from NhanVien 
inner join DiaPhuong on NhanVien.QueQuan = DiaPhuong.MaDP

select..left outer join: lấy tất cả phía trái và ghép (nếu có) với phải

Lấy tất cả những nhân viên kể cả những nhân viên có quê quán không hợp lệ (nghĩa là mã quê quán không có trong bảng địa phương)

select NhanVien.TenNV, DiaPhuong.TenDP
from NhanVien 
left outer join DiaPhuong on NhanVien.QueQuan = DiaPhuong.MaDP

select..right outer join: lấy tất cả phía phải và ghép (nếu có) với phía trái

Lấy tất cả những địa phương ghép với nhân viên, các địa phương không hợp lệ sẽ được ghép với bộ dữ liệu rỗng. Không hiện ra các nhân viên không có mã quê quán phù hợp

select NhanVien.TenNV, DiaPhuong.TenDP
from NhanVien 
right outer join DiaPhuong on NhanVien.QueQuan = DiaPhuong.MaDP

select..full outer join: lấy từ hai phía và ghép nếu có

Lấy tất cả những nhân viên (nếu không có quê quán phù hợp thì ghép với bộ dữ liệu rỗng) và tất cả những địa phương kể cả không có nhân viên.

select NhanVien.TenNV, DiaPhuong.TenDP
from NhanVien 
right outer join DiaPhuong on NhanVien.QueQuan = DiaPhuong.MaDP

select..cross join: trả về tất cả các cặp có thể ghép

Ghép từng nhân viên với tất cả các địa phương. Như vậy nếu có m nhân viên và có n địa phương thì bảng đích sẽ có m*n dòng. n dòng đầu cho nhân viên thứ nhất ghép với các địa phương. n dòng sau cho nhân viên thứ hai ghép với các địa phương. và tiếp tục như thế tới nhân viên thứ m.

select NhanVien.TenNV, DiaPhuong.TenDP
from NhanVien 
cross join DiaPhuong

Video phần 1