25/05/2018, 08:18

Các lệnh định nghĩa dữ liệu (DDL)

Cú pháp: Create Database <Tên CSDL> Tạo một cơ sở dữ liệu có tên là QLTV _ Quản lý thư viện Create Database QLTV; Cú pháp CREATE TABLE <Ten bang> ( Tên_thuộc_tính1 ...

Cú pháp:

Create Database <Tên CSDL>

Tạo một cơ sở dữ liệu có tên là QLTV _ Quản lý thư viện

Create Database QLTV;

Cú pháp

CREATE TABLE <Ten bang> 
(
	Tên_thuộc_tính1 Kiểu_tt1 [NOT NULL],
	Tên_thuộc_tính2 Kiểu_tt2 [NOT NULL],
	Tên_thuộc_tínhn Kiểu_ttn [NOT NULL]
	[, CONSTRAINT mệnh đề ]
)
    

Trong đó, mệnh đề

CONSTRAINT
cho phép ta khai báo các ràng buộc dữ liệu (chi tiết sẽ được trình bày ở phần sau).

Tạo bảng DOCGIA, có các thuộc tính:

CREATE TABLE DOCGIA(
    MaDG Text(10) NOT NULL PRIMARY KEY,
    TenDG Text(30) NOT NULL,
    DiaChi Text(50) NOT NULL,
    Tuoi NUMBER)
    

Bảng này sẽ được nhận một tên gọi và một cấu trúc (danh sách tên các thuộc tính và một vài đặc trưng). Khi mới được tạo, bảng chưa có dữ liệu, chỉ là một cấu trúc lôgic có thể tiếp nhận các dữ liệu.

Tên của bảng

Tên của bảng được xác định ngay sau lệnh

CREATE TABLE
.

Mỗi HQTCSDL có một quy tắc đặt tên riêng.

  • Tên bảng phải bắt đầu bằng một chữ cái, có dưới 30 kí tự (chữ cái, chữ số, và dấu ‘_’).
  • Tên bảng phải khác tên gọi khác của bảng hay của khung nhìn và với tên gọi đã dành riêng của SQL.
  • Không phân biệt hoa, thường.

Xác định các thuộc tính

Trong lệnh tạo bảng ta phải xác định cấu trúc của bảng. Cần phải xác định mỗi thuộc tính của một định nghĩa kết thúc bằng dấu ‘,’ và gồm:

  • Tên thuộc tính
  • Loại dữ liệu và độ dài
  • Các ràng buộc có liên quan.

Các loại dữ liệu được sử dụng còn tùy theo HQTCSDL.

Các loại dữ liệu được sử dụng trong MS Access

Kiểu dữ liệu Miêu tả Kích cỡ
Text Sử dụng ký tự hoặc kết hợp giữa ký tự và số, như địa chỉ, hoặc những số không yêu cầu tính toán, như số điện thoại, mã nước, mã vùng… Khả năng lưu trữ tối đa (FieldSize)là 255 ký tự.
Memo Sử dụng khi bạn cần lưu trữ một lượng thông tin lớn, ví dụ như trường thông tin ghi chú về một cán bộ. Khả năng lưu trữ tối đa là 65.536 ký tự.
Number Number: Sử dụng cho những dữ liệu cần tính toán (loại trừ tính tiền, sử dụng Currency Type). Khả năng lưu trữ có thể là 1, 2, 4, 8 tuỳ thuộc bào kiểu dữ liệu ta chọn (byte, integer, long integer, single, double, decimal), riêng đối với kiểu dữ liệu ReplicationID (GUI) thi khả năng lưu trữ là 16 byte.
Date/Time Lưu trữ thông tin về thời gian. Sử dụng 8 byte để lưu trữ.
Currency Sử dụng Currency cho các dữ liệu cần tính toán. Phần thập phân có thể có từ 1 đến 4 số. Khả năng lưu trữ là 8 byte.
AutoNumber Đây là kiểu số tự động tăng với bước tăng là 1. Ta không thể cập nhật lại được trường này. Sử dụng 4 byte để lưu trữ. Nếu chọn kiểu dữ liệu là ReplicationID thì khả năng lưu trữ có thể lên tới 16 byte.
Yes/No Kiểu dữ liệu YES/NO chỉ chứa một trong 2 giá trị (Yes/No, True/False, On/ Off)Y Sử dụng 1 bite để lưu trữ.
OLE Object Đối tượng (như là một văn bản trong Microsoft Word, dữ liệu đồ hoạ, âm thanh, hoặc một kiểu dữ liệu nhị phân… ) Sử dụng 1 GB để lưu trữ (tuỳ thuộc vào dung lượng của đĩa).

Ngoài ra còn 2 loại dữ liệu khác như Hyperlink, Lookup Wizard.

Đối với kiểu dữ liệu Number, ta còn có thể lựa chọ chi tiết:

Kiểu dữ liệu Miêu tả Độ chính xác thập phân Kích cỡ
Byte Lưu trữ số từ 0 đến 255 (không có phân số) Không 1 byte
Decimal Lưu trữ tối đa 10^38-1 28 12bytes
Integer Lưu trữ số từ -32,768 to 32,767 (không có phân số). Không 2 bytes
Long Integer Lưu trữ số từ -2,147,483,648 tới 2,147,483,647 (không có phân số). None 4 bytes
Single Lưu trữ số từ -3.402823E38 to -1.401298E-45 cho giá trị âm và từ 1.401298E-45 to 3.402823E38 giá trị dương. 7 4 bytes
Double Lưu trữ số từ -1.79769313486231E308 tới -4.94065645841247E-324 cho giá trị âm và từ 4.94065645841247E–324 to 1.79769313486231E308 giá trị dương. 15 8 bytes

Các loại dữ liệu được sử dụng trong Oracle

1. CHAR

Kiểu CHAR dùng để khai báo một chuỗi có chiều dài cố định, khi khai báo biến hoặc cột kiểu CHAR với chiều dài chỉ định thì tất cả các mục tin của biến hay cột này đều có cùng chiều dài được chỉ định. Các mục tin ngắn hơn ORACLE sẽ tự động thêm vào các khoảng trống cho đủ chiều dài. ORACLE không cho phép gán mục tin dài hơn chiều dài chỉ định đối với kiểu CHAR. Chiều dài tối đa cho phép của kiểu CHAR là 255 byte

2. VARCHAR2

Kiểu VARCHAR2 dùng để khai báo chuỗi ký tự với chiều dài thay đổi. Khi khai báo một biến hoặc cột kiểu VARCHAR2 phải chỉ ra chiều dài tối đa, các mục tin chứa trong biến hay cột kiểu VARCHAR2 có chiều dài thực sự là chiều dài của mục tin. ORACLE không cho phép gán mục tin dài hơn chiều dài tối đa chỉ định đối với kiểu VARCHAR2. Chiều dài tối đa kiểu VARCHAR2 là 2000 byte

3. VARCHAR

Hiện tại ORACLE xem kiểu VARCHAR2 và VARCHAR là như nhau, tuy nhiên ORACLE khuyên nên dùng VARCHAR2. ORACLE dự định trong tương lai dùng kiểu VARCHAR để chứa các chuỗi với chiều dài biến đổi, nhưng trong phép so sánh sẽ được chỉ định theo nhiều ngữ nghĩa khác nhau.

4. NUMBER

Kiểu số của ORACLE dùng để chứa các mục tin dạng số dương, số âm, số với dấu chấm động.

NUMBER(p, s)

Trong đó:

p: số chữ số trước dấu chấm thập phân (precision), p từ 1 đến 38 chữ số

s: số các chữ số tính từ dấu chấm thập phân về bên phải (scale), s từ -84 đến 127

NUMBER(p) số có dấu chấm thập phân cố định với precision bằng p và scale bằng 0

NUMBER số với dấu chấm động với precision bằng 38. Nhớ rằng scale không được áp dụng cho số với dấu chấm động.

Ví dụ sau cho thấy cách thức ORACLE lưu trữ dữ liệu kiểu số tùy theo cách định precision và scale khác nhau:

Dữ liệu thực Kiểu Lưu trữ
7456123.89 NUMBER 7456123.89
7456123.89 NUMBER(9) 7456123
7456123.89 NUMBER(9,2) 7456123.89
7456123.89 NUMBER(9,1) 7456123.8
7456123.89 NUMBER(6) Không hợp lệ
7456123.8 NUMBER(15,1) 7456123.8
7456123.89 NUMBER(7,-2) 7456100
7456123.89 NUMBER(-7,2) Không hợp lệ

5. FLOAT

Dùng để khai báo kiểu số dấu chấm động, với độ chính xác thập phân 38 hay độ chính xác nhị phân là 126.

FLOAT(b) Khai báo kiểu dấu chấm động với độ chính xác nhị phân là b, b từ 1 đến 126. Có thể chuyển từ độ chính xác nhị phận sang độ chính xác thập phân bằng cách nhân độ chính xác nhị phân với 0.30103.

6. LONG

Dùng để khai báo kiểu chuỗi ký tự với độ dài biến đổi, chiều dài tối đa của kiểu LONG là 2 gigabyte. Kiểu LONG thường được dùng để chứa các văn bản.

Có một số hạn chế khi dùng kiểu LONG:

  • Một table không thể chứa nhiều hơn một cột kiểu LONG.
  • Dữ liệu kiểu LONG không thể tham gia vào các ràng buộc toàn vẹn, ngoại trừ kiểm tra NULL và khác NULL.
  • Không thể index một cột kiểu LONG.
  • Không thể truyền tham số kiểu LONG cho hàm hoặc thủ tục.
  • Các hàm không thể trả về dữ liệu kiểu LONG.
  • Trong câu lệnh SQL có truy cập các cột kiểu LONG, thì việc cập nhật hoặc khóa các bảng chỉ cho phép trong cùng một CSDL

Ngoài ra, các cột kiểu LONG không được tham gia trong các thành phần sau của câu lệnh SQL:

  • Các mệnh đề
    WHERE
    ,
    GROUP BY
    ,
    ORDER BY
    ,
    CONNECT BY
    hoặc với tác tử
    DISTINCT
    trong câu lệnh
    SELECT
    .
  • Các hàm sử dụng trong câu lệnh SQL như SUBSTR, INSTR.
  • Trong danh sách lựa chọn của câu lệnh
    SELECT
    có sử dụng mệnh đề
    GROUP BY
    .
  • Trong danh sách lựa chọn của câu hỏi con, câu hỏi có sử dụng các toán tử tập hợp.
  • Trong danh sách lựa chọn của câu lệnh
    CREATE TABLE AS SELECT

7. DATE

Dùng để chứa dữ liệu ngày và thời gian. Mặc dù kiểu ngày và thời gian có thể được chứa trong kiểu CHAR và NUMBER.

Với giá trị kiểu DATE, những thông tin được lưu trữ gồm thế kỷ, năm, tháng, ngày, giờ, phút, giây. ORACLE không cho phép gán giá trị kiểu ngày trực tiếp, để gán giá trị kiểu ngày, bạn phải dùng TO_DATE để chuyển giá trị kiểu chuỗi ký tự hoặc kiểu số.

Nếu gán một giá trị kiểu ngày mà không chỉ thời gian thì thời gian mặc định là 12 giờ đêm, Nếu gán giá trị kiểu ngày mà không chỉ ra ngày, thì ngày mặc định là ngày đầu của tháng. Hàm SYSDATE cho biết ngày và thời gian hệ thống.

Tính toán đối với kiểu ngày:

Đối với dữ liệu kiểu ngày, bạn có thể thực hiện các phép toán cộng và trừ.

  • SYSDATE+1 ngày hôm sau
  • SYSDATE-7 cách đây một tuần
  • SYSDATE+(10/1440) mười phút sau
  • Ngày Julian: Là giá trị số cho biết số ngày kể từ ngày 1 tháng giêng năm 4712 trước công nguyên.
SELECT TO_CHAR (TO_DATE('01-01-1992', 'MM-DD-YYYY'), 'J') JULIAN FROM DUAL

Cho kết quả:

JULIAN

-----------------------------------------------

2448623

8. RAW và LONG RAW

Kiểu RAW và LONG RAW dùng để chứa các chuỗi byte, các dữ liệu nhị phân như hình ảnh, âm thanh. Các dữ liệu kiểu RAW chỉ có thể gán hoặc truy cập chứ không được thực hiện các thao tác như đối với chuỗi ký tự.

Kiểu RAW giống như kiểu VARCHAR2 và kiểu LONG RAW giống kiểu LONG, chỉ khác nhau ở chổ ORACLE tự động chuyển đổi các giá trị kiểu CHAR, VARCHAR2 và LONG giữa tập hợp ký tự của CSDL và tập ký tự của các ứng dụng.

9. ROWID

Mỗi mẫu tin trong CSDL có một địa chỉ có kiểu ROWID. ROWID gồm block.row.file, trong đó:

block : chuỗi hệ hexa cho biết block chứa row

row : chuỗi hệ hexa cho biết row trong block

file : chuỗi hệ hexa cho biết database file chứa block

0000000F.0000.0002

Row đầu tiên trong block 15 của data file thứ hai.

10. MLSLABEL

Kiểu MLSLABEL dùng để chứa label dạng nhị phân mà ORACLE dùng để đảm bảo hoạt động của bản thân hệ thống.

Các loại dữ liệu sử dụng trong SQL SERVER

Phần này sẽ được trình bày trong phần sau, khi học về SQL SERVER 2000.

Các dạng constraint gồm:

  • NOT NULL
  • UNIQUE
  • PRIMARYKEY
  • FOREIGN KEY (Referential)
  • CHECK

NOT NULL- Không rỗng

  • Khi có mệnh đề
    NOT NULL
    có trong định nghĩa của một cột thì ta bắt buộc thuộc tính này phải có giá trị. Nếu ta không chỉ thị gì trong định nghĩa của thuộc tính thì nó có thể có hoặc không có giá trị.
CREATE TABLE NHANVIEN(
	MaNV NUMBER(10) NOT NULL,
	TenNV CHAR(30)
)
    

UNIQUE-Duy nhất

  • Chỉ ra ràng buộc duy nhất, các giá trị của cột chỉ trong mệnh đề UNIQUE trong các row của table phải có giá trị khác biệt. Giá trị null là cho phép nêu UNIQUE dựa trên một cột.
CREATE TABLE NHANVIEN (
          MaNV NUMBER(10) NOT NULL,
          TenNV CHAR(30),
          DiachiNV CHAR(50))

CONSTRAINT UNQ_Ten_Diachi UNIQUE(Ten,Diachi))

