1. Trang chủ
  2. » Tất cả

Kiến thức SQL phỏng vấn Fsoft chắc chắn pass

16 9 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Kiến thức SQL phỏng vấn Fsoft chắc chắn pass
Tác giả Nhóm tác giả
Trường học Đại học Bách Khoa Hà Nội
Chuyên ngành Khoa học máy tính
Thể loại sách hướng dẫn
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 16
Dung lượng 69,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

I Ngôn ngữ định nghĩa DDL Tạo database CREATE DATABASE ; VD CREATE DATABASE db; Nhớ phải sử dụng master hoặc ghi USE master Xóa database USE master DROP DATABASE VD DROP D.

Trang 1

I Ngôn ngữ định nghĩa DDL

Tạo database

CREATE DATABASE <tên database>;

VD: CREATE DATABASE db;

Nhớ phải sử dụng master hoặc ghi USE master

Xóa database

USE master

DROP DATABASE <tên database>

VD: DROP DATABASE db;

Tạo bảng

- Cách 1:

USE <Tên database chứa bảng>

CREATE TABLE <tên bảng>(

Khai báo các cột và ràng buộc );

- Cách 2:

Chế độ master

CREATE TABLE <tên database>.<dbo>.<tên bảng>(

Khai báo các cột và ràng buộc )

VD: CREATE TABLE db.dbo.bang(

… )

Hoặc sử dụng cả dấu [] ở tên

Việc sử dụng dấu [] để tránh nhầm tên với các từ khóa của SQL

- Tạo bảng tự động sinh giá trị khóa chính

create table student(

id int primary key identity( , ),

name varchar(50),

sex varchar(50),

dob date,

age int,

jpa float

)

Xóa bảng

Cũng có hai cách như tạo bảng:

Cách 1:

USE <tên database chứa bảng>

DROP TABLE <tên bảng>

Cách 2: DROP <tên database>.<dbo>.<tên bảng>

Trang 2

Khai báo các thuộc tính bên trong bảng

Cú pháp: <tên cột> <kiểu dữ liệu> <các ràng buộc cho cột>;

VD: NAME VARCHAR(32) NOT NULL PRIMARY KEY,

- Mỗi khai báo cột của bảng được phân cách nhau bởi dấu phẩy

Cách tạo khóa chính

Có hai cách tạo khóa chính:

1 Đặt ngay sau khai báo tên cột

VD: ACCOUNT_ID INT PRIMARY KEY,

2 Sử dụng hàm PRIMARY KEY

VD: PRIMARY KEY(ACCOUNT_ID);

Bên trong dấu ngoặc có thể có nhiều khóa chính

Khóa ngoại tham chiếu đến khóa chính

Có 2 cách để tạo khóa ngoại

C1: đặt ngay sau khai báo thuộc tính từ khóa sau: REFERENCES <tên bảng>(tên thuộc tính tham chiếu đến)

VD: CUS_CODE CHAR(8) NOT NULL REFERENCES

CUSTOMER(CUS_CODE),

C2: sử dụng cú pháp sau:

FOREIGN KEY (tên khóa ngoại) REFERENCES <tên bảng cần tham chiếu đến> (tên thuộc tính tham chiếu đến)

VD: FOREIGN KEY(CUS_CODE) REFERENCES CUSTOMER(CUS_CODE)

Các ràng buộc cho cột

1 NOT NULL: không cho phép giá trị NULL trong cột

2 DEFAULT: nếu không gán giá trị thì mặc định là giá trị mặc định

VD: DEFAULT <giá trị mặc định>,

3 UNIQUE: giá trị của cột không được trùng lặp

4 ON UPDATE CASECADE: ràng buộc cho khóa ngoại, tức là sau khi khóa chính

bị thay đổi thì khóa ngoại tham chiếu đến cũng thay đổi

