Apache Tajo - Truy vấn SQL
Chương này giải thích về các Truy vấn quan trọng sau đây.
- Predicates
- Explain
- Join
Hãy để chúng tôi tiến hành và thực hiện các truy vấn.
Dự đoán
Vị từ là một biểu thức được sử dụng để đánh giá các giá trị true / false và UNKNOWN. Các vị từ được sử dụng trong điều kiện tìm kiếm của mệnh đề WHERE và mệnh đề HAVING và các cấu trúc khác mà giá trị Boolean được yêu cầu.
Vị ngữ IN
Xác định xem giá trị của biểu thức cần kiểm tra có khớp với bất kỳ giá trị nào trong truy vấn con hoặc danh sách hay không. Truy vấn con là một câu lệnh SELECT thông thường có tập kết quả gồm một cột và một hoặc nhiều hàng. Cột này hoặc tất cả các biểu thức trong danh sách phải có cùng kiểu dữ liệu với biểu thức để kiểm tra.
Syntax
IN::=
<expression to test> [NOT] IN (<subquery>)
| (<expression1>,...)
Query
select id,name,address from mytable where id in(2,3,4);
Result
Truy vấn trên sẽ tạo ra kết quả sau.
id, name, address
-------------------------------
2, Amit, 12 old street
3, Bob, 10 cross street
4, David, 15 express avenue
Truy vấn trả về các bản ghi từ mytable cho id học sinh 2,3 và 4.
Query
select id,name,address from mytable where id not in(2,3,4);
Result
Truy vấn trên sẽ tạo ra kết quả sau.
id, name, address
-------------------------------
1, Adam, 23 new street
5, Esha, 20 garden street
6, Ganga, 25 north street
7, Jack, 2 park street
8, Leena, 24 south street
9, Mary, 5 west street
10, Peter, 16 park avenue
Truy vấn trên trả về các bản ghi từ mytable nơi học sinh không thuộc khối 2,3 và 4.
Giống như Vị ngữ
Vị từ LIKE so sánh chuỗi được chỉ định trong biểu thức đầu tiên để tính toán giá trị chuỗi, được coi là giá trị để kiểm tra, với mẫu được xác định trong biểu thức thứ hai để tính giá trị chuỗi.
Mẫu có thể chứa bất kỳ sự kết hợp nào của các ký tự đại diện như -
Ký hiệu gạch dưới (_), có thể được sử dụng thay cho bất kỳ ký tự đơn nào trong giá trị để kiểm tra.
Dấu phần trăm (%), thay thế bất kỳ chuỗi nào không hoặc nhiều ký tự trong giá trị cần kiểm tra.
Syntax
LIKE::=
<expression for calculating the string value>
[NOT] LIKE
<expression for calculating the string value>
[ESCAPE <symbol>]
Query
select * from mytable where name like ‘A%';
Result
Truy vấn trên sẽ tạo ra kết quả sau.
id, name, address, age, mark
-------------------------------
1, Adam, 23 new street, 12, 90
2, Amit, 12 old street, 13, 95
Truy vấn trả về các bản ghi từ bảng của tôi về những sinh viên có tên bắt đầu bằng 'A'.
Query
select * from mytable where name like ‘_a%';
Result
Truy vấn trên sẽ tạo ra kết quả sau.
id, name, address, age, mark
——————————————————————————————————————-
4, David, 15 express avenue, 12, 85
6, Ganga, 25 north street, 12, 55
7, Jack, 2 park street, 12, 60
9, Mary, 5 west street, 12, 75
Truy vấn trả về các bản ghi từ mytable của những sinh viên có tên bắt đầu bằng 'a' là ký tự thứ hai.
Sử dụng Giá trị NULL trong Điều kiện Tìm kiếm
Bây giờ chúng ta hãy hiểu cách sử dụng Giá trị NULL trong các điều kiện tìm kiếm.
Syntax
Predicate
IS [NOT] NULL
Query
select name from mytable where name is not null;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)
Ở đây, kết quả là true nên nó trả về tất cả các tên từ bảng.
Query
Bây giờ chúng ta hãy kiểm tra truy vấn với điều kiện NULL.
default> select name from mytable where name is null;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)
Giải thích
Explainđược sử dụng để có được một kế hoạch thực thi truy vấn. Nó cho thấy một kế hoạch hợp lý và toàn cầu thực hiện một câu lệnh.
Truy vấn kế hoạch logic
explain select * from mytable;
explain
-------------------------------
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
Result
Truy vấn trên sẽ tạo ra kết quả sau.
Kết quả truy vấn hiển thị một định dạng kế hoạch hợp lý cho bảng đã cho. Phương án lôgic trả về ba kết quả sau:
- Danh sách mục tiêu
- Ra ngoài lược đồ
- Trong lược đồ
Truy vấn kế hoạch toàn cầu
explain global select * from mytable;
explain
-------------------------------
-------------------------------------------------------------------------------
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002)
-------------------------------------------------------------------------------
|-eb_0000000000000_0000_000002
|-eb_0000000000000_0000_000001
-------------------------------------------------------------------------------
Order of Execution
-------------------------------------------------------------------------------
1: eb_0000000000000_0000_000001
2: eb_0000000000000_0000_000002
-------------------------------------------------------------------------------
=======================================================
Block Id: eb_0000000000000_0000_000001 [ROOT]
=======================================================
SCAN(0) on default.mytable
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=======================================================
Block Id: eb_0000000000000_0000_000002 [TERMINAL]
=======================================================
(24 rows, 0.065 sec, 0 B selected)
Result
Truy vấn trên sẽ tạo ra kết quả sau.
Ở đây, kế hoạch toàn cầu hiển thị ID khối thực thi, thứ tự thực hiện và thông tin của nó.
Tham gia
Các phép nối SQL được sử dụng để kết hợp các hàng từ hai bảng trở lên. Sau đây là các loại SQL Joins khác nhau:
- Tham gia bên trong
- {TRÁI | ĐÚNG | FULL} THAM GIA NGOÀI TRỜI
- Tham gia chéo
- Tự tham gia
- Tham gia tự nhiên
Hãy xem xét hai bảng sau để thực hiện các thao tác nối.
Bảng 1 - Khách hàng
Tôi | Tên | Địa chỉ | Tuổi tác |
---|---|---|---|
1 | Khách hàng 1 | 23 Phố Cổ | 21 |
2 | Khách hàng 2 | 12 Phố Mới | 23 |
3 | Khách hàng 3 | 10 Đại lộ Express | 22 |
4 | Khách hàng 4 | 15 Đại lộ Express | 22 |
5 | Khách hàng 5 | 20 Garden Street | 33 |
6 | Khách hàng 6 | 21 North Street | 25 |
Table2 - customer_order
Tôi | Mã đơn hàng | Id trống |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
Bây giờ chúng ta hãy tiếp tục và thực hiện các phép toán nối SQL trên hai bảng trên.
Tham gia bên trong
Phép nối bên trong chọn tất cả các hàng từ cả hai bảng khi có sự khớp giữa các cột trong cả hai bảng.
Syntax
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Query
default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
age, empid
-------------------------------
21, 101
23, 102
22, 103
22, 104
33, 105
Truy vấn khớp với năm hàng từ cả hai bảng. Do đó, nó trả về tuổi của các hàng phù hợp từ bảng đầu tiên.
Tham gia bên ngoài bên trái
Một phép nối ngoài cùng bên trái giữ lại tất cả các hàng của bảng “bên trái”, bất kể có hàng nào khớp trên bảng “bên phải” hay không.
Query
select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
customer6,
Tại đây, phép nối ngoài cùng bên trái trả về các hàng cột tên từ bảng khách hàng (bên trái) và cột trống các hàng khớp với bảng khách hàng (bên phải).
Tham gia bên ngoài bên phải
Một phép nối ngoài cùng bên phải giữ lại tất cả các hàng của bảng “bên phải”, bất kể có hàng nào khớp trên bảng “bên trái” hay không.
Query
select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
Ở đây, phép kết hợp bên ngoài bên phải trả về các hàng trống từ bảng customer_order (bên phải) và cột tên khớp với các hàng từ bảng khách hàng.
Tham gia đầy đủ bên ngoài
Tham gia bên ngoài đầy đủ giữ lại tất cả các hàng từ cả bảng bên trái và bên phải.
Query
select * from customers c full outer join customer_order c1 on c.id = c1.id;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
Truy vấn trả về tất cả các hàng phù hợp và không khớp từ cả bảng khách hàng và bảng customer_order.
Tham gia chéo
Điều này trả về tích Descartes của các tập hợp các bản ghi từ hai hoặc nhiều bảng được nối.
Syntax
SELECT * FROM table1 CROSS JOIN table2;
Query
select orderid,name,address from customers,customer_order;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
Truy vấn trên trả về tích Descartes của bảng.
Tham gia tự nhiên
Một phép nối tự nhiên không sử dụng bất kỳ toán tử so sánh nào. Nó không nối theo cách một tích Descartes làm. Chúng ta chỉ có thể thực hiện phép nối tự nhiên nếu có ít nhất một thuộc tính chung tồn tại giữa hai mối quan hệ.
Syntax
SELECT * FROM table1 NATURAL JOIN table2;
Query
select * from customers natural join customer_order;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
Ở đây, có một id cột chung tồn tại giữa hai bảng. Sử dụng cột chung đó,Natural Join tham gia cả hai bảng.
Tự tham gia
SQL SELF JOIN được sử dụng để nối một bảng với chính nó như thể bảng là hai bảng, tạm thời đổi tên ít nhất một bảng trong câu lệnh SQL.
Syntax
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field
Query
default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;
Result
Truy vấn trên sẽ tạo ra kết quả sau.
id, name
-------------------------------
1, customer1
2, customer2
3, customer3
4, customer4
5, customer5
6, customer6
Truy vấn kết hợp một bảng khách hàng với chính nó.