🥬
FreshForFresh
  • ✌️Xin chào!
  • Overview
    • 💡Data structures and Algorithms
    • 👀Programming
    • 🧠Database
    • 🦴Back-End
    • ✨Front-End
    • 💐Spring Framework
    • 🛠️Tool
  • Data structures and Algorithms
    • 🎰Data Type
    • 🗑️Garbage collection
    • 🧩Data structures
    • 🎲Algorithms
  • Programming
    • 🧮Compiler
      • 🤖Tại sao phải cần compiler?
      • 📠Java Virtual Machine
  • 📈Thread
  • 🔐Lock & Deadlock
  • 🏇Race condition & Data Race
  • 🧯Synchronized
  • 🗜️Blocking IO và Non Blocking IO Client Server Socket
  • 🌐Languages
    • 🎛️Programming Language
    • 📑Client-Side & Server-Side
    • ⁉️Why java? Why javascript?
  • 🗼Design pattern
    • 🎨Front-End Design Pattern
    • 🏗️Back End Design Pattern
      • 🐴with Java
      • 🦄with Spring Boot
      • 🐖with Modern Backend Development
      • 🐁with Microservice
  • 🍀Clean Code
    • 🌊Chương 1: Code sạch
    • 📐Chương 2: Quy tắc đặt tên rõ nghĩa
    • 🚧Chương 3: Cách viết hàm
    • 👻Chương 4: Comments thế nào cho chuẩn?
    • 🥳Chương 5: Định dạng code.
    • 😈Chương 6: Đối tượng và cấu trúc dữ liệu
    • 🐛Chương 7: Xử lí lỗi
    • ☦️Chương 8: Ranh giới code
    • 🧪Chương 9: Unit test
    • 🥂Chương 10: Lớp đối tượng
    • 🥡Chương 11: Code sạch cấp hệ thống
  • Database
    • 🐔Giới thiệu
    • 📰Các loại cơ sở dữ liệu
    • 🐘Các loại DBMS phổ biến
    • 🕵️‍♀️SQL và cách sử dụng với relational database
      • 👺Lệnh SQL
      • 🛢️JOIN trong SQL
      • 🛕GROUP BY trong SQL
      • 🐼ORDER BY trong SQL
      • 🐣Truy vấn con SUBQUERY trong SQL Server
      • 🏦Transaction Trong SQL
      • 🇲🇰ACID
    • ☢️Thiết kế cơ sở dữ liệu
    • 🕍Consistency and concurrency handling
      • 🔒Database locking
      • 🎮Concurrency Control
      • 🙀Isolation Level
    • 🎨Performance & Scability
      • ☝️Indexing
      • 👯‍♂️Partitioning
      • 💅Các tips tăng hiệu suất SQL
      • 🇲🇬Kiểm tra và Xác thực việc Sao lưu và Phục hồi CSDL
      • 🌠Database sharding
      • 🧘‍♂️REPLICATION
      • 😁Các vấn đề ảnh hưởng đến performance.
  • Back-End
    • 🔫API?
    • 🐕‍🦺Web Services
    • 💾Phân biệt API và web service
    • 🙆‍♂️Tìm hiểu về RestAPI
    • 🧦SOAP
    • ✈️GraphQL API
    • 📊Compared GraphQL & REST
    • 📄Phân biệt HTTP & HTTPS
    • 🚵Client & Server
    • 🇩🇲DOM
  • Front-End
    • 🦑User Interface (UI)
    • 🛰️State Management
  • Spring Framework
    • 🔐Spring Security
      • 🌅Đơn giản hoá Spring Security
      • 🌸Spring Security: Authentication and Authorization In-Depth
      • 🚻OAuth2 Basic
      • 🀄JWT + Spring Security Oauth
      • 📤Logout trong ứng dụng sử dụng bảo mật Oauth
      • 🔂Reset Password
      • 🎗️OAuth2 Remember Me với Refresh Token
      • ⛓️OAuth2 cho một Spring REST API
  • Network
    • 💸Mạng máy tính căn bản
  • Tool
    • 🦏Các câu lệnh Docker cơ bản
    • 🦧Github
      • 🐰Các lệnh Git cơ bản
      • 🐇Một số trường hợp khi sử dụng Git
    • 🏚️WebServer
      • 🪂Tổng quan về kiến trúc hệ thống
      • 🔃Cơ bản về WebServer Nginx
  • Tài nguyên
    • 👨‍🏫Course
    • 📖Docs
