Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SQL GIỮA-Các mẹo thông minh để quét tìm một loạt các giá trị

SQL BETWEEN là một toán tử được sử dụng để chỉ định một phạm vi giá trị để kiểm tra. Giá trị trả về có thể bao gồm hoặc trong phạm vi. Hoặc nó có thể nằm ngoài phạm vi nếu bạn thêm toán tử NOT trước nó. Nó hoạt động cho ngày tháng, ngày tháng với thời gian, số và chuỗi.

Bạn có thể sử dụng nó trong mệnh đề WHERE cho những việc sau:

  • CHỌN,
  • CHÈN (với CHỌN)
  • CẬP NHẬT,
  • và XÓA.

Nó cũng hoạt động cho các mệnh đề HAVING cùng với GROUP BY.

Nhưng nếu bạn không cẩn thận, SQL GIỮA có thể khiến bạn thất vọng khi sử dụng nó, đặc biệt là với những ngày có thời gian.

Tuy nhiên, không phải lo lắng. Chúng tôi có các ví dụ để đối phó với các lỗi khi sử dụng SQL GIỮA. Nhưng trước đó, dữ liệu mẫu tôi sử dụng đến từ NOAA . Bạn có thể yêu cầu dữ liệu thời tiết miễn phí từ họ. Tôi đã sử dụng bản ghi nhiệt độ hàng giờ cho Hoa Kỳ vào năm 2010. Sau đó, tôi nhập dữ liệu CSV vào SQL Server bằng SQL Server Management Studio. Tôi đã đổi tên các cột và thêm chỉ mục không phân cụm.

Hãy bắt đầu.

Sử dụng SQL GIỮA với Ngày và Giờ

Đây phải là mục được tìm kiếm nhiều nhất khi xử lý SQL GIỮA. Chúng tôi sẽ sử dụng các ví dụ để giải thích cách hoạt động của nó.

Mẹo # 1:Đối với các cột DATETIME, hãy chỉ định cả ngày và giờ

SỬ DỤNG SAI

Hãy bắt đầu với cách sử dụng sai để nhấn mạnh điểm này. Việc sử dụng BETWEEN với các cột DATETIME sau đây sẽ cho kết quả bất ngờ.


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010' AND '01/02/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


Truy vấn trả về dữ liệu trong 2 ngày từ một trạm thời tiết gần Sân bay Quốc tế O’Hare ở Chicago. Bạn có thể nhận thấy phạm vi giữa giá trị thấp hơn (01/01/2010) và giá trị cao hơn (01/02/2010). Đây là kết quả được thiết lập trong Hình 1.

Hình 1 . Tập hợp kết quả của truy vấn sử dụng SQL GIỮA 2 ngày.

Nhưng vấn đề là ở đâu?

Nó được cho là một kỷ lục hàng giờ trong 2 ngày. Do đó, tập kết quả nên có 48 bản ghi. Nhưng hãy lưu ý rằng nó chỉ là 24. Vấn đề nằm ở yếu tố thời gian của DateHour cột. Khi bạn không chỉ định thời gian trong cột DATETIME, nó sẽ giả định là 00:00 hoặc 12:00 SA. Ngoài ra, lưu ý rằng dữ liệu bắt đầu vào ngày 1 tháng 1 năm 2010, lúc 01:00 sáng, không phải 12:00 sáng.

Vì vậy, trong nội bộ, SQL Server đã sử dụng DateHour GIỮA ’01/01/2010 00:00:00.000 ′ ’01/02/2010 00:00:00.000 ′ . Làm sao chúng ta biết?

NGÀY THỰC SỰ LÀ STRING

Đúng vậy.

Giá trị ngày tháng được đặt trong dấu ngoặc kép không thực sự là ngày tháng mà là chuỗi ký tự . SQL Server sử dụng chuyển đổi ngầm định để chuyển đổi chuỗi thành DATETIME. Sau khi chuyển đổi, phần thời gian sẽ được thêm vào ngày.

Hãy kiểm tra bằng Bao gồm kế hoạch thực thi thực tế . Nhấn Ctrl-M trong SQL Server Management Studio, sau đó chạy lại ví dụ trước đó.

Khi Kế hoạch thực thi xuất hiện, hãy nhấp chuột phải vào Tìm kiếm chỉ mục và chọn Thuộc tính . Xem Hình 2.

Hình 2 . Chuyển đổi ngầm một chuỗi thành DATETIME. Nó được ẩn trong Kế hoạch thực thi của một truy vấn sử dụng GIỮA.

Sau đó, mở rộng Tìm kiếm dự đoán . Các phần đóng hộp của Hình 2 cho thấy sự chuyển đổi ngầm định của 2 chuỗi thành DATETIME. Vì chuyển đổi ngầm được thực hiện nội bộ , người mới bối rối tại sao không đáp ứng được kỳ vọng của họ trong tập hợp kết quả.

CÁCH SỬ DỤNG ĐÚNG

Ví dụ dưới đây sẽ trả về các bản ghi hàng giờ trong khoảng thời gian từ 8 giờ sáng đến 12 giờ đêm vào ngày 2 tháng 1 năm 2010.


SELECT * FROM TemperatureData
WHERE DateHour BETWEEN '01/02/2010 08:00' AND '01/02/2010 12:00'
AND Latitude = 41.995
AND Longitude = -87.9336;


Bạn cần chỉ định phần thời gian, đặc biệt là khi các ngày giống nhau. Hoặc kết quả mong đợi của bạn sẽ không xảy ra.

Để trả lại hồ sơ cho cả ngày, điều này sẽ không hiệu quả:


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour = '06/01/2010'
AND Latitude = 41.995
AND Longitude = -87.9336;


Nó sẽ chỉ trả lại 1 bản ghi - bản ghi vào ngày 1 tháng 6 năm 2010, lúc 12:00 sáng. Nhưng sử dụng GIỮA với thời gian được chỉ định, bạn có thể trả lại bản ghi của từng giờ cho cả ngày. Xem ví dụ tiếp theo.


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010 00:00' AND '06/01/2010 23:00'
AND Latitude = 41.995
AND Longitude = -87.9336;


Lưu ý rằng tôi chỉ định tối đa 23:00. Nếu dữ liệu của bạn sử dụng bất kỳ thời điểm nào trong ngày, hãy sử dụng 23:59 hoặc 11:59 tối ở giá trị cao hơn của phạm vi. Cũng chỉ định giây nếu bạn cần.

Mẹo # 2:Xem xét Loại dữ liệu NGÀY

Nếu bạn không cần phần thời gian, hãy xem xét loại dữ liệu DATE. Và bạn sẽ tránh được những rắc rối kể trên.

SQL GIỮA với các số

Hãy chuyển sang các con số.

Mẹo số 3:Bao gồm phần thập phân cho các giá trị không phải là số nguyên


SELECT
 DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] BETWEEN 5.0 AND 7.0
AND Latitude = 41.995
AND Longitude = -87.9336;


Lưu ý việc bổ sung một điều kiện khác liên quan đến số. Kết quả sẽ được giới hạn ở mức 5 và 7 độ.

Khi sử dụng các kiểu dữ liệu DECIMAL, MONEY hoặc FLOAT, hãy chỉ định phần thập phân ngay cả khi nó bằng 0, chẳng hạn như 52,00 hoặc 10,0000. Bằng cách này, bạn tránh được chuyển đổi ngầm định đến các loại dữ liệu DECIMAL, MONEY hoặc FLOAT mục tiêu.

SQL GIỮA với chuỗi

Mẹo số 4:Đối với chuỗi, phạm vi dựa trên đối chiếu

Với chuỗi, GIỮA đánh giá các giá trị dựa trên thứ tự bảng chữ cái. ‘A’ là ít nhất và ‘Z’ là lớn nhất. Bạn cũng có thể nói rằng nói chung, đánh giá dựa trên đối chiếu. Bởi vì tiếng Anh không phải là ngôn ngữ duy nhất mà SQL Server hỗ trợ. Đối chiếu cung cấp các quy tắc sắp xếp, chữ hoa chữ thường và độ nhạy trọng âm. Hãy sử dụng AdventureWorks cơ sở dữ liệu cho ví dụ này. Kiểm tra đoạn mã dưới đây và kết quả trong Hình 3.


USE AdventureWorks
GO

SELECT 
 LastName
,FirstName
,MiddleName
FROM Person.Person
WHERE Lastname BETWEEN 'Spanaway' AND 'Splane'
ORDER BY LastName;

Hình 3 . Tập hợp kết quả của truy vấn sử dụng GIỮA với các chuỗi.

Phạm vi bao gồm họ Spanaway . Nhưng Splane ở đâu ? Nó không tồn tại trong cơ sở dữ liệu. Vì vậy, kết quả chỉ đạt đến tối đa Spicer .