PRIMARY KEY- Khoá chính

  • Chỉ ra ràng buộc duy nhất (giống
    UNIQUE
    ), tuy nhiên khoá là dạng khoá
    UNIQUE
    cấp cao nhất. Một table chỉ có thể có một
    PRIMARY KEY
    . Các giá trị trong PRIMARY KEY phải
    NOT NULL
    .

Cú pháp:

[CONSTRAINT constraint_name ]
PRIMARY KEY [CLUSTERED|NONCLUSTERED]
[( colname [,colname2 [...,colname16]])]
    
CREATE TABLE NHANVIEN
(
	MaNV char(10) NOT NULL primary key,
	TenNV char(30),
	DiachiNV char(50)
)

Hoặc ta có thể viết câu lệnh sau:

CREATE TABLE NHANVIEN
(
	MaNV char(10) NOT NULL,
	TenNV char(30),
	DiachiNV char(50),
	CONSTRAINT NV_P_K PRIMARY KEY (MaNV)
)

FOREIGN KEY-Khoá ngoại

Chỉ ra mối liên hệ ràng buộc tham chiếu giữa bảng này với bảng khác.

Từ khoá

ON DELETE CASCADE
được chỉ định trong dạng khoá này để chỉ khi dữ liệu cha bị xoá thì dữ liệu con cũng tự động bị xoá theo.

