Thứ Hai, 13 tháng 4, 2015

Thay đổi cấu trúc bảng trong SQL

Thay đổi cấu trúc bảng.

Câu lệnh ALTER TABLE được sử dụng để thêm hoặc xoá cột trong một bảng.

ALTER TABLE tên_bảng
ADD tên_cột kiểu_dữ_liệu

ALTER TABLE tên_bảng
DROP COLUMN tên_cột

Lưu ý: Một số hệ CSDL không cho phép việc xoá bỏ cột trong bảng.

Ví dụ: ta có bảng Person như sau:

LastNameFirstNameAddress
PettersenKariStorgt 20

Thêm một cột tên là City vào bảng Person:

ALTER TABLE Person ADD City varchar(30)

kết quả:

LastNameFirstNameAddressCity
PettersenKariStorgt 20 

Xoá cột Address:

ALTER TABLE Person DROP COLUMN Address

kết quả:

LastNameFirstNameCity
PettersenKari

Tạo một Database trong SQL

Tạo một CSDL

CREATE DATABASE tên_CSDL

Tạo một bảng trong một CSDL

CREATE TABLE tên_bảng
(
tên_cột_1 kiểu_dữ_liệu,
tên_cột_2 kiểu_dữ_liệu,
.......
)

Ví dụ

Tạo một bảng tên Person có bốn cột: LastName, FirstName, Address  Age:

CREATE TABLE Person
(
LastName varchar,
FirstName varchar,
Address varchar,
Age int
)

Tạo bảng và đặt kích thước tối đa của các cột:

CREATE TABLE Person
(
LastName varchar(30),
FirstName varchar,
Address varchar,
Age int(3)
)

Kiểu dữ liệu sẽ qui định loại dữ liệu nào được phép lưu trữ trong cột. Sau đây là các kiểu dữ liệu thường dùng nhất trong SQL:

integer(n)
int(n)
smallint(n)
tinyint(n)
Chỉ lưu trữ dữ liệu là số nguyên. Số lượng tối đa các chữ số được qui định bởi n.
decimal(n,d)
numeric(n,d)
Lưu trữ số thập nhân. Số lượng tối đa các chữ số được qui định bởi n. Số lượng tối đa các chữ số sau dấu phảy thập phân được qui định bởi d.
char(n)Lưu trữ n ký tự.
varchar(n)Lưu trữ tối đa n ký tự.
date(yyyymmdd)Lưu trữ ngày tháng (dạng năm-tháng-ngày)

Tạo chỉ mục

Chỉ mục được tạo ra nhằm để các dòng trong bảng được truy xuất nhanh và hiệu quả hơn. Chỉ mục có thể được tạo trên một hoặc nhiều cột của bảng, và mỗi chỉ mục được đặt một tên. Người dùng không thấy được các chỉ mục này, chúng chỉ được dùng để tăng tốc cho CSDL.

Lưu ý: Sau khi bảng đã được tạo chỉ mục thì việc cập nhật thay thêm dòng mới vào bảng sẽ mất nhiều thời gian hơn là đối với bảng không có chỉ mục. Lý do là vì khi cập nhật bảng, các chỉ mục đồng thời cũng phải được cập nhật theo. Vì thế, ta chỉ nên tạo chỉ mục cho các cột thường xuyên dùng trong các tác vụ tìm kiếm.

Chỉ mục đơn nhất (Unique Index)

Chỉ mục đơn nhất sẽ bắt buộc hai dòng bất kỳ của bảng sẽ không được phép mang cùng giá trị ở cột được tạo chỉ mục.

Cú pháp:

CREATE UNIQUE INDEX tên_chỉ_mục
ON tên_bảng (tên_cột)

Chỉ mục đơn (Simple Index)

Khi không dùng từ khoá UNIQUE trong câu lệnh tạo chỉ mục, các giá trị trùng nhau trong cột sẽ được phép.

Cú pháp:

CREATE INDEX tên_chỉ_mục
ON tên_bảng (tên_cột)

Ví dụ

Tạo một chỉ mục đơn có tên là PersonIndex trên cột LastName của bảng Person:

CREATE INDEX PersonIndex
ON Person (LastName
)

Nếu bạn muốn tạo chỉ mục sắp xếp giảm dần, bạn sử dụng thêm từ dành riêng DESC:

CREATE INDEX PersonIndex
ON Person (LastName
 DESC)

Nếu bạn muốn tạo chỉ mục trên nhiều cột:

CREATE INDEX PersonIndex
ON Person (LastName, Firstname)

Xoá chỉ mục

Bạn có thể xoá chỉ mục đã tạo bằng lệnh DROP.

DROP INDEX tên_bảng.tên_chỉ_mục

Xoá CSDL hoặc bảng

Để xoá một CSDL (các bảng trong CSDL cũng đồng thời được xoá):

DROP DATABASE tên_CSDL