5 ON DELETE CASECADE: ràng buộc cho khóa ngoại và áp dụng cho thực thể yếu, tức một dòng của thực thể chính bị xóa thì sẽ gây ra việc xóa tự động dòng tương ứng trong thực thể yếu

6 CHECK(điều kiện cho cột ): kiểm tra điều kiện cho cột

Có 2 cách để ràng buộc cho cột:

C1: đặt ràng buộc ngay sau khai bao tên cột

C2: Sử dụng cú pháp: CONSTRAINT <tên ràng buộc> <ràng buộc>,

Có thể có ràng buộc cho nhiều biến

VD: CONSTRAINT CUS_UI1 UNIQUE (CUS_LNAME, CUS_FNAME);

Tên ràng buộc để sau này có thể dùng để xóa ràng buộc

Các kiểu dữ liệu

INT hoặc INTEGER: đây là số nguyên

REAL hoặc FLOAT: đây là số thực

Trang 3

CHAR(n): đây là kiểu ký tự có độ dài cố định, dù nhập ít hơn n thì bộ nhớ vẫn cấp n

ký tự

VARCHAR(n): chuỗi có độ dài thay đổi, max là n ký tự

NUMERIC(p,d): là kiểu số với độ dài p, và d chữ số sau dấu phẩy

DATE: kiều ngày tháng, định dạng: yyyy-mm-dd

TIME: thời gian có định dạng hh:mm:ss

DATETIME hoặc TIMESTAMP: cả ngày tháng và thời gian: yyyy-mm-dd hh:mm:ss

Câu lệnh ALTER

1 Xóa cột

Nếu cột không có ràng buộc CONSTRAINT thì ta sử dụng câu lệnh sau để xóa ALTER TABLE <tên bảng>

DROP COLUMN<tên cột>

Nếu cột có ràng buộc CONSTRAINT thì ta phải xóa ràng buộc trước rồi mới xóa cột Câu lệnh như sau

ALTER TABLE <tên bảng>

DROP CONSTRAINT <tên ràng buộc>,

COLUMN <tên cột>;

VD: ALTER TABLE bang

DROP CONSTRAINT ck1,

COLUMN luong;

2 Xóa khóa chính

Muốn xóa khóa chính thì phải tạo ràng buộc CONSTRAINT PRIMARY KEY và đặt tên cho ràng buộc

Đầu tiên xóa ràng buộc, sau đó xóa tên cột như phần xóa cột

Lưu ý là không được xóa hết cột, vì một bảng phải có ít nhất một cột

3 Thay đổi kiểu dữ liệu của cột

Trong trường hợp muốn thay đổi kiểu dữ liệu cho thuộc tính thì phải đáp ứng hai điều kiện: (1) cột thuộc tính phải rỗng, (2) không có thuộc tính khác tham chiếu đến

Cú pháp: ALTER TABLE <tên bảng>

MODIFY (<tên cột> <kiểu dữ liệu mới>)

VD: ALTER TABLE PRODUCT

MODIFY(V_CODE CHAR(5));

4 Thêm cột vào bảng

Cú pháp: ALTER TABLE <tên bảng>

ADD <tên cột> <kiểu dữ liệu> <ràng buộc nếu cần>

VD: ALTER TABLE bang

ADD newcot CHAR(8) CONSTRAINT ck1 UNIQUE(newcot);

5 Thêm ràng buộc CONSTRAINT

6 Thêm khóa chính, khóa ngoại

Trang 4

- Thêm khóa chính: Điều kiện chưa có khóa chính

Cú pháp: ALTER TABLE <tên bảng>

ADD PRIMARY KEY(<tên các cột>) Lưu ý: Ràng buộc cho cột được chọn làm khóa chính phải là NOT NULL

- Thêm khóa ngoại:

Cú pháp: ALTER TABLE <tên bảng>

ADD FOREIGN KEY(<tên khóa ngoại>) REFERENCES <tên bảng tham chiếu đến>(<tên cột tham chiếu đến>)

II Ngôn ngữ thao tác dữ liệu DML

1 Các câu lệnh không truy vấn

Thêm các bản ghi vào bảng

- Thêm vào tất cả các cột

Cú pháp: INSERT INTO <tên bảng> VALUES(<các giá trị của từng cột>)

VD: INSERT INTO bang VALUES(‘Nguyen Ba Nhat’, 123);

- Chỉ thêm một số cột, các cột còn lại là NULL

Cú pháp: INSERT INTO <tên bảng>(<tên các cột cần thêm>) VALUES(<giá trị các cột>)

VD: INSERT INTO bang(name) VALUES(‘Nguyen Ba Nhat’);

Có thể liệt kê các bản ghi trong () cách nhau bởi dấu phẩy sau từ VALUES

VD: INSERT INTO bang VALUES('nguyen thi e', 22),

('nguyen thi na', 33), ('le thi be', 18)

Xóa các bản ghi của bảng

Cú pháp: DELETE FROM <tên bảng> WHERE <biểu thức điều kiện>

Tức là những hàng nào thõa mãn điều kiện sẽ được xóa

Chú ý: Nếu không có WHERE đằng sau thì sẽ xóa tất cả bản ghi

Thay đổi dữ liệu của một hoặc nhiều hàng

Cú pháp: UPDATE <tên bảng>

SET <tên cột> = <giá trị mới> WHERE <biểu thức điều kiện>

Tức là thay đổi giá trị của cột thõa mãn điều kiện

VD: UPDATE bang

SET name = ‘Le Thi e’ WHERE luong = 22

Có thể thay đổi trên nhiều cột, các cột được liệt kê cách nhau bởi dấu phẩy

VD: UPDATE bang

SET name = ‘Le thi n’, luong = 11 WHERE luong IS NULL Nếu không có câu lệnh WHERE thì thay đổi sẽ được thực hiện trên tất cả các hàng

Lưu các thay đổi trong bảng

Các thay đổi sẽ được lưu vĩnh viễn, tránh được trường hợp dữ liệu bị mất khi đột ngột mất điện

Trang 5

Cú pháp: BEGIN TRAN <tên giao dịch>

<Các câu lệnh thay đổi>

COMMIT TRAN <tên giao dịch>

VD: BEGIN TRAN d

UPDATE bang

SET luong = 12 WHERE name = 'le thi n'

COMMIT TRAN d

Phục hồi nội dung của bảng

Nếu bạn chưa sử dụng câu lệnh COMMIT để lưu vĩnh viễn những thay đổi, bạn

có thể khôi phục lại dữ liệu trước đó nhờ câu lệnh ROLLBACK

BEGIN TRAN <tên giao dịch>

<Các câu lệnh để thay đổi>

ROLLBACK TRAN <tên giao dịch>

VD: BEGIN TRAN

UPDATE bang

SET luong = 14 WHERE name = 'le thi n'

ROLLBACK TRAN

2 Câu lệnh truy vấn

Chỉ có một lệnh là SELECT

Lấy tất cả các bản ghi của bảng

Cú pháp: SELECT * FROM <tên bảng> WHERE <điều kiện>

WHERE có thể có hoặc không

VD: SELECT*FROM bang

Lấy một số các cột

SELECT <tên cột 1>, <tên cột 2>, … FROM <tên bảng> WHERE <điều kiện>

So sánh về thời gian trong SQL

VD: SELECT*FROM bang WHERE ngaySinh > '19980512'

Sử dụng các cột tính toán và đổi tên các cột

Giả sử câu truy vấn cần xác định một giá trị không được lưu trữ vật lý mà được tính toán từ các thông số trong CSDL

VD: SELECT name, tuoi, ngaySinh, (toan+van)/2 AS TB

FROM bang

Lấy điểm trung bình được sinh ra từ cột toan và van trong CSDL đặt tên là TB với