Cú pháp:

[CONSTRAINT constraint_name ]
[FOREIGN KEY (colname [,colname2 [...,colname16]])]
REFERENCES reference_table [(ref_colname[,ref_colname2[...,ref_colname 16]])]
    

Hai bảng DONVI và bảng NHANVIEN có mối quan hệ cha – con (1_N). Thuộc tính MaDV trong bảng NHANVIEN(bảng con) là khoá ngoại, được tham chiếu từ thuộc tính MaDV của bảng DONVI(bảng cha)

Ta tạo 2 bảng như sau

CREATE TABLE DONVI
(
	MaDV char(2) primary key,
	TenDV char(20) not null
)

CREATE TABLE NHANVIEN
(
	MaNV char(10) primary key,
	TenNV char(30) not null,
	Diachi char(50), 
	madv char(2)
	CONSTRAINT k_n_madv FOREIGN KEY(madv) REFERENCES DONVI(MaDV)
)

CHECK- Ràng buộc kiểm tra giá trị

Ràng buộc CHECK được sử dụng để yêu cầu các giá trị trong cột, hoặc khuôn dạng dữ liệu trong cột phải theo một quy tắc nào đó. Trên một cột có thể có nhiều ràng buộc này. Để khai báo một rang buộc CHECK cho một cột nào đó ta dùng cú pháp sau.

