Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
0,95 MB
Nội dung
29/09/2015 Giới thiệu SQL (Structured Query Language) ? Là công cụ quản lý liệu sử dụng phổ biến nhiều lĩnh vực Hầu hết ngơn ngữ bậc cao có trình hỗ trợ SQL Là ngôn ngữ chuẩn để truy vấn thao tác CSDL quan hệ Chương 4: Ngôn ngữ SQL Giảng viên: ThS Thái Bảo Trân Thời lượng: 12 tiết Lịch sử phát triển Khởi nguồn SQL SEQUEL - Structured English QUEry Language, năm 1974) Được phát triển IBM (1970s) Được ANSI công nhận phát triển thành chuẩn Khoa HTTT - Đại học CNTT SQL89 SQL92 (SQL2) SQL99 (SQL3) Giới thiệu Nội dung (1) Giới thiệu Các ngôn ngữ giao tiếp Ngôn ngữ định nghĩa liệu Ngôn ngữ thao tác liệu Ngôn ngữ truy vấn liệu có cấu trúc (2) Đặc điểm SQL Là ngôn ngữ tựa Tiếng Anh Là ngôn ngữ phi thủ tục Người sử dụng cần đưa nội dung cần truy vấn Cung cấp tập lệnh phong phú cho công việc hỏi đáp liệu Yêu cầu để sử dụng cho hỏi đáp phải nắm vững cấu trúc CSDL SQL sử dụng thuật ngữ Bảng ~ quan hệ Cột ~ thuộc tính Dịng ~ 29/09/2015 Giới thiệu Ngôn ngữ định nghĩa liệu (1) (3) SQL gồm Định nghĩa liệu Thao tác liệu Định nghĩa khung nhìn Ràng buộc toàn vẹn Phân quyền bảo mật Điều khiển giao tác Là ngôn ngữ mô tả Lược đồ cho quan hệ Miền giá trị tương ứng thuộc tính Ràng buộc tồn vẹn Chỉ mục quan hệ Gồm CREATE TABLE (tạo bảng) DROP TABLE (xóa bảng) ALTER TABLE (sửa bảng) CREATE DOMAIN (tạo miền giá trị) CREATE DATABASE … Ngôn ngữ định nghĩa liệu (2) Các ngôn ngữ giao tiếp Ngôn ngữ định nghĩa liệu (Data Definition Language - DDL): cho phép khai báo cấu trúc bảng, mối quan hệ ràng buộc Ngôn ngữ thao tác liệu (Data Manipulation Language - DML): cho phép thêm, xóa, sửa liệu Ngơn ngữ truy vấn liệu (Structured Query Language – SQL): cho phép truy vấn liệu Ngôn ngữ điều khiển liệu (Data Control Language – DCL): khai báo bảo mật thông tin, cấp quyền thu hồi quyền khai thác sở liệu 3.1 Lệnh tạo bảng (CREATE) 3.1.1 Cú pháp 3.1.2 Một số kiểu liệu 3.1.3 Ràng buộc toàn vẹn 3.2 Lệnh sửa cấu trúc bảng (ALTER) 3.2.1 Thêm thuộc tính 3.2.2 Sửa kiểu liệu thuộc tính 3.2.3 Xóa thuộc tính 3.2.4 Thêm ràng buộc tồn vẹn 3.2.5 Xóa ràng buộc tồn vẹn 3.3 Lệnh xóa bảng (DROP) 3.4 Lệnh tạo miền giá trị 29/09/2015 3.1 Lệnh tạo bảng (1) 3.1.3 Ràng buộc toàn vẹn 3.1.1 Cú pháp CREATE TABLE ( [], [], … [], [] ) NOT NULL NULL UNIQUE DEFAULT PRIMARY KEY FOREIGN KEY / REFERENCES CHECK Đặt tên cho RBTV CONSTRAINT 3.1 Lệnh tạo bảng (2) 3.1 Ví dụ - Lệnh tạo bảng (1) 3.1.2 Một số kiểu liệu Kiểu liệu Ví dụ 1: Cho lược đồ CSDL quản lý bán hàng gồm có quan hệ: SQL Server Chuỗi ký tự varchar(n), char(n),nvarchar(n), nchar(n) Số tinyint,smallint, int, numeric(m,n), decimal(m,n),float, real, smallmoney, money Ngày tháng smalldatetime, datetime Luận lý bit 11 KHACHHANG (MAKH, HOTEN, DCHI, SODT, NGSINH, DOANHSO, NGDK, CMND) NHANVIEN (MANV,HOTEN, NGVL, SODT) SANPHAM (MASP,TENSP, DVT, NUOCSX, GIA) HOADON (SOHD, NGHD, MAKH, MANV, TRIGIA) CTHD (SOHD,MASP,SL) 10 12 29/09/2015 3.1 Ví dụ - Lệnh tạo bảng (2) 3.1 Ví dụ - RBTV (3) CREATE TABLE KHACHHANG ( MAKH char(4), HOTEN varchar(40), DCHI varchar(50), SODT varchar(20), NGSINH smalldatetime, DOANHSO money, NGDK smalldatetime, CMND varchar(10) ) CREATE TABLE NHANVIEN ( manv char(4) primary key, hoten varchar(40), sodt varchar(20), ngvl smalldatetime ) 13 15 3.1 Ví dụ 1- RBTV (1) 3.1 Ví dụ - RBTV (3) CREATE TABLE KHACHHANG ( MAKH char(4) primary key, HOTEN varchar(40), DCHI varchar(50), SODT varchar(20), NGSINH smalldatetime, DOANHSO money, NGDK smalldatetime, CMND varchar(10) ) CREATE TABLE SANPHAM ( masp char(4) primary key, tensp varchar(40), dvt varchar(20), nuocsx varchar(40), gia money ) 14 16 29/09/2015 3.1 Ví dụ - RBTV (1) 3.1 Ví dụ - RBTV (4) Ví dụ 2: Cho lược đồ CSDL “Quản lý đề án công CREATE TABLE HOADON ( sohd int primary key, nghd smalldatetime, makh char(4), manv char(4), trigia money ) ty” sau: NHANVIEN (MaNV, HoNV, TenDem, TenNV, NTNS, Dchi, GT, Luong, Ma_NQL, PHG) PHONGBAN (MaPH, TenPH, TRPH, NG_Nhanchuc) DEAN (MaDA, TenDA, Phong, NamThucHien) PHANCONG (MaNV, MaDA, ThoiGian) 17 3.1 Ví dụ - RBTV (5) 19 3.1 Ví dụ 2- RBTV (2) CREATE TABLE CTHD ( SOHD int foreign key (SOHD) references HOADON(SOHD), MASP char(4) foreign key (MASP) references SANPHAM(MASP), SL int, constraint PK_CTHD primary key (SOHD,MASP) ) CREATE TABLE NHANVIEN ( MANV CHAR(9) PRIMARY KEY, HONV VARCHAR(10) NOT NULL, TENDEM VARCHAR(20) , TENNV VARCHAR(10) NOT NULL, NTNS DATETIME, DCHI VARCHAR(50), GT CHAR(3) CHECK (GT IN (‘Nam’, ‘Nu’)), LUONG INT DEFAULT (2000000), MA_NQL CHAR(9), PHG INT ) 18 20 29/09/2015 3.1 Ví dụ 2- RBTV (3) 3.1 Ví dụ 2- RBTV (5) CREATE TABLE PHONGBAN ( CREATE TABLE PHANCONG ( TENPB VARCHAR(20) UNIQUE, MA_NVIEN CHAR(9), MAPHG INT NOT NULL, SODA INT, TRPHG CHAR(9), THOIGIAN DECIMAL(3,1), NG_NHANCHUC DATETIME DEFAULT (GETDATE()) CONSTRAINT PC_MANVIEN_SODA_PK PRIMARY KEY (MA_NVIEN, SODA), ) CONSTRAINT PC_MANVIEN_FK FOREIGN KEY (MA_NVIEN) CREATE TABLE PHANCONG ( REFERENCES NHANVIEN(MANV), MA_NVIEN CHAR(9) FOREIGN KEY (MA_NVIEN) CONSTRAINT PC_SODA_FK FOREIGN KEY (SODA) REFERENCES NHANVIEN(MANV), REFERENCES DEAN(MADA) SODA INT REFERENCES DEAN(MADA), ) THOIGIAN DECIMAL(3,1) ) 21 3.2 Sửa cấu trúc bảng (1) 3.1 Ví dụ 2- RBTV (4) CREATE TABLE NHANVIEN ( HONV VARCHAR(10) CONSTRAINT NV_HONV_NN NOT NULL, TENDEM VARCHAR(20) NOT NULL, TENNV VARCHAR(10) NOT NULL, MANV CHAR(9) CONSTRAINT NV_MANV_PK PRIMARY KEY, NS 23 Được dùng để Thay đổi cấu trúc bảng Thay đổi RBTV Thêm cột DATETIME, ALTER TABLE ADD [] DCHI VARCHAR(50), GT CHAR(3) CONSTRAINT NV_GT_CHK Xóa cột CHECK (GT IN (‘Nam’, ‘Nu’)), ALTER TABLE DROP COLUMN LUONG INT CONSTRAINT NV_LUONG_DF DEFAULT (2000000), MA_NQL CHAR(9), Mở rộng cột PHG INT ALTER TABLE ALTER COLUMN ) 22 24 29/09/2015 3.2 Ví dụ - Thay đổi cấu trúc bảng 3.2 Sửa cấu trúc bảng (2) Ví dụ 1: Thêm cột Ghi_chu vào bảng khách hàng Thêm RBTV ALTER TABLE KHACHHANG ADD GHI_CHU varchar(20) Ví dụ 2: Sửa Cột Ghi_chu thành kiểu liệu varchar(50) ALTER TABLE ADD CONSTRAINT , ALTER TABLE KHACHHANG ALTER COLUMN GHI_CHU varchar(50) CONSTRAINT , Lưu ý: Không phải sửa kiểu liệu … Ví dụ: Nếu sửa kiểu liệu cột Ghi_chu thành varchar(50), mà trước nhập giá trị cho cột Ghi_chu có độ dài 50 ký tự khơng phép Hoặc sửa từ kiểu chuỗi ký tự sang kiểu số, … Xóa RBTV ALTER TABLE DROP Ví dụ 3: Xóa cột Ghi_chu bảng KHACHHANG ALTER TABLE NHANVIEN DROP COLUMN Ghi_chu 25 3.2 Ví dụ - Thay đổi RBTV (1) 3.2 Sửa cấu trúc bảng (3) Chú ý: Thêm ràng buộc toàn vẹn ALTER TABLE NHANVIEN ADD CONSTRAINT PK_NV PRIMARY KEY (MANV) UNIQUE tên_cột ALTER TABLE ADD CONSTRAINT 27 PRIMARY KEY (tên_cột) FOREIGN KEY (tên_cột) REFERENCES tên_bảng (cột_là_khóa_chính) CHECK (tên_cột điều_kiện) 26 ALTER TABLE CTHD ADD CONSTRAINT FK_CT_SP FOREIGN KEY (MASP) REFERENCES SANPHAM(MASP) ALTER TABLE SANPHAM ADD CONSTRAINT CK_GIA CHECK (GIA >=500) ALTER TABLE KHACHHANG ADD CONSTRAINT UQ_KH UNIQUE (CMND) 28 29/09/2015 3.2 Ví dụ - Thay đổi RBTV (2) 3.3 Lệnh xóa bảng ALTER TABLE CTHD DROP CONSTRAINT FK_CT_SP ALTER TABLE SANPHAM DROP CONSTRAINT ck_gia NHANVIEN HONV Lưu ý: Đối với ràng buộc khóa chính, muốn xóa ràng buộc phải xóa hết ràng buộc khóa ngoại tham chiếu tới TENDEM TENNV MANV NS DCHI GT LUONG MA_NQL PHG PHONGBAN TENPHG MAPHG TRPHG NG_NHANCHUC 29 31 3.3 Lệnh xóa bảng 3.4 Lệnh tạo miền giá trị Được dùng để xóa cấu trúc bảng Tất liệu bảng bị xóa Cú pháp: DROP TABLE tên_bảng Tạo kiểu liệu kế thừa kiểu liệu có sẳn Cú pháp CREATE DOMAIN AS Ví dụ: Xóa bảng KHACHHANG DROP TABLE KHACHHANG Lưu ý: Khi muốn xóa bảng phải xóa tất khóa ngoại tham chiếu tới bảng trước 30 Ví dụ CREATE DOMAIN Kieu_Ten AS VARCHAR(30) 32 29/09/2015 4.1 Lệnh INSERT (2) Ngôn ngữ thao tác liệu Gồm lệnh: 4.1 Lệnh thêm liệu (INSERT) 4.2 Lệnh xóa liệu (DELETE) 4.3 Lệnh sửa liệu (UPDATE) Cú pháp (thêm dòng) INSERT INTO [] VALUES () 33 4.1 Lệnh INSERT (1) Dùng để thêm hay nhiều dòng vào bảng Để thêm liệu 35 4.1 Ví dụ (1) INSERT INTO NHANVIEN(HONV, TENDEM, TENNV, MANV) VALUES (‘Le’, ‘Van’, ‘Tuyen’, ‘635635635’) INSERT INTO NHANVIEN(HONV, TENDEM, TENNV, MANV, DCHI) VALUES (‘Le’, ‘Van’, ‘Tuyen’, ‘635635635’, NULL) Tên quan hệ Danh sách thuộc tính cần thêm liệu Danh sách giá trị tương ứng INSERT INTO NHANVIEN VALUES (‘Le’, ‘Van’, ‘Tuyen’, ‘635635635’, ’12/30/1952’, ’98 HV’, ‘Nam’, ‘37000’, 4) INSERT INTO SANPHAM VALUES ('BC01','But chi', 'cay', 'Singapore', 3000) INSERT INTO SANPHAM(masp,tensp,dvt,nuocsx,gia) VALUES ('BC01','Butchi','cay','Singapore',3000) 34 36 29/09/2015 4.1 Ví dụ (2) 4.1 Nhận xét CREATE TABLE THONGKE_PB ( Thứ tự giá trị phải trùng với thứ tự cột Có thể thêm giá trị NULL thuộc tính khơng khóa NOT NULL Câu lệnh INSERT gặp lỗi vi phạm RBTV TENPHG VARCHAR(20), SL_NV INT, LUONG_TC INT ) INSERT INTO THONGKE_PB(TENPHG, SL_NV, LUONG_TC) SELECT TENPHG, COUNT(MANV), SUM(LUONG) Khóa Tham chiếu NOT NULL - thuộc tính có ràng buộc NOT NULL bắt buộc phải có giá trị FROM NHANVIEN, PHONGBAN WHERE PHG=MAPHG GROUP BY TENPHG 37 4.1 Lệnh INSERT (3) 39 4.2 Lệnh DELETE Cú pháp (thêm nhiều dịng) Dùng để xóa dịng bảng Cú pháp INSERT INTO () DELETE FROM [WHERE ] 38 40 10 29/09/2015 Bài tập - SO SÁNH IN & NOT IN Bài tập - SO SÁNH LIKE Câu hỏi 4: Cho biết nhân viên có người quản lý trực tiếp?Thông tin hiển thị gồm: mã nhân viên, họ tên, mã người quản lý Câu hỏi 8: Liệt kê mã nhân viên, ngày tháng năm sinh, mức lương nhân viên có tên “Nguyễn Tường Linh”? Select MaNV, NTNS, Luong from NhanVien where HoTen = ‘Nguyễn Tường Linh’ Select MaNV, HoTen, Ma_NQL from NhanVien where Ma_NQL is not Null Câu hỏi 9: Tìm nhân viên có họ Nguyễn Câu hỏi 5: Cho biết họ tên nhân viên thuộc phòng ‘NC’ phòng ‘DH’? Select DISTINCT Hoten From NhanVien where MaPH in (‘NC’,’DH’) Cách 2: Sử dụng IN (so sánh với tập hợp giá trị chọn từ câu SELECT khác) Cho biết họ tên nhân viên thuộc phòng ‘NC’ phòng ‘DH’? Select MaNV, HoTen from NhanVien where HoTen like ‘Nguyễn %’ Câu hỏi (tt): Tìm nhân viên có tên Lan Select MaNV, HoTen from NhanVien where HoTen like ‘% Lan’ Câu hỏi (tt): Tìm nhân viên có tên lót “Văn” Select MaNV, HoTen from NhanVien where HoTen like ‘% Văn %’ Câu hỏi 10: Tìm nhân viên tên có tên ‘Nguyễn La_’ (ví dụ Lam, Lan) Select MaNV, HoTen from NhanVien where HoTen like ‘Nguyễn La_’ Select Hoten from NhanVien where PHG in (Select MaPH from PHONGBAN where MaPH=‘NC’ OR MaPH=‘DH’) 81 Bài tập – SO SÁNH IN & NOT IN 83 Phép toán tập hợp SQL (1) Câu hỏi 6: Cho biết mã số, họ tên, ngày tháng năm sinh nhân viên tham gia đề án? Select MaNV, HoTen, NTNS from NhanVien where MaNV in (Select Distinct MaNv From PhanCong) SQL có cài đặt phép toán Câu hỏi 7: Cho biết mã số, họ tên, ngày tháng năm sinh nhân viên không tham gia đề án nào? Gợi ý cho mệnh đề NOT IN: thực câu truy vấn “tìm nhân viên có tham gia đề án (dựa vào bảng PhanCong)”, sau lấy phần bù Select MaNV, HoTen, NTNS from NhanVien where MaNV not in (Select MaNv From PhanCong) Câu hỏi (tt): Cho biết tên phòng ban khơng chủ trì đề án triển khai năm 2005? Gợi ý: thực câu truy vấn “tìm phịng ban chủ trì đề án triển khai năm 2005”, sau lấy phần bù Select TenPH from PhongBan where MaPH not in (Select DISTINCT Phong from DEAN where NamThucHien=2005) 82 Hợp (UNION) Giao (INTERSECT) Trừ (EXCEPT) Kết trả tập hợp Loại bỏ trùng Để giữ lại trùng UNION ALL INTERSECT ALL EXCEPT ALL 84 21 29/09/2015 Phép toán tập hợp SQL (2) Ví dụ 2- Phép tốn tập hợp Cú pháp SELECT FROM WHERE UNION [ALL] SELECT FROM WHERE Tìm nhân viên có người thân tên giới tính SELECT TENNV, PHAI, MANV FROM NHANVIEN INTERSET SELECT TENTN, PHAI, MANV FROM THANNHAN SELECT FROM WHERE INTERSECT [ALL] SELECT FROM WHERE SELECT NV.* FROM NHANVIEN NV, THANNHAN TN WHERE NV.MANV = TN.MA_NVIEN AND NV.TENNV = TN.TENNV AND NV.PHAI = TN.PHAI SELECT FROM WHERE EXCEPT [ALL] SELECT FROM WHERE 85 Ví dụ 1- Phép tốn tập hợp Ví dụ - Phép tốn tập hợp Cho biết mã đề án có 87 Nhân viên với họ ‘Nguyen’ tham gia, Trưởng phòng chủ trì đề án với họ ‘Nguyen’ Tìm nhân viên khơng có thân nhân SELECT MADA FROM NHANVIEN, PHANCONG WHERE MANV = MA_NVIEN AND HONV = ‘Nguyen’ UNION SELECT MADA FROM NHANVIEN, PHONGBAN, DEAN WHERE MANV = TRPHP AND MAPHG=PHONG AND HONV = ‘Nguyen’ 86 88 22 29/09/2015 Truy vấn lồng (1) Truy vấn lồng (3) SELECT MANV, TENNV Có loại truy vấn lồng FROM NHANVIEN, PHONGBAN Lồng phân cấp WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG Câu truy vấn (Outer query) SELECT FROM Lồng tương quan WHERE ( SELECT FROM WHERE ) Câu truy vấn (Subquery) Mệnh đề WHERE truy vấn không tham chiếu đến thuộc tính quan hệ mệnh đề FROM truy vấn Khi thực hiện, câu truy vấn thực trước Mệnh đề WHERE truy vấn tham chiếu thuộc tính quan hệ mệnh đề FROM truy vấn Khi thực hiện, câu truy vấn thực nhiều lần, lần tương ứng với truy vấn 89 Truy vấn lồng (2) Ví dụ 1- Lồng phân cấp Các câu lệnh SELECT lồng nhiều mức Câu truy vấn thường trả tập giá trị Các câu truy vấn trong mệnh đề WHERE kết hợp phép nối logic Mệnh đề WHERE câu truy vấn So sánh tập hợp thường với số toán tử SELECT MANV, TENNV FROM NHANVIEN, DIADIEM_PHG WHERE DIADIEM=‘TP HCM’ AND PHG=MAPHG SELECT MANV, TENNV FROM NHANVIEN WHERE PHG IN (1, ( 5) IN, NOT IN ALL ANY SOME SELECT MAPHG FROM DIADIEM_PHG WHERE DIADIEM=‘TP HCM’ ) Kiểm tra tồn 91 EXISTS NOT EXISTS 90 92 23 29/09/2015 Ví dụ - Lồng phân cấp Ví dụ - Lồng phân cấp Tìm nhân viên khơng có thân nhân SELECT * FROM NHANVIEN WHERE MANV NOT IN (SELECT MA_NVIEN FROM THANNHAN) Tìm trưởng phịng có tối thiểu thân nhân SELECT * FROM NHANVIEN WHERE MANV IN (SELECT MA_NVIEN FROM THANNHAN) AND MANV IN (SELECT TRPHG FROM PHONGBAN) SELECT * FROM NHANVIEN WHERE MANV ALL (SELECT MA_NVIEN FROM THANNHAN) 93 Ví dụ - Lồng phân cấp 95 Ví dụ 5- Lồng tương quan Tìm nhân viên có lương lớn lương tất nhân viên phòng SELECT MANV, TENNV FROM NHANVIEN, PHONGBAN WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG SELECT * FROM NHANVIEN WHERE LUONG > ALL (SELECT LUONG FROM NHANVIEN WHERE PHG = 4) SELECT * FROM NHANVIEN WHERE LUONG > SELECT MAX(LUONG) FROM NHANVIEN WHERE PHG = SELECT MANV, TENNV FROM NHANVIEN WHERE EXISTS ( SELECT * FROM PHONGBAN WHERE TENPHG=‘Nghien cuu’ AND PHG=MAPHG ) 94 96 24 29/09/2015 Ví dụ - Lồng tương quan Phép chia SQL (1) Tìm nhân viên có người thân tên giới tính R A B C D E a a a a SELECT * a b FROM NHANVIEN NV a a a b a a a b a b WHERE EXISTS( SELECT * FROM THANNHAN TN WHERE NV.MANV = TN.MA_NVIEN AND NV.TENNV=TN.TENTN AND NV.PHAI=TN.PHAI) S bi D E RS A B C a a b a RS tập giá trị R cho khơng có giá trị bi S làm cho (ai, bi) không tồn R 97 Phép chia SQL (2) Nhận xét IN EXISTS IN IN Thuộc tính mệnh đề SELECT truy vấn phải có kiểu liệu với thuộc tính mệnh đề WHERE truy vấn Sử dụng NOT EXISTS để biểu diễn SELECT R1.A, R1.B, R1.C FROM R R1 WHERE NOT EXISTS ( SELECT * EXISTS 99 FROM S Khơng cần có thuộc tính, số hay biểu thức khác đứng trước Không thiết liệt kê tên thuộc tính mệnh đề SELECT truy vấn Những câu truy vấn có = ANY hay IN chuyển thành câu truy vấn có EXISTS WHERE NOT EXISTS ( SELECT * FROM R R2 WHERE R2.D=S.D AND R2.E=S.E AND R1.A=R2.A AND R1.B=R2.B AND R1.C=R2.C )) 98 100 25 29/09/2015 Ví dụ - Phép chia Hàm kết hợp COUNT Tìm tên nhân viên phân công làm tất đồ án Tìm tên nhân viên mà khơng có đề án khơng phân cơng làm Tập bị chia: PHANCONG(MA_NVIEN, SODA) Tập chia: DEAN(MADA) Tập kết quả: KQ(MA_NVIEN) Kết KQ với NHANVIEN để lấy TENNV COUNT(*) đếm số dịng COUNT() đếm số giá trị khác NULL thuộc tính COUNT(DISTINCT ) đếm số giá trị khác khác NULL thuộc tính MIN MAX SUM AVG Các hàm kết hợp đặt mệnh đề SELECT 101 Ví dụ - Phép chia (tt) 103 Ví dụ – Hàm kết hợp SELECT NV.TENNV FROM NHANVIEN NV, PHANCONG PC1 Tìm tổng lương, lương cao nhất, lương thấp lương trung bình nhân viên WHERE NV.MANV = PC1.MANV AND NOT EXISTS ( SELECT * SELECT SUM(LUONG), MAX(LUONG), MIN(LUONG), AVG(LUONG) FROM DEAN DA FROM NHANVIEN WHERE NOT EXISTS ( SELECT * FROM PHANCONG PC2 WHERE PC2.MADA=DA.MADA AND PC1.MANV= PC2.MANV)) 102 104 26 29/09/2015 Ví dụ – Hàm kết hợp Gom nhóm Cho biết số lượng nhân viên phòng ‘Nghien cuu’ Cú pháp SELECT FROM WHERE SELECT COUNT(*) AS SL_NV GROUP BY FROM NHANVIEN, PHONGBAN WHERE PHG = MAPHG AND TENPHG = ‘Nghien cuu’ Sau gom nhóm Mỗi nhóm có giá trị thuộc tính gom nhóm 105 107 Ví dụ – Hàm kết hợp Ví dụ – Gom nhóm Cho biết số lượng nhân viên phòng ban PHG SL_NV MANV HONV SELECT PHG, COUNT(*) AS SL_NV TENLOT TENNV NGSINH DCHI PHAI LUONG MA_NQL PHG Thanh Tung 12/08/1955 638 NVC Q5 Nam 40000 888665555 987987987 Nguyen Manh Hung 09/15/1962 Ba Ria VT Nam 38000 333445555 453453453 Tran Thanh Tam 07/31/1972 543 MTL Q1 Nu 25000 333445555 999887777 Bui Ngoc Hang 07/19/1968 33 NTH Q1 Nu 38000 987654321 987654321 Le Quynh Nhu 07620/1951 219 TD Q3 Nu 43000 888665555 987987987 Tran Hong Quang 04/08/1969 980 LHP Q5 Nam 25000 987654321 888665555 Pham Van Vinh 11/10/1945 450 TV HN Nam 55000 NULL 333445555 Nguyen Cho biết số lượng nhân viên phòng ban FROM NHANVIEN GROUP BY PHG 106 108 27 29/09/2015 Ví dụ – Gom nhóm Ví dụ – Gom nhóm Với nhân viên cho biết mã số, họ tên, số lượng đề án tổng thời gian mà họ tham gia MA_NVIEN SODA THOIGIAN 123456789 123456789 7.5 333445555 10.0 333445555 10.0 333445555 10 10.0 888665555 20 20.0 987987987 10 35.0 987987987 30 5.0 987654321 30 20.0 987654321 20 15.0 453453453 20.0 453453453 20.0 32.5 Cho biết nhân viên tham gia từ đề án trở lên MA_NVIEN SODA THOIGIAN 123456789 123456789 32.5 7.5 333445555 10.0 333445555 10.0 333445555 10 10.0 888665555 20 20.0 987987987 10 35.0 987987987 30 5.0 987654321 30 20.0 987654321 20 15.0 453453453 20.0 453453453 20.0 109 Ví dụ – Gom nhóm (tt) bị loại 111 Ví dụ – Gom nhóm (tt) SELECT TENPHG, COUNT(*) AS SL_NV SELECT MANV FROM NHANVIEN, PHONGBAN FROM PHANCONG WHERE PHG = MAPHG GROUP BY MANV GROUP BY TENPHG HAVING COUNT(*) >= 110 112 28 29/09/2015 Điều kiện nhóm Nhận xét Cú pháp Mệnh đề GROUP BY SELECT FROM WHERE GROUP BY Các thuộc tính mệnh đề SELECT (trừ thuộc tính hàm kết hợp) phải xuất mệnh đề GROUP BY Mệnh đề HAVING HAVING Sử dụng hàm kết hợp mệnh đề SELECT để kiểm tra số điều kiện Chỉ kiểm tra điều kiện nhóm, khơng điều kiện lọc Sau gom nhóm điều kiện nhóm thực 113 Ví dụ – Điều kiện gom nhóm 115 Nhận xét (tt) Cho biết phòng ban (TENPHG) có lương trung bình nhân viên lớn 2tr SELECT PHONG, AVG(LUONG) AS LUONG_TB FROM NHANVIEN GROUP BY PHONG HAVING AVG(LUONG) > 2000000 SELECT TENPHG, AVG(LUONG) AS LUONG_TB FROM NHANVIEN, PHONGBAN WHERE PHG = MAPHG GROUP BY TENPHG HAVING AVG(LUONG) > 2000000 114 Thứ tự thực câu truy vấn có mệnh đề GROUP BY HAVING (1) Chọn dòng thỏa điều kiện mệnh đề WHERE (2) Những dòng gom thành nhiều nhóm tương ứng với mệnh đề GROUP BY (3) Áp dụng hàm kết hợp cho nhóm (4) Bỏ qua nhóm khơng thỏa điều kiện mệnh đề HAVING (5) Rút trích giá trị cột hàm kết hợp mệnh đề SELECT 116 29 29/09/2015 Bài tập Truy vấn mệnh đề FROM Câu hỏi 11: Tìm phịng ban có lương trung bình cao Câu hỏi 12: Tìm nhân viên có lương cao Câu hỏi 13: Tìm tên nhân viên phân cơng làm tất đồ án Kết trả câu truy vấn phụ bảng Bảng trung gian trình truy vấn Khơng có lưu trữ thật Cú pháp SELECT FROM R1, R2, () AS tên_bảng WHERE 117 119 Một số dạng truy vấn khác Điều kiện kết mệnh đề FROM Truy vấn mệnh đề FROM Kết SELECT FROM R1 [INNER] JOIN R2 ON Điều kiện kết mệnh đề FROM WHERE Phép kết tự nhiên Phép kết Cấu trúc CASE Kết SELECT FROM R1 LEFT|RIGHT [OUTER] JOIN R2 ON WHERE 118 120 30 29/09/2015 Bài tập Bài tập Câu hỏi 14: Tìm mã tên nhân viên làm việc phòng ‘Nghien cuu’ Câu hỏi 15: Tìm họ tên nhân viên tên đề án nhân viên tham gia có Câu hỏi 16: Cho biết họ tên nhân viên đến tuổi hưu (nam 60 tuổi, nữ 55 tuổi) Câu hỏi 17: Cho biết họ tên nhân viên năm hưu 121 Bài tập – HÀM COUNT,SUM,MAX,MIN,AVG Cấu trúc CASE 123 Sử dụng hàm COUNT, SUM, MIN, MAX, AVG: Cho phép kiểm tra điều kiện xuất thông tin theo trường hợp – Câu hỏi 18: Tính số nhân viên công ty Select COUNT(MaNV) as SoNV from NhanVien Câu hỏi 19: Tính số lượng nhân viên quản lý trực tiếp nhân viên khác – Cú pháp Select COUNT (DISTINCT Ma_NQL) from NhanVien CASE Câu hỏi 20: Tìm mức lương lớn nhất, mức lương trung bình, tổng lương công ty – WHEN THEN WHEN THEN … – [ELSE ] Select MAX(Luong), AVG(Luong), SUM(Luong) from NhanVien Câu hỏi 21: Cho biết nhân viên có mức lương lớn Select HoTen from NhanVien Where Luong = (Select MAX(Luong) from NhanVien ) END 122 124 31 29/09/2015 Bài tập - MỆNH ĐỀ GROUP BY Bài tập – MỆNH ĐỀ GROUP BY Câu hỏi 22: Cho biết nhân viên có mức lương mức lương trung bình cơng ty Select HoTen from NhanVien where Luong > (Select AVG(Luong) from NhanVien ) Sử dụng hàm COUNT, SUM, MIN, MAX, AVG nhóm nhỏ: mệnh đề GROUP BY Chia dịng thành nhóm nhỏ dựa tập thuộc tính chia nhóm – Thực phép tốn nhóm như: Count (thực phép đếm), Sum (tính tổng), Min(lấy giá trị nhỏ nhất), Max(lấy giá trị lớn nhất), AVG (lấy giá trị trung bình) – Câu hỏi 23: Cho biết số lượng nhân viên theo phái? Do cột phái có giá trị “nam” “nữ”, trường hợp ta chia bảng NhanVien thành nhóm nhỏ Thuộc tính chia nhóm thuộc tính “Phai” Select Phai, count(Manv) as SoNV from NhanVien Group by Phai Câu hỏi 24: Cho biết số lượng nhân viên theo phịng? Do cột MaPH có giá trị “NC” “DH” “QL”, trường hợp ta chia bảng nhân viên thành nhóm nhỏ Thuộc tính chia nhóm thuộc tính “MaPH” Select MaPH, count(Manv) from NhanVien Group by MaPH Tương tự: cho biết tổng lương phòng, cho biết mức lương thấp phòng, mức lương cao nhất, mức lương trung bình phịng 125 Bài tập - MỆNH ĐỀ GROUP BY nhóm Quan hệ NV Q a a b b c c c c c d d d 10 10 10 16 18 50 Bài tập - MỆNH ĐỀ GROUP BY Chia dịng thành nhóm dựa tập thuộc tính chia nhóm S Q Count(S) a b c d Các thuộc tính GROUP BY: Q 127 Tương tự cho hàm SUM, MIN, MAX, AVG Câu hỏi 25: Cho biết tên phòng số lượng nhân viên theo phòng? Giống câu 24 bổ sung thêm bảng PhongBan để lấy tên phịng Thuộc tính chia nhóm (TenPH) thay cho MaPH Select TenPH, count(Manv) as SoLuongNV From NhanVien n, PhongBan p Where n.MaPh=p.MaPH Group by TenPH Câu hỏi 26: Với phòng, cho biết số lượng nhân viên theo phái? Do cột MaPH có giá trị “NC” “DH” “QL”, phòng chia nhỏ theo phái: nhóm “Nam” “Nữ”, trường hợp ta chia bảng nhân viên thành nhóm nhỏ Như vậy, tập thuộc tính chia nhóm cho câu truy vấn (Phong, Phai) Câu SQL: Select Q, count(S) From NV Group by Q Select MaPH, Phai, count(Manv) from NhanVien Group by Phong, Phai 126 128 32 29/09/2015 Bài tập - MỆNH ĐỀ GROUP BY Bài tập: Các hàm tính tốn gom nhóm (1) Câu hỏi 27: Đếm số đề án nhân viên tham gia? - Do cột MaNV có giá trị “NV001”,…”NV008” (khơng có nhân viên “005”), trường hợp ta chia bảng PhanCong thành nhóm nhỏ Với nhóm nhỏ (MaNV), ta đếm số đề án (count(MADA)) tham gia Thuộc tính chia nhóm thuộc tính “MaNV” - Tương tự: tính tổng số làm việc nhân viên (SUM), thời gian làm việc thấp nhân viên (MIN), thời gian làm việc lớn nhân viên (MAX), thời gian làm việc trung bình,… Select MaNV, count(MaDA) as SoDATG From PhanCong Group by MaNV Câu hỏi 28: Cho biết mã, tên nhân viên số đề án mà n/v tham gia? Các hàm tính tốn COUNT: Đếm số liệu thuộc tính MIN: Tính giá trị nhỏ MAX: Tính giá trị lớn AVG: Tính giá trị trung bình SUM: Tính tổng giá trị liệu Select n.MaNV, HoTen, count(MaDA) as SoDATG From PhanCong pc, NhanVien n where pc.manv=n.manv Group by MaNV, HoTen 129 Bài tập – MỆNH ĐỀ HAVING 131 Bài tập: Các hàm tính tốn gom nhóm (2) Lọc kết theo điều kiện, sau gom nhóm Điều kiện HAVING điều kiện hàm tính tốn nhóm (Count, Sum, Min, Max, AVG) thuộc tính danh sách GROUP BY NHANVIEN Câu hỏi 29: Cho biết nhân viên tham gia từ đề án trở lên? Select MaNV, count(MaDA) as SoDATG From PhanCong Group by MaNV Having count(MaDA) >=2 Câu hỏi 30: Cho biết mã phịng ban có nhân viên? Select MaPH, count(Manv) from NhanVien Group by MaPH Having count(Manv)>4 130 MANV HOTEN PHAI MANQL PHONG LUONG NV001 Nguyễn Ngọc Linh Nữ Null NC 2.800.000 NV002 Đinh Bá Tiến Nam NV002 DH 2.000.000 NV003 Nguyễn Văn Mạnh Nam NV001 NC 2.300.000 NV004 Trần Thanh Long Nam NV002 DH 1.800.000 NV005 Nguyễn Thị Hồng Vân Nữ NV001 NC 2.500.000 NV006 Nguyễn Minh Nam NV002 DH 2.000.000 NV007 Hà Duy Lập Nam NV003 NC 1.800.000 NV008 Trần Kim Duyên Nữ NV003 NC 1.800.000 NV009 Nguyễn Kim Anh Nữ NV003 NC 2.000.000 132 33 29/09/2015 Bài tập (3) Đáp án (2) Tính lương thấp nhất, cao nhất, trung bình tổng lương tất nhân viên Có tất nhân viên Có tất nhân viên Bao nhiêu nhân viên có người quản lý Bao nhiêu phịng ban có nhân viên trực thuộc Select count(*) FROM NhanVien WHERE manql is not null Tính lương trung bình nhân viên SELECT count(Manql) FROM NhanVien SELECT count(*) FROM NhanVien Bao nhiêu nhân viên có người quản lý Tính lương trung bình nhân viên theo phòng ban Bao nhiêu phịng ban có nhân viên trực thuộc SELECT count(distinct phong) FROM NhanVien 133 Các hàm tính tốn gom nhóm (2) Đáp án (1) Gom nhóm: mệnh đề GROUP BY Tính lương thấp nhất, cao nhất, trung bình tổng lương tất nhân viên SELECT min(luong) as thapnhat, max(luong) as caonhat, avg(luong) as trungbinh, sum(luong) as tongluong FROM 135 NhanVien 134 Sử dụng hàm gom nhóm quan hệ Mỗi nhóm bao gồm tập hợp có giá trị thuộc tính gom nhóm Hàm gom nhóm áp dụng độc lập SQL có mệnh đề GROUP BY để thuộc tính gom nhóm, thuộc tính phải xuất mệnh đề SELECT 136 34 29/09/2015 Đáp án (3) Tính lương trung bình nhân viên SELECT FROM avg(LUONG) as LUONGTB NhanVien Tính lương trung bình nhân viên theo phịng ban SELECT phong, avg(LUONG) as LUONGTB FROM NhanVien GROUP BY phong 137 Các hàm tính tốn gom nhóm (3) Điều kiện sau gom nhóm: mệnh đề HAVING Lọc kết theo điều kiện, sau gom nhóm Điều kiện HAVING thực sau gom nhóm, điều kiện có liên quan đến thuộc tính Group By Ví dụ: tìm phịng có số lượng nhân viên “Nữ” người SELECT FROM WHERE GROUP BY HAVING phong NhanVien phai = ‘Nữ’ phong count(manv) > 138 35 ... THOIGIAN 12 345 6789 12 345 6789 7.5 33 344 5555 10.0 33 344 5555 10.0 33 344 5555 10 10.0 888665555 20 20.0 987987987 10 35.0 987987987 30 5.0 9876 543 21 30 20.0 9876 543 21 20 15.0 45 345 345 3 20.0 45 345 345 3 20.0... 12 345 6789 12 345 6789 32.5 7.5 33 344 5555 10.0 33 344 5555 10.0 33 344 5555 10 10.0 888665555 20 20.0 987987987 10 35.0 987987987 30 5.0 9876 543 21 30 20.0 9876 543 21 20 15.0 45 345 345 3 20.0 45 345 345 3... 33 344 5555 45 345 345 3 Tran Thanh Tam 07/31/1972 543 MTL Q1 Nu 25000 33 344 5555 999887777 Bui Ngoc Hang 07/19/1968 33 NTH Q1 Nu 38000 9876 543 21 9876 543 21 Le Quynh Nhu 07620/1951 219 TD Q3 Nu 43 000