Để xoá một bảng (toàn bộ cấu trúc, dữ liệu và chỉ mục của bảng sẽ được xoá):

DROP TABLE tên_bảng


Nối kết và khóa trong SQL

Đôi khi chúng ta phải lấy dữ liệu từ hai bảng cùng một lúc, chúng ta thực hiện một kết nối.

Các bảng trong CSDL có thể quan hệ ràng buộc với nhau thông qua các khoá. Một khoá chính (primary key)  là một cột mà trong đó mỗi giá trị của hàng phải là duy nhất. Mục đích của khoá là kết nối dữ liệu lại với nhau, từ nhiều bảng khác nhau mà không gây trùng lắp dữ liệu giữa các bảng.

Trong bảng Employees (nhân viên) ở ví dụ dưới đây có cột Employees_ID là khoá chính, bảo đảm rằng không thể có hai dòng nào có trùng Employees_ID. Employees_ID dùng để phân biệt hai nhân viên khi họ trùng tên.

Trong ví dụ dưới đây:

  • Employee_ID là khoá chính của bảng Employees.
  • Prod_ID là khoá chính của bảng Orders.
  • Cột Employeed_ID trong bảng Orders được sử dụng để kết nối với bảng Employees, chỉ đến nhân viên trong bảng Employees.

Bảng Employees:

Employees_IDName
01Hansen, Ola
02Svendson, Tove
03Svendson, Stephen
04Pettersen, Kari

Bảng Orders:

Prod_IDProductEmployee_ID
234Printer01
657Table03
865Chair03

Kết nối hai bảng với nhau

Chúng ta có thể lấy dữ liệu từ hai bảng bằng cách kết nối chúng, tương tự như sau:

Ví dụ: Tìm xem ai đã đặt hàng sản phẩm và họ đã đặt món hàng gì:

SELECT Employees.Name, Orders.Product
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID

kết quả trả về:

NameProduct
Hansen, OlaPrinter
Svendson, StephenTable
Svendson, StephenChair

Ví dụ: Tìm xem ai đã đặt hàng máy in:

SELECT Employees.Name
FROM Employees, Orders
WHERE Employees.Employee_ID = Orders.Employee_ID
AND Orders.Product = 'Printer'

kết quả trả về:

Name
Hansen, Ola

Sử dụng JOIN

Ta có thể sử dụng từ khoá JOIN để kết nối dữ liệu từ hai bảng.

Ví dụ: INNER JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
INNER JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Ai đã đặt hàng và họ đã đặt món hàng nào:

SELECT Employees.Name, Orders.Product
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

INNER JOIN trả về tất cả các dòng ở cả hai bảng khi chúng tương ứng với nhau. Nếu có một dòng ở bảng Employees không ứng với dòng nào ở bảng Orders, dòng đó sẽ không được tính.

kết quả trả về:

NameProduct
Hansen, OlaPrinter
Svendson, StephenTable
Svendson, StephenChair

Ví dụ: LEFT JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
LEFT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Liệt kê tất cả các nhân viên và món hàng mà họ đặt (nếu có):

SELECT Employees.Name, Orders.Product
FROM Employees
LEFT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

LEFT JOIN trả về tất cả các dòng của bảng thứ nhất (Employees), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ hai (Orders). Nếu có một dòng nào ở bảng Employees không ứng với bất cứ dòng nào ở bảng Orders thì dòng đó cũng vẫn được tính.

kết quả trả về:

NameProduct
Hansen, OlaPrinter
Svendson, Tove 
Svendson, StephenTable
Svendson, StephenChair
Pettersen, Kari 

Ví dụ: RIGHT JOIN

Cú pháp:

SELECT cột_1, cột_2, cột_3
FROM bảng_1
RIGHT JOIN bảng_2
ON bảng_1.khoá_chính = bảng_2.khoá_ngoại

Liệt kê tất cả các mặt hàng được đặt và tên người đặt hàng (nếu có):

SELECT Employees.Name, Orders.Product
FROM Employees
RIGHT JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID

RIGHT JOIN trả về tất cả các dòng ở bảng thứ hai (Orders), ngay cả khi các dòng đó không ứng với dòng nào ở bảng thứ nhất (Employees). Nếu có một dòng nào ở bảng Orders không ứng với bất cứ dòng nào ở bảng Employees thì dòng đó cũng vẫn được tính.

kết quả trả về:

NameProduct
Hansen, OlaPrinter
Svendson, StephenTable
Svendson, StephenChair

Ví dụ: Ai đã đặt hàng máy in:

SELECT Employees.Name
FROM Employees
INNER JOIN Orders
ON Employees.Employee_ID = Orders.Employee_ID
WHERE Orders.Product = 'Printer'

kết quả trả về:

Name
Hansen, Ola

Popular Posts

Recent Posts

Unordered List

Text Widget

Được tạo bởi Blogger.