Cú pháp:

[CONSTRAINT constraint_name]
    CHECK (expression)
    

Trong đó, expression là một biểu thức logic. Sau khi có ràng buộc này, giá trị nhập vào cho cột phải thoả mãn điều kiện mới được chấp nhận.

CREATE TABLE NHANVIEN
(
	MaNV CHAR(10) NOT NULL PRIMARY KEY,
	TenNV CHAR(30),
	Luong NUMBER(10,2)
	CONSTRAINT CK_SAL CHECK(SAL>500)
)

DEFAULT-Mặc định

Ràng buộc DEFAULT được sử dụng để quy định giá trị mặc định cho một cột. Giá trị này sẽ tự động gán cho cột nếu người sử dụng không nhập vào khi bổ sung bản ghi.

Cú pháp:

[CONSTRAINT constraint_name]
    DEFAULT {const_expression/nonarguments_function/NULL}
    
CREATE TABLE NHANVIEN
(
	MaNV char(10) primary key,
	TenNV char(30) not null,
	Gioitinh char(3) DEFAULT ‘Nam’
)

Có thể sửa đổi cấu trúc của bảng hiện đang tồn tại bằng lệnh ALTER. Chúng ta có thể thêm một thuộc tính (cột) mới, thay đổi cấu trúc của một thuộc tính (cột ) đang có, bổ sung khoá, bổ sung ràng buộc.

