To explicitly select columns, enter the col- umn names after the SELECTkeyword as shown in the following query and click Execute.. How It Works The new query returns the data for columns
Trang 1Figure 5-2.Query results pane
How It Works
You ask the database to return the data for all columns, and you get exactly that If you
scroll to the right, you’ll find all the columns in the Employees table
Most of the time, you should limit queries to only relevant columns When you selectcolumns you don’t need, you waste resources To explicitly select columns, enter the col-
umn names after the SELECTkeyword as shown in the following query and click Execute
Figure 5-3 shows the results
Select employeeid, firstname, lastname
from employees
This query selects all the rows from the Employees table but only the EmployeeID,FirstName, and LastName columns
Trang 2Figure 5-3.Selecting specific columns
Using the WHERE Clause
Queries can have WHEREclauses The WHEREclause allows you to specify criteria for ing rows This clause can be complex, but we’ll stick to a simple example for now Thesyntax is as follows:
select-WHERE <column1> <operator> <column2 / Value>
Here, <operator>is a comparison operator (for example, =,<>,>, or <) (Table 5-1, later inthe chapter, lists the T-SQL comparison operators.)
Try It Out: Refining Your Query
In this exercise, you’ll see how to refine your query
1. Add the following WHEREclause to the query in Figure 5-3
Where country = 'USA'
2. Run the query by pressing F5, and you should see the results shown in Figure 5-4
Trang 3Figure 5-4.Using a WHEREclause
■ Caution SQL keywords and table and column names aren’t case sensitive, but string literals (enclosed
in single quotes) are This is why we use 'USA', not 'usa', for this example
How It Works
The new query returns the data for columns EmployeeID, FirstName, and LastName
from the Employees table, but only for rows where the Country column value equals
“USA”
Trang 4Using Comparison Operators in a WHERE Clause
You can use a number of different comparison operators in a WHEREclause (see Table 5-1)
Table 5-1.Comparison Operators
< Less than EmployeeID < 1
> Greater than EmployeeID > 1
<= Less than or equal to EmployeeID <= 1
>= Greater than or equal to EmployeeID >= 1
<> Not equal to EmployeeID <> 1
!= Not equal to EmployeeID != 1
!< Not less than EmployeeID !< 1
!> Not greater than EmployeeID !> 1
■ Tip As mentioned earlier, every database vendor has its own implementation of SQL This discussion isspecific to T-SQL; for example, standard SQL doesn’t have the !=operator and calls <>the not equals oper- ator In fact, standard SQL calls the expressions in a WHEREclause predicates; we’ll use that term because
predicates are either true or false, but other expressions don’t have to be If you work with another version
of SQL, please refer to its documentation for specifics
In addition to these operators, the LIKEoperator (see Table 5-2) allows you to matchpatterns in character data As with all SQL character data, strings must be enclosed insingle quotes (') (Chapter 4 covers the LIKEoperator in more detail.)
Table 5-2.The LIKEOperator
LIKE Allows you to specify a pattern WHERE Title LIKE 'Sales%' selects all rows
where the Title column contains a value that starts with the word “Sales” followed by zero or more characters.
Trang 5You can use four different wildcards in the pattern Chapter 4 covers these wildcards
in detail, but to briefly review, we list them here in Table 5-3
Table 5-3.Wildcard Characters
Wildcard Description
% Any combination of characters Where FirstName LIKE 'Mc%' selects all rows where
the FirstName column equals McDonald, McBadden, McMercy, and so on.
_ Any one character WHERE Title LIKE '_ales' selects all rows where the Title column
equals Aales, aales, Bales, bales, and so on.
[ ] A single character within a range [a-d] or set [abcd] WHERE Title LIKE '[bs]ales'
selects all rows where the Title column equals either the bales or sales.
[^] A single character not within a range [^a-d] or set [^abcd].
Sometimes it’s useful to select rows where a value is unknown When no value hasbeen assigned to a column, the column is NULL (This isn’t the same as a column that con-
tains the value 0or a blank.) To select a row with a column that’sNULL, use the IS [NOT]
NULLoperator (see Table 5-4)
Table 5-4.The IS [NOT] NULLOperator
IS NULL Allows you to select rows where WHERE Region IS NULL returns all rows where
a column has no value Region has no value.
IS NOT NULL Allows you to select rows where WHERE Region IS NOT NULL returns all rows
a column has a value where Region has a value.
■ Note You must use the IS NULLand IS NOT NULLoperators (collectively called the null predicate in
standard SQL) to select or exclude NULLcolumn values, respectively The following is a valid query but
always produces zero rows:SELECT * FROM employees WHERE Region = NULL If you change =to IS,
the query will read as SELECT * FROM employees WHERE Region IS NULL, and it will return rows where
regions have no value
To select values in a range or in a set, you can use the BETWEENand INoperators (seeTable 5-5) The negation of these two is NOT BETWEENand NOT IN
Trang 6Table 5-5.The BETWEENand INOperators
BETWEEN True if a value is within a range WHERE extension BETWEEN 400 AND 500 returns
the rows where Extension is between 400 and
500, inclusive.
IN True if a value is in a list The list WHERE city IN ('Seattle', 'London') returns
can be the result of a subquery the rows where City is either Seattle or London.
Combining Predicates
Quite often you’ll need to use more than one predicate to filter your data You can use thelogical operators shown in Table 5-6
Table 5-6.SQL Logical Operators
AND Combines two expressions, HERE (title LIKE 'Sales%' AND lastname
evaluating the complete ='Peacock') expression as true only if both
are true NOT Negates a Boolean value WHERE NOT (title LIKE 'Sales%' AND lastname
='Peacock')
OR Combines two expressions, WHERE (title = 'Peacock' OR title = 'King')
evaluating the complete expression as true if either
is true
When you use these operators, it’s often a good idea to use parentheses to clarify theconditions In complex queries, this may be absolutely necessary
Sorting Data
After you’ve filtered the data you want, you can sort the data by one or more columns and
in a certain direction Since tables are by definition unsorted, the order in which rows areretrieved by a query is unpredictable To impose an ordering, you use the ORDER BYclause.ORDER BY <column> [ASC | DESC] {, n}
Trang 7The <column>is the column that should be used to sort the result The {, n}syntaxmeans you can specify any number of columns separated by commas The result will be
sorted in the order in which you specify the columns
The following are the two sort directions:
• ASC: Ascending (1, 2, 3, 4, and so on)
• DESC: Descending (10, 9, 8, 7, and so on)
If you omit the ASCor DESCkeywords, the sort order defaults to ASC.The following is the basic syntax for queries:
SELECT <column>
FROM <table>
WHERE <predicate>
ORDER BY <column> ASC | DESC
Now that you’ve seen it, you’ll put this syntax to use in an example
Try It Out: Writing an Enhanced Query
In this example, you’ll code a query that uses the basic syntax just shown You want to do
the following:
• Select all the orders that have been handled by employee 5
• Select the orders shipped to either France or Brazil
• Display only OrderID, EmployeeID, CustomerID, OrderDate, and ShipCountry
• Sort the orders by the destination country and the date the order was placed
Does this sound complicated? Give it a try Open a New Query window in SQL ServerManagement Studio Enter the following query and click Execute You should see the
results shown in Figure 5-5
select orderid,employeeid,customerid,orderdate,shipcountry
from orders
where employeeid = 5 and shipcountry in ('Brazil', 'France')
order by shipcountry asc,orderdate asc
Trang 8Figure 5-5.Filtering and sorting data
Trang 9As these predicates are combined with AND, they both must evaluate to true for a row
to be included in the result
where employeeid = 5 and shipcountry in ('Brazil', 'France')
The ORDER BYclause specifies the order in which the rows are sorted The rows will besorted by ShipCountry first and then by OrderDate
order by shipcountry asc,orderdate asc
Using SELECT INTO Statements
ASELECT INTOstatement is used to create a new table containing or not containing the
result set returned by a SELECTquery SELECT INTOcopies the exact table structure and
data into another table specified in the INTOclause Usually, a SELECTquery returns result
sets to the client application
Including the #(hash) symbol before table name results in creating a temporarytable, which ends up in the tempdb system database, regardless of which database you
are working in Specifying the table name without the #symbol gives you a permanent
table in your database (not in tempdb)
The columns of the newly created table inherit the column names, their data types,whether columns can contain null values or not, and any associated IDENTITYproperty
from the source table However, the SELECT INTOclause does have some restrictions: it
will not copy any constraints, indexes, or triggers from the source table
Try It Out: Creating a New Table
In this exercise, you’ll see how to create a table using a SELECT INTOstatement Open a
New Query window in SQL Server Management Studio Express (remember to make
Northwind your query context) Enter the following query and click Execute You should
see the results shown in Figure 5-6
select orderid,employeeid,customerid,orderdate,shipcountry
into #myorder
from orders
Trang 10Figure 5-6.Creating a new table
Even though you write the query in Northwind, the #myorder table gets createdinside tempdb because of the prefixed #symbol (see Figure 5-7)
A temporary table can reside in the tempdb database as long as you have the querywindow open If you close the query window from which you created your temporarytable, and regardless of whether you saved the query, the temporary table will be auto-matically deleted from tempdb
Once the table is created, you can use it like any other table (see Figure 5-8).Temporary tables will also be deleted if you close SQL Server Management StudioExpress, because the tempdb database gets rebuilt every time you close and open SQLServer Management Studio Express again
Trang 11Figure 5-7.Viewing the newly created table in tempdb
Figure 5-8.Retrieving data from your temporary table
Trang 12Try It Out: Using SELECT INTO to Copy Table Structure
Sometimes you will want to copy only the table structure, not the data inside the table(e.g., you only need an empty copy of the table) To do so, you need to include a conditionthat must not return true In this case, you are free to insert your own data
To try this out, enter the following query, and you should get the results shown inFigure 5-9
it, and select Refresh to refresh the tables list You should see the newly created
#myemptyorder table as shown in Figure 5-10
Trang 13Figure 5-10.Viewing a newly created empty table in tempdb
As you can see, the table has structure but not data, the false condition you included
If you were to run a SELECTquery on the #myemptyorder table as shown in Figure 5-11, the query would return nothing, clearly demonstrating that only the
table structure has been copied because only field names are displayed
Figure 5-11.Writing a SELECTquery on an empty table in tempdb
Trang 14Inserting Data
The next important task you need to be able to do is add data (e.g., add rows) to a table.You do this with the INSERTstatement The INSERTstatement is much simpler than aquery, particularly because the WHEREand ORDER BYclauses have no meaning when insert-ing data and therefore aren’t used
A basic INSERTstatement has these parts:
INSERT INTO <table>
(<column1>, <column2>, , <columnN>)
VALUES (<value1>, <value2>, , <valueN>)
Using this syntax, let’s add a new row to the Shipperstable of the Northwind base Before you insert it, let’s look at the table In the SQL Server Management StudioExpress Object Explorer, select the Northwind database, right-click the Shippers table,and click Open Table The table has three rows, which are displayed in a tabbed window(see Figure 5-12)
data-Figure 5-12.The Shippers table before adding a row
Try It Out: Inserting a New Row
To insert a new row into a table, open a New Query window in SQL Server ManagementStudio Express Enter the following query and click Execute
Trang 15insert into shippers ( companyname, phone )
The first column, ShipperID, is an identity column, and you can’t insert values into it
explicitly—SQL Server database engine will make sure that a unique and SQL server–
generated value is inserted for the ShipperID field So, the INSERTstatement needs to be
written in such a way that you specify the column list you want to insert values for
explic-itly; though the Shippers table contains three fields, ShipperID is an identity column, and
it does not expect any value to be inserted from the user But by default, an INSERT
state-ment cannot judge whether the column you are not passing a value for is an identity
column Thus, to prevent errors, you specify the column list and then pass the respective
values to these fields as shown in the following query:
insert into shippers( companyname, phone )
values ('GUIPundits', '+91 9820801756')
Trang 16■ Note INSERTstatements have a limitation When you try to insert data directly into a foreign key table,and the primary key table has no related parent record, you will receive an error because that value needs to
be available in the primary key table before you insert it into the foreign key table For example, the Shipperstable is the PK table for the Orders table, which has an FK column named ShipVia that references the PK col-umn ShipperID of Shippers table In this scenario, you can’t insert a row until you have inserted it into theShippers table
After inserting the row, return to the dbo.Shippers table in Object Explorer, click, and open the table again You’ll see that the new row has been added, as shown inFigure 5-14
right-Figure 5-14.The Shippers table after adding a row
Be careful to insert data of the correct data type In this example, both the columnsare of character type, so you inserted strings If one of the columns had been of integertype, you would have inserted an integer value instead
Trang 17Updating Data
Another important task you need to be able to do is change data You do this with the
UPDATEstatement When coding UPDATEstatements, you must be careful to include a WHERE
clause, or you’ll update all the rows in a table So, always code an appropriate WHERE
clause, or you won’t change the data you intend to change
Now that you’re aware of the implications of the UPDATEstatement, let’s take a goodlook at it In essence, it’s a simple statement that allows you to update values in one or
more rows and columns
changing its name to Pearl HR Solution To make this change in the database, you first
need to locate the row to change More than one company could have the same name,
so you shouldn’t use the CompanyName column as the key Instead, look back at
Figure 5-10 and note the ShipperID value for GUIPundits
Try It Out: Updating a Row
To change a row’s value, open a New Query window in SQL Server Management Studio
Express Enter the following query and click Execute
update shippers
set companyname = 'PearlHRSolution'
where shipperid = 4
How It Works
The ShipperID is the primary key (unique identifier for rows) of the Shippers table, so
you can use it to locate the one row we want to update Running the query should
pro-duce a Messages pane reporting “(1 row(s) affected)” Switch back to Object Explorer and
open the Shippers table, and you’ll see that CompanyName has changed, as shown in
Figure 5-15
Trang 18Figure 5-15.The Shippers table after updating a row
When you update more than one column, you still use the SETkeyword only once,and separate column names and their respective values you want to set by comma Forexample, the following statement would change both the name and the phone of thecompany:
Trang 19Figure 5-16.The Shippers table after updating multiple columns of a row
Deleting Data
The final important task you need to be able to do that we’ll discuss in this chapter is
remove data You do this with the DELETEstatement The DELETEstatement has the same
implications as the UPDATEstatement It’s all too easy to delete every row (not just the wrong
rows) in a table by forgetting the WHEREclause, so be careful The DELETEstatement removes
entire rows, so it’s not necessary (or possible) to specify columns Its basic syntax is as
fol-lows (remember, the WHEREclause is optional, but without it all rows will be deleted):
DELETE FROM <table>
Trang 20Figure 5-17.The Shippers table after deleting a row
If you try to delete one of the remaining three shippers, you’ll get a database error Aforeign-key relationship exists from Orders (FK) to Shippers (PK), and SSE enforces it,preventing deletion of Shippers’ rows that are referred to by Orders rows If the databasewere to allow you to drop records from the PK table, the records in the FK table would beleft as orphan records, leaving the database in an inconsistent state (Chapter 3 discusseskeys.)
Sometimes you do need to remove every row from a table In such cases, the TRUNCATETABLEstatement may be preferable to the DELETEstatement, since it performs better TheTRUNCATE TABLEstatement is faster because it doesn’t do any logging (saving each row in a
log file before deleting it) to support recovery, while DELETElogs every row removed
Summary
In this chapter, you saw how to use the following T-SQL keywords to perform data ulation tasks against a database: SELECT INTO,SELECT,INSERT,UPDATE, and DELETE You alsosaw how to use comparison and other operators to specify predicates that limit whatrows are retrieved or manipulated
manip-In the next chapter, you will see how stored procedures work
Trang 21Using Stored Procedures
Stored procedures are SQL statements that allow you to perform a task repeatedly.
You can create a procedure once and reuse it any number of times in your program
This can improve the maintainability of your application and allow applications to
access the database in a uniform and optimized manner The goal of this chapter is to
get you acquainted with stored procedures and understand how C# programs can
interact with them
In this chapter, we’ll cover the following:
• Creating stored procedures
• Modifying stored procedures
• Displaying definitions of stored procedures
• Renaming stored procedures
• Working with stored procedures in C#
• Deleting stored procedures
Creating Stored Procedures
Stored procedures can have parameters that can be used for input or output and
single-integer return values (that default to zero), and they can return zero or more result sets.
They can be called from client programs or other stored procedures Because stored
procedures are so powerful, they are becoming the preferred mode for much database
programming, particularly for multitier applications and web services, since (among
their many benefits) they can dramatically reduce network traffic between clients and
database servers
95
C H A P T E R 6
Trang 22Try It Out: Working with a Stored Procedure in SQL Server
Using SQL Server Management Studio Express, you’ll create a stored procedure that duces a list of the names of employees in the Northwind database It requires no inputand doesn’t need to set a return value
pro-1. Open SQL Server Management Studio Express, and in the Connect to Server log box, select <ServerName>\SQLEXPRESS as the server name and then clickConnect
dia-2. In Object Explorer, expand the Databases node, select the Northwind database,and click the New Query button Enter the following query and click Execute Youshould see the results shown in Figure 6-1
create procedure sp_Select_All_Employeesas
selectemployeeid,firstname,lastnamefromemployees
Figure 6-1.Creating a stored procedure using SQL Server Management Studio Express
Trang 233. To execute the stored procedure, enter the following query and click Execute Youshould see the results shown in Figure 6-2.
execute sp_Select_All_Employees
Figure 6-2.Executing the stored procedure
How It Works
The CREATE PROCEDUREstatement creates stored procedures The ASkeyword separates the
signature (the procedure’s name and parameter list, but here you define no parameters)
of the stored procedure from its body (the SQL that makes up the procedure)
create procedure sp_Select_All_Employees
as
After AS, the procedure body has just one component, a simple query
Select
employeeid,firstname,lastnamefrom
employees
Trang 24SQL Server Management Studio Express submitted the CREATE PROCEDUREstatement,and once the stored procedure is created, you run it from the query window by writingthe statement
execute sp_Select_All_Employees
That’s it There’s nothing complicated about creating stored procedures The lenge is coding them when they’re nontrivial, and stored procedures can be quite compli-cated and can do very powerful things, but that’s well beyond the scope of this book
chal-■ Note The prefix sp_is a T-SQL convention that typically indicates the stored procedure is coded in SQL.The prefix xp_(which stands for extended procedure) is also used to indicate that the stored procedure isn’twritten in SQL (However, not all sp_stored procedures provided by SQL Server are written in SQL.) By theway, hundreds of sp_(and other) stored procedures are provided by SQL Server 2005 to perform a widevariety of common tasks
Although we use sp_for the purposes of these examples, it is a best practice not tocreate a stored procedure prefixed with sp_; doing so has a dramatic effect on the searchmechanism and the way the SQL Server database engine starts searching for that partic-ular procedure in order to execute
The SQL Server follows this search order if you are executing a stored procedure thatbegins with sp_:
1. SQL Server will search the master database for the existence of the procedure, if it
is available, and then it will call the procedure
2. If the stored procedure is not available in the master database, SQL Serversearches inside either the database from which you are calling it or the databasewhose name you provide as qualifier (database_name.stored_procedure_name).Therefore, although a user-created stored procedure prefixed with sp_may exist in
the current database, the master database, which is where the sp_prefixed stored dures that come with SQL Server 2005 are stored, is always checked first, even if thestored procedure is qualified with the database name
proce-It is also important to note that if any user-defined stored procedure has the samename as a system stored procedure, and you try calling the user-defined stored proce-dure, it will never be executed, even if you call it from inside the database where you havejust created it Only the master database’s version will be called
Trang 25Try It Out: Creating a Stored Procedure with an Input Parameter
Here you’ll create a stored procedure that produces a list of orders for a given employee
You’ll pass the employee ID to the stored procedure for use in a query
1. Enter the following query and click Execute You should see the message mand(s) completed successfully” in the results window
“Com-create procedure sp_Orders_By_EmployeeId
@employeeid intas
select orderid, customeridfrom orders
where employeeid = @employeeid;
2. To execute the stored procedure, enter the following command along with thevalue for the parameter, select it, and then click Execute You should see theresults shown in Figure 6-3
execute sp_Orders_By_EmployeeId 2
Figure 6-3.Using an input parameter
Trang 26■ Tip SQL Server has a very interesting behavior of executing a portion of a query or executing a particularquery out of multiple SQL statements written in the query window, unlike other RDBMSs This behavior isshown in the Figure 6-3, in which we have selected a particular statement Click the Execute button, andSQL Server will process only the selected statement.
How It Works
The CREATE PROCEDUREstatement creates a stored procedure that has one input parameter.Parameters are specified between the procedure name and the ASkeyword Here youspecify only the parameter name and data type, so by default it is an input parameter.Parameter names start with @
create procedure sp_Orders_By_EmployeeId
@employeeid intas
This parameter is used in the WHEREclause of the query
where
employeeid = @employeeid;
■ Note In this example, a semicolon terminates the query It’s optional here, but you’ll see when it needs to
be used in the next example
Try It Out: Creating a Stored Procedure with an
Output Parameter
Output parameters are usually used to pass values between stored procedures, butsometimes they need to be accessed from C#, so here you’ll see how to write a storedprocedure with an output parameter so you can use it in a C# program later You’ll alsosee how to return a value other than zero