Tin hoc
Chia sẻ bởi Dương Văn Nhân |
Ngày 10/05/2019 |
61
Chia sẻ tài liệu: tin hoc thuộc Tin học 11
Nội dung tài liệu:
Cơ sở dữ liệu mã nguồn mở - MySQL
Nội dung trình bày
I. Làm quen với MySQL
II. MySQL căn bản
III. Tối ưu hóa MySQL
IV. Quản trị CSDL MySQL
IV. Một số tính năng mở rộng của MySQL
I. Làm quen với MySQL
I.1. MySQL là gì?
I.2. Cài đặt MySQL
I.3. CSDL đầu tiên với MySQL
I.1. MySQL là gì?
MySQL (My Ess Que Ell) là hệ quản trị cơ sở dữ liệu
MySQL là hệ quản trị cơ sở dữ liệu quan hệ
MySQL là PMNM
Bạn có thể download phần mềm và mã nguồn của MySQL qua internet, có thể sửa đổi MySQL theo nhu cầu của mình. MySQL tuân theo giấy phép GNU GPL(http://www.fsf.org/licenses/)
Ngoài phiên bản sử dụng GPL, bạn có thể mua bản thương mại của MySQL (https://order.mysql.com/)
I.1. MySQL là gì?
Vì sao sử dụng CSDL MySQL?
MySQL là cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng
Friendster, more than 85 million dynamic page views per day, able to support more than 1.5 billion MySQL queries per day
Wikipedia, more than 200 million queries and 1.2 million updates per day with peak loads of 11,000 queries per second
MySQL có tính khả chuyển, hoạt động trên nhiều hệ điều hành (Unix, FreeBSD, NetBSD, Linux, Novell NetWare, SGI Irix, Solaris, SunOS, Windows)
Qua nhiều năm phát triển, hiện tại MySQL cung cấp một hệ thống lớn các hàm tiện ích rất mạnh
Với tốc độ và tính bảo mật cao, MySQL rất thích hợp cho các ứng dụng có truy cập CSDL trên internet
Bạn có thể sử dụng các CSDL MySQL free trên interrnet
http://www.db4free.net/
http://www.freesql.org/
I.1. Cài đặt MySQL (trên Windows)
I.1.1. Yêu cầu tối thiểu
I.1.2. Cài đặt
I.1.1. Yêu cầu tối thiểu
Windows 9x, NT, Me, 2000, XP. Các hệ dòng NT cho phép chạy MySQL dưới dạng các service.
Phiên bản cài đặt MySQL download từ địa chỉ http://www.mysql.com/downloads
Khoảng trống >= 200MB (khoảng trống còn lại phụ thuộc vào nhu cầu đối với CSDL của bạn)
Nếu muốn kết nối với MySQL qua ODBC, bạn phải cài đặt MyODBC (http://www.mysql.com/downloads/api-myodbc.html. )
Với CSDL có các bảng (table) có kích thước lớn hơn 4GB, bạn phải cài đặt trên ổ đĩa NTFS hoặc mới hơn
I.1.2. Cài đặt MySQL trên Windows
Nếu sử dụng Windows NT, 2000 hay XP, phải có quyền administrator
Nếu nâng cấp, bạn phải dừng MySQL theo các bước sau
>net stop mysql
>mysqld –remove
>mysqladmin –u root shutdown
Bung file nén download được
Chạy setup.exe
I.1.3. CSDL đầu tiên với MySQL
I.1.3.1. Connect & Disconnect server
I.1.3.2. Nhập Query trên console
I.1.3.3. Tạo và sử dụng Cơ sở dữ liệu
I.1.3.4. Tạo bảng, import dữ liệu vào bảng
I.1.3.5. Xem thông tin từ bảng
I.1.3.1. Connect & Disconnect server
Để kết nối đến máy chủ, cần cung cấp username & password. Nếu kết nối máy chủ từ xa, phải xác định hostname.
> mysql -h host -u user –p
Enter password: ********
> mysql -h host -u user –p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 25338 to server version: 4.0.14-log Type `help;` or `h` for help. Type `c` to clear the buffer.
mysql>
I.1.3.2. Nhập Query trên console
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| VERSION() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 | 25 |
+-------------+---------+
I.1.3.2. Nhập Query trên Console (2)
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION() |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER() | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18 |
+--------------------+--------------+
I.1.3.2. Nhập Query trên Console (3)
Để dừng lệnh đang nhập, dùng lệnh c
mysql> SELECT
-> USER()
-> c
mysql>
Chú ý đến ý nghĩa của dấu nhắc của MySQL
I.1.3.2. Nhập query trên console (4)
Làm việc theo lô (batch)
> mysql -e "source batch-file"
> mysql -h host -u user -p < batch-file
Enter password: ********
> mysql < batch-file | more
> mysql < batch-file > mysql.out
I.1.3.2. Nhập Query trên Console (4)
Làm việc theo lô (batch)
Một query bình thường hiển thị kết quả ở chế độ interactive
+---------+
| species |
+---------+
| bird |
| cat |
| dog |
| hamster |
| snake |
+---------+
Ở chế độ batch, kết quả hiển thị như sau
species
bird
cat
dog
hamster
snake
Để hiển thị dữ liệu kiểu interactive ở chế độ batch, sử dụng lệnh mysql –t
Để hiển thị các lệnh được gọi, dùng lệnh mysql -vvv
I.1.3.2. Nhập Query trên Console (4)
Chú ý: Câu lệnh MySQL phải kết thúc bởi dấu ;
mysql> SELECT USER()
->
mysql> SELECT USER()
-> ;
+--------------------+
| USER() |
+--------------------+
| joesmith@localhost |
+--------------------+
I.1.3.3. Tạo và sử dụng cơ sở dữ liệu
mysql> show databases;
+-----------+
| Database |
+-----------+
| guestbook |
| mysql |
| quang |
| test |
+-----------+
4 rows in set (0.00 sec)
mysql> CREATE DATABASE dhxd;
mysql> USE dhxd
Database changed
> mysql -h host -u user -p dhxd
Enter password: ********
I.1.3.4. Tạo bảng, import dữ liệu vào bảng
mysql> SHOW TABLES;
Empty set (0.00 sec)
mysql> create table sv(id int auto_increment primary key, hodem varchar(30),
-> ten varchar(10), gioitinh char(1), ngaysinh date);
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+----------------+
| Tables_in_dhxd |
+----------------+
| sv |
+----------------+
1 row in set (0.00 sec)
I.1.3.4. Tạo bảng, import dữ liệu vào bảng (2)
mysql> describe sv;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| hodem | varchar(30) | YES | | NULL | |
| ten | varchar(10) | YES | | NULL | |
| gioitinh | char(1) | YES | | NULL | |
| ngaysinh | date | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)
Nội dung file "dhxd.txt" (chú ý các trường cách nhau bởi dấu tab)
1 Nguyen Phu Quang M 1979-04-04
3 Tran Van On M 1919-04-06
4 Nguyen Viet Xuan F 1029-03-02
I.1.3.4. Tạo bảng, import dữ liệu vào bảng (3)
mysql> load data local infile "dhxd.txt" into table sv;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from sv;
+----+-------------+-------+----------+------------+
| id | hodem | ten | gioitinh | ngaysinh |
+----+-------------+-------+----------+------------+
| 1 | Nguyen Phu | Quang | M | 1979-04-04 |
| 3 | Tran Van | On | M | 1919-04-06 |
| 4 | Nguyen Viet | Xuan | F | 1029-03-02 |
+----+-------------+-------+----------+------------+
3 rows in set (0.00 sec)
I.1.3.5. Xem thông tin từ bảng
mysql> select * from sv;
+----+-------------+-------+----------+------------+
| id | hodem | ten | gioitinh | ngaysinh |
+----+-------------+-------+----------+------------+
| 1 | Nguyen Phu | Quang | M | 1979-04-04 |
| 3 | Tran Van | On | M | 1919-04-06 |
| 4 | Nguyen Viet | Xuan | F | 1029-03-02 |
+----+-------------+-------+----------+------------+
3 rows in set (0.00 sec)
mysql> select hodem, ten from sv;
+-------------+-------+
| hodem | ten |
+-------------+-------+
| Nguyen Phu | Quang |
| Tran Van | On |
| Nguyen Viet | Xuan |
+-------------+-------+
3 rows in set (0.00 sec)
I.1.3.5. Xem thông tin từ bảng (2)
mysql> select concat(hodem, " ", ten) from sv;
+-------------------------+
| concat(hodem, " ", ten) |
+-------------------------+
| Nguyen Phu Quang |
| Tran Van On |
| Nguyen Viet Xuan |
+-------------------------+
3 rows in set (0.44 sec)
mysql> select concat(hodem, " ", ten) from sv where ten="quang";
+-------------------------+
| concat(hodem, " ", ten) |
+-------------------------+
| Nguyen Phu Quang |
+-------------------------+
1 row in set (0.35 sec)
II. MySQL căn bản
II.1. Cấu trúc ngôn ngữ
II.2. Các kiểu trường
II.3. Các hàm sử dụng với câu lệnh SELECT và mệnh đề WHERE
II.4. Các câu lệnh thao tác trên dữ liệu (SELECT, INSERT, UPDATE, DELETE)
II.5. Các câu lệnh thao tác trên bảng CREATE, DROP, ALTER
II.6. Làm việc với giao dịch (transaction) & các lệnh khóa (Locking command)
II.7. Tìm kiếm văn bản (Full-text search)
II.8. Các dạng bảng của MySQL
II.1. Cấu trúc ngôn ngữ
II.1.1. String & số
II.1.2. Tên CSDL, bảng, chỉ số, cột
II.1.3. Phân biệt chữ hoa, chữ thường
II.1.4. Biến người dùng
II.1.5. Biến hệ thống
II.1.6. Chú thích
II.1.1. String & Số
II.1.1.1. String
II.1.1.2. Số
II.1.1.3. Giá trị NULL
II.1.1.1. String
String trong MySQL có thể được ký hiệu bằng cả dấu nháy đơn và dấu nháy kép
Trong String, để viết các ký tự đặc biệt, ta sử dụng dấu chéo ngược (backslash)
Do đó, khi làm việc với đường dẫn, tốt nhất là dùng ký tự /
II.1.1.1. String (2)
mysql> SELECT `hello`, `"hello"`, `""hello""`, `hel``lo`, ``hello`;
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel`lo | `hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "`hello`", "``hello``", "hel""lo", ""hello";
+-------+---------+-----------+--------+--------+
| hello | `hello` | ``hello`` | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This Is Four lines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
II.1.1.2. Số
Số ký hiệu như những ngôn ngữ khác
1221
0
-32
294.42
-32032.6809e+10
148.00
Từ version 4.1.0: TRUE (1), FALSE(0)
Số Hexa
mysql> SELECT x`4D7953514C`;
-> MySQL
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> Paul
II.1.1.3. Giá trị NULL
Giá trị NULL có nghĩa là không có dữ liệu (không giống với giá trị 0 của kiểu số, xâu rỗng của kiểu String)
Giá trị NULL khi import hoặc export ra file text sử dụng ký hiệu (N)
II.1.1.2. Tên CSDL, bảng, chỉ số, cột
Các tên CSDL, bảng, cột... nếu trùng với từ khóa thì phải đặt trong dấu nháy ngược [`]
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
II.1.3. Phân biệt chữ hoa, chữ thường
Với MySQL, cơ sở dữ liệu và bảng tương ứng với thư mục và file trên máy tính. Do vậy, sự phân biệt chữ hoa, chữ thường (case-sensitive) phụ thuộc vào hệ điều hành
Windows: Không phân biệt chữ hoa chữ thường
Linux, Unix: Có phân biệt chữ hoa, chữ thường
Các bí danh (alias) có phân biệt chữ hoa chữ thường
II.1.4. Biến
Tên biến phân biệt chữ hoa chữ thường. Biến không cần khởi tạo (biến chưa khởi tạo có giá trị NULL)
Để gán giá trị cho biến, sử dụng cú pháp
SET @variable= { integer expression | real expression | string expression }
[,@variable= ...] .
mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
II.1.5. Biến hệ thống
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
SET SESSION sort_buffer_size=value;
SET @@session.sort_buffer_size=value;
SET sort_buffer_size=value;
SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like `sort_buffer_size`;
SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like `sort_buffer_size`;
II.1.6. Chú thích
mysql> SELECT 1+1; # This comment continues to the end of line
mysql> SELECT 1+1; -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;
II.2. Kiểu trường (cột)
II.2.1. Các kiểu số
NUMERIC, DECIMAL, INTEGER, SMALLINT
FLOAT, REAL, DOUBLE
II.2.2. Các kiểu ngày tháng
II.2.3. Các kiểu chuỗi (string)
II.2.4. Kích thước của các kiểu dữ liệu
II.2.1. Các kiểu số
Các kiểu số sử dụng trong MySQL
NUMERIC, DECIMAL, INTEGER, SMALLINT
FLOAT, REAL, DOUBLE
Các kiểu số riêng cho MySQL
TINYINT, MEDIUMINT, BIGINT
mysql> create table pet(id decimal(5,2));
II.2.2. Kiểu ngày tháng
Các kiểu ngày tháng trong MySQL gồm có
DATETIME, DATE, TIMESTAMP, TIME, YEAR
Chú ý: MySQL không kiểm tra tính hợp lệ của ngày tháng, ví dụ 1999-11-31 cũng được MySQL chấp nhận (MySQL chỉ kiểm tra điều kiện tháng từ 0-12, ngày từ 0-31 – điều này giúp MySQL có được tốc độ cao)
MySQL cho phép bạn lưu ngày thàng với ngày =0 hoặc tháng =0, điều này rất hữu ích trong trường hợp bạn không biết chính xác ngày tháng (ví dụ 1999-00-00)
II.2.3. Các kiểu chuỗi
II.2.3.1. Kiểu `CHAR` và `VARCHAR`
II.2.3.2. Kiểu `BLOB` và `TEXT`
II.2.3.3. Kiểu `ENUM`
II.2.3.4. Kiểu `SET`
II.2.3.1. Kiểu `CHAR` và `VARCHAR`
Kiểu CHAR và VARCHAR là tương tự nhau, nhưng khác nhau khi lưu trữ:
Các trường kiểu CHAR có kích thước cố định khi bạn tạo bảng (chiều dài của chuỗi kiểu CHAR từ 1-255)
Các trường kiểu VARCHAR có kích thước thay đổi tùy thuộc vào dữ liệu vào (chiều dài từ 1-255)
II.2.3.2. Kiểu `BLOB` và `TEXT`
Kiểu BLOB dùng để lưu trữ các dữ liệu có kích thước lớn. BLOB gồm 4 loại
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
Kiểu TEXT gồm 4 kiểu
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
Hai kiểu BLOB và TEXT chỉ có sự khác nhau duy nhất là BLOB có phân biệt sự khác nhau giữa chữ hoa và chữ thường còn kiểu TEXT thì không phân biệt chữ hoa và chữ thường
TEXT có thể coi là VARCHAR nhưng có kích thước lớn
Nếu bạn muốn sử dụng kiểu BLOB, TEXT cho câu lệnh GROUP BY, phải chuyển chúng về cùng một chiều dài
mysql> SELECT comment FROM tbl_name,SUBSTRING(comment,20) AS substr
-> ORDER BY substr;
Nếu không sử dụng cú pháp trên chỉ có một đoạn có độ dài max_sort_length của văn bản là được sắp xếp (giá trị mặc định của max_sort_length là 1024 và có thể thay đổi bằng tùy chọn –O của mysql)
Kích thước của trường kiểu TEXT và BLOB là thay đổi tùy theo kích thước của dữ liệu nhập vào (giống VARCHAR)
II.2.3.3. Kiểu `ENUM`
Kiểu ENUM là kiểu string mà giá trị được lựa chọn từ 1 trong các giá trị được liệt kê lúc tạo bảng
mysql>CREATE TABLE temp(gt enum("nam","nu");
mysql> insert into temp values("nam"),("nu"),("");
mysql> select * from temp;
+------+
| gt |
+------+
| nam |
| nu |
| |
+------+
mysql> insert into temp values(NULL), (0), (1), (2);
mysql> select * from temp;
+------+
| gt |
+------+
| nam |
| nu |
| |
| NULL |
| |
| nam |
| nu |
+------+
II.2.3.3. Kiểu `ENUM` (2)
mysql> select concat("`", gt, "`") from temp;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `nam` |
| `nu` |
| `` |
| NULL |
| `` |
| `nam` |
| `nu` |
+----------------------+
mysql> select concat("`", gt, "`") from temp where gt=0;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `` |
| `` |
+----------------------+
mysql> select concat("`", gt, "`") from temp where gt=1;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `nam` |
| `nam` |
+----------------------+
II.2.3.4. Kiểu `SET`
mysql> create table temp (s set("one", "two", "three"));
mysql> insert into temp values("one"),("two"),("two,three");
mysql> select * from temp;
+-----------+
| s |
+-----------+
| one |
| two |
| two,three |
+-----------+
mysql> select s+0 from temp;
+------+
| s+0 |
+------+
| 1 |
| 2 |
| 6 |
+------+
II.2.3.4. Kiểu `SET` (2)
mysql> delete from temp;
mysql> insert into temp values("one"),("two"),("three"),("one,two"),("one,three"
),("two,three"),("one,two,three");
mysql> select * from temp;
+---------------+
| s |
+---------------+
| one |
| two |
| three |
| one,two |
| one,three |
| two,three |
| one,two,three |
+---------------+
mysql> select s+0 from temp;
+------+
| s+0 |
+------+
| 1 |
| 2 |
| 4 |
| 3 |
| 5 |
| 6 |
| 7 |
+------+
II.2.3.4. Kiểu `SET` (3)
mysql> select * from temp where s like "%one%";
+---------------+
| s |
+---------------+
| one |
| one,two |
| one,three |
| one,two,three |
+---------------+
mysql> select * from temp where find_in_set("one", s);
+---------------+
| s |
+---------------+
| one |
| one,two |
| one,three |
| one,two,three |
+---------------+
II.2.4. Kích thước của các kiểu dữ liệu
II.2.4. Kích thước của các kiểu dữ liệu (2)
II.2.4. Kích thước của các kiểu dữ liệu (3)
II.3. Các hàm sử dụng với câu lệnh SELECT và mệnh đề WHERE
II.3.1. Các toán tử và hàm điều kiện
II.3.2. Các hàm trên String
II.3.3. Các hàm trên kiểu số
II.3.4. Các hàm trên ngày tháng
II.3.5. Hàm đổi kiểu
II.3.7. Các hàm dùng với mệnh đề GROUP BY
II.3.1. Các toán tử và hàm điều kiện
II.3.1.1. Các toán tử so sánh
II.3.1.2. Các toán tử logic
II.3.1.3. Các hàm điều kiện
II.3.1.1. Các toán tử so sánh
Các phép toán so sánh trả về các giá trị TRUE(1), FALSE(0) hoặc NULL.
Các phép toán này làm việc với cả số và string
Nguyên tắc so sánh của MySQL
Trả về NULL nếu 1 trong 2 toán hạng là NULL (trừ phép toán <=>)
Nếu cả 2 toán hạng là string, sử dụng phép so sánh string (phép so sánh string không phân biệt chữ hoa và chữ thường)
Nếu cả 2 toán hạng là số nguyên, sử dụng phép so sánh số nguyên
Nếu 1 trong 2 toán hạng là kiểu DATETIME hoặc TIMESTAMP, toán hạng còn lại là 1 hằng số, thì chuyển kiểu của hằng số trước khi so sánh
Trừ các trường hợp trên, các toán hạng sẽ được so sánh bằng phép so sánh số thực
II.3.1.1. Các toán tử so sánh (2)
Các toán tử so sánh (=,<>,>... trừ phép LIKE) của string sẽ bỏ qua các khoảng trắng (ký tự cách, tab, xuống dòng)
mysql> select `a`=`A `;
+---------------+
| `a`=`A ` |
+---------------+
| 1 |
+---------------+
mysql> SELECT 1 > `6x`;
-> 0
mysql> SELECT 7 > `6x`;
-> 1
mysql> SELECT 0 > `x6`;
-> 0
mysql> SELECT 0 = `x6`;
-> 1
II.3.1.1. Các toán tử so sánh (3)
=
mysql> SELECT 1 = 0;
-> 0
mysql> SELECT `0` = 0;
-> 1
mysql> SELECT `0.0` = 0;
-> 1
mysql> SELECT `0.01` = 0;
-> 0
mysql> SELECT `.01` = 0.01;
-> 1
<> !=
mysql> SELECT `.01` <> `0.01`;
-> 1
mysql> SELECT .01 <> `0.01`;
-> 0
mysql> SELECT `zapp` <> `zappp`;
-> 1
II.3.1.1. Các toán tử so sánh (4)
<=
mysql> SELECT 0.1 <= 2;
-> 1
<
mysql> SELECT 2 < 2;
-> 0
>=
mysql> SELECT 2 >= 2;
-> 1
>
mysql> SELECT 2 > 2;
-> 0
<=>
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
II.3.1.1. Các toán tử so sánh (5)
IS NULL
IS NOT NULL
Kiếm tra 1 giá trị là NULL hay không:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0 0 1
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0
Một số chú ý với toán tử IS NULL
Để lấy dòng cuối cùng của bảng
SELECT * FROM tbl_name WHERE auto_col IS NULL;
Để bỏ chế độ này, đặt SQL_AUTO_IS_NULL=0
Với NOT NULL DATE và DATETIME bạn có thể tìm giá trị 0000-00-00 bằng cú pháp:
SELECT * FROM tbl_name WHERE date_column IS NULL;
Điều này để phù hợp với ODBC (không hỗ trợ ngày 0000-00-00)
II.3.1.1. Các toán tử so sánh (6)
expr BETWEEN min AND max
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT `b` BETWEEN `a` AND `c`;
-> 1
mysql> SELECT 2 BETWEEN 2 AND `3`;
-> 1
mysql> SELECT 2 BETWEEN 2 AND `x-3`;
-> 0
expr NOT BETWEEN min AND max
mysql> SELECT 2 IN (0,3,5,`wefwf`);
-> 0
expr IN (value,...)
mysql> SELECT `wefwf` IN (0,3,5,`wefwf`);
-> 1
II.3.1.1. Các toán tử so sánh (7)
ISNULL(expr)
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
COALESCE(list): Trả về giá trị đầu tiên != NULL trong danh sách
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...): Trả về 0 nếu N=N1 && Nmysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
II.3.1.2. Các toán tử logic
II.3.1.3. Các hàm điều kiện
CASE ... WHEN...THEN...ELSE...END
mysql> SELECT CASE 1 WHEN 1 THEN "one"
WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
IF(expr1,expr2,expr3)
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,`yes`,`no`);
-> `yes`
mysql> SELECT IF(STRCMP(`test`,`test1`),`no`,`yes`);
-> `no`
expr1 luôn được chuyển về số nguyên
mysql> SELECT IF(0.1,1,0);
-> 0
mysql> SELECT IF(0.1<>0,1,0);
-> 1
II.3.1.3. Các hàm điều kiện (2)
IFNULL(expr1,expr2)
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,`yes`);
-> `yes`
NULLIF(expr1,expr2)
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
II.3.2. Các hàm trên String
II.3.2. Các hàm trên String (2)
II.3.2. Các hàm trên String (3)
II.3.2. Các hàm trên String (4)
II.3.2. Các hàm trên String (5)
II.3.2. Các hàm trên String (6)
II.3.2. Các hàm trên String
II.3.2.1. So sánh string
II.3.2.2. Phân biệt chữ hoa, chữ thường
II.3.2.1. So sánh string
MySQL tự động chuyển các số thành string (nếu cần)
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,` test`);
-> `2 test`
expr LIKE pat [ESCAPE `escape-char`]
mysql> SELECT `David!` LIKE `David_`;
-> 1
mysql> SELECT `David!` LIKE `%D%v%`;
-> 1
mysql> SELECT `David!` LIKE `David\_`;
-> 0
mysql> SELECT `David_` LIKE `David\_`;
-> 1
mysql> SELECT `David_` LIKE `David|_` ESCAPE `|`;
-> 1
mysql> SELECT `abc` LIKE `ABC`;
-> 1
mysql> SELECT `abc` LIKE BINARY `ABC`;
-> 0
mysql> SELECT 10 LIKE `1%`;
-> 1
II.3.2.1. So sánh string (2)
MATCH ... AGAINST()
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
mysql> INSERT INTO articles VALUES
-> (NULL,`MySQL Tutorial`, `DBMS stands for DataBase ...`),
-> (NULL,`How To Use MySQL Efficiently`, `After you went through a ...`),
-> (NULL,`Optimizing MySQL`,`In this tutorial we will show ...`),
-> (NULL,`1001 MySQL Tricks`,`1. Never run mysqld as root. 2. ...`),
-> (NULL,`MySQL vs. YourSQL`, `In the following database comparison ...`),
-> (NULL,`MySQL Security`, `When configured properly, MySQL ...`);
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST (`database`);
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
II.3.2.2. Phân biệt chữ hoa, chữ thường
BINARY: Chuyển từ String sang kiểu Binary
mysql> SELECT "a" = "A";
-> 1
mysql> SELECT BINARY "a" = "A";
-> 0
Đối với kiểu trường BLOB, để tránh phân biệt chữ hoa, chữ thường, bạn chuyển tất cả về chữ hoa
SELECT `A` LIKE UPPER(blob_col) FROM table_name;
II.3.3. Các hàm trên kiểu số
mysql> SELECT 3+5;
-> 8
mysql> SELECT 3-5;
-> -2
mysql> SELECT - 2;
-> -2
mysql> SELECT 3*5;
-> 15
mysql> SELECT 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> SELECT 18014398509481984*18014398509481984;
-> 0
mysql> SELECT 3/5;
-> 0.60
mysql> SELECT 102/(1-1);
-> NULL
II.3.3. Các hàm trên kiểu số (2)
II.3.3. Các hàm trên kiểu số (3)
II.3.3. Các hàm trên kiểu số (4)
II.3.4. Các hàm trên ngày tháng
II.3.4. Các hàm trên ngày tháng (2)
II.3.4. Các hàm trên ngày tháng (3)
II.3.4. Các hàm trên ngày tháng (4)
II.3.4. Các hàm trên ngày tháng (5)
II.3.5. Hàm đổi kiểu
Sử dụng hàm CAST hoặc CONVERT
CAST(expression AS type)
CONVERT(expression,type)
CONVERT(expr USING transcoding_name)
Các kiểu sử dụng trong tham số type
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}
mysql> SELECT CAST(1-2 AS UNSIGNED);
-> 18446744073709551615
mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
mysql> SELECT CAST(NOW() AS DATE);
-> 2003-05-26
II.3.7. Các hàm dùng với mệnh đề GROUP BY
II.3.7.1. Các hàm GROUP BY
II.3.7.2. WITH ROLLUP
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP
II.3.7.1. Các hàm GROUP BY
II.3.7.1. Các hàm GROUP BY
II.3.7.1. Các hàm GROUP BY (2)
II.3.7.2. WITH ROLLUP
II.3.7.2. WITH ROLLUP (2)
SELECT lop.khoa, lop.id, SUM(diemtb)
FROM sv, lop
WHERE sv.lop=lop.id
GROUP BY lop.khoa, lop.id WITH rollup;
+------+-----+-------------+
| khoa | id | sum(diemtb) |
+------+-----+-------------+
| 1 | 1 | 21.3 |
| 1 | 2 | 23.3 |
| 1 | 4 | 33.4 |
| 1 |NULL | 78.0 |
| 2 | 10 | 8.0 |
| 2 | 11 | 17.0 |
| 2 |NULL | 25.0 |
| NULL |NULL | 103.0 |
+------+-----+-------------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP
SELECT hodem, ten, MAX(diemtb) FROM sv GROUP BY lop;
+----------+-------+-------------+
| hodem | ten | max(diemtb) |
+----------+-------+-------------+
| Dao Ngoc | Manh | 8.7 |
| Tran Van | Khom | 8.8 |
| doan | cong | 9.5 |
| Cu van | Chuoi | 8.0 |
| Dao Ngoc | Manh | 9.2 |
+----------+-------+-------------+
SELECT hodem, ten, diemtb, MAX(diemtb) FROM sv GROUP BY lop;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| Dao Ngoc | Manh | 6.4 | 8.7 |
| Tran Van | Khom | 7.2 | 8.8 |
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
+----------+-------+--------+-------------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP (2)
SELECT hodem, ten, diemtb, MAX(diemtb) FROM sv GROUP BY lop ORDER BY diemtb DESC;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
| Tran Van | Khom | 7.2 | 8.8 |
| Dao Ngoc | Manh | 6.4 | 8.7 |
+----------+-------+--------+-------------+
SELECT * FROM
sv,(SELECT lop, MAX(diemtb) AS diem FROM sv GROUP BY lop) AS b
WHERE sv.lop=b.lop AND sv.diemtb=b.diem;
+----+-----------+-------+------------+------+--------+------+------+
| id | hodem | ten | ngaysinh | lop | diemtb | lop | diem |
+----+-----------+-------+------------+------+--------+------+------+
| 6 | Pham Xuan | Dinh | 1983-08-10 | 1 | 8.7 | 1 | 8.7 |
| 10 | Tran Van | Khom | 2005-03-03 | 2 | 8.8 | 2 | 8.8 |
| 1 | doan | cong | 0000-00-00 | 4 | 9.5 | 4 | 9.5 |
| 11 | Cu van | Chuoi | 2004-03-05 | 10 | 8.0 | 10 | 8.0 |
| 13 | Le Minh | Thuy | 1983-06-21 | 11 | 9.2 | 11 | 9.2 |
+----+-----------+-------+------------+------+--------+------+------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP (2)
mysql> select hodem, ten, diemtb, max(diemtb) from sv group by lop order by diemtb desc;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
| Tran Van | Khom | 7.2 | 8.8 |
| Dao Ngoc | Manh | 6.4 | 8.7 |
+----------+-------+--------+-------------+
mysql> select * from sv,(select lop, max(diemtb) as diem from sv group by lop) as b where sv.lop=b.lop and sv.diemtb=b.diem;
+----+-----------+-------+------------+------+--------+------+------+
| id | hodem | ten | ngaysinh | lop | diemtb | lop | diem |
+----+-----------+-------+------------+------+--------+------+------+
| 6 | Pham Xuan | Dinh | 1983-08-10 | 1 | 8.7 | 1 | 8.7 |
| 10 | Tran Van | Khom | 2005-03-03 | 2 | 8.8 | 2 | 8.8 |
| 1 | doan | cong | 0000-00-00 | 4 | 9.5 | 4 | 9.5 |
| 11 | Cu van | Chuoi | 2004-03-05 | 10 | 8.0 | 10 | 8.0 |
| 13 | Le Minh | Thuy | 1983-06-21 | 11 | 9.2 | 11 | 9.2 |
+----+-----------+-------+------------+------+--------+------+------+
II.4. Các câu lệnh thao tác trên dữ liệu (SELECT, INSERT, UPDATE, DELETE)
II.4.1. Câu lệnh SELECT
II.4.2. Sử dụng query lồng nhau (subquery)
II.4.3. Câu lệnh INSERT
II.4.4. Câu lệnh UPDATE
II.4.5. Câu lệnh DELETE
II.4.6. Câu lệnh REPLACE
II.4.7. Câu lệnh LOAD DATA INFILE
II.4.1. Câu lệnh SELECT
II.4.1.1. Cú pháp lệnh SELECT
II.4.1.2. Sử dụng SELECT với JOIN
II.4.1.3. Sử dụng SELECT với UNION
II.4.1. Câu lệnh SELECT (2)
Câu lệnh SELECT là câu lệnh SQL được sử dụng nhiều nhất
SELECT sử dụng để rút trích dữ liệu từ một hoặc nhiều bảng khác nhau
Lệnh SELECT thường được sử dụng kết hợp với các điều kiện WHERE, HAVING
Khi sử dụng SELECT trên nhiều bảng, cần phải chú ý đến cách thức các bảng kết hợp với nhau vì điều này ảnh hưởng rất nhiều đến tốc độ thực hiện của lệnh
II.4.1.1. Cú pháp lệnh SELECT
SELECT [DISTINCT | DISTINCTROW | ALL]
select_expression,...
[FROM table_references]
[WHERE where_definition]
[GROUP BY {col_name | formula} [ASC | DESC], ...
[WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] row_count | row_count OFFSET offset]
II.4.1.1. Cú pháp lệnh SELECT (2)
Cú pháp của MySQL
SELECT 1+1;
Sử dung bảng dual để tương thích với CSDL khác
SELECT 1+1 FROM dual;
Một số ví dụ
SELECT * FROM sv;
SELECT id, hodem, ten, ngay sinh FROM sv;
SELECT * FROM sv ORDER BY diemtb;
SELECT * FROM sv ORDER BY diemtb DESC;
SELECT * FROM sv ORDER BY lop ASC, diemtb DESC;
SELECT * FROM sv WHERE lop >= 2 AND lop <= 4;
SELECT * FROM sv WHERE lop BETWEEN 2 AND 4;
II.4.1.1. Cú pháp lệnh SELECT (3)
Having chỉ nên sử dụng ở cuối câu query có sử dụng GROUP BY
SELECT MAX(diemtb) AS diemmax FROM sv GROUP BY lop HAVING diemmax>=9;
Liệt kê 5 dòng đầu tiên
SELECT * FROM sv LIMIT 5;
Liệt kê từ dòng 8 đến dòng 12
SELECT * FROM sv LIMIT 7, 5;
Đưa dữ liệu ra file text
SELECT * INTO OUTFILE `sv.txt` FIELDS TERMINATED BY `;` FROM sv;
II.4.1.2. Sử dụng SELECT với JOIN
Tích đề cac
table, table
table STRAIGHT_JOIN table
Inner Join
table [INNER | CROSS] JOIN table [join_condition]
II.4.1.2. Sử dụng SELECT với JOIN (2)
Left Join
table_reference LEFT [OUTER] JOIN table_reference [join_condition]
Right Join
table_reference RIGHT [OUTER] JOIN table_reference [join_condition]
II.4.1.2. Sử dụng SELECT với JOIN (3)
Tích đề các
SELECT * FROM sv, lop;
SELECT * FROM sv STRAIGHT_JOIN lop
Phân biệt inner, left, right join?
SELECT * FROM sv INNER JOIN lop ON sv.lop = lop.id;
SELECT * FROM sv LEFT JOIN lop ON sv.lop = lop.id;
SELECT * FROM sv RIGHT JOIN lop ON sv.lop = lop.id;
II.4.1.2. Sử dụng SELECT với JOIN (3)
SELECT * FROM lop LEFT JOIN sv
ON lop.id = sv.lop
WHERE sv.lop IS NULL;
SELECT * FROM sv LEFT JOIN lop
ON sv.lop=lop.id LEFT JOIN khoa
ON lop.khoa = khoa.id;
SELECT * FROM sv LEFT JOIN lop
ON sv.lop=lop.id LEFT JOIN khoa
ON lop.khoa = khoa.id;
II.4.1.3. Sử dụng SELECT với UNION
Cú pháp UNION:
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
[SELECT ...]
Chú ý: Chỉ sử dụng 1 loại UNION ALL hoặc UNION DISTINCT trong 1 câu lệnh UNION
II.4.1.3. Sử dụng SELECT với UNION (2)
CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
INSERT INTO t1 VALUES(1),(1),(1),(2),(2);
INSERT INTO t2 VALUES(2),(2),(3),(3),(3);
(SELECT * FROM t1)
UNION DISTINCT
(SELECT * FROM t2);
II.4.1.3. Sử dụng SELECT với UNION (3)
CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
INSERT INTO t1 VALUES(2),(2),(1),(1),(1);
INSERT INTO t2 VALUES(3),(3),(3),(2),(2);
(SELECT * FROM t1 ORDER BY id)
UNION ALL
(SELECT * FROM t2 ORDER BY id);
II.4.2. Sử dụng query lồng nhau (SUBQUERY)
SUBQUERY là query nằm trong query khác
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
SELECT * FROM t1...
gọi là OUTER QUERY
SELECT column2 FROM t2
gọi là SUBQUERY
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (2)
SELECT tenlop,
( SELECT count(*)
FROM sv
WHERE sv.lop=lop.id
)
FROM lop;
SELECT tenlop,
( SELECT max(diemtb)
FROM sv
WHERE sv.lop=lop.id
)
FROM lop;
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (3)
SELECT tenlop,
( SELECT max(diemtb)
FROM sv
WHERE sv.lop=lop.id
) AS dmax,
( SELECT concat(hodem," ", ten)
FROM sv
WHERE sv.lop=lop.id AND diemtb=dmax
)
FROM lop;
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (4)
SELECT l_Ten, BangDiem.*
FROM tblLop LEFT JOIN (
SELECT * FROM (
SELECT *
FROM tblSinhVien
ORDER BY sv_DiemTb DESC
) AS DiemSapXep
GROUP BY sv_Lop
) BangDiem
ON l_ID = BangDiem.sv_Lop;
II.4.2. Sử dụng query lồng nhau (subquery)
II.4.2.1. Subquery với ANY, IN, SOME, ALL
II.4.2.2. Truyền các tham số giữa các lớp query
II.4.2.3. Sử dụng EXISTS và NOT EXISTS
II.4.2.4. Row Subquery
II.4.2.5. Subquery trong mệnh đề FROM
II.4.2.6. Tối ưu hóa Subquery
II.4.2.1. Subquery với ANY, IN, SOME, ALL
ANY()
IN ()
SOME()
SELECT * FROM sv WHERE lop IN(SELECT id FROM lop);
SELECT * FROM sv WHERE lop = ANY(SELECT id FROM lop);
SELECT * FROM sv WHERE lop = ALL(SELECT id FROM lop);
SELECT * FROM sv WHERE lop <> ANY(SELECT id FROM lop);
SELECT * FROM sv WHERE lop <> ALL(SELECT id FROM lop);
II.4.2.2. Truyền các tham số giữa các lớp query
SELECT l_Ten,
sv_Hodem,
sv_Ten,
sv_DiemTB
FROM tblLop LEFT JOIN tblSinhVien
ON l_ID=sv_Lop AND
sv_DiemTB = (
SELECT MAX(sv_DiemTB)
FROM tblSinhVien
WHERE sv_Lop=l_ID
);
II.4.2.2. Truyền các tham số giữa các lớp query (2)
SELECT tenkhoa,
( SELECT sum((
SELECT count(*)
FROM sv
WHERE sv.lop=lop.id
))
FROM lop
WHERE lop.khoa=khoa.id
)
FROM khoa;
II.4.2.3. Sử dụng EXISTS và NOT EXISTS
SELECT *
FROM lop
WHERE EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
);
SELECT *
FROM lop
WHERE NOT EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
);
II.4.2.3. Sử dụng EXISTS và NOT EXISTS (2)
SELECT *
FROM khoa
WHERE NOT EXISTS(
SELECT *
FROM lop
WHERE lop.khoa=khoa.id
);
SELECT *
FROM khoa
WHERE NOT EXISTS(
SELECT *
FROM lop
WHERE EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
) AND
lop.khoa=khoa.id
);
II.4.2.4. Row Subquery
SELECT *
FROM t1
WHERE (1,2) =
( SELECT column1, column2
FROM t2
);
SELECT *
FROM t1
WHERE ROW(1,2) =
( SELECT column1, column2
FROM t2
);
II.4.2.4. Row Subquery (2)
SELECT *
FROM t1
WHERE (column1,column2) = (1,1);
SELECT *
FROM t1
WHERE column1 = 1 AND column2 = 1;
II.4.2.4. Row Subquery (3)
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
( SELECT column1,column2,column3
FROM t2
);
SELECT * FROM sv WHERE (hodem,ten)=("doan","cong");
SELECT tenlop,
( SELECT max(diemtb) FROM sv
WHERE sv.lop=lop.id) AS diemmax,
( SELECT concat(hodem, " ", ten) FROM sv
WHERE (lop, diemtb)=(lop.id, diemmax))
FROM lop;
II.4.2.5. Subquery trong mệnh đề FROM
SELECT ... FROM () AS ...
SELECT count(a) FROM
( SELECT `a` UNION ALL
SELECT `a` UNION ALL
SELECT `a` UNION ALL
SELECT `b`) AS temp
GROUP BY a;
SELECT avg(tongdiem)
FROM ( SELECT sum(diemtb) AS tongdiem
FROM sv
GROUP BY lop
) AS a;
II.4.2.5. Subquery trong mệnh đề FROM (2)
SELECT *
FROM sv
INNER JOIN ( SELECT lop,
max(diemtb) AS diemmax
FROM sv
GROUP BY lop
) AS a
ON sv.lop=a.lop AND sv.diemtb = a.diemmax;
II.4.2.6. Tối ưu hóa Subquery
Chuyển các mệnh đề từ ngoài vào trong subquery
SELECT * FROM t1
WHERE s1 IN (SELECT s1 FROM t1) OR
s1 IN (SELECT s1 FROM t2);
Đổi thành
SELECT * FROM t1
WHERE s1 IN ( SELECT s1 FROM t1
UNION ALL
SELECT s1 FROM t2
);
Hay
SELECT (SELECT column1 FROM t1) + 5 FROM t2;
Đổi thành
SELECT (SELECT column1 + 5 FROM t1) FROM t2;
II.4.2.6. Tối ưu hóa Subquery (2)
Sử dụng Rowsubquery thay vì truyền tham số
SELECT * FROM t1
WHERE EXISTS(
SELECT * FROM t2
WHERE t2.column1=t1.column1 AND
t2.column2=t1.column2
);
Đổi thành
SELECT * FROM t1
WHERE (column1,column2) IN (
SELECT column1,column2 FROM t2
);
Sử dụng NOT (a=ANY(...)) thay vì a<>ALL(...)
Sử dụng = ANY thay vì dùng EXISTS
II.4.2.6. Tối ưu hóa Subquery (3)
Cách thức MySql thực hiện Subquery
Những câu lệnh không có móc nối (truyền tham số) được gọi 1 lần
Viết lại các câu lệnh sử dụng IN/ALL/ANY/SOME nếu sử dụng các trường index trong bảng
II.4.3. Câu lệnh INSERT
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ((expression | DEFAULT),...),(...),...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=(expression | DEFAULT), ...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
II.4.3. Câu lệnh INSERT
INSERT ... VALUES: Thêm dữ liệu theo giá trị nhập vào của 1 hoặc nhiều dòng
INSERT ... SELECT: Thêm dữ liệu vào bảng sử dụng dữ liệu của bảng khác
Nếu không xác định danh sách tên cột thì tất cả các cột phải được liệt kê
Nếu 1 cột không được liệt kê trong danh sách tên cột (hoặc được gán giá trị NULL) thì khi insert sẽ được sử dụng giá trị default
Nếu sử dụng từ khóa DELAYED, các dòng chèn vào sẽ được để trong buffer (sau đó tiến trình gọi INSERT được tiếp tục), dữ liệu được để trong buffer cho đến khi không còn thao tác đọc nào đến bảng mới được chèn vào trong bảng
Nếu dùng LOW_PRIORITY thì tiến trình đợi không còn thao tác đọc nào mới chèn dữ liệu vào trong bảng và tiếp tục
II.4.3. Câu lệnh INSERT (2)
CREATE TABLE temp(id INT PRIMARY KEY NOT NULL);
INSERT INTO temp VALUES(10),(20),(30);
INSERT INTO temp VALUES(20),(30),(40),(50);
SELECT * FROM temp;
INSERT IGNORE INTO temp VALUES (20),(30),(40),(50);
SELECT * FROM temp;
II.4.3. Câu lệnh INSERT (3)
CREATE TABLE temp (id INT);
INSERT INTO temp VALUES(1),(2);
INSERT INTO temp SELECT * FROM temp;
SELECT * FROM temp;
+------+
| id |
+------+
| 1 |
| 2 |
| 1 |
| 2 |
+------+
II.4.4. Câu lệnh UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
II.4.4. Câu lệnh UPDATE (2)
Lệnh UPDATE: sửa giá trị cột của các dòng đã có trong bảng
Mệnh đề WHERE dùng để xác định dòng nào được cập nhật
Mệnh đề ORDER BY xác định thứ tự cập nhật, kết hợp với LIMIT để xác định các dòng cập nhật
Nếu sử dụng từ khóa LOW_PRIORITY, tiến trình đợi đến khi không có yêu cầu đến bảng mới thực hiện UPDATE
Nếu sử dụng từ khóa IGNORE, MySQL sẽ bỏ qua lỗi trùng khóa và vẫn tiếp tục cập nhật
Nếu tên cột nằm ở phía phải của biểu thức thì sẽ cho giá trị hiện tại của cột đó (ví dụ UPDATE temp SET id=id+1)
Thứ tự thực hiện biểu thức từ trái qua phải (ví dụ UPDATE temp SET id=id+1, id=id*2)
Nếu cập nhật giá trị NULL cho cột NOT NULL thì sẽ lấy giá trị DEFAULT của cột đó
II.4.4. Câu lệnh UPDATE (3)
CREATE TABLE temp(id INT);
INSERT INTO temp VALUES(1),(2);
UPDATE temp SET id=id+1, id=id*2;
SELECT * FROM temp;
UPDATE lop, sv
SET diemtb = diemtb+0.1
WHERE lop.id=sv.lop AND lop.tenlop="46pm1";
SELECT tenlop,
( SELECT min(diemtb)
FROM sv
WHERE sv.lop = lop.id
ORDER BY diemtb desc
LIMIT 3
)
FROM lop;
II.4.5. Câu lệnh DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...]
FROM table-references
[WHERE where_definition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM table_name[.*] [, table_name[.*] ...]
USING table-references
[WHERE where_definition]
II.4.5. Câu lệnh DELETE (2)
Nếu sử dụng từ khóa LOW_PRIORITY, tiến trình đợi đến khi không còn thao tác nào đến bảng mới thực hiện thao tác delete
Nếu sử dụng từ khóa IGNORE thì các lỗi sẽ được bỏ qua trong quá trình xóa
Mệnh đề ORDER BY kết hợp với LIMIT có thể xóa được một số lượng xác định các bản ghi theo thứ tự
Bạn có thể sử dụng cú pháp thứ 2 để xóa nhiều bảng
Nội dung trình bày
I. Làm quen với MySQL
II. MySQL căn bản
III. Tối ưu hóa MySQL
IV. Quản trị CSDL MySQL
IV. Một số tính năng mở rộng của MySQL
I. Làm quen với MySQL
I.1. MySQL là gì?
I.2. Cài đặt MySQL
I.3. CSDL đầu tiên với MySQL
I.1. MySQL là gì?
MySQL (My Ess Que Ell) là hệ quản trị cơ sở dữ liệu
MySQL là hệ quản trị cơ sở dữ liệu quan hệ
MySQL là PMNM
Bạn có thể download phần mềm và mã nguồn của MySQL qua internet, có thể sửa đổi MySQL theo nhu cầu của mình. MySQL tuân theo giấy phép GNU GPL(http://www.fsf.org/licenses/)
Ngoài phiên bản sử dụng GPL, bạn có thể mua bản thương mại của MySQL (https://order.mysql.com/)
I.1. MySQL là gì?
Vì sao sử dụng CSDL MySQL?
MySQL là cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng
Friendster, more than 85 million dynamic page views per day, able to support more than 1.5 billion MySQL queries per day
Wikipedia, more than 200 million queries and 1.2 million updates per day with peak loads of 11,000 queries per second
MySQL có tính khả chuyển, hoạt động trên nhiều hệ điều hành (Unix, FreeBSD, NetBSD, Linux, Novell NetWare, SGI Irix, Solaris, SunOS, Windows)
Qua nhiều năm phát triển, hiện tại MySQL cung cấp một hệ thống lớn các hàm tiện ích rất mạnh
Với tốc độ và tính bảo mật cao, MySQL rất thích hợp cho các ứng dụng có truy cập CSDL trên internet
Bạn có thể sử dụng các CSDL MySQL free trên interrnet
http://www.db4free.net/
http://www.freesql.org/
I.1. Cài đặt MySQL (trên Windows)
I.1.1. Yêu cầu tối thiểu
I.1.2. Cài đặt
I.1.1. Yêu cầu tối thiểu
Windows 9x, NT, Me, 2000, XP. Các hệ dòng NT cho phép chạy MySQL dưới dạng các service.
Phiên bản cài đặt MySQL download từ địa chỉ http://www.mysql.com/downloads
Khoảng trống >= 200MB (khoảng trống còn lại phụ thuộc vào nhu cầu đối với CSDL của bạn)
Nếu muốn kết nối với MySQL qua ODBC, bạn phải cài đặt MyODBC (http://www.mysql.com/downloads/api-myodbc.html. )
Với CSDL có các bảng (table) có kích thước lớn hơn 4GB, bạn phải cài đặt trên ổ đĩa NTFS hoặc mới hơn
I.1.2. Cài đặt MySQL trên Windows
Nếu sử dụng Windows NT, 2000 hay XP, phải có quyền administrator
Nếu nâng cấp, bạn phải dừng MySQL theo các bước sau
>net stop mysql
>mysqld –remove
>mysqladmin –u root shutdown
Bung file nén download được
Chạy setup.exe
I.1.3. CSDL đầu tiên với MySQL
I.1.3.1. Connect & Disconnect server
I.1.3.2. Nhập Query trên console
I.1.3.3. Tạo và sử dụng Cơ sở dữ liệu
I.1.3.4. Tạo bảng, import dữ liệu vào bảng
I.1.3.5. Xem thông tin từ bảng
I.1.3.1. Connect & Disconnect server
Để kết nối đến máy chủ, cần cung cấp username & password. Nếu kết nối máy chủ từ xa, phải xác định hostname.
> mysql -h host -u user –p
Enter password: ********
> mysql -h host -u user –p
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 25338 to server version: 4.0.14-log Type `help;` or `h` for help. Type `c` to clear the buffer.
mysql>
I.1.3.2. Nhập Query trên console
mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| VERSION() | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19 |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
| 0.707107 | 25 |
+-------------+---------+
I.1.3.2. Nhập Query trên Console (2)
mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| VERSION() |
+--------------+
| 3.22.20a-log |
+--------------+
+---------------------+
| NOW() |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+--------------------+--------------+
| USER() | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18 |
+--------------------+--------------+
I.1.3.2. Nhập Query trên Console (3)
Để dừng lệnh đang nhập, dùng lệnh c
mysql> SELECT
-> USER()
-> c
mysql>
Chú ý đến ý nghĩa của dấu nhắc của MySQL
I.1.3.2. Nhập query trên console (4)
Làm việc theo lô (batch)
> mysql -e "source batch-file"
> mysql -h host -u user -p < batch-file
Enter password: ********
> mysql < batch-file | more
> mysql < batch-file > mysql.out
I.1.3.2. Nhập Query trên Console (4)
Làm việc theo lô (batch)
Một query bình thường hiển thị kết quả ở chế độ interactive
+---------+
| species |
+---------+
| bird |
| cat |
| dog |
| hamster |
| snake |
+---------+
Ở chế độ batch, kết quả hiển thị như sau
species
bird
cat
dog
hamster
snake
Để hiển thị dữ liệu kiểu interactive ở chế độ batch, sử dụng lệnh mysql –t
Để hiển thị các lệnh được gọi, dùng lệnh mysql -vvv
I.1.3.2. Nhập Query trên Console (4)
Chú ý: Câu lệnh MySQL phải kết thúc bởi dấu ;
mysql> SELECT USER()
->
mysql> SELECT USER()
-> ;
+--------------------+
| USER() |
+--------------------+
| joesmith@localhost |
+--------------------+
I.1.3.3. Tạo và sử dụng cơ sở dữ liệu
mysql> show databases;
+-----------+
| Database |
+-----------+
| guestbook |
| mysql |
| quang |
| test |
+-----------+
4 rows in set (0.00 sec)
mysql> CREATE DATABASE dhxd;
mysql> USE dhxd
Database changed
> mysql -h host -u user -p dhxd
Enter password: ********
I.1.3.4. Tạo bảng, import dữ liệu vào bảng
mysql> SHOW TABLES;
Empty set (0.00 sec)
mysql> create table sv(id int auto_increment primary key, hodem varchar(30),
-> ten varchar(10), gioitinh char(1), ngaysinh date);
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+----------------+
| Tables_in_dhxd |
+----------------+
| sv |
+----------------+
1 row in set (0.00 sec)
I.1.3.4. Tạo bảng, import dữ liệu vào bảng (2)
mysql> describe sv;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| hodem | varchar(30) | YES | | NULL | |
| ten | varchar(10) | YES | | NULL | |
| gioitinh | char(1) | YES | | NULL | |
| ngaysinh | date | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.02 sec)
Nội dung file "dhxd.txt" (chú ý các trường cách nhau bởi dấu tab)
1 Nguyen Phu Quang M 1979-04-04
3 Tran Van On M 1919-04-06
4 Nguyen Viet Xuan F 1029-03-02
I.1.3.4. Tạo bảng, import dữ liệu vào bảng (3)
mysql> load data local infile "dhxd.txt" into table sv;
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from sv;
+----+-------------+-------+----------+------------+
| id | hodem | ten | gioitinh | ngaysinh |
+----+-------------+-------+----------+------------+
| 1 | Nguyen Phu | Quang | M | 1979-04-04 |
| 3 | Tran Van | On | M | 1919-04-06 |
| 4 | Nguyen Viet | Xuan | F | 1029-03-02 |
+----+-------------+-------+----------+------------+
3 rows in set (0.00 sec)
I.1.3.5. Xem thông tin từ bảng
mysql> select * from sv;
+----+-------------+-------+----------+------------+
| id | hodem | ten | gioitinh | ngaysinh |
+----+-------------+-------+----------+------------+
| 1 | Nguyen Phu | Quang | M | 1979-04-04 |
| 3 | Tran Van | On | M | 1919-04-06 |
| 4 | Nguyen Viet | Xuan | F | 1029-03-02 |
+----+-------------+-------+----------+------------+
3 rows in set (0.00 sec)
mysql> select hodem, ten from sv;
+-------------+-------+
| hodem | ten |
+-------------+-------+
| Nguyen Phu | Quang |
| Tran Van | On |
| Nguyen Viet | Xuan |
+-------------+-------+
3 rows in set (0.00 sec)
I.1.3.5. Xem thông tin từ bảng (2)
mysql> select concat(hodem, " ", ten) from sv;
+-------------------------+
| concat(hodem, " ", ten) |
+-------------------------+
| Nguyen Phu Quang |
| Tran Van On |
| Nguyen Viet Xuan |
+-------------------------+
3 rows in set (0.44 sec)
mysql> select concat(hodem, " ", ten) from sv where ten="quang";
+-------------------------+
| concat(hodem, " ", ten) |
+-------------------------+
| Nguyen Phu Quang |
+-------------------------+
1 row in set (0.35 sec)
II. MySQL căn bản
II.1. Cấu trúc ngôn ngữ
II.2. Các kiểu trường
II.3. Các hàm sử dụng với câu lệnh SELECT và mệnh đề WHERE
II.4. Các câu lệnh thao tác trên dữ liệu (SELECT, INSERT, UPDATE, DELETE)
II.5. Các câu lệnh thao tác trên bảng CREATE, DROP, ALTER
II.6. Làm việc với giao dịch (transaction) & các lệnh khóa (Locking command)
II.7. Tìm kiếm văn bản (Full-text search)
II.8. Các dạng bảng của MySQL
II.1. Cấu trúc ngôn ngữ
II.1.1. String & số
II.1.2. Tên CSDL, bảng, chỉ số, cột
II.1.3. Phân biệt chữ hoa, chữ thường
II.1.4. Biến người dùng
II.1.5. Biến hệ thống
II.1.6. Chú thích
II.1.1. String & Số
II.1.1.1. String
II.1.1.2. Số
II.1.1.3. Giá trị NULL
II.1.1.1. String
String trong MySQL có thể được ký hiệu bằng cả dấu nháy đơn và dấu nháy kép
Trong String, để viết các ký tự đặc biệt, ta sử dụng dấu chéo ngược (backslash)
Do đó, khi làm việc với đường dẫn, tốt nhất là dùng ký tự /
II.1.1.1. String (2)
mysql> SELECT `hello`, `"hello"`, `""hello""`, `hel``lo`, ``hello`;
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel`lo | `hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "`hello`", "``hello``", "hel""lo", ""hello";
+-------+---------+-----------+--------+--------+
| hello | `hello` | ``hello`` | hel"lo | "hello |
+-------+---------+-----------+--------+--------+
mysql> SELECT "This Is Four lines";
+--------------------+
| This
Is
Four
lines |
+--------------------+
II.1.1.2. Số
Số ký hiệu như những ngôn ngữ khác
1221
0
-32
294.42
-32032.6809e+10
148.00
Từ version 4.1.0: TRUE (1), FALSE(0)
Số Hexa
mysql> SELECT x`4D7953514C`;
-> MySQL
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> Paul
II.1.1.3. Giá trị NULL
Giá trị NULL có nghĩa là không có dữ liệu (không giống với giá trị 0 của kiểu số, xâu rỗng của kiểu String)
Giá trị NULL khi import hoặc export ra file text sử dụng ký hiệu (N)
II.1.1.2. Tên CSDL, bảng, chỉ số, cột
Các tên CSDL, bảng, cột... nếu trùng với từ khóa thì phải đặt trong dấu nháy ngược [`]
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
II.1.3. Phân biệt chữ hoa, chữ thường
Với MySQL, cơ sở dữ liệu và bảng tương ứng với thư mục và file trên máy tính. Do vậy, sự phân biệt chữ hoa, chữ thường (case-sensitive) phụ thuộc vào hệ điều hành
Windows: Không phân biệt chữ hoa chữ thường
Linux, Unix: Có phân biệt chữ hoa, chữ thường
Các bí danh (alias) có phân biệt chữ hoa chữ thường
II.1.4. Biến
Tên biến phân biệt chữ hoa chữ thường. Biến không cần khởi tạo (biến chưa khởi tạo có giá trị NULL)
Để gán giá trị cho biến, sử dụng cú pháp
SET @variable= { integer expression | real expression | string expression }
[,@variable= ...] .
mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
II.1.5. Biến hệ thống
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;
SET SESSION sort_buffer_size=value;
SET @@session.sort_buffer_size=value;
SET sort_buffer_size=value;
SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like `sort_buffer_size`;
SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like `sort_buffer_size`;
II.1.6. Chú thích
mysql> SELECT 1+1; # This comment continues to the end of line
mysql> SELECT 1+1; -- This comment continues to the end of line
mysql> SELECT 1 /* this is an in-line comment */ + 1;
mysql> SELECT 1+
/*
this is a
multiple-line comment
*/
1;
II.2. Kiểu trường (cột)
II.2.1. Các kiểu số
NUMERIC, DECIMAL, INTEGER, SMALLINT
FLOAT, REAL, DOUBLE
II.2.2. Các kiểu ngày tháng
II.2.3. Các kiểu chuỗi (string)
II.2.4. Kích thước của các kiểu dữ liệu
II.2.1. Các kiểu số
Các kiểu số sử dụng trong MySQL
NUMERIC, DECIMAL, INTEGER, SMALLINT
FLOAT, REAL, DOUBLE
Các kiểu số riêng cho MySQL
TINYINT, MEDIUMINT, BIGINT
mysql> create table pet(id decimal(5,2));
II.2.2. Kiểu ngày tháng
Các kiểu ngày tháng trong MySQL gồm có
DATETIME, DATE, TIMESTAMP, TIME, YEAR
Chú ý: MySQL không kiểm tra tính hợp lệ của ngày tháng, ví dụ 1999-11-31 cũng được MySQL chấp nhận (MySQL chỉ kiểm tra điều kiện tháng từ 0-12, ngày từ 0-31 – điều này giúp MySQL có được tốc độ cao)
MySQL cho phép bạn lưu ngày thàng với ngày =0 hoặc tháng =0, điều này rất hữu ích trong trường hợp bạn không biết chính xác ngày tháng (ví dụ 1999-00-00)
II.2.3. Các kiểu chuỗi
II.2.3.1. Kiểu `CHAR` và `VARCHAR`
II.2.3.2. Kiểu `BLOB` và `TEXT`
II.2.3.3. Kiểu `ENUM`
II.2.3.4. Kiểu `SET`
II.2.3.1. Kiểu `CHAR` và `VARCHAR`
Kiểu CHAR và VARCHAR là tương tự nhau, nhưng khác nhau khi lưu trữ:
Các trường kiểu CHAR có kích thước cố định khi bạn tạo bảng (chiều dài của chuỗi kiểu CHAR từ 1-255)
Các trường kiểu VARCHAR có kích thước thay đổi tùy thuộc vào dữ liệu vào (chiều dài từ 1-255)
II.2.3.2. Kiểu `BLOB` và `TEXT`
Kiểu BLOB dùng để lưu trữ các dữ liệu có kích thước lớn. BLOB gồm 4 loại
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
Kiểu TEXT gồm 4 kiểu
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
Hai kiểu BLOB và TEXT chỉ có sự khác nhau duy nhất là BLOB có phân biệt sự khác nhau giữa chữ hoa và chữ thường còn kiểu TEXT thì không phân biệt chữ hoa và chữ thường
TEXT có thể coi là VARCHAR nhưng có kích thước lớn
Nếu bạn muốn sử dụng kiểu BLOB, TEXT cho câu lệnh GROUP BY, phải chuyển chúng về cùng một chiều dài
mysql> SELECT comment FROM tbl_name,SUBSTRING(comment,20) AS substr
-> ORDER BY substr;
Nếu không sử dụng cú pháp trên chỉ có một đoạn có độ dài max_sort_length của văn bản là được sắp xếp (giá trị mặc định của max_sort_length là 1024 và có thể thay đổi bằng tùy chọn –O của mysql)
Kích thước của trường kiểu TEXT và BLOB là thay đổi tùy theo kích thước của dữ liệu nhập vào (giống VARCHAR)
II.2.3.3. Kiểu `ENUM`
Kiểu ENUM là kiểu string mà giá trị được lựa chọn từ 1 trong các giá trị được liệt kê lúc tạo bảng
mysql>CREATE TABLE temp(gt enum("nam","nu");
mysql> insert into temp values("nam"),("nu"),("");
mysql> select * from temp;
+------+
| gt |
+------+
| nam |
| nu |
| |
+------+
mysql> insert into temp values(NULL), (0), (1), (2);
mysql> select * from temp;
+------+
| gt |
+------+
| nam |
| nu |
| |
| NULL |
| |
| nam |
| nu |
+------+
II.2.3.3. Kiểu `ENUM` (2)
mysql> select concat("`", gt, "`") from temp;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `nam` |
| `nu` |
| `` |
| NULL |
| `` |
| `nam` |
| `nu` |
+----------------------+
mysql> select concat("`", gt, "`") from temp where gt=0;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `` |
| `` |
+----------------------+
mysql> select concat("`", gt, "`") from temp where gt=1;
+----------------------+
| concat("`", gt, "`") |
+----------------------+
| `nam` |
| `nam` |
+----------------------+
II.2.3.4. Kiểu `SET`
mysql> create table temp (s set("one", "two", "three"));
mysql> insert into temp values("one"),("two"),("two,three");
mysql> select * from temp;
+-----------+
| s |
+-----------+
| one |
| two |
| two,three |
+-----------+
mysql> select s+0 from temp;
+------+
| s+0 |
+------+
| 1 |
| 2 |
| 6 |
+------+
II.2.3.4. Kiểu `SET` (2)
mysql> delete from temp;
mysql> insert into temp values("one"),("two"),("three"),("one,two"),("one,three"
),("two,three"),("one,two,three");
mysql> select * from temp;
+---------------+
| s |
+---------------+
| one |
| two |
| three |
| one,two |
| one,three |
| two,three |
| one,two,three |
+---------------+
mysql> select s+0 from temp;
+------+
| s+0 |
+------+
| 1 |
| 2 |
| 4 |
| 3 |
| 5 |
| 6 |
| 7 |
+------+
II.2.3.4. Kiểu `SET` (3)
mysql> select * from temp where s like "%one%";
+---------------+
| s |
+---------------+
| one |
| one,two |
| one,three |
| one,two,three |
+---------------+
mysql> select * from temp where find_in_set("one", s);
+---------------+
| s |
+---------------+
| one |
| one,two |
| one,three |
| one,two,three |
+---------------+
II.2.4. Kích thước của các kiểu dữ liệu
II.2.4. Kích thước của các kiểu dữ liệu (2)
II.2.4. Kích thước của các kiểu dữ liệu (3)
II.3. Các hàm sử dụng với câu lệnh SELECT và mệnh đề WHERE
II.3.1. Các toán tử và hàm điều kiện
II.3.2. Các hàm trên String
II.3.3. Các hàm trên kiểu số
II.3.4. Các hàm trên ngày tháng
II.3.5. Hàm đổi kiểu
II.3.7. Các hàm dùng với mệnh đề GROUP BY
II.3.1. Các toán tử và hàm điều kiện
II.3.1.1. Các toán tử so sánh
II.3.1.2. Các toán tử logic
II.3.1.3. Các hàm điều kiện
II.3.1.1. Các toán tử so sánh
Các phép toán so sánh trả về các giá trị TRUE(1), FALSE(0) hoặc NULL.
Các phép toán này làm việc với cả số và string
Nguyên tắc so sánh của MySQL
Trả về NULL nếu 1 trong 2 toán hạng là NULL (trừ phép toán <=>)
Nếu cả 2 toán hạng là string, sử dụng phép so sánh string (phép so sánh string không phân biệt chữ hoa và chữ thường)
Nếu cả 2 toán hạng là số nguyên, sử dụng phép so sánh số nguyên
Nếu 1 trong 2 toán hạng là kiểu DATETIME hoặc TIMESTAMP, toán hạng còn lại là 1 hằng số, thì chuyển kiểu của hằng số trước khi so sánh
Trừ các trường hợp trên, các toán hạng sẽ được so sánh bằng phép so sánh số thực
II.3.1.1. Các toán tử so sánh (2)
Các toán tử so sánh (=,<>,>... trừ phép LIKE) của string sẽ bỏ qua các khoảng trắng (ký tự cách, tab, xuống dòng)
mysql> select `a`=`A `;
+---------------+
| `a`=`A ` |
+---------------+
| 1 |
+---------------+
mysql> SELECT 1 > `6x`;
-> 0
mysql> SELECT 7 > `6x`;
-> 1
mysql> SELECT 0 > `x6`;
-> 0
mysql> SELECT 0 = `x6`;
-> 1
II.3.1.1. Các toán tử so sánh (3)
=
mysql> SELECT 1 = 0;
-> 0
mysql> SELECT `0` = 0;
-> 1
mysql> SELECT `0.0` = 0;
-> 1
mysql> SELECT `0.01` = 0;
-> 0
mysql> SELECT `.01` = 0.01;
-> 1
<> !=
mysql> SELECT `.01` <> `0.01`;
-> 1
mysql> SELECT .01 <> `0.01`;
-> 0
mysql> SELECT `zapp` <> `zappp`;
-> 1
II.3.1.1. Các toán tử so sánh (4)
<=
mysql> SELECT 0.1 <= 2;
-> 1
<
mysql> SELECT 2 < 2;
-> 0
>=
mysql> SELECT 2 >= 2;
-> 1
>
mysql> SELECT 2 > 2;
-> 0
<=>
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1 1 0
II.3.1.1. Các toán tử so sánh (5)
IS NULL
IS NOT NULL
Kiếm tra 1 giá trị là NULL hay không:
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0 0 1
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1 1 0
Một số chú ý với toán tử IS NULL
Để lấy dòng cuối cùng của bảng
SELECT * FROM tbl_name WHERE auto_col IS NULL;
Để bỏ chế độ này, đặt SQL_AUTO_IS_NULL=0
Với NOT NULL DATE và DATETIME bạn có thể tìm giá trị 0000-00-00 bằng cú pháp:
SELECT * FROM tbl_name WHERE date_column IS NULL;
Điều này để phù hợp với ODBC (không hỗ trợ ngày 0000-00-00)
II.3.1.1. Các toán tử so sánh (6)
expr BETWEEN min AND max
mysql> SELECT 1 BETWEEN 2 AND 3;
-> 0
mysql> SELECT `b` BETWEEN `a` AND `c`;
-> 1
mysql> SELECT 2 BETWEEN 2 AND `3`;
-> 1
mysql> SELECT 2 BETWEEN 2 AND `x-3`;
-> 0
expr NOT BETWEEN min AND max
mysql> SELECT 2 IN (0,3,5,`wefwf`);
-> 0
expr IN (value,...)
mysql> SELECT `wefwf` IN (0,3,5,`wefwf`);
-> 1
II.3.1.1. Các toán tử so sánh (7)
ISNULL(expr)
mysql> SELECT ISNULL(1+1);
-> 0
mysql> SELECT ISNULL(1/0);
-> 1
COALESCE(list): Trả về giá trị đầu tiên != NULL trong danh sách
mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL
INTERVAL(N,N1,N2,N3,...): Trả về 0 nếu N
-> 3
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
II.3.1.2. Các toán tử logic
II.3.1.3. Các hàm điều kiện
CASE ... WHEN...THEN...ELSE...END
mysql> SELECT CASE 1 WHEN 1 THEN "one"
WHEN 2 THEN "two" ELSE "more" END;
-> "one"
mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END;
-> "true"
mysql> SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
IF(expr1,expr2,expr3)
mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,`yes`,`no`);
-> `yes`
mysql> SELECT IF(STRCMP(`test`,`test1`),`no`,`yes`);
-> `no`
expr1 luôn được chuyển về số nguyên
mysql> SELECT IF(0.1,1,0);
-> 0
mysql> SELECT IF(0.1<>0,1,0);
-> 1
II.3.1.3. Các hàm điều kiện (2)
IFNULL(expr1,expr2)
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,`yes`);
-> `yes`
NULLIF(expr1,expr2)
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
II.3.2. Các hàm trên String
II.3.2. Các hàm trên String (2)
II.3.2. Các hàm trên String (3)
II.3.2. Các hàm trên String (4)
II.3.2. Các hàm trên String (5)
II.3.2. Các hàm trên String (6)
II.3.2. Các hàm trên String
II.3.2.1. So sánh string
II.3.2.2. Phân biệt chữ hoa, chữ thường
II.3.2.1. So sánh string
MySQL tự động chuyển các số thành string (nếu cần)
mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,` test`);
-> `2 test`
expr LIKE pat [ESCAPE `escape-char`]
mysql> SELECT `David!` LIKE `David_`;
-> 1
mysql> SELECT `David!` LIKE `%D%v%`;
-> 1
mysql> SELECT `David!` LIKE `David\_`;
-> 0
mysql> SELECT `David_` LIKE `David\_`;
-> 1
mysql> SELECT `David_` LIKE `David|_` ESCAPE `|`;
-> 1
mysql> SELECT `abc` LIKE `ABC`;
-> 1
mysql> SELECT `abc` LIKE BINARY `ABC`;
-> 0
mysql> SELECT 10 LIKE `1%`;
-> 1
II.3.2.1. So sánh string (2)
MATCH ... AGAINST()
mysql> CREATE TABLE articles (
-> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> title VARCHAR(200),
-> body TEXT,
-> FULLTEXT (title,body)
-> );
mysql> INSERT INTO articles VALUES
-> (NULL,`MySQL Tutorial`, `DBMS stands for DataBase ...`),
-> (NULL,`How To Use MySQL Efficiently`, `After you went through a ...`),
-> (NULL,`Optimizing MySQL`,`In this tutorial we will show ...`),
-> (NULL,`1001 MySQL Tricks`,`1. Never run mysqld as root. 2. ...`),
-> (NULL,`MySQL vs. YourSQL`, `In the following database comparison ...`),
-> (NULL,`MySQL Security`, `When configured properly, MySQL ...`);
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST (`database`);
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
+----+-------------------+------------------------------------------+
II.3.2.2. Phân biệt chữ hoa, chữ thường
BINARY: Chuyển từ String sang kiểu Binary
mysql> SELECT "a" = "A";
-> 1
mysql> SELECT BINARY "a" = "A";
-> 0
Đối với kiểu trường BLOB, để tránh phân biệt chữ hoa, chữ thường, bạn chuyển tất cả về chữ hoa
SELECT `A` LIKE UPPER(blob_col) FROM table_name;
II.3.3. Các hàm trên kiểu số
mysql> SELECT 3+5;
-> 8
mysql> SELECT 3-5;
-> -2
mysql> SELECT - 2;
-> -2
mysql> SELECT 3*5;
-> 15
mysql> SELECT 18014398509481984*18014398509481984.0;
-> 324518553658426726783156020576256.0
mysql> SELECT 18014398509481984*18014398509481984;
-> 0
mysql> SELECT 3/5;
-> 0.60
mysql> SELECT 102/(1-1);
-> NULL
II.3.3. Các hàm trên kiểu số (2)
II.3.3. Các hàm trên kiểu số (3)
II.3.3. Các hàm trên kiểu số (4)
II.3.4. Các hàm trên ngày tháng
II.3.4. Các hàm trên ngày tháng (2)
II.3.4. Các hàm trên ngày tháng (3)
II.3.4. Các hàm trên ngày tháng (4)
II.3.4. Các hàm trên ngày tháng (5)
II.3.5. Hàm đổi kiểu
Sử dụng hàm CAST hoặc CONVERT
CAST(expression AS type)
CONVERT(expression,type)
CONVERT(expr USING transcoding_name)
Các kiểu sử dụng trong tham số type
BINARY
CHAR
DATE
DATETIME
SIGNED {INTEGER}
TIME
UNSIGNED {INTEGER}
mysql> SELECT CAST(1-2 AS UNSIGNED);
-> 18446744073709551615
mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
-> -1
mysql> SELECT CAST(NOW() AS DATE);
-> 2003-05-26
II.3.7. Các hàm dùng với mệnh đề GROUP BY
II.3.7.1. Các hàm GROUP BY
II.3.7.2. WITH ROLLUP
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP
II.3.7.1. Các hàm GROUP BY
II.3.7.1. Các hàm GROUP BY
II.3.7.1. Các hàm GROUP BY (2)
II.3.7.2. WITH ROLLUP
II.3.7.2. WITH ROLLUP (2)
SELECT lop.khoa, lop.id, SUM(diemtb)
FROM sv, lop
WHERE sv.lop=lop.id
GROUP BY lop.khoa, lop.id WITH rollup;
+------+-----+-------------+
| khoa | id | sum(diemtb) |
+------+-----+-------------+
| 1 | 1 | 21.3 |
| 1 | 2 | 23.3 |
| 1 | 4 | 33.4 |
| 1 |NULL | 78.0 |
| 2 | 10 | 8.0 |
| 2 | 11 | 17.0 |
| 2 |NULL | 25.0 |
| NULL |NULL | 103.0 |
+------+-----+-------------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP
SELECT hodem, ten, MAX(diemtb) FROM sv GROUP BY lop;
+----------+-------+-------------+
| hodem | ten | max(diemtb) |
+----------+-------+-------------+
| Dao Ngoc | Manh | 8.7 |
| Tran Van | Khom | 8.8 |
| doan | cong | 9.5 |
| Cu van | Chuoi | 8.0 |
| Dao Ngoc | Manh | 9.2 |
+----------+-------+-------------+
SELECT hodem, ten, diemtb, MAX(diemtb) FROM sv GROUP BY lop;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| Dao Ngoc | Manh | 6.4 | 8.7 |
| Tran Van | Khom | 7.2 | 8.8 |
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
+----------+-------+--------+-------------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP (2)
SELECT hodem, ten, diemtb, MAX(diemtb) FROM sv GROUP BY lop ORDER BY diemtb DESC;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
| Tran Van | Khom | 7.2 | 8.8 |
| Dao Ngoc | Manh | 6.4 | 8.7 |
+----------+-------+--------+-------------+
SELECT * FROM
sv,(SELECT lop, MAX(diemtb) AS diem FROM sv GROUP BY lop) AS b
WHERE sv.lop=b.lop AND sv.diemtb=b.diem;
+----+-----------+-------+------------+------+--------+------+------+
| id | hodem | ten | ngaysinh | lop | diemtb | lop | diem |
+----+-----------+-------+------------+------+--------+------+------+
| 6 | Pham Xuan | Dinh | 1983-08-10 | 1 | 8.7 | 1 | 8.7 |
| 10 | Tran Van | Khom | 2005-03-03 | 2 | 8.8 | 2 | 8.8 |
| 1 | doan | cong | 0000-00-00 | 4 | 9.5 | 4 | 9.5 |
| 11 | Cu van | Chuoi | 2004-03-05 | 10 | 8.0 | 10 | 8.0 |
| 13 | Le Minh | Thuy | 1983-06-21 | 11 | 9.2 | 11 | 9.2 |
+----+-----------+-------+------------+------+--------+------+------+
II.3.7.3. GROUP BY với các trường không nằm trong mệnh đề GROUP (2)
mysql> select hodem, ten, diemtb, max(diemtb) from sv group by lop order by diemtb desc;
+----------+-------+--------+-------------+
| hodem | ten | diemtb | max(diemtb) |
+----------+-------+--------+-------------+
| doan | cong | 9.5 | 9.5 |
| Cu van | Chuoi | 8.0 | 8.0 |
| Dao Ngoc | Manh | 7.8 | 9.2 |
| Tran Van | Khom | 7.2 | 8.8 |
| Dao Ngoc | Manh | 6.4 | 8.7 |
+----------+-------+--------+-------------+
mysql> select * from sv,(select lop, max(diemtb) as diem from sv group by lop) as b where sv.lop=b.lop and sv.diemtb=b.diem;
+----+-----------+-------+------------+------+--------+------+------+
| id | hodem | ten | ngaysinh | lop | diemtb | lop | diem |
+----+-----------+-------+------------+------+--------+------+------+
| 6 | Pham Xuan | Dinh | 1983-08-10 | 1 | 8.7 | 1 | 8.7 |
| 10 | Tran Van | Khom | 2005-03-03 | 2 | 8.8 | 2 | 8.8 |
| 1 | doan | cong | 0000-00-00 | 4 | 9.5 | 4 | 9.5 |
| 11 | Cu van | Chuoi | 2004-03-05 | 10 | 8.0 | 10 | 8.0 |
| 13 | Le Minh | Thuy | 1983-06-21 | 11 | 9.2 | 11 | 9.2 |
+----+-----------+-------+------------+------+--------+------+------+
II.4. Các câu lệnh thao tác trên dữ liệu (SELECT, INSERT, UPDATE, DELETE)
II.4.1. Câu lệnh SELECT
II.4.2. Sử dụng query lồng nhau (subquery)
II.4.3. Câu lệnh INSERT
II.4.4. Câu lệnh UPDATE
II.4.5. Câu lệnh DELETE
II.4.6. Câu lệnh REPLACE
II.4.7. Câu lệnh LOAD DATA INFILE
II.4.1. Câu lệnh SELECT
II.4.1.1. Cú pháp lệnh SELECT
II.4.1.2. Sử dụng SELECT với JOIN
II.4.1.3. Sử dụng SELECT với UNION
II.4.1. Câu lệnh SELECT (2)
Câu lệnh SELECT là câu lệnh SQL được sử dụng nhiều nhất
SELECT sử dụng để rút trích dữ liệu từ một hoặc nhiều bảng khác nhau
Lệnh SELECT thường được sử dụng kết hợp với các điều kiện WHERE, HAVING
Khi sử dụng SELECT trên nhiều bảng, cần phải chú ý đến cách thức các bảng kết hợp với nhau vì điều này ảnh hưởng rất nhiều đến tốc độ thực hiện của lệnh
II.4.1.1. Cú pháp lệnh SELECT
SELECT [DISTINCT | DISTINCTROW | ALL]
select_expression,...
[FROM table_references]
[WHERE where_definition]
[GROUP BY {col_name | formula} [ASC | DESC], ...
[WITH ROLLUP]]
[HAVING where_definition]
[ORDER BY {col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] row_count | row_count OFFSET offset]
II.4.1.1. Cú pháp lệnh SELECT (2)
Cú pháp của MySQL
SELECT 1+1;
Sử dung bảng dual để tương thích với CSDL khác
SELECT 1+1 FROM dual;
Một số ví dụ
SELECT * FROM sv;
SELECT id, hodem, ten, ngay sinh FROM sv;
SELECT * FROM sv ORDER BY diemtb;
SELECT * FROM sv ORDER BY diemtb DESC;
SELECT * FROM sv ORDER BY lop ASC, diemtb DESC;
SELECT * FROM sv WHERE lop >= 2 AND lop <= 4;
SELECT * FROM sv WHERE lop BETWEEN 2 AND 4;
II.4.1.1. Cú pháp lệnh SELECT (3)
Having chỉ nên sử dụng ở cuối câu query có sử dụng GROUP BY
SELECT MAX(diemtb) AS diemmax FROM sv GROUP BY lop HAVING diemmax>=9;
Liệt kê 5 dòng đầu tiên
SELECT * FROM sv LIMIT 5;
Liệt kê từ dòng 8 đến dòng 12
SELECT * FROM sv LIMIT 7, 5;
Đưa dữ liệu ra file text
SELECT * INTO OUTFILE `sv.txt` FIELDS TERMINATED BY `;` FROM sv;
II.4.1.2. Sử dụng SELECT với JOIN
Tích đề cac
table, table
table STRAIGHT_JOIN table
Inner Join
table [INNER | CROSS] JOIN table [join_condition]
II.4.1.2. Sử dụng SELECT với JOIN (2)
Left Join
table_reference LEFT [OUTER] JOIN table_reference [join_condition]
Right Join
table_reference RIGHT [OUTER] JOIN table_reference [join_condition]
II.4.1.2. Sử dụng SELECT với JOIN (3)
Tích đề các
SELECT * FROM sv, lop;
SELECT * FROM sv STRAIGHT_JOIN lop
Phân biệt inner, left, right join?
SELECT * FROM sv INNER JOIN lop ON sv.lop = lop.id;
SELECT * FROM sv LEFT JOIN lop ON sv.lop = lop.id;
SELECT * FROM sv RIGHT JOIN lop ON sv.lop = lop.id;
II.4.1.2. Sử dụng SELECT với JOIN (3)
SELECT * FROM lop LEFT JOIN sv
ON lop.id = sv.lop
WHERE sv.lop IS NULL;
SELECT * FROM sv LEFT JOIN lop
ON sv.lop=lop.id LEFT JOIN khoa
ON lop.khoa = khoa.id;
SELECT * FROM sv LEFT JOIN lop
ON sv.lop=lop.id LEFT JOIN khoa
ON lop.khoa = khoa.id;
II.4.1.3. Sử dụng SELECT với UNION
Cú pháp UNION:
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
[SELECT ...]
Chú ý: Chỉ sử dụng 1 loại UNION ALL hoặc UNION DISTINCT trong 1 câu lệnh UNION
II.4.1.3. Sử dụng SELECT với UNION (2)
CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
INSERT INTO t1 VALUES(1),(1),(1),(2),(2);
INSERT INTO t2 VALUES(2),(2),(3),(3),(3);
(SELECT * FROM t1)
UNION DISTINCT
(SELECT * FROM t2);
II.4.1.3. Sử dụng SELECT với UNION (3)
CREATE TABLE t1 (id INT);
CREATE TABLE t2 (id INT);
INSERT INTO t1 VALUES(2),(2),(1),(1),(1);
INSERT INTO t2 VALUES(3),(3),(3),(2),(2);
(SELECT * FROM t1 ORDER BY id)
UNION ALL
(SELECT * FROM t2 ORDER BY id);
II.4.2. Sử dụng query lồng nhau (SUBQUERY)
SUBQUERY là query nằm trong query khác
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
SELECT * FROM t1...
gọi là OUTER QUERY
SELECT column2 FROM t2
gọi là SUBQUERY
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (2)
SELECT tenlop,
( SELECT count(*)
FROM sv
WHERE sv.lop=lop.id
)
FROM lop;
SELECT tenlop,
( SELECT max(diemtb)
FROM sv
WHERE sv.lop=lop.id
)
FROM lop;
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (3)
SELECT tenlop,
( SELECT max(diemtb)
FROM sv
WHERE sv.lop=lop.id
) AS dmax,
( SELECT concat(hodem," ", ten)
FROM sv
WHERE sv.lop=lop.id AND diemtb=dmax
)
FROM lop;
II.4.2. Sử dụng query lồng nhau (SUBQUERY) (4)
SELECT l_Ten, BangDiem.*
FROM tblLop LEFT JOIN (
SELECT * FROM (
SELECT *
FROM tblSinhVien
ORDER BY sv_DiemTb DESC
) AS DiemSapXep
GROUP BY sv_Lop
) BangDiem
ON l_ID = BangDiem.sv_Lop;
II.4.2. Sử dụng query lồng nhau (subquery)
II.4.2.1. Subquery với ANY, IN, SOME, ALL
II.4.2.2. Truyền các tham số giữa các lớp query
II.4.2.3. Sử dụng EXISTS và NOT EXISTS
II.4.2.4. Row Subquery
II.4.2.5. Subquery trong mệnh đề FROM
II.4.2.6. Tối ưu hóa Subquery
II.4.2.1. Subquery với ANY, IN, SOME, ALL
SELECT * FROM sv WHERE lop IN(SELECT id FROM lop);
SELECT * FROM sv WHERE lop = ANY(SELECT id FROM lop);
SELECT * FROM sv WHERE lop = ALL(SELECT id FROM lop);
SELECT * FROM sv WHERE lop <> ANY(SELECT id FROM lop);
SELECT * FROM sv WHERE lop <> ALL(SELECT id FROM lop);
II.4.2.2. Truyền các tham số giữa các lớp query
SELECT l_Ten,
sv_Hodem,
sv_Ten,
sv_DiemTB
FROM tblLop LEFT JOIN tblSinhVien
ON l_ID=sv_Lop AND
sv_DiemTB = (
SELECT MAX(sv_DiemTB)
FROM tblSinhVien
WHERE sv_Lop=l_ID
);
II.4.2.2. Truyền các tham số giữa các lớp query (2)
SELECT tenkhoa,
( SELECT sum((
SELECT count(*)
FROM sv
WHERE sv.lop=lop.id
))
FROM lop
WHERE lop.khoa=khoa.id
)
FROM khoa;
II.4.2.3. Sử dụng EXISTS và NOT EXISTS
SELECT *
FROM lop
WHERE EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
);
SELECT *
FROM lop
WHERE NOT EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
);
II.4.2.3. Sử dụng EXISTS và NOT EXISTS (2)
SELECT *
FROM khoa
WHERE NOT EXISTS(
SELECT *
FROM lop
WHERE lop.khoa=khoa.id
);
SELECT *
FROM khoa
WHERE NOT EXISTS(
SELECT *
FROM lop
WHERE EXISTS(
SELECT *
FROM sv
WHERE sv.lop=lop.id
) AND
lop.khoa=khoa.id
);
II.4.2.4. Row Subquery
SELECT *
FROM t1
WHERE (1,2) =
( SELECT column1, column2
FROM t2
);
SELECT *
FROM t1
WHERE ROW(1,2) =
( SELECT column1, column2
FROM t2
);
II.4.2.4. Row Subquery (2)
SELECT *
FROM t1
WHERE (column1,column2) = (1,1);
SELECT *
FROM t1
WHERE column1 = 1 AND column2 = 1;
II.4.2.4. Row Subquery (3)
SELECT column1,column2,column3
FROM t1
WHERE (column1,column2,column3) IN
( SELECT column1,column2,column3
FROM t2
);
SELECT * FROM sv WHERE (hodem,ten)=("doan","cong");
SELECT tenlop,
( SELECT max(diemtb) FROM sv
WHERE sv.lop=lop.id) AS diemmax,
( SELECT concat(hodem, " ", ten) FROM sv
WHERE (lop, diemtb)=(lop.id, diemmax))
FROM lop;
II.4.2.5. Subquery trong mệnh đề FROM
SELECT ... FROM (
SELECT count(a) FROM
( SELECT `a` UNION ALL
SELECT `a` UNION ALL
SELECT `a` UNION ALL
SELECT `b`) AS temp
GROUP BY a;
SELECT avg(tongdiem)
FROM ( SELECT sum(diemtb) AS tongdiem
FROM sv
GROUP BY lop
) AS a;
II.4.2.5. Subquery trong mệnh đề FROM (2)
SELECT *
FROM sv
INNER JOIN ( SELECT lop,
max(diemtb) AS diemmax
FROM sv
GROUP BY lop
) AS a
ON sv.lop=a.lop AND sv.diemtb = a.diemmax;
II.4.2.6. Tối ưu hóa Subquery
Chuyển các mệnh đề từ ngoài vào trong subquery
SELECT * FROM t1
WHERE s1 IN (SELECT s1 FROM t1) OR
s1 IN (SELECT s1 FROM t2);
Đổi thành
SELECT * FROM t1
WHERE s1 IN ( SELECT s1 FROM t1
UNION ALL
SELECT s1 FROM t2
);
Hay
SELECT (SELECT column1 FROM t1) + 5 FROM t2;
Đổi thành
SELECT (SELECT column1 + 5 FROM t1) FROM t2;
II.4.2.6. Tối ưu hóa Subquery (2)
Sử dụng Rowsubquery thay vì truyền tham số
SELECT * FROM t1
WHERE EXISTS(
SELECT * FROM t2
WHERE t2.column1=t1.column1 AND
t2.column2=t1.column2
);
Đổi thành
SELECT * FROM t1
WHERE (column1,column2) IN (
SELECT column1,column2 FROM t2
);
Sử dụng NOT (a=ANY(...)) thay vì a<>ALL(...)
Sử dụng = ANY thay vì dùng EXISTS
II.4.2.6. Tối ưu hóa Subquery (3)
Cách thức MySql thực hiện Subquery
Những câu lệnh không có móc nối (truyền tham số) được gọi 1 lần
Viết lại các câu lệnh sử dụng IN/ALL/ANY/SOME nếu sử dụng các trường index trong bảng
II.4.3. Câu lệnh INSERT
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ((expression | DEFAULT),...),(...),...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=(expression | DEFAULT), ...
[ON DUPLICATE KEY UPDATE col_name=expression, ...]
II.4.3. Câu lệnh INSERT
INSERT ... VALUES: Thêm dữ liệu theo giá trị nhập vào của 1 hoặc nhiều dòng
INSERT ... SELECT: Thêm dữ liệu vào bảng sử dụng dữ liệu của bảng khác
Nếu không xác định danh sách tên cột thì tất cả các cột phải được liệt kê
Nếu 1 cột không được liệt kê trong danh sách tên cột (hoặc được gán giá trị NULL) thì khi insert sẽ được sử dụng giá trị default
Nếu sử dụng từ khóa DELAYED, các dòng chèn vào sẽ được để trong buffer (sau đó tiến trình gọi INSERT được tiếp tục), dữ liệu được để trong buffer cho đến khi không còn thao tác đọc nào đến bảng mới được chèn vào trong bảng
Nếu dùng LOW_PRIORITY thì tiến trình đợi không còn thao tác đọc nào mới chèn dữ liệu vào trong bảng và tiếp tục
II.4.3. Câu lệnh INSERT (2)
CREATE TABLE temp(id INT PRIMARY KEY NOT NULL);
INSERT INTO temp VALUES(10),(20),(30);
INSERT INTO temp VALUES(20),(30),(40),(50);
SELECT * FROM temp;
INSERT IGNORE INTO temp VALUES (20),(30),(40),(50);
SELECT * FROM temp;
II.4.3. Câu lệnh INSERT (3)
CREATE TABLE temp (id INT);
INSERT INTO temp VALUES(1),(2);
INSERT INTO temp SELECT * FROM temp;
SELECT * FROM temp;
+------+
| id |
+------+
| 1 |
| 2 |
| 1 |
| 2 |
+------+
II.4.4. Câu lệnh UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
II.4.4. Câu lệnh UPDATE (2)
Lệnh UPDATE: sửa giá trị cột của các dòng đã có trong bảng
Mệnh đề WHERE dùng để xác định dòng nào được cập nhật
Mệnh đề ORDER BY xác định thứ tự cập nhật, kết hợp với LIMIT để xác định các dòng cập nhật
Nếu sử dụng từ khóa LOW_PRIORITY, tiến trình đợi đến khi không có yêu cầu đến bảng mới thực hiện UPDATE
Nếu sử dụng từ khóa IGNORE, MySQL sẽ bỏ qua lỗi trùng khóa và vẫn tiếp tục cập nhật
Nếu tên cột nằm ở phía phải của biểu thức thì sẽ cho giá trị hiện tại của cột đó (ví dụ UPDATE temp SET id=id+1)
Thứ tự thực hiện biểu thức từ trái qua phải (ví dụ UPDATE temp SET id=id+1, id=id*2)
Nếu cập nhật giá trị NULL cho cột NOT NULL thì sẽ lấy giá trị DEFAULT của cột đó
II.4.4. Câu lệnh UPDATE (3)
CREATE TABLE temp(id INT);
INSERT INTO temp VALUES(1),(2);
UPDATE temp SET id=id+1, id=id*2;
SELECT * FROM temp;
UPDATE lop, sv
SET diemtb = diemtb+0.1
WHERE lop.id=sv.lop AND lop.tenlop="46pm1";
SELECT tenlop,
( SELECT min(diemtb)
FROM sv
WHERE sv.lop = lop.id
ORDER BY diemtb desc
LIMIT 3
)
FROM lop;
II.4.5. Câu lệnh DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] table_name[.*] [, table_name[.*] ...]
FROM table-references
[WHERE where_definition]
DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
FROM table_name[.*] [, table_name[.*] ...]
USING table-references
[WHERE where_definition]
II.4.5. Câu lệnh DELETE (2)
Nếu sử dụng từ khóa LOW_PRIORITY, tiến trình đợi đến khi không còn thao tác nào đến bảng mới thực hiện thao tác delete
Nếu sử dụng từ khóa IGNORE thì các lỗi sẽ được bỏ qua trong quá trình xóa
Mệnh đề ORDER BY kết hợp với LIMIT có thể xóa được một số lượng xác định các bản ghi theo thứ tự
Bạn có thể sử dụng cú pháp thứ 2 để xóa nhiều bảng
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Dương Văn Nhân
Dung lượng: |
Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)