Cú pháp tổng quát

ALTER TABLE table_name
    [ADD
    {col_name column_properties [column_constraints]
    [[,]table_constraint ] }
    [,{next_col_name|next_table_constraint}]...]
    [DROP
    [CONSTRAINT] constraint_name1
    [, constraint_name2]...]
    ALTER
    {col_name column_properties [column_constraints]
    [[,]table_constraint ] }
    [,{next_col_name|next_table_constraint}]...]
    

Thêm một ràng buộc CHECK

ALTER TABLE DONVI
ADD CONSTRAINT check_madv
CHECK (MaDV LIKE ‘[0-9][0-9]’)

Thêm một thuộc tính

Cú pháp:

ALTER TABLE <Tên_bảng> 
ADD COLUMN Tên_cột , Kiểu_cột[(size)])
    
ALTER TABLE DONVI
        ADD(GhiChu, VARCHAR(255))
Trong một số HQTCSDL ta cần phải thêm từ khoá COLUMN như sau:

Cú pháp:

ALTER TABLE <Tên_bảng> 
ADD COLUMN Tên_cột , Kiểu_cột[(size)] )
    
ALTER TABLE NHANVIEN
ADD COLUMN GhiChu Text(50));

Thay đổi kiểu của một thuộc tính

Cú pháp:

ALTER TABLE <Tên_bảng>
ALTER (Tên_cột, Kiểu_mới)
    
ALTER TABLE NHANVIEN
ALTER(HoTen, VARCHAR(40))
Trong một số HQTCSDL ta cần phải thêm từ khoá COLUMN như sau

Cú pháp:

ALTER TABLE <Tên_bảng> 
ALTER COLUMN Tên_cột , Kiểu_cột_mới[(size)]
    
ALTER TABLE NHANVIEN
ALTER COLUMN GhiChu Memo

Xóa một thuộc tính

Cú pháp:

ALTER TABLE <Tên_bảng>

DROP <Tên_thuộc_tính>
ALTER TABLE NHANVIEN
DROP GhiChu
Trong một số HQTCSDL ta cần phải thêm từ khoá COLUMN như sau

Cú pháp:

ALTER TABLE <Tên_bảng> 
    DROP COLUMN Tên_cột
    
ALTER TABLE NHANVIEN
DROP COLUMN GhiChu

Cú pháp:

DROP <Object_name>
DROP TABLE SINHVIEN
0