To get an alphabetical or an incremental order of records, you must let the database engine know what field would be used as reference. To visually specify the order, if you are using a Query window or the Query Designer:
SELECT WhatField(s) FROM WhatObject ORDER BY WhatField ASC;
If you are working in the Query Designer, to arrange the records in ascending order:
The reverse of arranging the records normally is the descending order. If you are working in the Query Designer, to arrange the records in ascending order:
If you are arranging the records using code, you must explicitly indicate that you want to arranging in descending order. This is done by adding the DESC keyword after the name of the column. The formula to use is: SELECT WhatField(s) FROM WhatObject ORDER BY WhatField DESC;
As we will see in the next sections, when sorting the records, the result you will get depend on the (data) type of (the) column.
We already know that some fields can hold a value or be null, which would indicate that such a field has no value. As mentioned already, to sort records, you must specify the column by which you are sorting. If some records of that field are null, those records would be selected first. Here is an example: SELECT * FROM Registration.Students ORDER BY LastName; GO This would produce:
On the other hand, if you sort the records in descending order, the non-null records would come first.
If you sort the records based on a column that uses plain text (char, varchar, varchar(max) and their variants nchar, nvarchar, and nvarchar(max)), the database engine would refer to the language used by the database. If the language is latin-based, which is the default in US English, the records would be arranged in alphabetical order based on the indicated column. Here is an example that gives a list of students based on the students numbers: SELECT StudentNumber, FirstName, LastName, Gender, ParentsNames, SingleParentHome FROM Registration.Students ORDER BY StudentNumber; GO This would produce:
As mentioned already, if the column has null values, their records would come first. Also, you can add the ASC keyword to re-enforce the idea that you want to sort the records in ascending order. To reverse an ascending arrangement, add the DESC keyword after the name of the column. Here is an example: SELECT FirstName,
LastName,
Gender,
ParentsNames,
SingleParentHome
FROM Registration.Students
ORDER BY LastName DESC;
GO
This would produce:
Boolean fields are those that use 0 (false) and 1 (true) values. If you arrange a list based on such a field, the NULL records would come first, followed by records with a 0 value, and followed by records with 1. Here is an example: USE master; GO CREATE DATABASE Exercise10; GO USE Exercise10; GO CREATE TABLE Videos(Title nvarchar(50), [Length] int, Rating nchar(10), [Year] int, WideScreen bit); GO INSERT INTO Videos VALUES(N'Last Castle (The)', 133, N'R', 2001, 1); GO INSERT INTO Videos(Title, [Length], [Year]) VALUES(N'Sex, Lies, and Videotape', 99, 1989); GO INSERT INTO Videos(Title, [Length], [Year], WideScreen) VALUES(N'American President (The)', 115, 1995, 0); GO INSERT INTO Videos(Title, WideScreen, Rating) VALUES(N'Day After Tomorrow (The)', 1, N'PG-13'); GO INSERT INTO Videos(Title, [Length], Rating, WideScreen) VALUES(N'Sneakers', 126, N'PG-13', 1); GO SELECT * FROM Videos ORDER BY WideScreen; GO This would produce:
If you sort the records in descending order, the records with 1 value would come up first, followed by those with 0, and then the NULL values.
As you may know already, the SQL supports various types of numeric values. The columns that use those values can be sorted in incremental order. The SQL interpreter uses the rules specified in the Control Panel. For example, in US English, the referenced number is 0. Then there are negative and positive values. Of course, negative values come before 0 and positive values come after. As seen with other types, if you sort the records based on a number-based column, if that column has null records, those records would come first. The other records would be sorted in increment order. Here is an example: SELECT * FROM Videos ORDER BY [Year]; GO This would produce:
Of course, to sort the records in decrementing order, apply the DESC keyword after the name of the column.
The SQL supports date, time, and combinations of date and time values. When you sort records based on a column that uses one of Transact-SQL date-based types (date, time, datetime, smalldate, or datetime2), the SQL interpreter must be able to identify each date/time value. Fortunately, the database engine will have validated each date/time value and reject those that were not valid. As seen for the other data types, if you sort records based on a column that uses a date/time type and if the column has null values, the records with null values would show first. The values of a date/time field are sorted in chronological orders. As a result:
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|
Consider the following table: USE Exercise; GO CREATE TABLE Employees([Empl #] nchar(10), [First Name] nvarchar(20), [Last Name] nvarchar(20), Salary money, [Full Time?] bit); GO INSERT INTO Employees VALUES(N'29730', N'Philippe', N'Addy', 20.05, 1); GO INSERT INTO Employees([Empl #], [First Name], [Last Name], Salary) VALUES(N'28084', N'Joan', N'Shepherd', 12.72); GO INSERT INTO Employees([Empl #], [First Name], [Last Name], Salary) VALUES(N'79272', N'Joshua', N'Anderson', 18.26); GO INSERT INTO Employees VALUES(N'22803', N'Gregory', N'Swanson', 15.95, 0); GO INSERT INTO Employees([Empl #], [Last Name], Salary, [Full Time?]) VALUES(N'28084', N'Shepherd', 12.72, 1), (N'39742', N'Anders', 8.88, 0); GO INSERT INTO Employees VALUES(N'83084', N'Josephine', N'Anderson', 20.02, 1); GO INSERT INTO Employees([Empl #], [First Name], [Last Name], Salary) VALUES(N'79272', N'James', N'Anders', 18.26), (N'27924', N'Gregory', N'Hope', 12.85), (N'39742', N'John', N'Anderson', 8.88); GO SELECT * FROM Employees; GO This would produce:
Imagine you want to arrange the list based on salaries, you would execute a statement as: SELECT [Empl #], [First Name], [Last Name], [Salary],
CASE [Full Time?]
WHEN 0 THEN N'Contractor'
WHEN 1 THEN N'Full Time'
ELSE N'Unspecified'
END AS [Employment Status]
FROM Employees
ORDER BY [Salary];
GO
This would produce:
Notice that some records have the same salaries. If you get a situation where many records on a column have the same value, you can specify an additional column by which to sort the records. To visually sort by more than one column, in the Criteria pane, click the Sort Type corresponding to the first column and select the desired option. To specify the subsequent column, click the box corresponding to its Sort Type and select the desired option. To keep track of the columns you are using, in the Sort Order column, the database engine would create an incrementing number for each. The first column receives the number 1, the second receives the number 2, and so on. Here is an example:
If you don't like the order suggested, click the Sort Order box corresponding to the column whose position you want to change, then click the arrow of its combo box and select the desired number:
After making your selection, the studio would update the order of sorting columns. To arrange the list using more than one column using the SQL, after ORDER BY, type the columns separated by commas.
If you specify more than one record to sort by, the database engine sorts the primary column first. Then, on the second field, when two records have the same value, the NULL values would come first. Here is an example: SELECT [Empl #], [First Name], [Last Name], [Salary], [Full Time?] FROM Employees ORDER BY [Salary], [Full Time?]; GO This would produce:
Notice that when two records have the same values and if one of the records has a NULL value, that one comes first.
Imagine you have two string-based records that have the same value. If you sort them, you would wonder which one would come up first. An additional field would solve this problem. That is, you can combine fields to sort the records. Here is an example: SELECT [Empl #], [First Name], [Last Name], [Salary], CASE [Full Time?] WHEN 0 THEN N'No' WHEN 1 THEN N'Yes' ELSE N'Don''t Know' END AS [Employment Status] FROM Employees ORDER BY [Last Name], [First Name]; GO If you do this, the SQL interpreter would first sort the records based on the first field, in which case the records would be grouped. It is then the second field that would be used to handle the assignment. In other words, using the alphabetical order, the value that comes first would be based on the alphabet, such as US English. The above statement would produce:
Notice that, when you sort more than one string-based fields, the records with NULL values come first, such is the case for the above Anders and the Shepherd records. For the fields that are not null, the records are sorted based on the second records; that's the case for the Anderson records.
As you may know already, Transact-SQL supports records that use date only, time only, or a combination of date and time values. When sorting the records, you can combine the fields to get a certain appreciation of the distribution of records. If you have records that occur at different dates, the sorting is easy. Imagine you have records that occur on the same day but at different times, if you have all dates and times on the same column, you can sort by only that column and the database engine would take care of the rest. We saw an example already. If you have one column that holds date values but another field that records the times, you can first sort by the date column, followed by the time field. Here is an example: USE master;
GO
CREATE DATABASE IceCreamFactory1;
GO
USE IceCreamFactory1;
GO
CREATE SCHEMA IceCream;
GO
CREATE TABLE IceCream.Orders
(
OrderID int identity(1, 1) not null,
OrderDate date not null,
OrderTime time not null
);
GO
INSERT IceCream.Orders(OrderDate, OrderTime)
VALUES(N'2011-02-14', N'10:12'), (N'2011-02-15', N'09:08'),
(N'2011-05-10', N'15:24'), (N'2011-07-04', N'14:01'),
(N'2011-04-18', N'19:16'), (N'2011-04-18', N'10:12'),
(N'2011-04-18', N'12:48'), (N'2011-07-04', N'11:26');
GO
SELECT OrderID, OrderDate, OrderTime FROM IceCream.Orders
ORDER BY OrderDate, OrderTime;
GO
In this case, the records of the date column would be sorted first, which means the records would be grouped by day. In other words, records that occur on the same day would be put in the same range. Then, when some records occur on the same day, the records of the time field would be sorted in chronological order. The above code would produce:
Notice the records registered on 2011-04-18 and 2011-07-04. It's the values of OrderTime field that determine the sorting.
Consider the following table and its records: CREATE TABLE Videos ( [Shelf #] nchar(7) null, Title nvarchar(50) not null, Director nvarchar(50), [Length] int, Rating nchar(10), [Year] int ); GO INSERT INTO Videos VALUES(N'DHE-927', N'Two for the Money', N'D.J. Caruso', 123, N'R', 2008), (N'CGM-683', N'Her Alibi', N'Bruce Beresford', 94, N'PG-13', 1998), (N'FQT-973', N'Memoirs of a Geisha', N'Rob Marshall', 145, N'PG-13', 2006), (N'DBT-395', N'Wall Street', N'Oliver Stone', 126, N'R', 2000); GO INSERT INTO Videos(Title, Director, [Length], Rating) VALUES(N'Stealing Harvard', N'Bruce McCulloch', 85, N'PG-13'); GO INSERT INTO Videos([Shelf #], Title, Director, [Length], [Year]) VALUES(N'TPH-973', N'A Few Good Men', N'Rob Reiner', 138, 1992); GO INSERT INTO Videos(Title, Director, [Year], [Length]) VALUES(N'The Silence of the Lambs', N'Jonathan Demme', 1991, 118); GO INSERT INTO Videos([Shelf #], Title, Director, Rating, [Length]) VALUES(N'DZV-737', N'The Lady Killers', N'Joel Coen & Ethan Coen', N'R', 104); GO INSERT INTO Videos(Title, Director, [Length], Rating, [Year]) VALUES(N'Sneakers', N'Phil Alden Robinson', 126, N'PG-13', 1992), (N'Annie', N'John Huston', 126, N'G', 1982), (N'Dave', N'Ivan Reitman', 110, N'PG-13', 1993); GO INSERT INTO Videos VALUES(N'ADR-737', N'Incredibles (The)', N'Brad Bird', 133, N'PG', 2004); GO As we have seen so far, to get the list of all records, you would execute: SELECT * FROM Videos;
Notice that the statement produces 12 records. To get the first 40% records, you would execute: SELECT TOP 40 PERCENT * FROM Videos; GO
Notice that you get 5 records that include 3 with a PG-13 rating. If you want to arrange the list based on the Rating column, you can add the ORDER BY clause as follows: SELECT TOP 40 PERCENT * FROM Videos ORDER BY Rating; GO
Notice that you still get 5 records but this time, only one is with PG-13 and the PG-13 record is the last. Transact-SQL provides an operation that associates with the ORDER BY statement and the TOP PERCENT value. The operation works as follows:
To visually perform this operation, in the Object Explorer, right-click the table or view and click Edit Top 200 Rows. Include at least either the Criteria pane or the SQL pane. In either the Criteria pane or the SQL pane, set the order of your choice (ascending or descending) for the column that will hold the arrangement. Here is an example:
In the Properties window, expand the Top Specification field and make sure its (Top) field is set to Yes (it should be set already). In the Expression field, enter the value you want. Set the Percent field to Yes. Set the With Ties field to Yes. Here is an example:
Once these are done, you can execute the statement:
In Transact-SQL, the formula to perform the above operation is: SELECT TOP ( expression ) [ PERCENT ] [ WITH TIES ] What Columns FROM Object ORDER BY Column The WITH TIES clause asks the SELECT statement to perform the two operations we saw aboce. The WITH TIES expression is entered after the PERCENT keyword, which is before the list of columns. Here is an example: SELECT TOP 40 PERCENT WITH TIES * FROM Videos ORDER BY Rating; GO This would produce:
Consequently, the WITH TIES condition is used to select the top percent records plus all records that use the value of the last record depending on the column specified by the ORDER BY clause.
|
|
|||||||||||||||||||||||
|