từ khóa AS

Tính toán với thời gian

VD: SELECT name, tuoi, ngaySinh, toan, van, GETDATE()

- 20 AS [day] FROM bang

Các phép toán AND, OR, NOT

AND: và

OR: hoặc

Trang 6

NOT: phủ định

Các toán tử đặc biệt trong SQL

- BETWEEN: kiểm tra giá trị có nằm trong khoảng nào đó không

VD: SELECT * FROM bang WHERE toan BETWEEN 8 AND 9

- IS NULL: được dùng để xác định một thuộc tính có NULL không

- LIKE: dùng như REGEX trong java

VD: SELECT * FROM bang WHERE name LIKE 'nguyen%'

Liệt kê các học sinh có họ là nguyễn

Các regex như:

+ %: chỉ một chuỗi ký tự

VD: ‘B%’ chỉ chuỗi bắt đầu bằng B

‘%O%’ chỉ chuỗi chứa O

+ Ký hiệu _: chỉ ký tự còn thiếu:

VD: ‘AD_O’: chỉ một từ có 4 ký tự

+Ký hiệu[]: chỉ một trong các ký tự trong [] sẽ phù hợp

VD: ‘Sm[iy]th’ sẽ có 2 từ thõa mãn là Smith và Smyth

+ Ký hiệu [^]: bất kể ký tự nào ngoại trừ ký tự trong []

+Ký tự bỏ qua: Để tránh hiểu nhầm ký tự đặc biệt

Ví dụ muốn tìm a_ hoặc a%

VD: SELECT *

FROM nhanvien

WHERE secret_hint LIKE ‘ 123 !% 455 ’ ESCAPE ‘!’;

Tìm tất cả nhân viên có secret_hint là ‘123%455’, ký tự bỏ qua là ‘!’ đặt trước

‘%’

- IN: được sử dụng để xác định giá trị của thuộc tính có nằm trong một danh sách các giá trị

- EXISTS: Xác định sự tồn tại của truy vấn con

Cú pháp: WHERE EXITST(subquery)

Trả về true nếu subquery trả về ít nhất một hàng, trả về false nếu subquery không chứa hàng nào

Khi trả về true thì truy vấn cha mới được thực hiện

Sao chép từ bảng sang bảng

Đôi khi ta muốn sao chép dữ liệu từ bảng này sang bảng khác

Có 3 TH cần lưu ý:

Nếu tất cả cột ở bảng đích có thứ tự kiểu dữ liệu trùng với bảng nguồn và số lượng cột hai bảng bằng nhau thì có ví dụ sau:

INSERT INTO copy

SELECT * FROM bang

Trang 7

Nếu số lượng cột ở bảng đích bé hơn số lượng cột ở bảng nguồn và thứ tự các kiểu dữ liệu trùng với bảng nguồn thì ta dùng câu lệnh sau:

INSERT INTO copy

SELECT name, tuoi, ngaySinh FROM bang

Nếu thứ tự các kiểu dữ liệu ở bảng đích sắp xếp lộn xộn không tương ứng với bảng nguồn thì ta dùng câu lệnh sau:

INSERT INTO copy(ten, age, DOB) SELECT name, tuoi, ngaySinh FROM bang

Sắp xếp danh sách

Sử dụng câu lệnh ORDER BY

Cú pháp: SELECT <danh sách cột> FROM <tên bảng> [WHERE condition]

ORDER BY <danh sách cột> [ASC|DESC]

Trong [] nghĩa là có thể có hoặc không

ORDER BY áp dụng được cho cả kiểu dữ liệu số và chữ

VD: SELECT * FROM bang ORDER BY tuoi DESC

Sắp xếp học sinh theo thứ tự tuổi giảm dần

ASC theo sau thì là tăng dần, không có gì thì mặc định là tăng dần

Liệt kê các giá trị duy nhất

Sử dụng câu lệnh DISTINCT