Powered by GitBook
On this page
  1. Database
  2. SQL và cách sử dụng với relational database

Truy vấn con SUBQUERY trong SQL Server

Bài viết dưới đây sẽ hướng dẫn cách dùng truy vấn con trong SQL Server cùng với cú pháp và các ví dụ.

Truy vấn con trong SQL (subquery) là gì?

Trong SQL Server, truy vấn con là một truy vấn nằm trong một truy vấn khác. Bạn có thể tạo các truy vấn trong lệnh SQL. Các truy vấn con này nằm trong mệnh đề WHERE, FROM hoặc SELECT.

Lưu ý:

  • Truy vấn con còn được gọi là INNER QUERY hay INNER SELECT.

  • Truy vấn chính mà chứa truy vấn con được gọi là OUTER QUERY hay OUTER SELECT.

Mệnh đề WHERE

Thông thường truy vấn con nằm trong mệnh đề WHERE. Các truy vấn con này gọi là truy vấn lồng nhau hay truy vấn phụ.

SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
WHERE s.sanpham_id IN 
     (SELECT htk.sanpham_id
     FROM hangtonkho htk
     WHERE htk.soluong > 10);

Đây là đoạn truy vấn con trong lệnh SELECT nói trên:

(SELECT htk.sanpham_id
FROM hangtonkho htk 
WHERE htk.soluong > 10);

Truy vấn con cho phép tìm các giá trị sanpham_id từ bảng hangtonkho có số lượng lớn hơn 10. Sau đó truy vấn con được dùng để lọc kết quả từ truy vấn chính bằng điều kiện IN.

Truy vấn con có thể được viết thành INNER JOIN như dưới đây.

SELECT s.sanpham_id, s.sanpham_ten
FROM sanpham s
INNER JOIN hangtonkho htk
ON s.sanpham_id = htk.sanpham_id
WHERE htk.soluong > 10;

INNER JOIN sẽ trả về hiệu quả hơn truy vấn con ban đầu. Cũng cần lưu ý là không phải truy vấn con nào cũng viết lại bằng JOIN được.

Mệnh đề FROM

SELECT nhacung.nhacung_ten, truyvancon1.tong_sl 
FROM nhacung,
     (SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl 
     FROM donhang
     GROUP BY nhacung_id) truyvancon1
WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;

Ở ví dụ này chúng ta đã tạo truy vấn con trong mệnh đề FROM như sau:

(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl 
FROM donhang
GROUP BY nhacung_id) truyvancon1

Truy vấn con này cũng được gắn bí danh là truyvancon1. Đây sẽ là tên dùng để tham chiếu tới truy vấn con này hoặc bất kì trường thông tin nào của nó.

Mệnh đề SELECT

Thường truy vấn con đặt trong mệnh đề SELECT để tính toán bằng các hàm tổng như SUM, COUNT, MIN hay MAX nhưng không muốn tính trong truy vấn chính.

SELECT n1.ho, n1.ten, 
      (SELECT MAX(luong)
      FROM nhanvien n2
      WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2
FROM nhanvien n1;

Dưới đây là truy vấn con được tạo trong ví dụ trên

(SELECT MAX(luong)
FROM nhanvien n2
WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2

Truy vấn con này cũng được gắn bí danh là truyvancon2. Đây sẽ là tên dùng để tham chiếu tới truy vấn con này hoặc bất kì trường thông tin nào của nó.

Thủ thuật đặt truy vấn con trong mệnh đề SELECT được dùng là bởi truy vấn con trả về giá trị đơn. Đó là lý do các hàm tổng như SUM, COUNT, MIN hay MAX thường được dùng trong truy vấn con.

PreviousORDER BY trong SQLNextTransaction Trong SQL

Last updated 1 year ago

🕵️‍♀️
🐣