MySQL Documentation - Công nghệ Website | Đại học Bách Khoa, Đại học Đà Nẵng

MySQL Documentation - Công nghệ Website | Đại học Bách Khoa, Đại học Đà Nẵng giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng, ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học

My SQL Documentation (sưu tm)
Trang: 1
MYSQL DOCUMENTATION
(sưu tm)
Trong bài này, gi ã MySQL cài t s s b n đ đặ ến trong máy bi t cách
connect disconnect vào server r i. Xin nh c l connect vào server i, để
mysql, b n click vào file mysql.exe trong th c bin. Ho ư m c đánh l nh ngoài
dos nh sau: ư
shell> mysql -h <hostname> -u <username> -p;
Enter password: ******** (password c a b n)
1. Vào queries (yêu cu):
Phi chc ch n r ng b n ã connect vào server r i. đ
Lnh vào queries là: select. Ví d , xem version number hay ngày hi n để để
ti b n type nh ư sau:
mysql> select version(), current_date;
+--------------+--------------+
| version() | Current_date |
+--------------|--------------+
| 3.22.20a-log | 2002-03-29 |
+--------------+--------------+
1 row in set (0.00 sec)
mysql>
Gii thích:
1. Các l nh trong sql được kết thúc b u ch m phi d y (;). (tr 1 s nh nh l ư
quit là trường h p c bi t) đặ
2. Khi th c hi nh, mysql chuy n nó n l đế n server và yêu c u th c hi n l nh.
Do ó, "mysql>" đ cu i cùng báo hi u yêu c u ã c th c hi n. đ đượ
3. mysql a ra k t qu i d ng 1 b ng (table) g m các c t (column) và hàng đư ế dướ
(row). Hàng u tiên cho bi t Nhãn (label) c a tđầ ế ng trường (field). Các hàng
tiếp theo là kết qu.
4. mysql cũng đưa ra bao nhiêu hàng đượ c tr v (row in set) trong vòng
bao nhiêu giây (sec)
Ngoài ra, mysql c ng thũ đượ hi n c các phép tính n. đơn gi
Ví d :
mysql> select sin(pi()/4), (4+1)*5, mod(27,5);
Hãy th và b n s nh n c k t qu . đượ ế
Hơn n a, b n có th vào nhi nh trên cùng 1 hàng: u l
mysql> select version(); select now();
Chú ý, k t qu a ra là 2 b ng. ế đư
Lnh c ng không ph i lúc nào c ng c th c hi n trên cùng 1 hàng. Ví d : ũ ũ đượ
mysql> select
-> user()
-> ,
-> current_date;
+-----------------+--------------+
| user() | Current_date |
+-----------------+--------------+
| admin@localhost | 2002-03-29 |
+-----------------+--------------+
Chú ý d u nh c ã c đ đượ đổi t "mysql>" sang thành "->" khi b n đánh "enter"
mà không c k t thúc b ng d u ch m ph y ";". đượ ế
My SQL Documentation (sưu tm)
Trang: 2
Nếu b n mu n k t thúc dòng l nh mà không a ra k t qu (cancel) b n type ế đư ế
"\c". ví d:
mysql> select
-> user()
-> \c
mysql>
Mysql có 4 lo i d u nh c. Sau ây là ý ngh a c a các d u nh c: đ ĩ
Prompt Ý Nghĩa
mysql> Sn sàng cho 1 l nh m i
-> Ch cho hàng k p c a 1 l nh có nhiế tiế u hàng
'> Ch cho hành k p th c hi n b i 1 chu i trong dế tiế u nháy đơn
"> Ch cho hành k p th c hi n b i 1 chu i trong dế tiế u nháy đôi
ví d :
mysql> select user()
-> ;
hay
mysql> select * from my_table where name = "Thuy Lan age < 30;
">
Trong tr p trên, nường h ếu mu n b câ l nh, ph i làm nh sau: ư
">" \c
vì n u không ế đóng du ", mysql s ngh r ng câu l nh \c là ti p t c c a chu i ế
trước ó. đ
2. T d s do và s ng cơ liu (database)
Dùng lnh show để xem có nh ng database nào trên server.
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
Trong d trên, có 2 database trên server vi tên là mysql test. Để làm
vic vi database, b n c n ph i vào (access) nó b ng câu l nh use.
mysql> use test
Database changed
(bn thy y, lđấ nh use c ng nh l nh quit, không c n d u ; cu i dòng ũng gi ư
lnh)
a. T o database:
Dùng câu lnh create. Create database <name of database>;
mysql> create database menagerie;
Bây gi n show databases, databases "menagerie" b o s b n mi t trên
server. s d ng database m i t o, dùng l nh use. Để
mysql> use menageries;
Database changed
My SQL Documentation (sưu tm)
Trang: 3
(chú ý: có d u ; hay không có c ng không thành v n !) ũ đề
Bn ã có database r i, bây gi b n s t ng. đ o b
b. T ng (table) o b
Trước hết, b n mu n xem th xem có bao nhiêu b ng n t đã t i. B n dùng l nh
show tables.
mysql> show tables;
Empty set (0.00 sec)
Không có b ng nào t n t i. Giã s bây gi b n mu n t ng m i có tên là o b
"pet" g m các m c sau:
1. Tên (name)
2. owner (ng i nuôi) ườ
3. species (loài)
4. sex (gi i tính)
5. birth (ng y sinh)
6. death (ngày ch t) ế
Câu l nh nh sau: ư
mysql> create table pet (name varchar(20), owner varchar(20),
-> species varchar(20),
-> sex char(1), birth date, death date);
varchar dùng cho name, owner và species đây là các chui thay đổi. i Đối vơ
sex thì ta ch n 1 t c đủ ('m' for male 'f' for female). Dùng date
cho birth và death là điu hi n nhiên. Bây gi , b n th show tables xem sao?
Bn có th xem các thông tin v 1 b ng:
mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
Bng trên là bng trng, ngh a là ch a có record nào c l u cĩ ư đượ ư . B n c n
phi a record vào. đư
Đư a các giá tr vào b ng:
mysql> insert into pet
-> values ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Chú ý, giá tr cu i cùng là NULL, có ngh a là r ng. ĩ
Để xem các giá tr v a r i, b n dùng câu l nh nh sau: ư
mysql> select * from pet;
Bây gi b n hãy a vào b ng nh sau: đư ư
+----------+--------+---------+------+------------+------------+
My SQL Documentation (sưu tm)
Trang: 4
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+
Ngoài ra, b n c ũng th a record vào b dùng t p tin text để đư ng. Cách này
đơ ơ n gi n và d h n cách dùng câu l nh trên. B n dùng b ươt c ch ng trình biên
son văn b n nào (ví d notepad). Nhp các record trên vào (l u ý không như p
hàng đầu, ch nh p các record thôi). Các giá tr ca t ng record ph i cách ra
bi d theo thu "tab". Và th các giá tr t căn c t b n n đã làm trong ph
to b i v i các giá tr "NULL", b u tng. Đố n đánh ch "\N". L ư p tin đó thành
"pet.txt" vào trong th c "E:\mysql\data\menagerie\" (th c trên thư m ư m
khác v n, tùy theo cách cài i b đặt mysql ca t ng ng i). Sau ườ đó, bn a đư
file text đó vào b ng nh sau: ư
mysql> LOAD DATA INFILE "pet.txt" INTO TABLE pet;
(nếu dùng lnh trên mà báo l i, b n th dùng câu l nh sau, vì tùy theo phiên
bn b n ang s d đ ng, câu l nh có khác 1 chút)
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Để xóa record, b n dùng l nh delete nh sau: ư
mysql> DELETE FROM pet WHERE name = 'Chirpy';
Chú ý: nên h n ch dùng l nh delete vì l nh này không có h i l ế i bn có th t
s xóa không khi nó thc hi n. Vì th , n u dùng l nh nh sau: ế ế ư
mysql> DELETE FROM pet; #KHÔNG NÊN TH !!!
Là b t h t t d li u. n m ế t c
Chú ý: ngay con v t Bowser: ngày sinh l i i sau ngày ch t????! thay i đ ế Để đổ
giá tr c a record mà b đ n l ánh nh m vào nh tr ng h p trên, b n dùng câu ư ườ
lnh nh sau: ư
mysql> update pet set birth = '1989-08-31' where name = 'Bowser';
Tuy nhiên, v n còn 1 cách s i n u b n dùng t p tin ".txt". B n m t a l ế p tin
pet.txt ra, s a l i record b n s a. R i ánh l nh sau: n mu đ
mysql> set autocommit=1; #dùng t o nhanh lđể i 1 b ng.
mysql> delete from pet;
mysql> load data infile "pet.txt" into table pet;
3. Ch ng b nh: n t ng xác đị
Ví d :
a.
mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+
My SQL Documentation (sưu tm)
Trang: 5
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
b.
mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
đ đ ây, b n dùng các i u kin (condition) để th c hi c ch n vi n. Bn c ng có ũ
th k t h p các u ki n nhế đi ư sau:
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
hay:
mysql> SELECT * FROM pet WHERE species = "snake" OR species =
-> "bird";
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+
Các u ki n and và or có th c "tr n" (intermix) vào nhau: đi đượ
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
-> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
4. Ch n các hàng xác định (particular columns):
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
My SQL Documentation (sưu tm)
Trang: 6
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
ví d trên, b n ch ch n các hàng có tên là name và birth "display". để Để
tìm xem ai là ch c a t ưng con, b n l m nh sau:
mysql> SELECT owner FROM pet;
+--------+
| owner |
+--------+
| Harold |
| Gwen |
| Harold |
| Benny |
| Diane |
| Gwen |
| Gwen |
| Benny |
| Diane |
+--------+
Tuy nhiên, Có nhi u tên p l i. H được l đ đn b n không mu n i u ó, vì b n ch
cn bi t tên c a các chế đ thôi. Do ó, b n làm như sau:
mysql>SELECT DISTINCT owner FROM pet;
+--------+
| owner |
+--------+
| Benny |
| Diane |
| Gwen |
| Harold |
+--------+
Bn có th dùng WHERE để ế k t h p các hàng l i v i nhau. Ví d , b n ngày n mu
sinh ca chó và mèo thôi:
mysql> SELECT name, species, birth FROM pet
-> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+
| name | species | birth |
+--------+---------+------------+
| Fluffy | cat | 1993-02-04 |
| Claws | cat | 1994-03-17 |
| Buffy | dog | 1989-05-13 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
+--------+---------+------------+
5. S p: (sorting the rows) p xế
Vi nh ng m c ính c th nào ó, b n mu n s đ đ ế đượ đưp x p nh ng gì s c a ra,
bn dùng câu l nh: "sort by <Tên hàng> [desc] hay [asc]". Ví d :
My SQL Documentation (sưu tm)
Trang: 7
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
hoc, b n mu n s p x ếp theo tr t t t trên xu ng:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name | birth |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Claws | 1994-03-17 |
| Fluffy | 1993-02-04 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Buffy | 1989-05-13 |
+----------+------------+
DESC là DESCENDING, ASC là ASCENDING.
Bn c ng th u hàng cùng 1 lúc b t hũ sp xếp nhi ng cách kế p các ORDER BY
vi nhau. Ví d n s p x p ki u con v c, sau bn mu ế t trướ đó a đến ngày sinh c
tng con, b n sort nh sau: ư
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth
-> DESC;
+----------+---------+------------+
| name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 |
| Claws | cat | 1994-03-17 |
| Fluffy | cat | 1993-02-04 |
| Fang | dog | 1990-08-27 |
| Bowser | dog | 1989-08-31 |
| Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim | snake | 1996-04-29 |
+----------+---------+------------+
Chú ý: DESC ch áp dng cho hàng birth (có ngh a là ngay trĩ ước nó). Còn
species v n c s p x đượ ếp theo Asceding order.
6. Tính toán ngày: (Date Calculations)
My SQL Documentation (sưu tm)
Trang: 8
MySQL cung c p 1 s hàm tính ngày r t hu hi u. Thí d , b n c n tính s tu i
ca t ng con v t? Để tính tui c a t ng con v t, b n l n t i và try nãm hi
đi nãm sinh, sau đó, tr i 1 n u ngày hi n t i i tr c ngày sinh. Ví d : đ ế đ ướ
mysql> SELECT name, birth, current_date as now,
-> (year(current_date)-year(birth))
-> -(right(current_date,5)<right(birth,5))
-> AS age
-> FROM pet;
kết qu :
+----------+------------+--------------+------+
| name | birth | CURRENT_DATE | age |
+----------+------------+--------------+------+
| Fluffy | 1993-02-04 | 2001-08-29 | 8 |
| Claws | 1994-03-17 | 2001-08-29 | 7 |
| Buffy | 1989-05-13 | 2001-08-29 | 12 |
| Fang | 1990-08-27 | 2001-08-29 | 11 |
| Bowser | 1989-08-31 | 2001-08-29 | 11 |
| Chirpy | 1998-09-11 | 2001-08-29 | 2 |
| Whistler | 1997-12-09 | 2001-08-29 | 3 |
| Slim | 1996-04-29 | 2001-08-29 | 5 |
| Puffball | 1999-03-30 | 2001-08-29 | 2 |
+----------+------------+--------------+------+
Trong ó: year() l y giá tr a tđ nãm c ng giá tr mang ki u DATE. Hàm right
ly giá tr t bên ph i. Gi ng nh hàm right trong VB v y. ư
Hãy l y thêm 1 thí d n a:
mysql> SELECT name, birth, CURRENT_DATE,
-> (YEAR(CURRENT_DATE)-YEAR(birth))
-> - (RIGHT(CURRENT_DATE,5)<RIGHT(birth,5))
-> AS age
-> FROM pet ORDER BY name;
+----------+------------+--------------+------+
| name | birth | CURRENT_DATE | age |
+----------+------------+--------------+------+
| Bowser | 1989-08-31 | 2001-08-29 | 11 |
| Buffy | 1989-05-13 | 2001-08-29 | 12 |
| Chirpy | 1998-09-11 | 2001-08-29 | 2 |
| Claws | 1994-03-17 | 2001-08-29 | 7 |
| Fang | 1990-08-27 | 2001-08-29 | 11 |
| Fluffy | 1993-02-04 | 2001-08-29 | 8 |
| Puffball | 1999-03-30 | 2001-08-29 | 2 |
| Slim | 1996-04-29 | 2001-08-29 | 5 |
| Whistler | 1997-12-09 | 2001-08-29 | 3 |
+----------+------------+--------------+------+
Bây gi , b n mu n tính tu i c a nh ng con ã ch đ ế t r i:
mysql> SELECT name, birth, death,
-> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
-> AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+
My SQL Documentation (sưu tm)
Trang: 9
Vì NULL là giá tr c bi n ph i dùng câu l nh gi đặ t nên b nh như ngôn ng
nói nh trên. (v n này s c p sau) ư đề đề
Ngoài hàm year(), mysql còn cung c p 1 s hàm khác để tính ngày nh ư
MONTH() DAYOFMONTH(), . Ví d:
mysql> select month(now());
mysql> select dayofmonth(now());
Như v y, b n mu n l y tháng c a ngày sinh c a t ng con v t, b n làm nh sau: ư
mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name | birth | MONTH(birth) |
+----------+------------+--------------+
| Fluffy | 1993-02-04 | 2 |
| Claws | 1994-03-17 | 3 |
| Buffy | 1989-05-13 | 5 |
| Fang | 1990-08-27 | 8 |
| Bowser | 1989-08-31 | 8 |
| Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 |
| Slim | 1996-04-29 | 4 |
| Puffball | 1999-03-30 | 3 |
+----------+------------+--------------+
Do ó, tìm xem tháng t i có ph i cái sinh nh t nào không? gi s bây gi đ để
là tháng 4, b n mu n tìm sinh nh t trong tháng 5:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name | birth |
+-------+------------+
| Buffy | 1989-05-13 | (trùng h p th t, 13/5 c ng là SN c a tôi) ũ
+-------+------------+
Thế nh u bưng... Nế đ n ang tháng 12 th sao? ch ng l b i n l đi tìm
MONTH(birth) = 13 (???). M t u không th ph đi i không b n?
Do đó, mysql ã cung c p cho ta 1 hàm DATE_ADD(). Hàm này cho phép b n thêm đ
vào ngày nào ó 1 kho ng th i gian xác nh nào ó. Hãy th nh sau: đ đị đ ư
mysql> SELECT now(), Date_add(now(), interval 1 day) as them 1
-> ngay,
-> Date_add(now(), interval 1 month) as them 1 thang,
-> Date_add(now(), interval 1 year) as them 1 nam,
-> Date_add(now(), interval 1 hour) as them 1 gio,
-> Date_add(now(), interval 1 minute) as them 1 phut,
-> Date_add(now(), interval 1 second) as them 1 giay;
Tr l i ví d c a chúng ta, tìm xem tháng t để i có SN hay không, b n ch c n
so sánh giá tr tháng trong database v i tháng sau là xong:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1
-> MONTH));
My SQL Documentation (sưu tm)
Trang: 10
Tuy nhiên, có 1 cách khác hay h n, n u b n dùng hàm MOD(). Ch c h n các b n ơ ế
ai c ng ã t ng ng vũ đ đụ i h ...trãm l n trong các bm mod c i t p l p trình
ri nh ! Vì th , ví d sau ây th t d hi u. ế đ
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
7. Làm vic vi giá tr NULL:
Như ã nói ph c, chúng ta s quay l i vđ n trướ i giá tr NULL. NULL có ngh a ĩ
là "không bi t" (unknown). V vì nó c bi t nh v y, nên nó c ng c s ế đặ ư ũ đượ
dng 1 cách c bi t. đặ Để làm vi c v i NULL, chúng ta không s d ng các toán
t so sánh thông th ng nh <, >, <>, =. hiườ ư Để u rõ, xin th nh ư sau:
mysql> select 1 = null, 1 <> null, 1 < null, 1 > null;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
Như ã th y, kđ ết qu nh n t vô ngh a. Hãy s d ng nh sau: được th ĩ ư
mysql> select 1 is null, 1 is not null;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
Trong mysql, 0 ho c Null là FALSE, t t c c giá tr khác là TRUE. Do ó, đ
kết qu trên là u d hi u. đi
8. Pattern Matching (xin l i mình không tìm nào được t để d ch c ).
Hãy ngh Pattern Matching dùng tìm các record t. để đặc bi
SQL pattern matching cho phép b n dùng '_' gán v i 1 kí t riêng l để hay
dùng '%' để gán 1 lúc nhi u kí t . (hãy ngh gi ng nh '?' và '*' v y). Trong ĩ ư
MySQL, pattern là "case insensity". Ngoài ra, trong SQL, b n không dùng tóan
t =, <> cho pattern matching mà dùng LIKE ho c NOT LIKE.
Ví d :
mysql> SELECT * FROM pet where name = "b%";
Empty set(0.00)
mysql> SELECT * FROM pet where like 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Bn y s khác nhau gi a like va '=' ch a? Chú ý n c tr p đã th ư đế ường h
INSENSITY trên.
Để tìm tên các con v t kế t thúc b i 'fy':
mysql> SELECT * FROM pet WHERE name LIKE '%fy';
My SQL Documentation (sưu tm)
Trang: 11
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Tương t nh v ư y, bn hãy th tìm tên các con v t có ch 'w' trong nó?
Để tìm các con v t mà tên ch có 5 ch :
mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Ngoài ra, mysql còn s dng "extended regular expresions" cho pattern
matching. Khi s u này, b dng ki n thay LIKE NOT LIKE thành REGEXP
(REGular EXPression) và NOT REGEXP. (ho n c ng có th dùng RLIKE ho c NOT c b ũ
RLIKE c ng c, t t cũ đượ u là 1) đề
+ Vài kiu mu ca Extended regular expression":
o '.': gán cho tt c đơ các kí t n.
o l p kí t '[...]': gán v t c các kí t trong ngo c. Ví d i t ,
'[abc]' gán v i 'a','b' ho c 'c'. t tên cho 1 dãy các kí t , dùng d u '- Để đặ
'. Ví d : '[a-z]': gán v i t t c các kí t và '[0-9]' cho t t c các con s .
o '*': gán v i s không '0' ho c s các kí t t o nên nó. Ví d , 'x*' gán v i
tt c s các kí t x.
o g n các pattern sao cho nó gán vào u hoĐể đầ c cu a giá tr c n t m, ta i c
dùng '^' cho phn t đầ u và '$' cho ph n t cu i cùng.
Ví d : tìm tên b t u b ng t 'b': đầ
mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Chú ý, n u b n dùng version tr c ây, pattern dùng "case sensity" nên làm ế ướ đ để
ging nh trên ây, b n phư đ i dùng đến l p các kí t a l i nh sau: và s ư
mysql> SELECT * FROM pet WHERE name REGEXP '^[bB]';
Mt khác, n u dùng version 3.23.4 thì b ng có th ch nh cho mysql s ế n cũ đị
dng "case sensity" được b ng cách dùng t "BINARY". VÍ d :
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
Kết qu cho ra là: Empty set(0.02)
Nếu b n mu n tìm các pattern k t thúc b ế i "fy", dùng $. Ví d :
My SQL Documentation (sưu tm)
Trang: 12
mysql> SELECT * FROM pet WHERE name REGEXP BINARY 'fy$';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Để tìm các pattern có kí t 'w' và 'W' b n dùng nh sau: ư
mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Như v y, tìm các tên có chính xác 5 kí t nh để ư ví d trên thì b n làm nh ư
sau:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Tuy nhiên, ví d trên còn có cách vi t n h n b ng cách dùng ế đơn gi ơ
"repeat-n-times operator". Ki u nh sau: '{n}'. ư
Ví d :
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
Kết qu a ra gi ng nh đư ư đ trên. ây, xin chú ý các '.' c l p l i 5 l n. đượ
9. Đếm s hàng (Counting Rows)
Bn mu n tìm có bao nhiêu con v t b n ang có? hay có bao nhiêu con v t c a đ
tng ch ? Xin gi i thi u hàm count(). Ví d :
mysql> select count(*) from pet;
+----------+
| COUNT(*) |
+----------+
| 9 |
+----------+
Bn mu n tìm m i ch có bao nhiêu con v t?
mysql> SELECT owner, count(*) FROM pet GROUP By owner;
+--------+----------+
| owner | COUNT(*) |
+--------+----------+
| Benny | 2 |
My SQL Documentation (sưu tm)
Trang: 13
| Diane | 2 |
| Gwen | 3 |
| Harold | 2 |
+--------+----------+
S các con v t t ng lo i gii tính:
mysql> SELECT sex, count(*) FROM pet GROUP BY sex;
S các con v t t ng loài và t ng gi i tính:
mysql> SELECT species, sex, count(*) FROM pet GROUP BY species,
->sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| bird | NULL | 1 |
| bird | f | 1 |
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
| hamster | f | 1 |
| snake | m | 1 |
+---------+------+----------+
Bn ch mu n m các con chó và mèo thôi? Hãy th xem sao: đế
mysql> SELECT species, sex, count(*)
-> FROM pet
-> WHERE species = 'dog' OR species = 'cat'
-> GROUP BY species, sex;
+---------+------+----------+
| species | sex | COUNT(*) |
+---------+------+----------+
| cat | f | 1 |
| cat | m | 1 |
| dog | f | 1 |
| dog | m | 2 |
+---------+------+----------+
Sau cùng, hãy th đon l nh sau:
mysql> SELECT species, sex, count(*)
-> FROM pet
-> WHERE sex IS NOT NULL
-> GROUP BY species, sex;
Đ ơó là t t c nh ng gì c b n v MySQL. Nh ng các b n ã làm qua nhi u bài t p ư đ
v C s d li u r i, và th ng không ph i lúc nào c ng dùng 1 b ng. Nh ơ y r ũ ư
vy, chúng ta hãy cùng nhau nghiên c u MYSQL trên nhi u b ng.
10. Làm vi u bc vi nhi ng:
Bn mu n l u tr thêm thông tin v các con v t c a b n? Tr ng h ư ườ p này, b n
cn ph i có h n 1 b ng. Gi s b n mu n l ơ ưu thông tin v s ki n các con v t
ca b n th ng i n các v bác s thú y nào. Khi nào thì con c a chúng c ườ đ đế ĩ đượ
sinh ra. Như v y, b ng c a b n ph đ i áp ng nh ng yêu c u sau:
1. Tên c a t ng con v t bi t c s ki n nào là c a con nào. để ế đượ
2. Ngày báo cho bi t s ki n ó xđể ế đ y ra khi nào.
My SQL Documentation (sưu tm)
Trang: 14
3. 1 tr ng miêu t s n ườ để ki
4. 1 phân loi c ế a s ki n n u b n mun phân loi các s ki n ó. đ
Bây gi , ta hãy t o 1 b ng tên la event v i các m c k trên.
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type
-> VARCHAR(15),
-> remark VARCHAR(255));
Sau ó, dùng l nh insert a các d ki n sau vào: (ho c đ để đư để đơn gin h n, ơ
bn dùng notepad type vào nh sau và l u vào tư ư p tin event.txt. Sau ó, dùng đ
lnh sau a vào database server: để đư
mysql> load data infile "event.txt" into table event;
name date type remark
Fluffy 1995-05-15 litter 4 kittens, 3 female, 1 male
Buffy 1993-06-23 litter 5 puppies, 2 female, 3 male
Buffy 1994-06-19 litter 3 puppies, 3 female
Chirpy 1999-03-21 vet needed beak straightened
Slim 1997-08-03 vet broken rib
Bowser 1991-10-12 kennel
Fang 1991-10-12 kennel
Fang 1998-08-28 birthday Gave him a new chew toy
Claws 1998-03-17 birthday Gave him a new flea collar
Whistler 1998-12-09 birthday First birthday
Kim li: mysql> show tables;
mysql> select * from event;
Nếu m i th u t đề t p, xin hãy ti p t c. đẹ ế
Bây gi n mu n l y s tu, giã s b đi c a m i con v t khi con. Khi ó,
bn c n ngày sinh (mà trong b ng pet) ngày x y ra s ki n đó ( trong
bng event). Nh v y, bư ế n c n ph i k t hp 2 b ng l i nhau. i v
mysql> SELECT event.name,
-> (TO_DAYS(date) - TO_DAYS(birth))/356 AS age,
-> remark FROM pet, event
-> WHERE pet.name = event.name AND type = 'litter';
+--------+------+-----------------------------+
| name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy | 5.10 | 3 puppies, 3 female |
+--------+------+-----------------------------+
Có vài u c n chú ý sau: đi
o Sau FROM ph i có 2 table vì nó c n 2 b ng th c hi n l nh. để
o Khi k p t ng, b n ph i xác ng kia ết h nhiu b n c định b ng này gán v i b
như th nào. Trong d trên, nế ếu b n b đi câu l nh "pet.name=event.name"
thì m i chuy n s khác i r t nhi u. đ
o ct name xut hi n trong c 2 b ng, khi dùng đến nó, b i xác n cn ph
đị nh v trí c a nó (pet.name và event.name nh trong thí d trên). ư
o ây, xin gi i thi u hàm TO_DAYS(). ây là hàm tr v giá tr đ Đ ngày.
Bn th ánh dòng sau xem sao: đ
mysql> select (to_days(current_date));
| 1/17

Preview text:

My SQL Documentation (sưu tầm) MYSQL DOCUMENTATION (sưu tầm)
Trong bài này, giả sử bạn đã có MySQL cài đặt sẳn trong máy và biết cách
connect và disconnect vào server rồi. Xin nhắc lại, để connect vào server
mysql, bạn click vào file mysql.exe trong thư mục bin. Hoặc đánh lệnh ở ngoài dos như sau: shell> mysql -h -u -p;
Enter password: ******** (password của bạn)
1. Vào queries (yêu cầu):
Phải chắc chắn rằng bạn đã connect vào server rồi.
Lệnh để vào queries là: select. Ví dụ, để xem version number hay ngày hiện tại bạn type như sau:
mysql> select version(), current_date;
+--------------+--------------+ | version() | Current_date |
+--------------|--------------+ | 3.22.20a-log | 2002-03-29 |
+--------------+--------------+ 1 row in set (0.00 sec) mysql> Giải thích:
1. Các lệnh trong sql được kết thúc bởi dấu chấm phẩy (;). (trử 1 số lệnh như
quit là trường hợp đặc biệt)
2. Khi thực hiện lệnh, mysql chuyển nó đến server và yêu cầu thực hiện lệnh.
Do đó, "mysql>" ở cuối cùng báo hiệu yêu cầu đã được thực hiện.
3. mysql đưa ra kết quả dưới dạng 1 bảng (table) gồm các cột (column) và hàng
(row). Hàng đầu tiên cho biết Nhãn (label) của từng trường (field). Các hàng tiếp theo là kết quả.
4. mysql cũng đưa ra bao nhiêu hàng được trả về (row in set) và trong vòng bao nhiêu giây (sec)
Ngoài ra, mysql cũng thể hiện được các phép tính đơn giản. Ví dụ:
mysql> select sin(pi()/4), (4+1)*5, mod(27,5);
Hãy thử và bạn sẽ nhận được kết quả.
Hơn nữa, bạn có thể vào nhiều lệnh trên cùng 1 hàng:
mysql> select version(); select now();
Chú ý, kết quả đưa ra là 2 bảng.
Lệnh cũng không phải lúc nào cũng được thực hiện trên cùng 1 hàng. Ví dụ: mysql> select -> user() -> , -> current_date;
+-----------------+--------------+ | user() | Current_date |
+-----------------+--------------+
| admin@localhost | 2002-03-29 |
+-----------------+--------------+
Chú ý dấu nhắc đã được đổi từ "mysql>" sang thành "->" khi bạn đánh "enter"
mà không được kết thúc bằng dấu chấm phẩy ";". Trang: 1
My SQL Documentation (sưu tầm)
Nếu bạn muốn kết thúc dòng lệnh mà không đưa ra kết quả (cancel) bạn type "\c". ví dụ: mysql> select -> user() -> \c mysql>
Mysql có 4 loại dấu nhắc. Sau đây là ý nghĩa của các dấu nhắc: Prompt Ý Nghĩa mysql>
Sẳn sàng cho 1 lệnh mới ->
Chờ cho hàng kế tiếp của 1 lệnh có nhiều hàng '>
Chờ cho hành kế tiếp thực hiện bởi 1 chuỗi trong dấu nháy đơn ">
Chờ cho hành kế tiếp thực hiện bởi 1 chuỗi trong dấu nháy đôi ví dụ: mysql> select user() -> ; hay
mysql> select * from my_table where name = "Thuy Lan age < 30; ">
Trong trường hợp trên, nếu muốn bỏ câ lệnh, phải làm như sau: ">" \c
vì nếu không đóng dấu ", mysql sẽ nghỉ rằng câu lệnh \c là tiếp tục của chuổi trước đó.
2. Tạo và sử dụng cơ sở dữ liệu (database)
Dùng lệnh show để xem có những database nào trên server. mysql> show databases; +----------+ | Database | +----------+ | mysql | | test | +----------+
Trong ví dụ trên, có 2 database trên server với tên là mysql và test. Để làm
việc với database, bạn cần phải vào (access) nó bằng câu lệnh use. mysql> use test Database changed
(bạn thấy đấy, lệnh use cũng giống như lệnh quit, không cẩn dấu ; ở cuối dòng lệnh) a. Tạo database:
Dùng câu lệnh create. Create database ;
mysql> create database menagerie;
Bây giờ bạn show databases, databases "menagerie" bạn mới tạo sẽ có trên
server. Để sử dụng database mới tạo, dùng lệnh use. mysql> use menageries; Database changed Trang: 2
My SQL Documentation (sưu tầm)
(chú ý: có dấu ; hay không có cũng không thành vấn đề!)
Bạn đã có database rồi, bây giờ bạn sẽ tạo bảng. b. Tạo bảng (table)
Trước hết, bạn muốn xem thử xem có bao nhiêu bảng đã tồn tại. Bạn dùng lệnh show tables. mysql> show tables; Empty set (0.00 sec)
Không có bảng nào tồn tại. Giã sử bây giờ bạn muốn tạo bảng mới có tên là "pet" gồm các mục sau: 1. Tên (name) 2. owner (người nuôi) 3. species (loài) 4. sex (giới tính) 5. birth (ngảy sinh) 6. death (ngày chết) Câu lệnh như sau:
mysql> create table pet (name varchar(20), owner varchar(20), -> species varchar(20),
-> sex char(1), birth date, death date);
varchar dùng cho name, owner và species vì đây là các chuỗi thay đổi. Đối vơi
sex thì ta chỉ cẩn 1 kí tự là đủ ('m' for male và 'f' for female). Dùng date
cho birth và death là điều hiển nhiên. Bây giờ, bạn thử show tables xem sao?
Bạn có thể xem các thông tin về 1 bảng: mysql> describe pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
Bảng trên là bảng trống, nghĩa là chưa có record nào được lưu cả. Bạn cần phải đưa record vào.
Đưa các giá trị vào bảng: mysql> insert into pet
-> values ('Puffball','Diane','hamster','f','1999-03-30',NULL);
Chú ý, giá trị cuối cùng là NULL, có nghĩa là rỗng.
Để xem các giá trị vừa rồi, bạn dùng câu lệnh như sau: mysql> select * from pet;
Bây giở bạn hãy đưa vào bảng như sau:
+----------+--------+---------+------+------------+------------+ Trang: 3
My SQL Documentation (sưu tầm)
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1998-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+--------+---------+------+------------+------------+
Ngoài ra, bạn cũng có thể dùng tập tin text để đưa record vào bảng. Cách này
đơn giản và dễ hơn cách dùng câu lệnh trên. Bạn dùng bất cứ chương trình biên
soạn văn bản nào (ví dụ notepad). Nhập các record trên vào (lưu ý không nhập
hàng đầu, chỉ nhập các record thôi). Các giá trị của từng record phải cách ra
bởi dấu "tab". Và thứ tự các giá trị căn cứ theo thứ tự bạn đã làm trong phần
tạo bảng. Đối với các giá trị "NULL", bạn đánh chữ "\N". Lưu tập tin đó thành
"pet.txt" vào trong thư mục "E:\mysql\data\menagerie\" (thư mục trên có thể
khác với bạn, tùy theo cách cài đặt mysql của từng người). Sau đó, bạn đưa
file text đó vào bảng như sau:
mysql> LOAD DATA INFILE "pet.txt" INTO TABLE pet;
(nếu dùng lệnh trên mà báo lổi, bạn thử dùng câu lệnh sau, vì tùy theo phiên
bản bạn đang sử dụng, câu lệnh có khác 1 chút)
mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
Để xóa record, bạn dùng lệnh delete như sau:
mysql> DELETE FROM pet WHERE name = 'Chirpy';
Chú ý: nên hạn chế dùng lệnh delete vì lệnh này không có hỏi lại bạn có thật
sự xóa không khi nó thực hiện. Vì thế, nếu dùng lệnh như sau: mysql> DELETE FROM pet; #KHÔNG NÊN THỬ!!!
Là bạn mất hết tất cả dữ liệu.
Chú ý: ngay con vật Bowser: ngày sinh lại đi sau ngày chết????! Để thay đổi
giá trị của record mà bạn lỡ đánh nhầm vào như trường hợp trên, bạn dùng câu lệnh như sau:
mysql> update pet set birth = '1989-08-31' where name = 'Bowser';
Tuy nhiên, vẫn còn 1 cách sửa lại nếu bạn dùng tập tin ".txt". Bạn mở tập tin
pet.txt ra, sửa lại record bạn muốn sửa. Rồi đánh lệnh sau: mysql> set autocommit=1;
#dùng để tạo nhanh lại 1 bảng. mysql> delete from pet;
mysql> load data infile "pet.txt" into table pet;
3. Chọn từng bảng xác định: Ví dụ: a.
mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+-------+---------+------+------------+------------+ Trang: 4
My SQL Documentation (sưu tầm)
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+ b.
mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
Ở đây, bạn dùng các điều kiện (condition) để thực hiện việc chọn. Bạn cũng có
thể kết hợp các điểu kiện như sau:
mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+ hay:
mysql> SELECT * FROM pet WHERE species = "snake" OR species = -> "bird";
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+
Các điều kiện and và or có thể được "trộn" (intermix) vào nhau:
mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
-> OR (species = "dog" AND sex = "f");
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
4. Chọn các hàng xác định (particular columns):
mysql> SELECT name, birth FROM pet; +----------+------------+ | name | birth | +----------+------------+ | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Buffy | 1989-05-13 | Trang: 5
My SQL Documentation (sưu tầm) | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Puffball | 1999-03-30 | +----------+------------+
Ở ví dụ trên, bạn chỉ chọn các hàng có tên là name và birth để "display". Để
tìm xem ai là chủ của từng con, bạn lảm như sau:
mysql> SELECT owner FROM pet; +--------+ | owner | +--------+ | Harold | | Gwen | | Harold | | Benny | | Diane | | Gwen | | Gwen | | Benny | | Diane | +--------+
Tuy nhiên, Có nhiều tên được lập lại. Hẳn bạn không muốn điều đó, vì bạn chỉ
cần biết tên của các chủ thôi. Do đó, bạn làm như sau:
mysql>SELECT DISTINCT owner FROM pet; +--------+ | owner | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+
Bạn có thể dùng WHERE để kết hợp các hàng lại với nhau. Ví dụ, bạn muốn ngày
sinh của chó và mèo thôi:
mysql> SELECT name, species, birth FROM pet
-> WHERE species = "dog" OR species = "cat";
+--------+---------+------------+ | name | species | birth |
+--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 |
+--------+---------+------------+
5. Sắp xếp: (sorting the rows)
Với những mục đính cụ thể nào đó, bạn muốn sắp xếp những gì sẽ được đưa ra,
bạn dùng câu lệnh: "sort by [desc] hay [asc]". Ví dụ: Trang: 6
My SQL Documentation (sưu tầm)
mysql> SELECT name, birth FROM pet ORDER BY birth; +----------+------------+ | name | birth | +----------+------------+ | Buffy | 1989-05-13 | | Bowser | 1989-08-31 | | Fang | 1990-08-27 | | Fluffy | 1993-02-04 | | Claws | 1994-03-17 | | Slim | 1996-04-29 | | Whistler | 1997-12-09 | | Chirpy | 1998-09-11 | | Puffball | 1999-03-30 | +----------+------------+
hoặc, bạn muốn sắp xếp theo trật tự từ trên xuống:
mysql> SELECT name, birth FROM pet ORDER BY birth DESC; +----------+------------+ | name | birth | +----------+------------+ | Puffball | 1999-03-30 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | | Slim | 1996-04-29 | | Claws | 1994-03-17 | | Fluffy | 1993-02-04 | | Fang | 1990-08-27 | | Bowser | 1989-08-31 | | Buffy | 1989-05-13 | +----------+------------+
DESC là DESCENDING, ASC là ASCENDING.
Bạn cũng có thể sắp xếp nhiều hàng cùng 1 lúc bằng cách kết hợp các ORDER BY
với nhau. Ví dụ bạn muốn sắp xếp kiểu con vật trước, sau đó đến ngày sinh của
từng con, bạn sort như sau:
mysql> SELECT name, species, birth FROM pet ORDER BY species, birth -> DESC;
+----------+---------+------------+ | name | species | birth |
+----------+---------+------------+
| Chirpy | bird | 1998-09-11 |
| Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | | Buffy | dog | 1989-05-13 |
| Puffball | hamster | 1999-03-30 | | Slim | snake | 1996-04-29 |
+----------+---------+------------+
Chú ý: DESC chỉ áp dụng cho hàng birth (có nghĩa là ngay trước nó). Còn
species vẫn được sắp xếp theo Asceding order.
6. Tính toán ngày: (Date Calculations) Trang: 7
My SQL Documentation (sưu tầm)
MySQL cung cấp 1 số hàm tính ngày rất hữu hiệu. Thí dụ, bạn cần tính số tuổi
của từng con vật? Để tính tuổi của từng con vật, bạn lấy nãm hiện tại và trừ
đi nãm sinh, sau đó, trừ đi 1 nếu ngày hiện tại đi trước ngày sinh. Ví dụ:
mysql> SELECT name, birth, current_date as now,
-> (year(current_date)-year(birth))
-> -(right(current_date,5) -> AS age -> FROM pet; kết quả:
+----------+------------+--------------+------+
| name | birth | CURRENT_DATE | age |
+----------+------------+--------------+------+
| Fluffy | 1993-02-04 | 2001-08-29 | 8 |
| Claws | 1994-03-17 | 2001-08-29 | 7 |
| Buffy | 1989-05-13 | 2001-08-29 | 12 |
| Fang | 1990-08-27 | 2001-08-29 | 11 |
| Bowser | 1989-08-31 | 2001-08-29 | 11 |
| Chirpy | 1998-09-11 | 2001-08-29 | 2 |
| Whistler | 1997-12-09 | 2001-08-29 | 3 |
| Slim | 1996-04-29 | 2001-08-29 | 5 |
| Puffball | 1999-03-30 | 2001-08-29 | 2 |
+----------+------------+--------------+------+
Trong đó: year() lấy giá trị nãm của từng giá trị mang kiểu DATE. Hàm right
lấy giá trị từ bên phải. Giống như hàm right trong VB vậy.
Hãy lấy thêm 1 thí dụ nữa:
mysql> SELECT name, birth, CURRENT_DATE,
-> (YEAR(CURRENT_DATE)-YEAR(birth))
-> - (RIGHT(CURRENT_DATE,5) -> AS age
-> FROM pet ORDER BY name;
+----------+------------+--------------+------+
| name | birth | CURRENT_DATE | age |
+----------+------------+--------------+------+
| Bowser | 1989-08-31 | 2001-08-29 | 11 |
| Buffy | 1989-05-13 | 2001-08-29 | 12 |
| Chirpy | 1998-09-11 | 2001-08-29 | 2 |
| Claws | 1994-03-17 | 2001-08-29 | 7 |
| Fang | 1990-08-27 | 2001-08-29 | 11 |
| Fluffy | 1993-02-04 | 2001-08-29 | 8 |
| Puffball | 1999-03-30 | 2001-08-29 | 2 |
| Slim | 1996-04-29 | 2001-08-29 | 5 |
| Whistler | 1997-12-09 | 2001-08-29 | 3 |
+----------+------------+--------------+------+
Bây giờ, bạn muốn tính tuổi của những con đã chết rổi:
mysql> SELECT name, birth, death,
-> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5) -> AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+ Trang: 8
My SQL Documentation (sưu tầm)
Vì NULL là giá trị đặc biệt nên bạn phải dùng câu lệnh giốnh như ngôn ngữ
nói như trên. (vấn đề này sẽ đề cập sau)
Ngoài hàm year(), mysql còn cung cấp 1 số hàm khác để tính ngày như
MONTH(), DAYOFMONTH(). Ví dụ:
mysql> select month(now());
mysql> select dayofmonth(now());
Như vậy, bạn muốn lấy tháng của ngày sinh của từng con vật, bạn làm như sau:
mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name | birth | MONTH(birth) |
+----------+------------+--------------+ | Fluffy | 1993-02-04 | 2 | | Claws | 1994-03-17 | 3 | | Buffy | 1989-05-13 | 5 | | Fang | 1990-08-27 | 8 | | Bowser | 1989-08-31 | 8 | | Chirpy | 1998-09-11 | 9 |
| Whistler | 1997-12-09 | 12 | | Slim | 1996-04-29 | 4 | | Puffball | 1999-03-30 | 3 |
+----------+------------+--------------+
Do đó, để tìm xem tháng tới có phải cái sinh nhật nào không? giả sử bây giờ
là tháng 4, bạn muốn tìm sinh nhật trong tháng 5:
mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name | birth | +-------+------------+
| Buffy | 1989-05-13 | (trùng hợp thật, 13/5 cũng là SN của tôi) +-------+------------+
Thế nhưng... Nếu bạn đang ở tháng 12 thỉ sao? chẳng lẽ bạn lại đi tìm
MONTH(birth) = 13 (???). Một điểu không thể phải không bạn?
Do đó, mysql đã cung cấp cho ta 1 hàm DATE_ADD(). Hàm này cho phép bạn thêm
vào ngày nào đó 1 khoảng thời gian xác định nào đó. Hãy thử như sau:
mysql> SELECT now(), Date_add(now(), interval 1 day) as them 1 -> ngay,
-> Date_add(now(), interval 1 month) as them 1 thang,
-> Date_add(now(), interval 1 year) as them 1 nam,
-> Date_add(now(), interval 1 hour) as them 1 gio,
-> Date_add(now(), interval 1 minute) as them 1 phut,
-> Date_add(now(), interval 1 second) as them 1 giay;
Trở lại ví dụ của chúng ta, để tìm xem tháng tới có SN hay không, bạn chỉ cần
so sánh giá trị tháng trong database với tháng sau là xong:
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 -> MONTH)); Trang: 9
My SQL Documentation (sưu tầm)
Tuy nhiên, có 1 cách khác hay hơn, nếu bạn dùng hàm MOD(). Chắc hẳn các bạn
ai cũng đã từng đụng với hảm mod cả...trãm lẩn trong các bải tập lập trình
rổi nhỉ! Vì thế, ví dụ sau đây thật dễ hiểu.
mysql> SELECT name, birth FROM pet
-> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
7. Làm việc với giá trị NULL:
Như đã nói ở phẩn trước, chúng ta sẽ quay lại với giá trị NULL. NULL có nghĩa
là "không biết" (unknown). Vả vì nó đặc biệt như vậy, nên nó cũng được sử
dụng 1 cách đặc biệt. Để làm việc với NULL, chúng ta không sử dụng các toán
tử so sánh thông thường như <, >, <>, =. Để hiểu rõ, xin thử như sau:
mysql> select 1 = null, 1 <> null, 1 < null, 1 > null;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+ | NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
Như đã thấy, kết quả nhận được thật vô nghĩa. Hãy sử dụng như sau:
mysql> select 1 is null, 1 is not null; +-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ | 0 | 1 | +-----------+---------------+
Trong mysql, 0 hoặc Null là FALSE, tất cả các giá trị khác là TRUE. Do đó,
kết quả trên là điều dễ hiểu.
8. Pattern Matching (xin lỗi mình không tìm được từ nào để dịch cả).
Hãy nghỉ Pattern Matching dùng để tìm các record đặc biệt.
SQL pattern matching cho phép bạn dùng '_' để gán với 1 kí tự riêng lẻ hay
dùng '%' để gán 1 lúc nhiều kí tự. (hãy nghĩ giống như '?' và '*' vậy). Trong
MySQL, pattern là "case insensity". Ngoài ra, trong SQL, bạn không dùng tóan
tử =, <> cho pattern matching mà dùng LIKE hoặc NOT LIKE. Ví dụ:
mysql> SELECT * FROM pet where name = "b%"; Empty set(0.00)
mysql> SELECT * FROM pet where like 'b%';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Bạn đã thấy sự khác nhau giữa like va '=' chưa? Chú ý đến cả trường hợp INSENSITY ở trên.
Để tìm tên các con vật kết thúc bởi 'fy':
mysql> SELECT * FROM pet WHERE name LIKE '%fy'; Trang: 10
My SQL Documentation (sưu tầm)
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Tương tự như vậy, bạn hãy thử tìm tên các con vật có chữ 'w' trong nó?
Để tìm các con vật mà tên chỉ có 5 chữ:
mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Ngoài ra, mysql còn sử dụng "extended regular expresions" cho pattern
matching. Khi sử dụng kiểu này, bạn thay LIKE và NOT LIKE thành REGEXP
(REGular EXPression) và NOT REGEXP. (hoặc bạn cũng có thể dùng RLIKE hoặc NOT
RLIKE cũng được, tất cả đều là 1)
+ Vài kiều mẫu của Extended regular expression":
o '.': gán cho tất cả các kí tự đơn.
o lớp kí tự '[...]': gán với tất cả các kí tự trong ngoặc. Ví dụ,
'[abc]' gán với 'a','b' hoặc 'c'. Để đặt tên cho 1 dãy các kí tự, dùng dấu '-
'. Ví dụ: '[a-z]': gán với tất cả các kí tự và '[0-9]' cho tất cả các con số.
o '*': gán với số không '0' hoặc số các kí tự tạo nên nó. Ví dụ, 'x*' gán với
tất cả số các kí tự x.
o Để gắn các pattern sao cho nó gán vào đầu hoặc cuối của giá trị cần tỉm, ta
dùng '^' cho phần tử đầu và '$' cho phần tử cuối cùng.
Ví dụ: tìm tên bắt đầu bằng từ 'b':
mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+
Chú ý, nếu bạn dùng version trước đây, pattern dùng "case sensity" nên để làm
giống như trên đây, bạn phải dùng đến lớp các kí tự và sửa lại như sau:
mysql> SELECT * FROM pet WHERE name REGEXP '^[bB]';
Mặt khác, nếu dùng version 3.23.4 thì bạn cũng có thể chỉ định cho mysql sử
dụng "case sensity" được bằng cách dùng từ "BINARY". VÍ dụ:
mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
Kết quả cho ra là: Empty set(0.02)
Nếu bạn muốn tìm các pattern kết thúc bởi "fy", dùng $. Ví dụ: Trang: 11
My SQL Documentation (sưu tầm)
mysql> SELECT * FROM pet WHERE name REGEXP BINARY 'fy$';
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+
Để tìm các pattern có kí tự 'w' và 'W' bạn dùng như sau:
mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+
Như vậy, để tìm các tên có chính xác 5 kí tự như ví dụ trên thì bạn làm như sau:
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
Tuy nhiên, ví dụ trên còn có cách viết đơn giản hơn bằng cách dùng
"repeat-n-times operator". Kiểu như sau: '{n}'. Ví dụ:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
Kết quả đưa ra giống như trên. Ở đây, xin chú ý các '.' được lập lại 5 lẩn.
9. Đếm số hàng (Counting Rows)
Bạn muốn tìm có bao nhiêu con vật bạn đang có? hay có bao nhiêu con vật của
từng chủ? Xin giới thiệu hàm count(). Ví dụ:
mysql> select count(*) from pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+
Bạn muốn tìm mỗi chủ có bao nhiêu con vật?
mysql> SELECT owner, count(*) FROM pet GROUP By owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | Trang: 12
My SQL Documentation (sưu tầm) | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
Số các con vật từng loại giới tính:
mysql> SELECT sex, count(*) FROM pet GROUP BY sex;
Số các con vật từng loài và từng giới tính:
mysql> SELECT species, sex, count(*) FROM pet GROUP BY species, ->sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
Bạn chỉ muốn đếm các con chó và mèo thôi? Hãy thử xem sao:
mysql> SELECT species, sex, count(*) -> FROM pet
-> WHERE species = 'dog' OR species = 'cat' -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
Sau cùng, hãy thử đoạn lệnh sau:
mysql> SELECT species, sex, count(*) -> FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex;
Đó là tất cả những gì cơ bản về MySQL. Nhưng các bạn đã làm qua nhiều bài tập
về Cơ sở dữ liệu rồi, và thấy rằng không phải lúc nào cũng dùng 1 bảng. Như
vậy, chúng ta hãy cùng nhau nghiên cứu MYSQL trên nhiều bảng.
10. Làm việc với nhiều bảng:
Bạn muốn lưu trữ thêm thông tin về các con vật của bạn? Trường hợp này, bạn
cần phải có hơn 1 bảng. Giả sử bạn muốn lưu thông tin về sự kiện các con vật
của bạn thường đi đến các vị bác sĩ thú y nào. Khi nào thì con của chúng được
sinh ra. Như vậy, bảng của bạn phải đáp ứng những yêu cầu sau:
1. Tên của từng con vật để biết được sự kiện nào là của con nào.
2. Ngày để báo cho biết sự kiện đó xảy ra khi nào. Trang: 13
My SQL Documentation (sưu tầm)
3. 1 trường để miêu tả sự kiện
4. 1 phân loại của sự kiện nếu bạn muốn phân loại các sự kiện đó.
Bây giờ, ta hãy tạo 1 bảng tên la event với các mục kể trên.
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type -> VARCHAR(15), -> remark VARCHAR(255));
Sau đó, dùng lệnh insert để đưa các dữ kiện sau vào: (hoặc để đơn giản hơn,
bạn dùng notepad type vào như sau và lưu vào tập tin event.txt. Sau đó, dùng
lệnh sau để đưa vào database server:
mysql> load data infile "event.txt" into table event; name date type remark Fluffy 1995-05-15 litter 4 kittens, 3 female, 1 male Buffy 1993-06-23 litter 5 puppies, 2 female, 3 male Buffy 1994-06-19 litter 3 puppies, 3 female Chirpy 1999-03-21 vet needed beak straightened Slim 1997-08-03 vet broken rib Bowser 1991-10-12 kennel Fang 1991-10-12 kennel Fang 1998-08-28
birthday Gave him a new chew toy Claws 1998-03-17
birthday Gave him a new flea collar Whistler 1998-12-09 birthday First birthday
Kiểm lại: mysql> show tables;
mysql> select * from event;
Nếu mọi thứ đều tốt đẹp, xin hãy tiếp tục.
Bây giở, giã sử bạn muốn lấy số tuổi của mỗi con vật khi nó có con. Khi đó,
bạn cẩn ngày sinh (mà ở trong bảng pet) và ngày xảy ra sự kiện đó (ở trong
bảng event). Như vậy, bạn cần phải kết hợp 2 bảng lại với nhau. mysql> SELECT event.name,
-> (TO_DAYS(date) - TO_DAYS(birth))/356 AS age, -> remark FROM pet, event
-> WHERE pet.name = event.name AND type = 'litter';
+--------+------+-----------------------------+ | name | age | remark |
+--------+------+-----------------------------+
| Fluffy | 2.27 | 4 kittens, 3 female, 1 male |
| Buffy | 4.12 | 5 puppies, 2 female, 3 male |
| Buffy | 5.10 | 3 puppies, 3 female |
+--------+------+-----------------------------+
Có vài điều cẩn chú ý sau:
o Sau FROM phải có 2 table vì nó cần 2 bảng để thực hiện lệnh.
o Khi kết hợp từ nhiều bảng, bạn cẩn phải xác định bảng này gán với bảng kia
như thế nào. Trong ví dụ trên, nếu bạn bỏ đi câu lệnh "pet.name=event.name"
thì mọi chuyện sẽ khác đi rất nhiều.
o Vì cột name xuất hiện trong cả 2 bảng, khi dùng đến nó, bạn cẩn phải xác
định vị trí của nó (pet.name và event.name như trong thí dụ trên).
o Ở đây, xin giới thiệu hàm TO_DAYS(). Đây là hàm trả về giá trị ngày.
Bạn thử đánh dòng sau xem sao:
mysql> select (to_days(current_date)); Trang: 14