. Lệnh CREATE
Lệnh này dùng để tạo ra các quan hệ như TABLE,VIEW,INDEX
CREATE TABLE
-Bảng là một cấu trúc c bn để cất giữ trong hệ thống quan hệ.Có khuôn dạng hai chiều gồm có các cột và hàng.Nó là yếu tố cơ bản cho các thao tác khác nhau.Có thể nói việc tạo bảng là bước đầu tiên quan trọng nhất để thiết lập CSDL.
-Cú pháp của lệnh này:
CREATE TABLE table-name(colom_name type(size).)
Khi tạo ra bảng chúng ta phải chỉ ra kiểu dữ liệu của cột và mỗi cột chỉ có thể có môt kiểu dữ liệu duy nhất.Khi tạo bảng ta có thể đưa ra các ràng buộc
Các ràng buộc của các trường có thể là : primary key,foreign key ,unique,not null .
VD:Tạo bảng nhân viên
CREATE TABLE NHAN_VIEN (#NV varchar(4) constraint NV_Primary key,ho_tên Varchar(25),Ng_sinh date,chứcvụ varchar(20),đia_chỉ varchar(30).lưng number(7));
trong VD trên ta tạo ra một ràng buộc là #NV được định nghĩa là primary key
-Ta cũng có thể tạo ra bảng mới với cấu trúc và dữ liệu từ 1 bảng khác.
Cú pháp:
CREATE TABLE TABLE_name[(colum_name.)]AS
SELECT statement;
VD:Tạo ra 1 bảng mới có tên là NVN (#NV,họ_tên) từ bảng NHAN_VIEN
CREATE TABLE NVN AS SELECT #NV,họ_tên FROM NHAN_VIEN;
13 trang |
Chia sẻ: oanh_nt | Lượt xem: 1884 | Lượt tải: 3
Nội dung tài liệu Bài tập về SQL, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
4. BµI TËP VÒ sql
MỤC TIÊU CỦA BÀI NÀY GIÚP NGƯỜI HỌC
Hiểu và phân biệt 3 nhóm lệnh của ngôn ngữ SQL
Giải một số bài tập thao tác trên quan hệ có sử dụng 3 nhóm lệnh trên.
Vận dụng giải quyết các bài toán tổng hợp.
A/ NHẮC LẠI LÝ THUYẾT
I. CÁC NHÓM LỆNH CỦA NGÔN NGỮ SQL
Phân biệt các nhóm câu lệnh sau:
- Các lệnh DDL: CREATE, ALTER, DROP.
a. Lệnh CREATE
Lệnh này dùng để tạo ra các quan hệ như TABLE,VIEW,INDEX
CREATE TABLE
-Bảng là một cấu trúc c bn để cất giữ trong hệ thống quan hệ.Có khuôn dạng hai chiều gồm có các cột và hàng.Nó là yếu tố cơ bản cho các thao tác khác nhau.Có thể nói việc tạo bảng là bước đầu tiên quan trọng nhất để thiết lập CSDL.
-Cú pháp của lệnh này:
CREATE TABLE table-name(colom_name type(size)..)
Khi tạo ra bảng chúng ta phải chỉ ra kiểu dữ liệu của cột và mỗi cột chỉ có thể có môt kiểu dữ liệu duy nhất.Khi tạo bảng ta có thể đưa ra các ràng buộc
Các ràng buộc của các trường có thể là : primary key,foreign key ,unique,not null ...
VD:Tạo bảng nhân viên
CREATE TABLE NHAN_VIEN (#NV varchar(4) constraint NV_Primary key,ho_tên Varchar(25),Ng_sinh date,chứcvụ varchar(20),đia_chỉ varchar(30).lưng number(7));
trong VD trên ta tạo ra một ràng buộc là #NV được định nghĩa là primary key
-Ta cũng có thể tạo ra bảng mới với cấu trúc và dữ liệu từ 1 bảng khác.
Cú pháp:
CREATE TABLE TABLE_name[(colum_name..)]AS
SELECT statement;
VD:Tạo ra 1 bảng mới có tên là NVN (#NV,họ_tên) từ bảng NHAN_VIEN
CREATE TABLE NVN AS SELECT #NV,họ_tên FROM NHAN_VIEN;
b. Lệnh ALTER
-Dùng để hoặc là thêm một hay nhiều trường vào bng hoặc sửa đổi một cột hiện
tại.SQL ANSI chuẩn không cho phép huỷ bỏ các cột.
-Cú pháp:
ALTER TABLE TABLE_name ADD | MODIFY | DROP option (colum Datatype..)
+ADD:thêm cột mới
+MODIFY:sửa đổi cột
+DROP option xoá bỏ các ràng buộc
VD1:thêm trường gia đình kiểu char(1) vào R1
ALTER TABLE R1 ADD gia đình char(1);
VD2:Thay đổi trường Địa_chỉ Varchar(30) trong R1 thành Địa_Chỉ(20):
ALTER TABLE R1 MODIFY Địa_Chỉ varchar(20);
VD3:Huỷ bỏ ràng buộc trường khoá #NV trong R1
ALTER TABLE R1 DROP constraint NV_prim
c. Lệnh DROP
-Dùng để xoá bỏ một quan hệ,khi ta xoá bỏ một bng c sở thì tất c các VIEW,INDEX được định nghĩa trên bng đó sẽ bị xoá bỏ .
Cú phap:
DROP TABLE/VIEW/INDEX Name;
VD:Xoá bỏ Nhân_viên_id;
DROP INDEX Nhân_viên_id;
- Các lệnh DML: SELECT, UPDATE, INSERT, DELETE, …
a. Lệnh SELECT
Mệnh đề SELECT tương ứng với toán tử project(phép chiếu p) của đại số quan hệ. Khối lệnh SELECT gồm có ba mệnh đề chính:
+SELECT:xác định nội dung của các cột cấn đưa ra.
+FROM:danh sách các quan hệ được quét qua
+WHERE:ứng với một khẳng định lựa chọn của đại số quan hệ.
-Lệnh SELECT thường có dạng:
SELECT [distinct]*/A1..An FROM R1, R2 ...,Rm
[WHERE p];
Trong đó :
Ai là các thuộc tính
Rj là các quan hệ (có thể là các TABLEs,VIEWs..)Ta có thể dùng các bí danh cho các Ai,rj.
p:là điều kiện ràng buộc.
ở đây WHERE có thể có hoặc không.
Dùng *để chỉ tất cả các thuộc tính của các quan hệ được chọn
-Hỏi đáp này tương đưng với biểu diễn sau trong đại số quan hệ:
pA1..An[S p(r1..rm)]
-Để loại bỏ các bộ giá trị (các hàng) trùng nhau ta thêm từ khoá Distinct vào sau SELECT (trước đây SQL thêm từ khoá unique).
-Trong khẳng định p:ta có thể dùng các liên từ logic and,or,not khi kết hợp nhiều điều kiện
VD1:Để hiện các thông tin về một nhân viên nào đó gồm(#,Họ_tên,N_sinh,Chức_vụ,địa_chỉ,lưng)
SELECT Distinc * FROM R1;
Đưa ra (họ_tên,Nsinh,chức_vụ,địa_chỉ,lưng,tên_phòng) với điều kiện lưng. 500.000 và đia_chỉ không ở Hà nội
SELECT Ho_tên,Nsinhn,chức_vụ,địa_chỉ,lưng,tên_phòng
FROM Nhânviên R1,Liênkêt R2,Phong R3
WHERE (R1.lưng. 500.000) and (not R1.địa_chỉ=’Hà nội’) and
(R1.#NV=R2.#NV) and (R2.#MP=R3.#MP);
-Trong lệnh trên ta đã dùng R1,R2,R3 làm bí danh cho Nhânviên, Liênkêt,Phong
Các bí danh đó chỉ có tác dụng trong một câu lệnh
b. Nhóm lệnh INSERT,UPDATE,DELETE:
Thêm một bộ vào quan hệ
Cú pháp: INSERT INTO Tên_Bảng(Danh sách tên cột)
VALUES(Danh sách các trị) [câuu hỏi con]
VD:chèn 1 hàng (‘020’,’Nguyễn trọng Nghĩa’,Bảo vệ’,’Hà nội’,’800.000’) vào R1
INSERT INTO R1 VALUES(‘020’,’Nguyễn trọng Nghĩa’,Bảo vệ’,’Hà nội’,800.000);
Xó́a các bảng
Dùng để xoá bỏ 1 hoặc nhiều bộ trong quan hệ
DELETE FROM R[WHERE P]
Những bộ nào tho mãn đk P thì mới bị huỷ bỏ khỏi quan hệ R
VD: DELETE FROM R1 WHERE ng_sinh. ’01-01-1935’;
Xoá bỏ tất cả các nhân viên ta dùng lệnh:
DELETE FROM R1;
Sửa dữ liệu
Cú pháp: UPDATE [Tên_bảng]
SET [Tên_cột=Biểu thức,...]
[FROM Tên_Bảng]
[WHERE btđk]
- Các lệnh DCL: GRANT, REVOKE.
GRANT Quyền truy cập ON Tên_bảng/view TO Tên_User [ with GRANT
option]
- Các quyền truy nhập CSDL gồm:
+Read(đọc)
+ SELECT(chọn)
+ Write(ghi)
+ INSERT(bổ sung)
+ UPDATE(sửa đổi)
+ DELETE,run.
- Tên người sử dụng:Tên của một người ,một nhóm người hoặc danh sách người
public:cho tất c mọi người cùng được sử dụng.
- Từ khoá :with grant OPTION:đm bo để người sử dụng có thể tiếp tục trao quyền sử dụng cho người khác.
VD:Cho phép SELECT,INSERT,UPDATE trên bảng R1 cho Nghĩa,Khôi
GRANT SELECT,INSERT,UPDATE ON R1 TO Nghĩa,Khôi with grant option;
Tức là Nghĩa,Khôi có thể trao quyền trên cho người khác.
*Để huỷ bỏ quyền truy nhập
REVOKE privileges ON object FROM user
VD: Để huỷ bỏ quyền UPDATE từ Nghĩa:
REVOKE UPDATE ON R1 FROM Nghĩa;
II. CÁC VÍ DỤ
Ví dụ 1:
Cho quan hệ SINHVIEN (#masv char(10), hoten char(25), ngaysinh datetime, d1 double, d2 double, d3 double). Trong đó, masv là thuộc tính khóa của quan hệ trên.
a) Hãy tạo lập cấu trúc trên.
b) Chèn một cột gt boolean vào bảng trên.
Lời giải:
a) Create Table SINHVIEN (MaSV Char(10), Hoten Char(25) not null, Ngaysinh Date, d1 double, d2 double, d3 double, CONSTRAINT [khoa] Primary Key ([MaSV]))
b) Alter table sinhvien add gt yesno;
Ví dụ 2:
Cho CSDL gồm 2 quan hệ:
LOP (#Malop char (10), tenlop char(20))
SINHVIEN (malop char (10), #masv char(10), hoten char(20), ngaysinh datetime, d1 double, d2 double, d3 double)
a) Hãy đưa ra các thông tin của các sinh viên bao gồm: tenlop, masv, hoten, dtb của mỗi sinh viên.
b) Đưa ra tổng số sinh viên của mỗi lớp.
Lời giải:
a) SELECT lop.tenlop, sv.masv, ([d1]+[d2]+[d3])/3 AS dtb
FROM lop, sv WHERE lop.malop = sv.malop;
b) SELECT lop.tenlop, Count(sv.masv) AS CountOfmasv
FROM lop, sv WHERE lop.malop = sv.malop
GROUP BY lop.tenlop;
III. MỘT SỐ LƯU Ý
Các câu lệnh này có thể thử nghiệm trên một số hệ quản trị CSDL như SQL, Access,..
Phân biệt điều kiện sau mệnh đề Where và sau mệnh đề Having.
B/ BÀI TẬP MẪU
Bài số 1:
Cho CSDL của hệ thống Quản lý nhân sự:
DONVI(MaDV C(3), TenDV C(20), Diachi C(20), MaNPT C(4))
NHANVIEN(MaNV C(4), Hoten C(20), NHVu C(20), Luong N(8), Phucap N(6), MaDV C(3))
Hãy đưa ra danh sách tất cả các đơn vị có trong tổ chức này.
Hướng dẫn:
Ta thấy các thông tin lấy trong bảng đơn vị và câu lệnh thuộc nhóm khai thác dữ liệu.
Lời giải:
SELECT TenDV, Diachi FROM DONVI
Bài số 2:
Để quản lý kinh doanh dùng các bảng sau:
+ HH(hàng hoá): MaHH C(3), TenHH C(20), Qcach C(20), DVT C(5), DGIA N(10)
+ CH(cửa hàng): MaCH C(3), TenCH C(20), DDiem C(20), PTrach C(4)
+ KH(khách hàng): MaKH C(4), TenKH C(20), Loai C(2), Diachi C(20)
+ CT(chứng từ): Sohieu C(12), Ngay D, LoaiCT C(1), MaKH C(4), MaCH C(3), MaHH C(3), SoLuong N(6).
a) Xem trong bng CT có những loại hàng hoá nào được xuất.
Hướng dẫn:
Ta thấy trong bảng CT, mỗi chứng từ có thể bao gồm nhiều MaHH khác nhau, như vậy trong bảng CT sẽ có nhiều MaHH giống nhau, với yêu cầu trên ta chỉ cần đưa ra các MaHH khác nhau.
Lời giải:
SELECT DISTINCT MaHH FROM CT
SELECT DISTINCT CT.MaHH, TenHH FROM CT, HH WHERE CT.MaHH = HH.MaHH
b) Đưa ra danh sách các nhân viên có lưng >=200000
SELECT * FROM NHANVIEN WHERE Luong >= 200000
c) Cho xem danh sách gồm 3 cột Mã đơn vị, họ tên, nhiệm vụ từ bảng nhân viên và được sắp xếp theo mã đơn vị, cùng đơn vị theo nhiệm vụ:
SELECT MaDV, Hoten, NHVu FROM NHANVIEN ORDER BY MaDV, NHVu
Mã đơn vị, họ tên, lương từ bảng NHANVIEN được sắp xếp theo mã đơn vị, cùng đơn vị theo lương gim dần:
SELECT MaDV, Hoten, Luong FROM NHANVIEN ORDER BY MaDV, Luong DESC
Chú ý:
1. Tên các cột trong sau WHERE không nhất thiết phi có sau SELECT, các cột này không nhất thiết phải có trong bảng kết quả.
2. Tên các cột sau ORDER BY… bắt buộc phải có sau SELECT, tức là các cột này bắt buộc phải có trong bảng kết quả.
*) GROUP BY : Nếu có dùng để nhóm các hàng có cùng giá trị của tên cột đối với mỗi nhóm thì cùng thực hiện một thao tác tính toán nào đó.
3. Cho xem mã hàng hoá, tên hàng hoá và tổng số tiền bán được của từng mặt hàng:
SELECT MaCT, MaHH, TenHH, SUM(Soluong*Dongia) FROm CT, HH WHERE CT.MaHH = HH.MaHH And Loai = “X” GROUP BY CT.MaHH
Cho xem m• đn vị, tên đn vị, mức lưng bình quân và số nhân viên của từng đn vị:
SELECT a.MaDV, TenDV, AGV(Luong), Cont (A.*) FROM NHANVIEN a, DONVI b WHERE a.MaDV = b.MaDV GROUP BY a.MaDV
*) Phần HAVING chỉ phục vụ cho GROUP BY
Bài số 3:
R1=Nhân viên (#NV, Ho_tên, Nsinh, nghề nghiệp, Địa chỉ, lương)
R2=Liên kết (#NV, #MP)
R3=Phong (#Mp, Tên_phong, tel)
1. Để hiện các thông tin về một nhân viên nào đó gồm(#NV , Họ_tên, N_sinh, Chức_vụ, địa_chỉ, lương)
SELECT Distinc * FROM R1;
2. Đưa ra (họ_tên,Nsinh,chức_vụ,địa_chỉ,lưng,tên_phòng) với đIều kiện lương. 500.000 và đia_chỉ không ở Hà nội.
SELECT Ho_tên,Nsinhn,chức_vụ,địa_chỉ,lưng,tên_phòng
FROM Nhânviên R1,Liênkêt R2,Phong R3
WHERE (R1.lưng. 500.000) and (not R1.địa_chỉ=’Hà nội’) and
(R1.#NV=R2.#NV) and (R2.#MP=R3.#MP);
- Trong lệnh trên ta đã dùng R1,R2,R3 làm bí danh cho Nhânviên, Liênkêt, Phong
Các bí danh đó chỉ có tác dụng trong một câu lệnh
Các ví dụ sau này ta dùng R1,R2,R3 để thay cho các bảng trên cho gọn
Có 4 toán tử hay được dùng với các kiểu dữ liệu.Trong mệnh đề WHERE là:
In (not In)
Between..and..(not between..)
Like(not like)
Is null (not is Null).
+ Toán tử In (not In):Dùng để kiểm tra giá trị trong (không nằm trong) một danh sách được chỉ ra.
3. Đưa ra những người có đia_chỉ ở Hà nội và Hà tây.
SELECT * FROM R1 WHERE đia_chỉ in (‘Hà nội’,’Hà tây’);
+Toán tử Between..and..(not ..) : kiểm tra giá trị nằm giữa (không nằm giữa) một phạm vi được chỉ ra.
4. Đưa ra những người có lưng nằm trong khong (500.000-:-1.000.000).
SELECT * FROM R1 WHERE lưng between 500.000 and 1.000.000;
+ Toán tử like (not like): Dùng để kiểm tra những giá trị giống (không giống) với giá tri sau like, thường sử dụng với xâu ký tự và khi ta không biết chính xác giá trị cần tìm kiếm hoặc giá trị cần tìm kiếm giống một mẫu nào đó.Trong SQL người ta sử dụng ký hiệu % cho xâu con và ‘_’cho 1 ký tự bất kỳ.
5. Tìm những người có tên mà có ký tự đầu tiên bất kỳ,ký tự tiềp theo là OA và tiếp theo là dãy ký tự bất kỳ:
SELECT *FROM R1 WHERE hoten=’_OA%’;
+ Toán tử Is Null (not is Null):kiểm tra cho các giá trị rỗng (không rỗng);
C/ BÀI TẬP TỰ GIẢI
Bài tập 1:
Cho CSDL gồm có ba quan hệ như sau
NCC(MaNCC, TenNCC, DCNCC, DT)
SP(MaSP, TenSP, Loai)
SP_NCC(MaNCC, MaSP, SL)
Giải thích một số từ viết tắt:
MaNCC là mã số nhà cung cấp
TenNCC là tên nhà cung cấp có mã số tương ứng
DCNCC là địa chỉ của nhà cung cấp
DT là điện thoại nhà cung cấp
MaSP là mã số sản phẩm
TenSP là tên của sản phẩm
Loại là chủng loại của mặt hàng
SL là số lượng đã cung cấp
Quan hệ NCC ( nhà cung cấp ) dùng để lưu trữ một số thông tin về các nhà cung cấp
Quan hệ SP ( sản phẩm ) dùng để lưu trữ một số thông tin của các mặt hàng
Quan hệ SPỴNCC dùng để lưu trữ một số thông tin về việc cung ứng sản phẩm của NCC
Hãy viết biểu thức đại số quan hệ cho biết
Cho biết tên của nhà cung cấp có địa chỉ là Hà Nôi
Cho biết tên của các sản phẩm đã cung ứng bởi nhà cung cấp có mã số là HP.
Cho biết tên của các nhà cung ứng đã cung ứng các sản phẩm với số lượng 20
Cho biết tên của các nhà cung cấp đã cung ứng các sản phẩm
Bài tập 2:
Cho cơ sở dữ liệu gồm 3 quan hệ
SV(MSV, HT, NS, QUE)
ĐT(MĐT, TĐT, GV, KP)
TT(MSV, MĐT, NTT, KQ)
Trong đó :
MSV : Mã sinh viên HT : Họ tên sinh viên
NS : Năm sinh QUE : Quê quán
MĐT : Mã đề tài TĐT : Tên đề tài
GV : Giáo viên KP : Kinh phí
NTT : Nơi thực tập KQ : Kết quả
Hãy trả lời các câu hỏi sau dưới dạng biểu thức quan hệ :
a. Cho biết tên của các giáo viên hướng dẫn sinh viên có quê ở Hà nội và có kết quả thực tập khá ( KQ >= 7)
b. Cho biết tên của các sinh viên có kết quả thực tập khá và thực tập tại quê hoặc thực tập tại Quảng ninh.
c. Cho biết tên của các giáo viên hướng dẫn sinh viên có quê ở Hà nội và thực tập đề tài có kinh phí lơn hơn 5 triệu
d. Cho biết tên của các sinh viên có kết quả thực tập khá và thực tập đề tài có kinh phí lớn hơn 4 triệu.
e. Danh sach sinh viên thực tập tại quê nhà
f. Thông tin về các đề tài có sinh viên thực tập
g. Cho biết mã của các đề tài không có sinh viên nào tham gia
h. Cho biết mã của các đề tài có kinh phí nằm trong khoảng 1.5 đến 2 triệu
i. Cho biết mã của sinh viên có tuổi nhỏ hơn 20 và kết qủa thực tập là khá ( KQ>7)
Bài số 3
Có CSDL thống kê về mối quan hệ giữa các quán bia (BAR) và những người uống (DRINKER) bia (BEER) như sau:
R(DRINKER, BAR) là quan hệ cho biết quán bia và những khách uống cần lui tới. S(BAR, BEER) LÀ quan hệ cho biết các loại bia thường bán ở các quán. Còn T( DRINKER, BEER) cho biết những loại bia mà một khách hàng ưu thích.
Hãy viết các câu vấn tin sau bằng ngôn ngữ SQL:
a. In các quán có loại bia Long thích.
b. In những khách hàng thường đi uống ít nhất một quán có bia họ thích.
c. In ra những khách hàng không đến uống ít nhất tại một quán có bia họ ưu thích.
d. Xoa tất cả loại bia tiger ra khỏi quan hệ S(DRINKER, BEER)
e. Chèn thông tin Long thích bia Tiger.
f. Chèn tất thông tin Long thích tất cả các loại bia bán ở quán "San hô tím"
Bài số 4
Giả sử trong CSDL bia ở trên ta có thêm quan hệ BAN (BAR, BEER, SL) quan hệ cho biết số lượng từng loại bia đã bán ở các quán. Hãy viết bằng SQL các vấn tin sau:
a. Tổng số bia của mỗi loại bia đã bán.
b. Số lượng trung bình mỗi loại bia được bán ở các quán.
c. Số lượng loại được bán ra nhiều nhất (bán chạy nhất)
Bài số 5
Giả sử có quan hệ S(F, S, O) với ý nghĩa là tập tin S có kích thước S thuộc chủ nhân O và quan hệ FTD(F, T, D) với ý nghĩa F có kiểu T và nằm trong thư mục D. Hãy dùng ngôn ngữ SQL để viết các câu vấn tin sau:
a. In ra chủ nhân và kiểu tin của tất cả các tập tin có kích thước tối thiểu là 10.000/
b. In ra tất c ả các tập tin được ông Tomax sở hữu/
c. In ra kích thước trung bình của các tập tin có trong thư mục BIN.
d. In ra tất cả các tập tin có trong thư mục f với tên chứa chuỗi con abc.
Bài số 6
Hãy dịch câu vấn tin sau sang đại số quan hệ.
SELECT OWNER
FROM
WHERE FILE IN
(SELECT FILE FROM FTD WHERE TYPE = 'TEX'
Bài số 7
Hãy dùng ngôn ngữ SQL:
a. Tạo bảng danh sách các sinh viên vừa thi vào trường của bạn, các thuộc tính ở đây là mã số (số báo danh), tên, năm sinh, quê, điểm thi.
b. In danh sách học sinh đậu vào trường (>=20 điểm)
c. In những sinh viên quê ở Sơn La, Lai Châu, Ninh Bình.
Bài số 8
Cho cơ sở dữ liệu như sau :
HANGHOA (MA_HANG,TEN_HG) : Mỗi mặt hàng sẽ có một mã hàng, và một tên hàng.
STT
FIELD NAME
TYPE
WIDTH
DEC
DIỄN GIẢI
1
MA_HANG
Character
3
Mã hàng
2
TEN_HG
Character
20
Tên hàng
DAILY(STT_DL, TEN_DL, DCHI_DL) : Mỗi đại lý có một số thứ tự, tên và một địa chỉ.
STT
FIELD NAME
TYPE
WIDTH
DEC
DIỄN GIẢI
1
STT_DL
Number
3
Số thứ tự đại lý
2
TEN_DL
Character
20
Tên đại lý
3
DCHI_DL
Character
20
Ðịa chỉ đại lý
MUA (STT_DL, MA_HANG, NGAY_MUA, SOLG_MUA, TRIGIA_MUA) : Mỗi một ngày, đại lý sẽ tổng kết xem đã mua những mặt hàng nào với số lượng và trị giá bao nhiêu.
STT
FIELD NAME
TYPE
WIDTH
DEC
DIỄN GIẢI
1
STT_DL
Number
3
Số thứ tự đại lý
2
MA_HANG
Character
3
Mã hàng
3
NGAY_MUA
Date
8
Ngày mua
4
SOLG_MUA
Number
6
Số lượng mua
5
TRIGIA_MUA
Number
10
Trị giá mua
BAN (STT_DL, MA_HANG, NGAY_BAN, SOLG_BAN, TRIGIA_BAN ) : Sau mỗi ngày, đại lý sẽ tổng kết xem đã bán được những mặt hàng nào với số lượng và trị giá bán là bao nhiêu.
STT
FIELD NAME
TYPE
WIDTH
DEC
DIỄN GIẢI
1
STT_DL
Number
3
Số thứ tự đại lý
2
MA_HANG
Character
3
Mã hàng
3
NGAY_BAN
Date
8
Ngày bán
4
SOLG_BAN
Number
6
Số lượng bán
5
TRIGIA_BAN
Number
10
Trị giá bán
Yêu cầu : Viết các câu hỏi sau dưới dạng ngôn ngữ hỏi SQL
1. Tìm những mặt hàng đã bán trong tháng 1/95 tại đại lý số 3.
2. Tìm những mặt hàng đã mua trước năm 1995 và có trị giá mua > 500000.
3. Tìm tên và địa chỉ đại lý có mua bia Heineken.
4. Tìm tất cả các mặt hàng mà đại lý số 2 đã bán trong năm 1994.
5. Tìm tên những mặt hàng mà đại lý Vạn Lợi đã mua trước 01/01/95 và có số lượng mua lớn hơn 150.
6. Tìm những mặt hàng đã được mua và bán trong cùng một ngày ở cùng một đại lý.
7. Tìm tên và địa chỉ đại lý có tổng giá trị mua trong một ngày lớn hơn 700000.
8. Tìm tổng giá trị mua và tổng giá trị bán của mặt hàng Coca Cola ở đại lý Tân Hiệp Hưng.
9. Tìm đơn giá mua trung bình của bia Sài Gòn trên các đại lý.
10. Tìm dơn giá mua trung bình của bia Sài gòn trên các đại lý.
11. Tìm tên, địa chỉ của đại lý và những mặt hàng có số lượng mua và số lượng bán bằng nhau trong cùng một ngày.
12. Tìm tổng thu nhập từng ngày trên từng đại lý.
13. Tìm tổng giá trị mua trong tháng 1/95 tại đại lý Vạn Lợi.
14. Tìm số mặt hàng có bán ở từng đại lý.
15. Tìm tên và địa chỉ của đại lý có bán nhiều mặt hàng nhất.
Gợi ý :
Câu 1 sele dist a.ma_hang, a.ten_hg, b.ngay_ban;
from hanghoa a, ban b;
where a.ma_hang=b.ma_hang;
and left(dtoc(b.ngay_ban),2)='01';
and b.stt_dl=3
Câu 2 sele dist a.ma_hang, a.ten_hg, b.ngay_mua, b.trigia_mua;
from hanghoa a, mua b;
where a.ma_hang=b.ma_hang;
and right(dtoc(b.ngay_mua),2)<'95';
and b.trigia_mua>500000
Câu 3 sele dist a.*;
from daily a, mua b, hanghoa c;
where a.stt_dl=b.stt_dl;
and b.ma_hang=c.ma_hang;
and upper(c.ten_hg)='BIA HEINEKEN'
Câu 4 sele dist a.ma_hang, a.ten_hg, b.ngay_ban;
from hanghoa a, ban b;
where a.ma_hang=b.ma_hang;
and b.stt_dl=2;
and right(dtoc(b.ngay_ban),2)='94';
Câu 5 sele dist a.ma_hang, a.ten_hg, b.ngay_mua, b.solg_mua;
from hanghoa a, mua b;
where a.ma_hang=b.ma_hang;
and right(dtoc(b.ngay_mua),2)<'95';
group by b.ma_hang;
having sum(b.solg_mua)>150
Câu 6 sele dist a.ma_hang, a.ten_hg, b.ngay_mua as ngay;
from hanghoa a, mua b, ban c;
where a.ma_hang=b.ma_hang;
and a.ma_hang=c.ma_hang;
and b.stt_dl=c.stt_dl;
and b.ngay_mua=c.ngay_ban
Câu 7 sele dist a.*,b.ngay_mua, sum(b.trigia_mua) as tong_mua;
from daily a, mua b;
where a.stt_dl=b.stt_dl;
group by b.stt_dl, b.ngay_mua;
having sum(b.trigia_mua)>700000
Câu 8 sele sum(a.trigia_mua) as tong_mua,
sum(b.trigia_ban) as tong_ban;
from mua a, ban b, daily c, hanghoa d;
where a.stt_dl=b.stt_dl;
and a.stt_dl=c.stt_dl;
and a.ma_hang=b.ma_hang;
and a.ma_hang=d.ma_hang;
and upper(d.ten_hg)='COCA COLA';
and upper(c.ten_dl)='TAN HIEP HUNG'
Câu 9 sele dist a.*;
from daily a, ban b, hanghoa c;
where a.stt_dl=b.stt_dl;
and b.ma_hang=c.ma_hang;
and upper(c.ten_hg)='BIA TIGER';
and b.stt_dl in;
(sele b.stt_dl;
from daily a, ban b, hanghoa c;
where a.stt_dl=b.stt_dl;
and b.ma_hang=c.ma_hang;
and upper(c.ten_hg)='BIA HEINEKEN')
Câu 10 sele dist b.ten_hg, avg(a.trigia_mua) as tgia_tb;
from mua a, hanghoa b;
where a.ma_hang=b.ma_hang;
and upper(b.ten_hg)='BIA SAIGON';
group by b.ma_hang
Câu 11 sele dist a.ten_dl, a.dchi_dl, b.ma_hang, b.ten_hg;
from daily a, hanghoa b, mua c, ban d;
where a.stt_dl=c.stt_dl;
and a.stt_dl=d.stt_dl;
and b.ma_hang=c.ma_hang;
and b.ma_hang=d.ma_hang;
and c.solg_mua=d.solg_ban;
and c.ngay_mua=d.ngay_ban
Câu 12 sele stt_dl as ma_dl, ngay_mua as ngay_mua,
sum(trigia_mua) as chi into dbf tam;
from mua;
group by stt_dl, ngay_mua
sele stt_dl as ma_dl, ngay_ban as ngay_ban,
sum(trigia_ban) as thu into dbf tam1;
from ban;
group by stt_dl, ngay_ban
sele a.ma_dl, a.ngay_mua as ngay,
(b.thu-a.chi) as thunhap;
from tam a, tam1 b;
where a.ma_dl=b.ma_dl;
and a.ngay_mua=b.ngay_ban
Câu 13 sele sum(b.trigia_mua) as tong_mua;
from daily a, mua b;
where a.stt_dl=b.stt_dl;
and upper(a.ten_dl)='VAN LOI';
and b.ngay_mua>={01/01/95};
and b.ngay_mua<={01/31/95};
group by a.stt_dl
Câu 14 sele dist a.stt_dl as stt_dl, b.ten_dl as ten_dl,
b.dchi_dl as dchi_dl, a.ma_hang as ma_hang
into dbf tam;
from ban a, daily b;
where a.stt_dl=b.stt_dl
sele stt_dl, ten_dl,count(ma_hang) as so_mat_hg;
from tam;
group by stt_dl
Câu 15 sele stt_dl, ten_dl,dchi_dl, count(ma_hang)
as so_mat_hg into dbf tam1;
from tam;
group by stt_dl
sele max(so_mat_hg) as max_so_mat_hg into dbf tam2;
from tam1
sele a.stt_dl, a.ten_dl, a.dchi_dl;
from tam1 a, tam2 b;
where a.so_mat_hg=b.max_so_mat_hg
Các file đính kèm theo tài liệu này:
- bai_tap_ve_sql.doc