Các giá trị trùng sẽ bị bỏ qua và chỉ lấy 1 giá trị duy nhất

Cú pháp: SELECT DISTINCT <danh sách cột> FROM <tên bảng> [các phần phụ sau]

VD: SELECT DISTINCT ten, tuoi, DOB FROM bang

Gom nhóm các kết quả truy vấn

Sử dụng câu lệnh GROUP BY

Cú pháp: SELECT <danh sách các cột>, ham_tong(<tên cột 1>) FROM <tên bảng> [WHERE condition] GROUP BY <tên cột 2>

Lưu ý: tên cột 2 phải thuộc <danh sách các cột> và không nằm trong tên cột 1 ham_tong có thể là các hàm sau: SUM, COUNT, MIN, MAX, AVG

VD: SELECT ten, MAX(tuoi) AS max_tuoi FROM bang GROUP

BY ten

Câu lệnh trên có nghĩa là liệt kê ra tên và max_tuoi ứng với tên Một tên có thể có nhiều tuổi khác nhau thì ta chỉ liệt kê 1 tên duy nhất cùng với tuổi lớn nhất ứng với tên đó

Các hàm số học:

SUM(cột): cột là 1 cột nào đó cần tính tổng, không được nhiều cột

Trang 8

COUNT(cột): cột là một cột nào đó cần đếm, nếu cột có giá trị NULL thì bỏ qua không đếm giá trị đó

MIN(cột): cột là cột cần tìm giá trị min

MAX(cột): tương tự nhưng tìm max

AVG(cột): cột là cột mà bạn muốn tính giá trị trung bình

Câu lệnh HAVING

Được dùng kết hợp với câu lệnh GROUP BY, là câu lệnh điều kiện, đứng sau GROUP BY, bắt buộc phải kết hợp với GROUP BY

Do câu lệnh WHERE không áp dụng được với các hàm nên ta dùng câu lệnh HAVING thay thế, để có thể đặt điều kiện cho các hàm

VD: SELECT ten, MAX(tuoi) AS max_tuoi FROM bang GROUP

BY ten HAVING MAX(tuoi) > 55

Liệt kê ra tên cùng với số tuổi lớn nhất của tên đó với điều kiện tuổi lớn nhất đó phải lớn hơn 55

Một khung nhìn VIEW

Là một bảng ảo trong cơ sở dữ liệu

Cú pháp: CREATE VIEW <tên view>

AS SELECT <danh sách cột> FROM <tên bảng> WHERE <điều kiện>

Khi dữ liệu của các cột của các bảng mà một VIEW tham chiếu đến được cập nhật hoặc được thêm vào thì dữ liệu trong VIEW cũng tự động cập nhật theo Hoặc khi dữ liệu ở VIEW được cập nhật hoặc thêm mới thì dữ liệu trong bảng cũng tự động cập nhật theo, các cột không có trong VIEW thì là NULL

VD: CREATE VIEW viewBang AS

SELECT ten, tuoi FROM bang

Một VIEW tên viewBang sẽ có 2 cột lấy từ bang là ten và tuoi

Câu lệnh UNION (toán tử hợp)

Để nối hai lệnh SELECT từ 2 bảng, trả về bảng gồm các hàng của cả hai bảng, nếu 2 hàng trùng nhau chỉ in 1 hàng, để in tất cả các hàng dùng UNION ALL Lưu ý là 2 hàng phải có cùng số lượng cột và kiểu dữ liệu của cột giống nhau VD: SELECT*FROM bang2

UNION

SELECT*FROM bang3

Kết nối đệ quy(một bảng kết nối với chính nó)

Ví dụ ta có một bảng EMPLOYEE để chỉ nhân viên trong một công ty, bảng này

có một khóa ngoại ManagerID tham chiếu đến khóa chính empID của chính nó.

Trang 9