SQL GIỮA Các mẹo cho tất cả các loại dữ liệu được hỗ trợ

Cho dù bạn đang sử dụng GIỮA cho ngày, số hay chuỗi, có những điều phổ biến bạn nên biết. Đây có thể là lẽ thường, nhưng nó vẫn xảy ra do nhầm lẫn. Đọc về cách điều này có thể xảy ra.

Mẹo # 5:Cả Giá trị Bắt đầu và Giá trị Kết thúc đều không được ĐẦY ĐỦ

GIỮA cần giá trị bắt đầu và giá trị kết thúc cho phạm vi. Mỗi giá trị phải có một giá trị không phải là NULL. Dưới đây là một ví dụ với giá trị cuối NULL.


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010' AND NULL;


Điều này có thể xảy ra nếu bạn gọi câu lệnh SELECT từ một ứng dụng hoặc một quy trình được lưu trữ và bạn không xác thực nó đúng cách.

Mẹo số 6:Giá trị ban đầu không được lớn hơn giá trị cuối cùng

Không có gì cũng sẽ được trả lại nếu cả hai giá trị không phải là NULL, nhưng phạm vi được đảo ngược. Đây là một ví dụ.

SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '01/30/2010' AND '01/01/2010';


Ngoài ngày tháng, các biểu thức sau cũng sẽ không trả lại kết quả:

    Giá trị
  • GIỮA 100 VÀ -200. Vì -200 thấp hơn 100.
  • làm việc GIỮA "Zookeeper" VÀ "Accountant". Vì ‘Z’ lớn hơn ‘A’.

Mẹo # 7:Giá trị phạm vi phải có cùng kiểu dữ liệu

Đôi khi, các điều khiển giao diện người dùng có đầu ra không mong muốn. Hoặc chúng ta vừa nhặt nhầm tài sản. Và nếu chúng tôi không kiểm tra nó trước khi chuyển nó đến SQL Server, một tình huống như thế này có thể xảy ra:


SELECT 
 DateHour
,Hourly_Heating_Degree_Hours
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND 'Saturday, June 5, 2010'
AND Latitude = 41.995
AND Longitude = -87.9336;

Sẽ xảy ra lỗi chuyển đổi từ chuỗi ký tự thành ngày tháng.

Vì vậy, bài học từ Mẹo # 5 đến # 7 là xác thực giá trị bắt đầu và giá trị kết thúc của phạm vi .

Mẹo # 8:KHÔNG SỬ DỤNG GIỮA ĐỂ Loại trừ Giá trị

Hãy xem xét một ví dụ khác.


SELECT
 MONTH(DateHour) AS [Month] 
,round(AVG([Hourly_Heating_Degree_Hours]),2) AS AverageTemperature
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 00:00' AND '06/30/2010 23:00'
AND DateHour NOT BETWEEN '05/01/2010 00:00' AND '05/31/2010 23:00'
AND Latitude = 41.995
AND Longitude = -87.9336
GROUP BY MONTH(DateHour);


Điều này sẽ trả về mức trung bình hàng tháng từ tháng 1 đến tháng 6 nhưng sẽ loại trừ tháng 5. Việc loại trừ các hồ sơ cho tháng 5 năm 2010 được thực hiện bởi KHÔNG GIỮA. Đây là kết quả được thiết lập trong Hình 4.

Hình 4 . Tập hợp kết quả của truy vấn sử dụng KHÔNG GIỮA.

SQL GIỮA So với các toán tử khác

Mẹo # 9:Sử dụng IN nếu bạn cần danh sách chứ không phải phạm vi

Toán tử IN xác định xem một giá trị có khớp với bất kỳ giá trị nào trong danh sách hoặc truy vấn con hay không. Trong khi đó, việc sử dụng NOT IN sẽ kiểm tra xem một giá trị có khớp không.

Cả toán tử BETWEEN và IN đều lọc dữ liệu dựa trên nhiều giá trị. Nhưng sự khác biệt nằm ở tập hợp các giá trị được so khớp. GIỮA sử dụng một phạm vi. Nhưng IN sử dụng các giá trị được phân tách bằng dấu phẩy trong danh sách hoặc các hàng trong truy vấn con.

Kiểm tra ví dụ bên dưới.

SELECT
 DateHour
