Từ 1 tới 1 trên tổng số 1 kết quả

Đề tài: Tìm kiếm và lựa chọn với SELECT

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Talking Tìm kiếm và lựa chọn với SELECT

    Xem mục lục các bài viết


    Bây giờ cùng thử làm việc với câu lệnh SELECT để tìm kiếm và lựa chọn kết quả cần tìm.
    Cấu trúc cơ bản của câu lệnh SELECT
    Code:
    SELECT 
    	<col-1>,
    	<col-2>,
    	…,
    	<col-N>
    FROM <table_name>
    Ví dụ trong database ‘Northwind’ tớ muốn lấy ra các cột ‘FirstName’ và ‘LastName’ thì tớ viết như sau :
    Code:
    SELECT
    	Firstname,
    	Lastname
    FROM Employees ;
    GO
    Chú ý : giữa các cột phải có dấu phẩy dưới để ngăn cách.
    Nếu bạn muốn lấy tất cả các cột trong bảng thì dùng dấu *. Ví dụ nếu tớ muốn lấy tất cả các cột trong bảng ‘Employees’ thì viết như thế này
    Code:
    SELECT *
    FROM Employees;
    GO
    Bây giờ thử làm vài cái mắm muối với lệnh SELECT nhé.
    Bây giờ giả sử chạy query dưới đây :
    Code:
    SELECT 
    Address, 
    City, 
    Country
    FROM Customers;
    GO
    Giả sử mấy cái kết quả này mình muốn nó gộp 3 cột lại thành một cột khi SELECT thôi thì thế nào nhỉ ?
    Nếu tớ muốn gộp 3 cột trên thành cột mới là ‘DiaChi’ thì viết thế này :
    Code:
    SELECT 
    	Address + ‘ ‘ + City + ‘ ‘ + Country 
    	AS
    		DiaChi
    FROM Customers;
    GO
    Vậy là mỗi record thì giá trị 3 cột được ghép lại thành 1 cột và ngăn cách nhau bởi 1 dấu cách (space).
    Dùng AS để góp vào các cột.
    Bây giờ tìm kiếm chi tiết hơn một chút, nếu như bây giờ trong bảng ‘Customers’ muốn lấy ra tất cả các ‘ContactName’ mà chỉ lấy cái nào có “Country = ‘USA’” thôi thì viết thế nào ?
    Ở đây để lọc kết quả ta dùng thêm mệnh đề WHERE
    Ví dụ
    Code:
    SELECT
    	ContactName
    FROM Customers
    WHERE
    	Country = ‘USA’;
    GO
    Thì kết quả thu ra chỉ có ‘ContactName’ có “Country = ‘USA’” thôi.
    Chi tiết hơn một chút về mệnh đề WHERE. Bây giờ muốn lấy thêm “Country = ‘Canada’” thì làm thế nào ?
    Dùng thêm logic OR trong WHERE.
    Vậy thì viết như thế này :
    Code:
    SELECT
    	ContactName
    FROM Customers
    WHERE
    	Country = ‘USA’ OR Country = ‘Canada’;
    GO
    Vậy là thu được các kết quả có Country = USA và Canada.
    Bây giờ mình muốn tìm ra các ‘ContactName’ có “Country = ‘USA’” và “ContactTitle = ‘Owner’” thì viết thế nào ?
    Dùng logic AND trong mệnh đề WHERE
    Code:
    SELECT
    	ContactName
    FROM Customers
    WHERE
    	Country = ‘USA’
    	AND
    	ContactTitle = ‘Owner’;
    GO
    Được kết quả như ý muốn rồi, bây giờ muốn lấy thêm cả “Country = ‘France’” thì viết thế nào ? Phối hợp thêm OR
    Code:
    SELECT
    	ContactName
    FROM Customers
    WHERE
    	Country = ‘USA’ OR Country = ‘France’
    	AND
    	ContactTitle = ‘Owner’;
    GO
    Bạn nghĩ viết như trên là đúng ?. Nhưng thực tế không được kết quả như mong muốn. Ở đây có một điểm sai đó là : trong toán tử logic AND có độ ưu tiên lớn hơn OR
    Vì thế khi bạn run query ở trên bạn sẽ thu được các ‘ContactName’ có “Country = ‘France’” mà có “ContactTitle = ‘Owner’” và các ‘ContactName’ có “Country = ‘USA’” với bất cứ ‘ContactTitle’ nào.
    Để sửa lại độ ưu tiên của logic thì bạn đặt vào trong dấu ngoặc đơn.
    Đoạn query trên sửa lại như sau:
    Code:
    SELECT 
    	ContactName
    FROM Customers
    WHERE
    	(Country = ‘USA’ OR Country =’France’)
    	AND
    	ContactTitle = ‘Owner’;
    GO
    Lúc này thì đúng như ý muốn rồi.
    Giả sử như mà cái ‘ContactTitle’ mà quên đi mấy chữ cái, có nhớ được mấy chữ đầu như là ‘Sa’ thì tìm như thế nào ?
    Lúc này thì dùng LIKE
    Ví dụ :
    Code:
    SELECT
    	ContactName, ContactTitle
    FROM Customers
    WHERE
    	(Country = ‘USA’ OR Country = ‘France’)
    	AND
    ContactTitle LIKE ‘Sa%’;
    GO
    Vậy là ra các loại ‘ContactName’ có ‘ContactTitle’ bắt đầu là ‘Sa’ .
    Kết quả thu được nhìn hơi rắc rối, mình muốn kết quả nó sắp xếp theo một thứ tự nào đó để dễ nhìn.
    Dùng ORDER BY để sắp xếp.
    Chẳng hạn ví dụ trên muốn kết quả sắp xếp theo thứ tự ABC của cột ‘ContactTitle’ thì viết thêm thế này :
    Code:
    SELECT
    	ContactName, ContactTitle
    FROM Customers
    WHERE
    	(Country =’USA’ OR Country = ‘France’)
    	AND 
    	ContactTitle LIKE ‘Sa%’
    ORDER BY
    	ContactTitle ASC;
    GO
    Vậy là các record thu được đã được sắp xếp theo thứ tự ABC của cột ContactTitle. Nếu muốn sắp xếp theo thứ tự ngược lại thì dùng DESC. Chú ý nếu bạn không cung cấp kiểu sắp xếp thì mặc định là ASC
    Ví dụ :
    Code:
    ORDER BY 
    	ContactTitle ASC;
    -- tương đương với
    ORDER BY
    	ContactTitle;
    Vậy thì tổng hợp các kiểu SELECT và lựa chọn sắp xếp trên có công thức chung viết gộp lại thế này
    Code:
    SELECT
    	<column-list>
    FROM
    	<table_name>
    WHERE
    	<column-X> (AND | OR ) <value-Y>
    ORDER BY
    	<column-Z> (ASC | DESC)
    Vậy là xong cơ bản về SELECT.
    Bây giờ làm cái khác bổ sung cho thú vị.
    Giả sử muốn lấy các ‘Country’ của các ‘ContactName’ trong bảng ‘Customers’ thì viết đơn giản thế này
    Code:
    SELECT 
    	Country
    FROM Customers;
    GO
    Thế là kết quả ra một danh sách dài ngoằng mà trùng giá trị rất nhiều.
    Bây giờ muốn là mỗi giá trị thì xuất hiện một lần thôi không được lặp lại thì làm sao ?.
    Dùng DISTINCT
    Ví dụ
    Code:
    SELECT 
    	DISTINCT Country
    FROM Customers;
    GO
    Vậy là mỗi cái chỉ xuất hiện một lần.
    Chà, bây giờ muốn nó viết ra cái file XML để mình tiện xem cấu trúc thì làm sao nhỉ?
    Dùng thêm lệnh chuyển sang dạng XML
    Code:
    FOR XML ( RAW | AUTO | EXPLICIT )
    Ở đây có 3 options là RAW , AUTO và EXPLICIT
    · RAW: dạng thô XML lấy trực tiếp từ kết quả thu được không có định nghĩa tag
    · AUTO : dạng thô XML có được định nghĩa tag
    · EXPLICIT : dạng well-formed XML, đầy đủ chi tiết
    Chú ý với 2 cái RAW và AUTO thì chỉ cần viết thêm đơn giản là
    Code:
    FOR XML RAW
    Hoặc
    FOR XML AUTO
    Còn với EXPLICIT thì hơi phức tạp để tạo được một cấu trúc well-formed XML.
    Ngoài 3 thuộc tính chính trên còn có thêm một thuộc tính khác là PATH. Phức tạp hơn cả thằng EXPLICIT.
    Bây giờ đi vào chi tiết từng thằng cu một xem nó làm việc thế nào.
    FOR XML RAW
    Như đã nói ở trên là nó không có định nghĩa tag và ở dạng thô nên kết quả thu ra sẽ là các <row> elements và các column là các attribute.
    Bây giờ thử làm việc vài phát với bảng ‘Employees’ quen thuộc nhé.
    Các bạn chạy thử query này xem :
    Code:
    USE Northwind;
    GO
    SELECT
    	EmployeeID,
    	FirstName
    FROM Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW;
    GO
    Và đây là kết quả :
    Code:
    -- Kết quả
    <row EmployeeID="1" FirstName="Nancy" />
    <row EmployeeID="2" FirstName="Andrew" />
    <row EmployeeID="3" FirstName="Janet" />
    Bây giờ muốn cho mỗi column thành một ELEMENT tag chứ không phải attribute nữa thì thêm vào định nghĩa ELEMENTS vào sau RAW.
    Code:
    SELECT
    	EmployeeID,
    	FirstName
    FROM Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW, ELEMENTS;
    GO
    Và đây là kết quả có được :
    Code:
    <row>
      <EmployeeID>1</EmployeeID>
      <FirstName>Nancy</FirstName>
    </row>
    <row>
      <EmployeeID>2</EmployeeID>
      <FirstName>Andrew</FirstName>
    </row>
    <row>
      <EmployeeID>3</EmployeeID>
      <FirstName>Janet</FirstName>
    </row>
    Nhìn trông có vẻ giống Mr.XML đẹp trai rồi .
    Làm cái khác, run thử query dưới đây
    Code:
    SELECT
    	EmployeeID,
    	FirstName,
    	ReportsTo
    FROM Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW;
    GO
    Bạn thấy cái dòng thứ 2 không có ReportsTo vì nó mang giá trị NULL.
    Bạn muốn nó kèm theo cả NULL thì viết thế nào ?.
    Cái này thì dùng XSINIL đi kèm với ELEMENTS trong định nghĩa tag cho các column
    Sửa ví dụ trên thế này :
    Code:
    SELECT 
    	EmployeeID,
    	FirstName,
    	ReportsTo
    FROM Employees
    WHERE
    	EmployeeID < 4
    FOR XML RAW, ELEMENTS XSINIL;
    GO
    Vậy là với column mang giá trị null thì attribute : xsinil sẽ mang giá trị ‘true’. Tại sao như thế thì bạn cần phải học XML để biết thêm chi tiết nha.
    Bạn thấy cái file XML này hay nhưng không hiểu cấu trúc nó được định nghĩa trong XML ra sao và bạn cần cái SCHEMA của nó. Vậy thì xử lý nó với tùy chọn XMLDATA
    Vẫn với code ở trên mình yêu cầu nó output ra cái schema thì viết thế này :
    Code:
    SELECT 
    EmployeeID,
    FirstName,
    ReportsTo
    FROM Employees
    WHERE
    	EmployeeID < 4
    FOR XML RAW, XMLDATA;
    GO
    Và bạn sẽ có ngay được DATA Schema của nó.
    Bây giờ muốn biết chi tiết hơn về XSD Schema thì làm sao ?.
    Dùng tùy chọn XMLSCHEMA thay vào ở trên :
    Code:
    SELECT 
    	EmployeeID,
    	FirstName,
    	ReportsTo
    FROM Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW, XMLSCHEMA;
    GO
    Có ngay XSD Schema.
    Nhìn lại thấy cái target namespace không ổn cho lắm, bạn muốn chỉ định cái target namespace URI là một đối số tùy chọn trong XMLSCHEMA thì sao ?.
    Chẳng hạn cho cái target namespace có giá trị là “congdongcviet.com” đi nhé, thì với cái code ở trên mình viết thế này :
    Code:
    SELECT 
    	EmployeeID,
    	FirstName,
    	ReportsTo
    FROM Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW, XMLSCHEMA (‘urn:congdongcviet.com’);
    GO
    Sau đó thấy kết quả các target namespace đều trỏ vào ‘congdongcviet.com’ hết.
    Bạn để ý trong bảng ‘Employees’ có cột ‘Photo’ nếu bạn viết ra file XML với các lẹnh tùy chọn như trên thì kiểu gì 100% cũng bị báo lỗi ^_^!. Bởi vì cột ‘Photo’ ở type = ‘image’ vì thế muốn lấy giá trị này cần phải dùng tùy chọn BINARY BASE64 để lấy ra
    Ví dụ
    Code:
    SELECT
    	Photo
    FROM
    	Employees
    WHERE
    	EmployeeID = 1
    FOR XML RAW, BINARY BASE64;
    GO
    Bạn sẽ thu được một attribute Photo với các giá trị Binary đã được encode sang base64.
    Nãy giờ làm việc với RAW mà lúc nào cũng là các tag <row> nhìn hơi chướng mắt, bạn muốn đổi nó thành tên khác, thì thêm giá trị tên cho nó như sau :
    Code:
    SELECT
    	EmployeeID,
    	FirstName
    FROM
    	Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW (‘Employee’), ELEMENTS;
    GO
    Nhìn bây giờ trông có vẻ đẹp hơn rồi đấy.
    Bây giờ muốn có thêm thằng ROOT ELEMENT nhỉ dùng thuộc tính ROOT và viết thế này :
    Code:
    SELECT
    	EmployeeID,
    	FirstName
    FROM
    	Employees
    WHERE 
    	EmployeeID < 4
    FOR XML RAW (‘Employee’), ROOT (‘EmployeeRoot’), ELEMENTS;
    GO
    Thế này chắc là đủ nhòe với thằng cu XML rồi.
    Còn các tùy chọn kia thì chắc là lúc khác vì nó rắc rối đòi hỏi kiến thức XML nhiều hơn là mấy cài này.
    Một ý cuối cùng để kết thúc cho SELECT là : nếu bạn muốn chọn ra TOP X giá trị nào đó thì chèn thêm đằng sau SELECT TOP X.
    Ví dụ để lấy TOP 10 thì viết là :
    Code:
    SELECT TOP 10 ….. – Đoạn này bạn tự nghiên cứu thử xem
    Bài viết quá dài nên kết thúc ở đây.

    Chúc một ngày vui vẻ !
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 04-08-2007 lúc 08:39 PM.
    None!

Các đề tài tương tự

  1. [Kiếm Thế] Kiếm Thế Ngạo Thiên Kiếm Chạy Thử Nghiệm vào 10h ngày 15/09
    Gửi bởi c0jskull trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 5
    Bài viết cuối: 29-09-2013, 10:45 AM
  2. MS Access với C# Select kiểu int với số 000 ở đầu
    Gửi bởi natri1991 trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 2
    Bài viết cuối: 04-06-2013, 09:30 PM
  3. làm thế nào để select 1 bảng mà có cột sẽ có giá trị select từ 1 bảng khác??
    Gửi bởi xiaoku trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 9
    Bài viết cuối: 31-08-2011, 10:56 AM
  4. MS SQL với C# Select có điều kiện. Giúp mình với?
    Gửi bởi hvcuongit trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 4
    Bài viết cuối: 24-03-2010, 05:11 PM
  5. Select SQL
    Gửi bởi MartSoft trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 17-10-2009, 03:05 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn