Làm việc với JOIN và Subquery

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Miller Trujillo

Staff Software Engineer

Dữ liệu nằm ở nhiều bảng

  • books, authors, categories, book_reviews
  • Cần kết hợp dữ liệu giữa các bảng

Quan hệ trong cơ sở dữ liệu thư viện

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

JOIN các bảng

String sql = "SELECT b.title, a.first_name, a.last_name " +
             "FROM books b " +

"INNER JOIN book_authors ba ON b.book_id = ba.book_id " + "INNER JOIN authors a ON ba.author_id = a.author_id " +
"WHERE b.publication_year > ?";
PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 2010); ResultSet rs = pstmt.executeQuery();
| title                                              | first_name | last_name |
| -------------------------------------------------- | ---------- | --------- |
| Effective Java                                     | Joshua     | Bloch     |
| Designing Data-Intensive Applications              | Martin     | Kleppmann |
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

INNER và LEFT JOIN

-- INNER JOIN: chỉ các bản ghi khớp
SELECT b.title, r.rating
FROM books b
INNER JOIN book_reviews r 
    ON b.book_id = r.book_id;
-- LEFT JOIN: mọi bản ghi từ bảng trái
SELECT b.title, r.rating
FROM books b
LEFT JOIN book_reviews r 
    ON b.book_id = r.book_id;

Inner và Left Join

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Subquery

// Lấy cuốn sách xuất bản gần đây nhất
String sql = "SELECT title FROM books " +
             "WHERE publication_year = ( " +

" SELECT MAX(publication_year) FROM books " + ")";
PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery();
| title                                              |
| -------------------------------------------------- |
| Effective Java                                     |
| Refactoring: Improving the Design of Existing Code |
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Subquery với tham số

// Lấy tất cả sách thể loại "Fantasy"
String sql = "SELECT title FROM books " +
             "WHERE category_id IN ( " +

" SELECT category_id FROM categories WHERE name = ? " + ")";
PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "Fantasy"); ResultSet rs = pstmt.executeQuery();
| title                                    |
| ---------------------------------------- |
| The Way of Kings                         |
| Harry Potter and the Philosopher's Stone |
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

StringBuilder

  • Nối chuỗi bằng + chậm và khó đọc
  • append() thêm văn bản, toString() trả về kết quả
StringBuilder sb = new StringBuilder("SELECT * FROM ");

sb.append("books");
sb.append(" WHERE 1=1");
sb.toString(); // SELECT * FROM books WHERE 1=1
Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Cùng luyện tập nào!

Truy vấn cơ sở dữ liệu PostgreSQL trong Java

Preparing Video For Download...