/*auto readmore*/
/*auto readmore*/
/* an hien script*/
// an hien password
/*an hien ma chuong trinh cong tru */
/*Scrollbox thanh cuon*/
/***Nhung CODE***/
/*
dòng xanh dòng trắng
*/
/*
https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi
1. copy link vao vi du:prism-python.min.js
2. ten ngon nua la python
*/
/*===
New posts
===*/
/*header slider*/
/*=== bai viet lien quan===*/
/*===tabcode===*/
PRIMARY KEY/Khóa Chính: Ràng buộc xác
định duy nhất mỗi bản ghi trong một bảng
FOREIGN KEY/Khóa ngoại: là một trường
(hoặc tập hợp các trường) trong một bảng, tham chiếu đến PRIMARY KEY trong
một bảng khác.
Bảng có khóa ngoại được gọi là bảng con
Bảng có khóa chính được gọi là bảng tham chiếu hoặc bảng cha.
CREATE TABLE phong_ban (
ma_pb CHAR(5) PRIMARY KEY,
ten_pb VARCHAR(255) NOT NULL,
ma_truongphong INT
);
3. Tạo mới bảng nhan_vien, khóa chính (cách 2), khóa ngoại, thiết lập
quan hệ giữa bảng phong_ban và bảng nhan_vien
CREATE TABLE quan_ly_nhan_su.nhan_vien (
id_nhanvien INT AUTO_INCREMENT,
ho_nv VARCHAR(255),
ten_nv VARCHAR(10) NOT NULL,
nam_sinh DATE,
dia_chi VARCHAR(255),
gioi_tinh BOOLEAN,
luong INT NOT NULL,
phg CHAR(5),
PRIMARY KEY (id_nhanvien),
FOREIGN KEY (phg) REFERENCES phong_ban (ma_pb)
);
Kiểm tra:
-- Tiểm tra sau khi tạo bảng/table
SHOW TABLES;
-- Xem các thuộc tính của bảng nhan_vien
DESC quan_ly_nhan_su.nhan_vien;
SHOW CREATE TABLE quan_ly_nhan_su.nhan_vien;
4. Tương tự tạo bảng quanly_duan, khóa chính, khóa ngoại, thiết lập quan
hệ giữa 2 bảng quanly_duan và nhan_vien
3. Thay đổi data type/kiểu dữ liệu của cột/trường ghichu
-- Thay đổi data type/kiểu dữ liệu của cột/trường ghichu
ALTER TABLE quan_ly_nhan_su.du_an
MODIFY COLUMN ghichu VARCHAR(15);
4. Rename tên cột ghichu thành ghi_chu và thay đổi kiểu dữ liệu/data
type
- Rename tên cột ghichu thành ghi_chu và thay đổi kiểu dữ liệu/data type
ALTER TABLE quan_ly_nhan_su.du_an
CHANGE COLUMN ghichu ghi_chu VARCHAR(100);
5. Xóa cột ghi_chu
-- Xóa cột ghi_chu
ALTER TABLE quan_ly_nhan_su.du_an
DROP COLUMN ghi_chu;
6. Xóa khóa chính trong bảng du_an
-- Xóa khóa chính trong bảng du_an
ALTER TABLE quan_ly_nhan_su.du_an
DROP PRIMARY KEY;
7. Thêm ràng buộc khóa chính cho bảng du_an
-- Thêm ràng buộc khóa chính cho bảng du_an
ALTER TABLE quan_ly_nhan_su.du_an
ADD CONSTRAINT pk_ma_duan
PRIMARY KEY (ma_duan);
8. Thêm ràng buộc khóa ngoại cho bảng quanly_duan và thiết lập quan hệ
với bảng du_an
-- Thêm ràng buộc khóa ngoại cho bảng quanly_duan và thiết lập quan hệ với bảng du_an
ALTER TABLE quan_ly_nhan_su.quanly_duan
ADD CONSTRAINT fk_quanly_duan_duan
FOREIGN KEY (ma_duan)
REFERENCES du_an(ma_duan);
9. Thêm ràng buộc kiểm tra - CHECK cho bảng nhan_vien
-- Thêm ràng buộc kiểm tra - CHECK cho bảng nhan_vien
ALTER TABLE quan_ly_nhan_su.nhan_vien
ADD CONSTRAINT chk_luong
CHECK (luong >= 100); -- không chấp nhận dữ liệu >= 100
10. Thêm trường email vào bảng nhan_vien
-- Thêm trường email vào bảng nhan_vien
ALTER TABLE quan_ly_nhan_su.nhan_vien
ADD email VARCHAR(100);
11. Thêm ràng buộc UNIQUE
-- Thêm ràng buộc UNIQUE
ALTER TABLE quan_ly_nhan_su.nhan_vien
ADD CONSTRAINT unq_email
UNIQUE (email); -- email là địa chỉ duy nhất
12. Tìm trong bảng nhan_vien nếu có tên ràng buộc là "unq_email" thì
xóa bỏ
-- Tìm trong bảng nhan_vien nếu có tên ràng buộc là "unq_email" thì xóa bỏ
ALTER TABLE quan_ly_nhan_su.nhan_vien
DROP CONSTRAINT unq_email;
13. Tạo bảng mới có tên tao_bang_cmd
Create taBLE tao_bang_cmd(
ma int primary key auto_INCREMENT,
ten VARchar(50) not NULL,
ngaySinh Date
);
Noted: Cố tình
gõ code như vậy để biết là SQL KHÔNG PHÂN BIỆT chữ HOA, chữ thường
14. Đổi tên bảng tao_bang_cmd thành tên mới là bang_moi_doi_ten
-- Đổi tên bảng tao_bang_cmd thành tên mới là bang_moi_doi_ten
ALTER TABLE quan_ly_nhan_su.tao_bang_cmd
RENAME bang_moi_doi_ten;
III. RENAME
Đổi tên một đối tượng trong Database
RENAME TABLE quan_ly_nhan_su.bang_moi_doi_ten TO quan_ly_nhan_su.bang_moi_doi_ten_LAI;
IV. TRUNCATE
Xóa tất cả các bảng ghi/record của một bảng/table.
TRUNCATE - Xóa tất cả các bảng ghi/record của một bảng/table
TRUNCATE TABLE quan_ly_nhan_su.bang_moi_doi_ten_LAI;
V. DROP
Dùng để xóa các đối tượng ĐANG TỒN TẠI trong cơ sở dữ liệu như: database,
table, ...
-- Dùng để xóa các đối tượng ĐANG TỒN TẠI trong cơ sở dữ liệu
DROP TABLE quan_ly_nhan_su.bang_moi_doi_ten_LAI;
-- hoặc
DROP TABLE IF EXISTS du_an; -- Kiểm tra nếu bảng đã tồn tại thì xóa bảng
DROP DATABASE quan_ly_nhan_su;
How To Fix
Trong quá trình xóa có khi gặp phải lỗi không thể xóa, các bạn tìm hiểu các
lệnh dưới
SET FOREIGN_KEY_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 0;
SET GLOBAL FOREIGN_KEY_CHECKS=0;
SHOW VARIABLES LIKE "sql_safe_updates";
SET SQL_SAFE_UPDATES = 0;
Tìm các nhân viên có mức lương trên 25,000 ở phòng 4 hoặc các nhân viên có
mức lương trên 30,000 ở phòng 5
Cho biết họ tên đầy đủ của các nhân viên ở TP HCM
Cho biết họ tên đầy đủ của các nhân viên có họ bắt đầu bằng ký tự 'N'
Cho biết ngày sinh và địa chỉ của nhân viên Dinh Ba Tien.
THỰC HIỆN
A. Khởi tạo dữ liệu mẫu (Thực hiện trên SQL Server 2019)
CREATE DATABASE COM2034_Lab1
GO
USE COM2034_Lab1
GO
create table NHANVIEN (
HONV nvarchar(15) NOT NULL,
TENLOT nvarchar(15) NOT NULL,
TENNV nvarchar(15) NOT NULL,
MANV nvarchar(9) primary key,
NGSINH date NOT NULL,
DCHI nvarchar(30) NOT NULL,
PHAI nvarchar(3) NOT NULL,
LUONG float NOT NULL,
MA_NQL nvarchar(9) NULL,
PHG int NULL,
)
GO
insert into NHANVIEN values
(N'Đinh', N'Quỳnh', N'Như', '001', '1967-02-01', N'291 Hồ Văn Huê, TP HCM', N'Nữ', '43000', '006', '4'),
(N'Phan', N'Viet', N'The', '002', '1984-01-11', N'778 nguyễn kiệm , TP hcm', '', '30000', '001', '4'),
(N'Trần', N'Thanh', N'Tâm', '003', '1957-05-04', '34 Mai Thị Lự, Tp Hồ Chí Minh', N'Nam', '25000', '005', '5'),
(N'Nguyễn', N'Mạnh ', N'Hùng', '004', '1967-03-04', N'95 Bà Rịa, Vũng Tàu', N'Nam', '38000', '005', '5'),
(N'Nguyễn', N'Thanh', N'Tùng', N'005', N'1962-08-20', N'222 Nguyễn Văn Cừ, Tp HCM', N'Nam', '40000', '006', '5'),
(N'Phạm', N'Văn', N'Vinh', '006', '1965-01-01', N'15 Trưng Vương, Hà Nội', N'Nữ', '55000', NULL, '1'),
(N'Bùi', N'Ngọc', N'Hành', '007', '1954-03-11', N'332 Nguyễn Thái Học, Tp HCM', N'Nam', '25000', '001', '4'),
(N'Trần', N'Hồng', N'Quang', '008', '1967-09-01', N'80 Lê Hồng Phong, Tp HCM',N'Nam', '25000', '001', '4'),
(N'Đinh', N'Bá', N'Tiên', '009', '1960-02-11', N'119 Cống Quỳnh, Tp HCM', N'Nam', '30000', '005', '5'),
(N'Đinh', N'Bá', N'Tiên', '010', '1960-02-11', N'119 Cống Quỳnh, Tp HCM', N'Nam', '30000', '005', '5')
GO
B. Thực hiện truy vấn đơn giản
1. Tìm các nhân viên làm việc ở phòng số 4
SELECT *
FROM NHANVIEN
WHERE dbo.NHANVIEN.PHG = 4;
2. Tìm các nhân viên có mức lương trên 30000
SELECT *
FROM NHANVIEN
WHERE dbo.NHANVIEN.LUONG > 30000;
3. Tìm các nhân viên có mức lương trên 25,000 ở phòng 4 hoặc các
nhân viên có mức lương trên 30,000 ở phòng 5
SELECT *
FROM NHANVIEN
WHERE
(dbo.NHANVIEN.LUONG > 25000 AND dbo.NHANVIEN.PHG = 4)
OR
(dbo.NHANVIEN.LUONG > 30000 AND dbo.NHANVIEN.PHG = 5);
4. Cho biết họ tên đầy đủ của các nhân viên ở TP HCM
SELECT
CONCAT(dbo.NHANVIEN.HONV, ' ', dbo.NHANVIEN.TENLOT, ' ', dbo.NHANVIEN.TENNV) as 'Họ và Tên',
dbo.NHANVIEN.DCHI
FROM NHANVIEN
WHERE
DCHI LIKE '%TP HCM%';
5. Cho biết họ tên đầy đủ của các nhân viên có họ bắt đầu bằng ký
tự 'N'
SELECT
CONCAT(dbo.NHANVIEN.HONV, ' ', dbo.NHANVIEN.TENLOT, ' ', dbo.NHANVIEN.TENNV) as 'Họ và Tên'
FROM NHANVIEN
WHERE
dbo.NHANVIEN.HONV LIKE 'N%';
6. Cho biết ngày sinh và địa chỉ của nhân viên Dinh Ba Tien.
SELECT
CONCAT(dbo.NHANVIEN.HONV, ' ', dbo.NHANVIEN.TENLOT, ' ', dbo.NHANVIEN.TENNV) as 'Họ và Tên',
dbo.NHANVIEN.NGSINH,
dbo.NHANVIEN.DCHI
FROM NHANVIEN
WHERE
dbo.NHANVIEN.HONV LIKE N'Đinh'
AND
dbo.NHANVIEN.HONV LIKE N'Bá'
AND
dbo.NHANVIEN.TENNV LIKE N'Tiên';
Hoặc:
SELECT
CONCAT(dbo.NHANVIEN.HONV, ' ', dbo.NHANVIEN.TENLOT, ' ', dbo.NHANVIEN.TENNV) as 'Họ và Tên',
dbo.NHANVIEN.NGSINH,
dbo.NHANVIEN.DCHI
FROM NHANVIEN
WHERE
CONCAT(dbo.NHANVIEN.HONV, ' ', dbo.NHANVIEN.TENLOT, ' ', dbo.NHANVIEN.TENNV) LIKE N'%Đinh Bá Tiên%';
1. Tách cột B (Full Name) thành 2 cột Last Name và First Name
2. Gộp 2 cột Last Name (cột C) và First Name (cột D) thành Cột New Full Name
(cột E)
3. Tách cột B (Full Name) thành 2 cột Last Name 2 và First Name 2 (Viết theo
kiểu tìm hàng cuối cùng tự động)
THỰC HIỆN:
1. Tách cột B (Full Name) thành 2 cột Last Name và First Name
Code:
# === Tách cột
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
# === tách first name, last name
sht["C:D"].insert()
sht["C2:D2"].value = ["First Name", "Last Name"]
full_names = sht["B3:B11"].value
first_names =[]
last_names=[]
for full_name in full_names:
# full_name = sht["D4"].value
list_fullname = full_name.split(" ") # chuyển về list, căn cứ vào dấu khoảng trắng
list_firstname = list_fullname[:-1] # lấy từ đầu cho đến phần tử gần cuối.
first_names.append(" ".join(list_firstname))
list_lastname = list_fullname[-1] # lấy phần tử cuối cùng
last_names.append(list_lastname)
sht["C3"].options(transpose=True).value = first_names
sht["D3"].options(transpose=True).value = last_names
2. Gộp 2 cột Last Name (cột C) và First Name (cột D) thành Cột New Full
Name (cột E)
Code:
# === Tách cột, gộp cột
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
# === tách first name, last name
sht["C:D"].insert()
sht["C2:D2"].value = ["First Name", "Last Name"]
full_names = sht["B3:B11"].value
first_names =[]
last_names=[]
for full_name in full_names:
# full_name = sht["D4"].value
list_fullname = full_name.split(" ") # chuyển về list, căn cứ vào dấu khoảng trắng
list_firstname = list_fullname[:-1] # lấy từ đầu cho đến phần tử gần cuối.
first_names.append(" ".join(list_firstname))
list_lastname = list_fullname[-1] # lấy phần tử cuối cùng
last_names.append(list_lastname)
sht["C3"].options(transpose=True).value = first_names
sht["D3"].options(transpose=True).value = last_names
# === gộp cột
sht["E:E"].insert()
sht["E2"].value = "New Full Name"
list_fullname= sht ["C3:D11"].value
list_fullname_join =[]
for fn in list_fullname:
list_fullname_join.append(" ".join(fn))
### HOẶC
# list_fullname_join = [" ".join(fn) for fn in list_fullname]
sht["E3"].options(transpose=True).value = list_fullname_join
3. Tách cột B (Full Name) thành 2 cột Last Name 2 và First Name 2 (Viết
theo kiểu tìm hàng cuối cùng tự động)
Code:
# === Tách cột (tìm hàng cuối cùng tự động)
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
# === HOẶC tách first name, last name TỐI ƯU
sht["C:D"].insert ()
sht["C2:D2"].value = ["First Name 2", "Last Name 2"]
last_row = sht[f"B{sht.cells.last_cell.row}"].end("up").row # tìm hàng cuối cùng trong cột B
full_names = sht[f"B3:B{last_row}"].value
def split_fullname(full_name): # hàm tách first name và last name
list_fullname = full_name.split(" ")
list_firstname = list_fullname[:-1]
first_name =" ".join(list_firstname)
last_name = list_fullname[-1]
return [first_name, last_name]
data_fullnames = list(map(split_fullname, full_names)) # trả list of list
sht["C3"].value = data_fullnames
- Copy dữ liệu từ ô A1 đến ô C11 dán vào ô A15 (chỉ copy nội dung) - Copy
dữ liệu từ ô A1 đến ô C11 dán vào ô A15 và giữ nguyên định dạng - Trích
xuất dữ liệu cột B và cột C dán vào ô E3 - Chỉ trích xuất dữ liệu dòng thứ
3 của cột B và cột C dán vào cột H3
2. Vẽ biểu đồ vừa trích xuất (cột B và cột C) ở bản dữ liệu từ ô E3 đến F11
3. Xử lý chuỗi:
- Xử lý theo từng ô:
+ B3: ghi hoa cả cell,
+ B4: ghi hoa chữ đầu tiên của chuỗi,
+ B5: chuyển sang chữ thường,
+ B6: ghi hoa đầu mỗi chữ - Xử lý theo cột (Ghi
hoa từ ô B7 đến ô B9) - Xử lý theo dòng (Ghi hoa từ ô A2 đến ô C2)
4. Ghi hoa đầu mỗi chữ cho cột B viết code theo kiểu COMPERHENSION
THỰC HIỆN:
1. Copy và trích xuất dữ liệu theo yêu cầu:
- Copy dữ liệu từ ô A1 đến ô C11 dán vào ô A15 (chỉ copy nội dung) -
Copy dữ liệu từ ô A1 đến ô C11 dán vào ô A15 và giữ nguyên định dạng -
Trích xuất dữ liệu cột B và cột C dán vào ô E3 - Chỉ trích xuất dữ
liệu dòng thứ 3 của cột B và cột C dán vào cột H3
Code:
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
# === copy không mất định dạng
sht["A15"].value= sht["A1:C11"].value # chỉ copy giá trị, cách này mất định dạng
sht["A1:C11"].copy(sht["A30"]) # copy nguyên định dạng và giá trị
# === copy trích xuất cột B, cột C
range_zip = zip(sht["B2:B11"].value, sht["C2:C11"].value)
range_zip = list (range_zip)
sht["E2"].value = range_zip # copy toàn bộ
sht["H2"].value = range_zip[3] # lấy dòng thứ 3
2. Vẽ biểu đồ vừa trích xuất (cột B và cột C) ở bản dữ liệu từ ô E3 đến
F11
Code:
# === Vẽ biểu đồ
chart1 = sht.charts.add(300, 250) # vị trí biểu đồ là trái tính qua 300, trên tính xuống là 250
chart1.set_source_data(sht["E3:F11"])
chart1.chart_type = "line_markers"
# chart1.chart_type = "3d_pie"
# chart1.chart_type = "stock_hlc"
3. Xử lý chuỗi:
- Xử lý theo từng ô:
+ B3: ghi hoa cả cell,
+ B4: ghi hoa chữ đầu tiên của chuỗi,
+ B5: chuyển sang chữ thường,
+ B6: ghi hoa đầu mỗi chữ
- Xử lý theo cột (Ghi hoa từ ô B7 đến ô B9) - Xử lý theo dòng (Ghi hoa từ ô A2 đến ô C2)
Code:
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
full_name = str(sht["B3"].value)
sht["B3"].value = full_name.upper() # ghi hoa cả cell
sht["B4"].value = full_name.capitalize() # ghi hoa chữ đầu tiên
sht["B5"].value = full_name.lower() # ghi thường tòan cell
sht["B6"].value = full_name.title() # ghi hoa đầu mỗi chữ
# === xử lý chuỗi trong cột
full_name = sht["B7:B9"].value
full_name_list =[]
for fn in full_name:
full_name_list.append(fn.upper()) #chữ hoa
sht["B7"].options(transpose = True).value = full_name_list
# === xử lý chuỗi theo hàng
tieu_de = sht["A2:C2"].value
tieu_de_list =[]
for td in tieu_de:
tieu_de_list.append(td.upper())
sht["A2"].value = tieu_de_list
4. Ghi hoa đầu mỗi chữ cho cột B viết code theo kiểu COMPERHENSION
Code:
# === Xử lý chuỗi - theo cột
import xlwings as xw
wb = xw.Book(r"C:\tmp\BangDuLieu_ngaunhien.xlsx")
sht = wb.sheets.active
# ===HOẶC xử lý chuỗi trong cột (comprehension)
full_name = sht["B3:B11"].value
full_name_list_2 =[]
full_name_list_2 =[fn.title() for fn in full_name]
sht["B3"].options(transpose = True).value = full_name_list_2