,[Hourly_Heating_Degree_Hours]
FROM TemperatureData
WHERE DateHour BETWEEN '06/01/2010' AND '06/5/2010 23:00'
AND [Hourly_Heating_Degree_Hours] IN (5.2, 6, 7, 3.7)
AND Latitude = 41.995
AND Longitude = -87.9336;


Nhìn vào danh sách các giá trị được sử dụng bởi IN. Nó không cần phải là một danh sách các giá trị ngày càng tăng. Giá trị cuối cùng trong danh sách (3,7) cũng là giá trị nhỏ nhất trong số các số.

Mẹo số 10:Chọn từ GIỮA hoặc> =với <=

Trong thời gian chạy, SQL Server chuyển đổi GIỮA thành> =với các toán tử <=. Làm sao chúng ta biết?

Hãy xem đoạn mã dưới đây.


SELECT
 DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour BETWEEN '01/01/2010 08:00' AND '01/01/2010 12:00'
GROUP BY DateHour;

SELECT
 DateHour
,AVG(Hourly_Heating_Degree_Hours) AS AverageTemp
FROM TemperatureData
WHERE DateHour >= '01/01/2010 08:00' 
AND DateHour <= '01/01/2010 12:00'
GROUP BY DateHour;


Cả hai truy vấn sẽ có cùng kết quả được đặt như trong Hình 5.

Hình 5 . Kết quả được đặt bằng cách sử dụng BETWEEN hoặc> =với <=.

Họ cũng có cùng một kế hoạch thực hiện, như trong Hình 6.

Hình 6 . Kế hoạch thực thi của 2 truy vấn so sánh việc sử dụng GIỮA và các toán tử> =và <=.

Nhưng đây là vấn đề.

Lưu ý Chỉ mục đầu tiên Tìm kiếm trong Hình 6. Sau đó, xem Tìm kiếm dự đoán . Bạn có thấy từ khóa BETWEEN không? Không có gì, phải không? Bởi vì nó được chuyển đổi thành> =với các toán tử <=. Đó là những toán tử có trong Tìm kiếm dự đoán .

Nhưng còn nhiều hơn thế nữa.

Nếu bạn di chuột đến Tìm kiếm chỉ mục thứ hai , bạn sẽ thấy các thuộc tính giống như Tìm kiếm chỉ mục đầu tiên .

Vì vậy, có vẻ như toán tử GIỮA là một phím tắt cho> =với <=các toán tử . Bạn sẽ nhập nhiều hơn nếu bạn sử dụng cái sau. Bạn sẽ thấy chuyển đổi tương tự xảy ra khi GIỮA được sử dụng ở dạng số và chuỗi.

Cuối cùng, bạn sử dụng BETWEEN hay các toán tử> =và <=tùy thuộc vào bạn. Thời gian chuyển đổi để chuyển đổi GIỮA là không đáng kể. Nhưng nếu bạn vẫn không muốn thêm thời gian đó, không đáng kể, hãy sử dụng các toán tử> =và <=.

Tóm lại

SQL BETWEEN phù hợp để tìm nạp dữ liệu bao gồm phạm vi. Và nó không khó sử dụng. Ngay cả các giá trị DATETIME cũng có thể quản lý được với BETWEEN. Chỉ cần đảm bảo rằng bạn trang trải đúng phần thời gian. Nó cũng tương đương với việc sử dụng> =với <=. Bạn muốn sử dụng cái nào là tùy thuộc vào bạn.

Bạn có thể đánh dấu trang này để nhận các mẹo SQL GIỮA các mẹo cho ngày, số và chuỗi khi bạn cần.

Nếu bạn có một số thủ thuật sử dụng GIỮA mà chúng tôi chưa đề cập, bạn có thể chia sẻ chúng với chúng tôi trong phần Nhận xét. Và nếu bạn thích bài viết này, hãy chia sẻ nó bằng cách nhấn các nút mạng xã hội.

Chúc mọi người viết mã vui vẻ!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt chế độ chờ vật lý bảo vệ dữ liệu chủ động trong kiến ​​trúc một nút RAC - Phần 1

  2. Hạn chế một máy chủ được liên kết với một đăng nhập cục bộ duy nhất (Ví dụ T-SQL)

  3. Làm thế nào để che giấu các bảng và bảo tồn tính toàn vẹn được tham chiếu

  4. Phần 2 - Cách tổ chức một sơ đồ cơ sở dữ liệu lớn

  5. Người đọc giải pháp cho thách thức Quần đảo đặc biệt