Ta hiển thị ra ID, tên, tuổi của quản lý cùng ID, tên, tuổi của nhân viên được quản lý tương ứng.

Trong trường hợp này ta phải dùng câu lệnh AS để đổi tên bảng, mỗi tên ứng với quản lý và nhân viên Nếu không đổi tên, hệ quản trị CSDL sẽ không hiểu được và

sẽ gây ra lỗi.

Câu lệnh như sau:

SELECT m.empID, m.ten, m.tuoi, e.empID, e.ten, e.tuoi FROM employee AS e, employee AS m

WHERE e.managerID = m.empID ORDER BY m.empID

Kết nối ngoài(tương tự như trong đại số quan hệ)

Có 3 loại kết nối ngoài: (1) Kết nối ngoài trái, (2) Kết nối ngoài phải, (3) Kết nối

cả 2 bên

a Kết nối ngoài trái

Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn ở bên trái

Ví dụ có 2 quan hệ VENDOR và PRODUCT, một VENDOR có thể có nhiều PRODUCT

Hiển thị ra sản phẩm cùng nhà cung cấp sản phẩm đó

Câulệnh:

SELEC

TID_PRODUCT,PRODUCT.ten,PRODUCT.ID_VENDOR,VENDOR.t

en,diachi

FROM PRODUCT LEFT JOIN VENDOR ON PRODUCT.ID_VENDOR

= VENDOR.ID_VENDOR

b Kết nối ngoài phải

Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn bên phải

Câu lệnh:

SELECT VENDOR.ID_VENDOR, VENDOR.ten, diachi,

ID_PRODUCT, PRODUCT.ten

FROM PRODUCT RIGHT JOIN VENDOR ON PRODUCT.ID_VENDOR

= VENDOR.ID_VENDOR

c Kết nối ngoài cả hai bên

Trang 10

Gồm các bản ghi thõa mãn điều kiện kết nối cộng với các bản ghi không thõa mãn điều kiện kết nối ở cả hai bên Giá trị trống sẽ là NULL

Câu lệnh:

SELECT VENDOR.ID_VENDOR, VENDOR.ten, diachi, ID_PRODUCT, PRODUCT.ten

FROM VENDOR FULL JOIN PRODUCT ON VENDOR.ID_VENDOR = PRODUCT.ID_VENDOR

Toán tử giao (INTERSECT)

Trả về các bản ghi thuộc cả hai bảng

Cú pháp: SELECT cot1, cot2, cot3,… FROM <tên bảng 1>

INTERSECT SELECT cot1, cot2, cot3,….FROM <tên bảng 2>

Lưu ý: Hai bảng có cùng số lượng cot và kiểu dữ liệu giống nhau

VD: SELECT ID_VENDOR FROM VENDOR

INTERSECT SELECT ID_VENDOR FROM PRODUCT

Toán từ trừ (EXCEPT)

Chỉ lấy bản ghi ở câu lệnh SELECT bên trái mà không thuộc câu lệnh SELECT bên phải Điều kiện là hai SELECT phải khả hợp

Cú pháp: SELECT <các cột của bảng 1> FROM <tên bảng 1>

EXCEPT SELECT <các cột của bảng 2> FROM <tên bảng 2>

VD: SELECT ID_VENDOR FROM VENDOR

EXCEPT SELECT ID_VENDOR FROM PRODUCT

Các loại Join trong SQL:

1 Inner Join

K t qu t Inner join trong SQL là t p h p d li u trong đó giá tr dùng đ join hai ế ả ừ ậ ợ ữ ệ ị ể table v i nhau đ u có c hai b ng, nghĩa là k t qu là GIAO c a hai t p h p d ớ ề ở ả ả ế ả ủ ậ ợ ữ

li u.Các b n ghi ch xu t hi n m t trong hai b ng s b lo i.ệ ả ỉ ấ ệ ở ộ ả ẽ ị ạ

Ngày đăng: 28/03/2023, 16:28

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w