Term
CHARINDEX
What does CHARINDEX do?
Describe 2 examples of its use. |
|
Definition
The CHARINDEX string function returns the starting position of the specified expression in a character string. It accepts three parameters with the third parameter being optional.
CHARINDEX ( expression1, expression2, [ , start_location ] )
The first parameter is the expression that contains the sequence of characters to be found. The second parameter is the expression searched for the specified sequence. This is typically a column from a table. The third parameter, which is optional, is the character position to start searching expression1 in expression2.
The CHARINDEX function searches expression 2 for the existence of expression 1. CHARINDEX returns a 1 or higher if a match is found returns a 0 if nothing is found.
IF CHARINDEX('Slax',@messageAction,0) >0 ...
(Joes2Pros Volume 4, page 135.)
SELECT CHARINDEX('the', 'the quick brown fox jumps over the lazy dog') AS [Location]
Location ---------------- 1
SELECT CHARINDEX('the', 'the quick brown fox jumps over the lazy dog', 10) AS [Location]
Location ---------------- 32
SELECT CHARINDEX('jumped', 'the quick brown fox jumps over the lazy dog') AS [Location]
Location ---------------- 0
DECLARE @FullName VARCHAR(100) SET @FullName = 'Mickey Mouse' SELECT LEFT(@FullName, CHARINDEX(' ', @FullName) - 1) AS [FirstName], RIGHT(@FullName, CHARINDEX(' ', REVERSE(@FullName)) - 1) AS [LastName]
First Name Last Name ---------- ---------- Mickey Mouse
http://www.sql-server-helper.com/tips/tip-of-the-day.aspx?tkey=4a59645b-a5a1-4099-b6d2-959d8644cbed&tkw=uses-of-the-charindex-function
|
|
|
Term
COUNT
What does COUNT(*) do? |
|
Definition
It counts all rows including those that have NULL values. |
|
|
Term
COUNT
What does COUNT(columnname) do?
|
|
Definition
It counts all rows, except those that contain a NULL marker. |
|
|
Term
CTE - Recursive
1. What is the structure of a recursive CTE query?
2. Explain how to terminate a recursive CTE. |
|
Definition
[image]
2. The anchor query is executed exactly once and the result is united with the results from the recursive member, which is executed until it returns an empty set. You have to provide a condition that will ensure the recursive member query does not run indefinitely. The easiest way to ensure termination is to use an increasing identity column in the base_table.
SQL.CTEs.RecursiveQueries.SQLServerCentral.SMarinova.(11.29.13).pdf
|
|
|
Term
Declarative Integrity
What is declarative integrity? |
|
Definition
Declarative integrity is a set of rules that are applied to tables and its columns unsing CREATE TABLE or ALTER TABLE statements.
These statements are called CONSTRAINTS.
70-433_Training_Kit_MS_SQL_Server_2008_Database_Development.pdf |
|
|
Term
EXPRESSIONS
1. When is an expression deterministic?
2. What is an example of deterministic function?
3. When is an expression or function non-deterministic |
|
Definition
1. The requirement for determinism and precision means that for a given set of input values, the same output values would always be returned.
2. The ISNULL function, on the other hand, is deterministic because the value to be supplied is contained within the definition when the ISNULL function is called.
3.. For example, the function SYSDATETIME() returns the current date and time whenever it is called. Its output would not be considered deterministic.
Many of the system functions are what is called nondeterministic, meaning that the result may vary and the system does not have a list of predetermined values to supply for the results of the function.
|
|
|
Term
Expressions
What is an "expression" |
|
Definition
[image]
70-433_Training_Kit_MS_SQL_Server_2008_Database_Development.pdf |
|
|
Term
ISNULL / COALESCE
1. What does COALESCE do?
2. What is isntyntax?
No back of card provided
|
|
Definition
|
|
Term
ISNULL / COALESCE
1. What does ISNULL do?
2. What is its syntax?
3. What does the ISNULL function return?
4. Is the ISNULL function deterministic or non-deterministic? |
|
Definition
1. Replaces NULL with the specified replacement value.
2. ISNULL ( check_expression , replacement_value )
Where:
- check_expression
-
Is the expression to be checked for NULL. check_expression can be of any type.
- replacement_value
-
Is the expression to be returned if check_expression is NULL. replacement_value must be of a type that is implicitly convertible to the type of check_expresssion.
3. Returns the same type as check_expression. If a literal NULL is provided as check_expression, returns the datatype of the replacement_value. If a literal NULL is provided as check_expression and no replacement_value is provided, returns an int.
4. The ISNULL function is deterministic because because the value to be supplied is contained within the definition when the ISNULL function is called.
Source: http://technet.microsoft.com/en-us/library/ms184325.aspx |
|
|
Term
ISNULL and COALESCE
1. Explain COALESCE
2. Explan ISNULL
|
|
Definition
COALESCE
COALESCE ( expression [ ,...n ] )
Evaluates the arguments in order and returns the current value of the first expression that initially does not evaluate to NULL.
COALESCE follows the CASE expression rules and returns the data type of value with the highest precedence.
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product;
ISNULL
ISNULL ( check_expression , replacement_value )
Replaces NULL with the specified replacement value
- check_expression
-
Is the expression to be checked for NULL. check_expression can be of any type.
- replacement_value
-
Is the expression to be returned if check_expression is NULL. replacement_value must be of a type that is implicitly convertible to the type of check_expresssion.
ISNULL is limited to two arguments. If you need the first non-NULL value from a list of three, you have to nest two ISNULL expressions. Make it a list of 20, and you are knee-deep in the nested parentheses. COALESCE, however, will take any number or arguments and return the first non-NULL value.
The following example finds the average of the weight of all products. It substitutes the value 50 for all NULL entries in the Weight column of the Product table.
USE AdventureWorks2012;
GO
SELECT AVG(ISNULL(Weight, 50))
FROM Production.Product;
GO
Here is the result set.
--------------------------
59.79 |
|
|
Term
Index
1. Index density
2. Index fill factor
3. Page Splitting |
|
Definition
1. Index Density
Index density refers to what percentage of each index pages (for clustered indexes, leaf pages because they contain both data and index) contains data. If the index density is low, then SQL Server must read more pages from the disk to retrieve the index data. (SQL 2008 Bible p 996)
Index Density is a ratio that shows just how many unique values there are within a given column, or set of columns.
Density = 1 / Number of distinct values for column(s)
If an index consisted of all duplicates, the density would be 1.
SELECT 1.0 / COUNT(DISTINCT MyColumn) FROM dbo.MyTable
For multiple columns:
SELECT 1.0 / COUNT(*) FROM (SELECT DISTINCT FirstColumn, SecondColumn FROM dbo.MyTable) AS DistinctRows;
High Density = Low Selectivity = Few Unique Values = Many Duplicates
Low Density = High Selectivity = Many Unique Values = Few Duplicates
If an index consisted of all duplicates, the density would be 1.
Density matters because the amount of selectivity of a given index, as determined by its density, is one of the best ways of measuring how effective it will be with your query.
A high density (low selectivity, few unique values) will be of less use to the optimizer because it might not be the most efficient way of getting at your data.
For example, if you have a column that shows up as a bit, a true or false statement such as, has a customer signed up for you mailing list, then for a million rows, you’re only ever going to see one of two values.
That means that using an index or statistics to try to find data within the table based on two values is going to result in scans where more selective data, such as an email address, will result in more efficient data access (e.g. seeks rather than scans).
SQL.Statistics.Indexes.SSCentral.GFritchey.(12.04.13).pdf
The density is the average proportion of duplicates for the index key(s). For example, an index on a 10,000-row table with 2,500 unique values would have a density of 1/2500 = 0.0004. The index density is applied against the number of rows in the table to estimate the average number of rows that would match any given value.
Therefore, any single value compared against the index key on a 10,000-row table with an index density of 0.0004 would be expected to match 10,000 * 0.0004 = 4 rows.
The lower the density value, the more selective the index is; the higher the density, the less selective the index. If an index consisted of all duplicates, the density would be 1.
(SQL.Statistics.Indexes.(12.04.13).pdf)
2a. Fill Factor
Applies only to indexed tables, not heaps. When an index is created or rebuilt, the index fill-factor value determines the percentage of space on each leaf-level index page to be filled with data, reserving the rest as free space for future growth. Index density will slowly alter during inserts, updates, and deletes. FILLFACTOR applies to index pages only.
The Fill Factor indicates the percentage of each 8K data (DATA) page used in the leaf level pages of the indexed table it (SQL Server) should fill with data.
(Source: The sentence is edited from http://www.brentozar.com/archive/2013/04/five-things-about-fillfactor/ and quoted as: " “Fillfactor” is a setting for indexes in SQL Server. When you create or rebuild an index, you can tell SQL Server what percentage of each 8K data page used in the “leaf” level of the index it should fill up.
In other words, if you set a 90% fillfactor when you rebuild a clustered index, SQL Server will try to leave 10% of each leaf page empty. The empty space will be present on the page as it’s written on disk, and it’ll take up the same amount of space as it sits in memory.")
(Source is edited from http://stackoverflow.com/questions/1113697/fill-factor-of-sql-server-2008 FILLFACTOR applies to index pages only. But the catch here is that if you have a clustered index (and most tables do), your FILLFACTOR will essentially apply to your data as well, since your data lives inside the leaf-nodes of your clustered index.
Fill Factor 100 or 0 Default
In an SQL Server, the smallest unit is a page, which is made of Page with size 8K. Every page can store one or more rows based on the size of the row. The default value of the Fill Factor is 100, which is same as value 0. The default Fill Factor (100 or 0) will allow the SQL Server to fill the leaf-level pages of an index with the maximum numbers of the rows it can fit. There will be no or very little empty space left in the page, when the fill factor is 100.
SQL.Indexes.FillFactor.01.PDave.(12.05.13).pdf
2b. Fill Factor
The ALTER INDEX REBUILD command will completely rebuild the index. Using this command is essentially the equivalent of dropping and creating the index, with the added benefit of enabling users to set the fill factor as the index is recreated.
In contrast, the ALTER INDEX REORGANIZE command repairs fragmentation to the index’s fill factor but does not adjust the target fill factor.
The following code recreates all the indexes on the Frag table and sets the fill factor to 98 percent: USE tempdb; ALTER INDEX ALL ON Frag REBUILD WITH (FILLFACTOR = 98);
SQL 2008 Bible p 996
3. Page Splits
In an SQL Server, the smallest unit is a page, which is made of Page with size 8K. Every page can store one or more rows based on the size of the row. If the page is completely filled and new data is inserted in the table which belongs to completely filled page, the “page split” event happens to accommodate new data.
When new data arrives, SQL Server has to accommodate the new data, and if it belongs to the page which is completely filled, SQL Server splits the page in two pages dividing the data in half. This means a completely filled page is now two half-filled pages.
Once this page split process is over, the new data is inserted at its logical place. This page split process is expensive in terms of the resources. As there is a lock on the page for a brief period as well, more storage space is used to accommodate small amounts of data. The argument usually is that it does not matter as storage is cheaper now a day. Let us talk about Fill Factor in terms of IO in the next paragraph.
SQL.Indexes.FillFactor.PDave.(12.05.13).pdf
|
|
|
Term
Index
1. What does a clustered index impose upon a table?
2. How may clustered indexes can a table have? |
|
Definition
Clustered Index:
1. An index that imposes a physical order on the rows within a table.
2. There can only be a single clustered index on a table.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf |
|
|
Term
Index
1. What does a nonclustered index contain?
2. If a table has both a clustered index and a non-clustered index, to where does the root level of the nonclustered index point?
3. If a table has only a non-clustered key, to where does the root level of nonclustered index point? |
|
Definition
Nonclustered index
1. An index that contains one or more columns in a table that are used to improve query efficiency.
2. If the table has a clustered index, the root level of the nonclustered index points back to the clustering key.
3. Otherwise, the root level points to a row in the table. |
|
|
Term
Index
1. What is a table that does not have a clustered index?
2. What is a table that is not sorted? |
|
Definition
If a table does not have a clustered index defined on it, it is called a heap, or an unsorted table.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf |
|
|
Term
Index
1. When using a nonclusted covered index, SQL Server does not need to use ________ between the _______ _____and the table to return query results.
2.Because a clustered index is the actual table, clustered indexes always ______ queries. |
|
Definition
The notion of a covered index is that SQL Server doesn’t need to use lookups between the nonclustered index and the table to return the query results.
Because a clustered index is the actual table, clustered indexes always cover queries.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf page 216 |
|
|
Term
Index
At the leaf-page level, what is the difference between a clustered index and a nonclustered index? |
|
Definition
Clustered index leaf-level pages contain the data in the table.
Nonclustered index leaf-level pages contain the key value and a pointer to the data row in the clustered index or heap.
Pluralsight SQL Performance: Indexing Basics |
|
|
Term
Index
For an index to be covered, it must contain ___________. |
|
Definition
To consider the index covered, it must contain all columns referenced in the query (in any clause, SELECT, JOIN, WHERE, GROUP BY, HAVING, and so on). |
|
|
Term
Index
What are key-columns?
What are non-key columns in a nonclustered index? |
|
Definition
Key vs. Nonkey Columns
Key columns: the columns specified to create a clustered or nonclustered index.
Nonkey columns: columns added to the INCLUDE clause of a nonclustered index. |
|
|
Term
Index
What could one say are the two types of tables? |
|
Definition
You could also say that a table can have one of two forms: It is either a heap (unsorted) or a clusteredbindex (sorted).
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf |
|
|
Term
Index
What happens when you create a primary key and do not define a clustered or a nonclustered index? |
|
Definition
Primary key: a constraint to enforce uniqueness in a table. The primary key columns cannot hold NULL values.
In SQL Server, when you create a primary key on a table, if a clustered index is not defined and a nonclustered index is not specified, a unique clustered index is created to enforce the constraint.
However, there is no guarantee that this is the best choice for a clustered index for that table. Make sure you are carefully considering this in your indexing strategy. |
|
|
Term
Index
What is Index Depth? |
|
Definition
Index Depth is defined as the number of levels from the top node (called the root node) and the bottom nodes (called leaf nodes).
6232 Vol 1 p 5-6 |
|
|
Term
Index
What is a covering index?
What are its benefits? |
|
Definition
Covering index: all columns returned in a query are in the index, so no additional reads are required to get the data.
A covering index will reduce the IO operations, and improve performance of queries. |
|
|
Term
Index
What is a key difference between a clustered index and a non-clustered index?
Context: Physical order of data pages. |
|
Definition
General
1. The difference between these index types is that the clustered index is the actual table; that is, the bottom level of a clustered index contains the actual rows, including all columns, of the table.
2. A nonclustered index, on the other hand, contains only the columns included in the index’s key, plus a pointer pointing to the actual data row.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf
The difference between clustered and nonclustered SQL Server indexes is that a clustered index
1. Controls the physical order of the data pages.
2. Data pages of a clustered index will always include all the columns in the table, even if you only create the index on one column.
3. Clustered index leaf-level pages contain the data in the table.
4. Column(s) you specify as key columns affect how the pages are stored in the B-tree index structure.
Nonclustered index
1. Leaf-level pages contain the key value and a pointer to the data row in the clustered index or heap.
2. A nonclustered index does not affect the ordering and storing of the data.
3. Nonclustered index leaf-level pages contain the key value and a pointer to the data row in the clustered index or heap.
http://www.brentozar.com/archive/2012/07/sql-server-index-terms/ |
|
|
Term
Index
When a clustered index is used, what is the B-Tree structure (picture)? |
|
Definition
[image]
http://cdn.prod.brentozar.com/wp-content/uploads/2012/07/index-b-tree.png |
|
|
Term
Index - Clustered
What is a clustered index (using a book as metaphor)
|
|
Definition
1. Pages in a book represent a clustered index and they are clustered by page number.
2. The clustered index represents the actual physical order of your data.
3. The clustered index is the placement order of a table’s records in memory pages. When you insert new records, then each record will be inserted into the memory page in the order it belongs.
Morelan, Rick A. (2011-02-23). SQL Architecture Basics Joes 2 Pros: Core Architecture concepts (Volume 3) (Kindle Locations 3037-3039). . Kindle Edition.
|
|
|
Term
|
Definition
A book with page numbers on each page is a clustered index leaf pages. The "table" is physically sorted in by page number and the "data" (words on the page) are stored with page number.
OR
An apartment house has appartment numbers 1XX are on Floor 1; all appartemnt number 2XX are on Flloo2, etc. you know you need to go to the 2nd floor to find appt 213.
Pluralsight SQL Performance: Indexing Basics |
|
|
Term
Index - Clustered Index
4 questions |
|
Definition
|
|
Term
Index - Clustered Index B-Tree |
|
Definition
|
|
Term
Index - Fill Factor
1. What is TSQL to see Fill Factor at server level?
2. What is TSQL to see Fill Factor at table/index level? |
|
Definition
1.
SELECT * FROM sys.configurations WHERE name ='fill factor (%)'
2.
USE YourDatabaseName; SELECT OBJECT_NAME(OBJECT_ID) Name, type_desc, fill_factor FROM sys.indexes |
|
|
Term
Index - Heap
3 facts about a heap. |
|
Definition
|
|
Term
Index - Heap Pages and Extents |
|
Definition
1 Extent = 8 Contiguous pages
[image]
One extent contains 8 contiguous pages |
|
|
Term
|
Definition
A non-clustered index is analogous to a book index. A book index indicates a key term (analogous to an index key or included column) with a page number (a pointer) to page on which the same pointer is located in addition to the actual data.
Pluralsight SQL Performance: Indexing Basics |
|
|
Term
Index - Page Splits
1. How can you avoid page splits? |
|
Definition
1. Rebuild indexes frequently to empty the fillfactor space for more data. 2. Increased use of primary keys and use of clustered index on them. 3. A faster hardware system can also reduce page splits.
Actions to reduce the number of page splits: 1. Increase the fillfactor on your indexes. 2. Rebuild your indexes more often (to update the Fill Factor figure) 3. Add clustered indexes to your monotonically increasing primary keys. 4. Get a faster I/O subsystem.
http://careerride.com/SQL-Server-what-is-page-splits.aspx
5. Use Clustered Indexes on Identify Fields
SQL Architecture Basics Joes 2 Pros (Volume 3) location 3083 of 4817. |
|
|
Term
Index - Page Splits
1. What is TSQL for seeing page splits? |
|
Definition
1.
SELECT cntr_value FROM MASTER.dbo.sysperfinfo WHERE counter_name ='Page Splits/sec' AND OBJECT_NAME LIKE'%Access methods%'
SQL.Indexes.FillFactor.PDave.01.(12.05.13).pdf |
|
|
Term
Index - Page Splits
1. What is a page split?
2. Are page splits good or bad for performance? |
|
Definition
1. Page splits arise when records from one memory page are moved to another page during changes to your table.
Note: A record (row) can't be split across multiple pages.
Source: SQL.Indexes.FillFactor.BEllul.(12.05.13) (1).pdf
2. Page splits are bad for performance for the following reasons:
Page splits are performed when there is no space in a data page to accommodate more inserts or updates. In a page spilt, SQL server removes some data from the current data page and moves it to another data page. This is done in order to make space for the new rows.
Morelan, Rick A. (2011-02-23). SQL Architecture Basics Joes 2 Pros: Core Architecture concepts (Volume 3) (Kindle Location 3046). . Kindle Edition.
|
|
|
Term
Index - Pages and Extents |
|
Definition
[image]
Pluralsight SQL Performance: Indexing Basics |
|
|
Term
Index - Primary Key
What does SQL Server do it creates a primary key? |
|
Definition
|
|
Term
Index Fragmentation
How does it occur?
What are the 2 types?
How do you detect it?
|
|
Definition
|
|
Term
Index Fragmentation - Internal
Index Fragmentation - External |
|
Definition
Index Internal vs. External Fragmentation Index Internal Fragmentation (pages are not full) is similar to what would occur if an existing bookcase was split into two bookcases. Each bookcase would then be only half full.
Index External Fragmentation (pages are not in logical sequence) relates to where the new bookcase would be physically located. It would probably need to be placed at the end of the library, even though it would "logically" need to be in a different order. That means that to read the bookcases in order, you could no longer just walk directly from bookcase to bookcase but would need to follow pointers around the library to follow a chain from one bookcase to another.
|
|
|
Term
Index Selectivity
Index Density
Index Depth |
|
Definition
[image]
Density is a measure of the lack of uniqueness of the data in a table. A dense table is one that has a high number of duplicates.
Index Depth is a measure of the number of levels from the root node to the leaf nodes. Users often imagine that SQL Server indexes are quite deep but the reality is quite different to this.
The large number of children that each node in the index can have produces a very flat index structure. Indexes with only 3 or 4 layers are very common. |
|
|
Term
Indexes - Pages and Extents
1. How many bytes is in a page?
2. What is maximum row length in bytes?
3. How many pages are in 1 MB?
4. What does each page begin with?
4. What is an extent? |
|
Definition
1. A page is 8K bytes (8,060 bytes)
2. Row maximum: 8K bytes
3. SQL Server databases have 128 pages / 1 MB
4. Each page begins with 96-page header
5. Extents are a collection of 8 contiguous pages
Source: Pluralsight.com; SQL Server Performance: Indexing Basics; Indexing Fundamentals
|
|
|
Term
|
Definition
The APPLY operator comes in two variants, the CROSS APPLY and the OUTER APPLY.
The CROSS APPLY operator returns only those rows from left table expression (in its final output) if it matches with right table expression. In other words, the right table expression returns rows for left table expression match only. Whereas the OUTER APPLY operator returns all the rows from left table expression irrespective of its match with the right table expression. For those rows for which there are no corresponding matches in right table expression, it contains NULL values in columns of right table expression. So you might now conclude, the CROSS APPLY is semantically equivalent to INNER JOIN (or to be more precise its like a CROSS JOIN with a correlated sub-query) with a implicit join condition of 1=1 whereas OUTER APPLY is semantically equivalent to LEFT OUTER JOIN.
You might be wondering if the same can be achieved with regular JOIN clause then why and when to use APPLY operator? Though the same can be achieved with normal JOIN, the need of APPLY arises if you have table-valued expression on right part and also in some cases use of APPLY operator boost the performance of your query. Let me explain you with help of some examples.
http://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/ |
|
|
Term
JOINs - CROSS APPLY
What does it do? |
|
Definition
Using a User Defined Function (UDF), CROSS APPLY acts as INNER JOIN & will return only matching rows, |
|
|
Term
NULL
1. Explain how ON, WHERE, and HAVING treat UNKNOWN (NULL)
2. Explain how the CHECK contraint handles UNKNOWN (NULL)
3. When NULLs treated as equal values |
|
Definition
1. All query filters (ON, WHERE, and HAVING) treat UNKNOWN like FALSE. A row for which a filter is UNKNOWN is eliminated from the result set.
2. On the other hand, an UNKNOWN value in a CHECK constraint is actually treated like TRUE.
Suppose you have a CHECK constraint in a table to require that the salary column be greater than zero. A row entered into the table with a NULL salary is accepted because (NULL > 0) is UNKNOWN and treated like TRUE in the CHECK constraint.
3. NULLs are treated as equal: ■ You cannot insert into a table two rows with a NULL in a column that has a UNIQUE constraint defi ned on it. T-SQL violates the standard on this point. ■ A GROUP BY clause groups all NULLs into one group. ■ An ORDER BY clause sorts all NULLs together. ■ Set operators treat NULLs as equal when comparing rows from the two sets.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf page 9 |
|
|
Term
NULL value
Indicate 3 things regarding what is unique about NULL value logic? |
|
Definition
Dealing with UNKNOWN logical results and NULLs can be very confusing. While NOT TRUE is FALSE, and NOT FALSE is TRUE, the opposite of UNKNOWN (NOT UNKNOWN)is still UNKNOWN.
The mark NULL represents a missing value. When comparing a missing value to another value (even another NULL), the logical result is always UNKNOWN.
The UNKNOWN logical value in SQL typically occurs in a logical expression that involves a NULL (for example, the logical value of each of these three expressions is UNKNOWN:NULL > 42; NULL = NULL; X + NULL > Y).
|
|
|
Term
Normalization - FORMS
1. What is first normal form?
2. What is second normal form?
3. What is third normal form? |
|
Definition
- First Normal Form (1NF): Each field in a table must contain different information.
- Second Normal Form (2NF): All attributes that are not dependent upon the primary key in a database table must be eliminated.
- Third Normal Form (3NF): No duplicate information is permitted. So, for example, if two tables both require a common field, this common field information should be separated into a different table.
|
|
|
Term
Normalization - FORMS
1.Describe the 5 normal forms in terms of the relationships they deal with. |
|
Definition
1. The First Normal Form (1NF) addresses: 1) the structure of an isolated table; 2) the identification of repeating groups (repeating columns).
Repeating Groups are indicated by rows that repeat columns:
{ PartID, Supplier1ID, Supplier2ID, Supplier3ID }
2. The Second (2NF), Third (3NF), and Boyce-Codd (BCNF) Normal Forms: 1) address one-to-one and one-to-many relationships; and (2) functional dependency of key and non-key columns in the same table.
Functional dependency: Given a key, the values of all the other attributes (columns) in row are fixed.
3. The Fourth (4NF) and Fifth (5NF) Normal Forms deal with many-to-many relationships.
SQL.Normalization.PracticalDBDesign.Part2.PJanert.2003.(11.24.13).pdf, p. 3. |
|
|
Term
Normalization - FORMS - 1NF
1. Describe First Normal Form.
2. Describe how to change a table that violates 1NF into table(s) that conform to 1NF. |
|
Definition
1. Table in 1NF definition:
A table is said to be in First Normal Form (1NF), if all entries in it are scalar-valued.
Relational database tables are 1NF by construction since vector-valued entries are forbidden. Vector-valued data (that is, entries which have more than one value in each row) are referred to as repeating groups.
2. Changing a table to meet 1NF
The following relation (table) violates 1NF because the SupplierID forms a repeating group. Repeating groups indicate 1-to-many relationships
{ PartID, Supplier1ID, Supplier2ID, Supplier3ID }
To achieve 1NF
1. Remove the repeating groups in the base table by putting them into new separate table(s), one for for each set of related data comprising the repeating group(s).
2. Connect the new separate table(s) to the original table by putting the PK of the original table into the new separate table(s) as an FK.
Sample solution:
Part Table
PartID (PK)
PartName
Supplier Table
SupplierID (PK)
PartID (FK)
SupplierName
SELECT PartID, PartName, SupplerID, SupplierName
FROM Part p
INNER JOIN Supplier s
ON p.PartID = s.PartID
|
|
|
Term
Normalization - FORMS - 2NF
1. Explain 2NF.
2. How do you fix a table that does not conform to 2NF? |
|
Definition
1. A table is in Second Normal Form (2NF) if every non-key field is a fact about the entire key.
In other words, a table is 2NF if it is 1NF and all non-key attributes are functionally dependent on the entire primary key (that is, the dependency is irreducible).
Clearly, 2NF is only relevant when the key is composite (that is, consisting of several fields).
The following example describes a table which is not 2NF since the WarehouseAddress attributedepends only on WarehouseID but not on PartID:
{ PartID, WarehouseID, Quantity, WarehouseAddress }
2. To achieve 2NF, create separate tables for sets of values that apply to multiple records and relate these tables through foreign keys. The determinants of the initial table become the primary keys of the resulting tables.
|
|
|
Term
Normalization - Functional Dependency
What is Functional Dependency? |
|
Definition
1. The Second and Third Normal Forms address dependencies among attributes, specifically between key and non-key fields.
2. In a Functional Dependency, there is a determinate attribute (X) and there is a dependent attribute (Y).
Determinate is analogous to Independent Variable. (X)
Dependent is analogous to Dependent Variable (Y).
3. For each (every) determinate value (X) there
4. Note that functional dependency is a semantic relationship: It is the business logic of the problem domain, represented by the relation, which determines whether a certain X determines Y.
SQL.Normalization.PracticalDBDesign.Part2.PJanert.2003.(11.24.13).pdf
|
|
|
Term
Normalization - Process
What is the normalization process? |
|
Definition
Normalization is a process in which an initial DB design is transformed, or decomposed, into a different, but equivalent, design.
The resulting schema is equivalent to the original one in the sense that no information is lost when going from one to the other.
The normalization procedure consists of a sequence of projections -- that is, some attributes are extracted from one table to form a new one. In other words, tables are split up vertically.
The decomposition is lossless, only if you can restore the original (non-conforming normal form) table by joining to its projections (which are additional tables with the originally "non-conforming" columns). |
|
|
Term
OUTER APPLY
What does it do? |
|
Definition
Using a User Defined Function (UDF), OUTER APPLY acts as OUTER LEFT JOIN & will return all matching & non-matching rows |
|
|
Term
Predicates
1. What are predicates?
2. In which elements are predicates specified?
3. How do you combine predicates? |
|
Definition
1. Predicates are logical expressions that evaluate to TRUE, FALSE, or UNKNOWN.
2. T-SQL has language elements in which predicates can be specified—for example, query filters such as WHERE and HAVING, CHECK constraints, and others.
Remember that predicates are logical expressions that evaluate to TRUE, FALSE, or UNKNOWN.
3. You can combine predicates by using logical operators such as AND and OR. You can also involve other types of operators, such as comparison operators, in your expressions.
SQL.microsoft_sql_server_2012_t-sql_fundamentals.Ben-Gan.pdf, p. 50 |
|
|
Term
Predicates
What is a predicate in a SQL statement? |
|
Definition
FROM TABLE_NAME WHERE predicate
Simple predicates use one of the operators = , <> , > , >= , < , <= , IN , BETWEEN , LIKE , IS NULL or IS NOT NULL .
Predicates can be enclosed in parentheses if desired. The keywords AND and OR can be used to combine two predicates into a new one. If multiple combinations are applied, parentheses can be used to group combinations to indicate the order of evaluation. Without parentheses, the AND operator has a stronger binding than OR . |
|
|
Term
Query
A database contains tables named Sales and SalesArchive. SalesArchive contains historical sales data. You configure Change Tracking on the Sales table. The minimum valid version of the Sales table is 10. You need to write a query to export only sales data that changed since version 10, including the primary key of deleted rows. Which method should you use? A. FROM SalesRIGHT JOIN CHANGETABLE (CHANGES Sales, 10) AS C ... B. FROM SalesINNER JOIN CHANGETABLE (CHANGES Sales, 10) AS C ... C. FROM SalesRIGHT JOIN CHANGETABLE (CHANGES SalesArchive, 10) AS C ... D. FROM SalesINNER JOIN CHANGETABLE (CHANGES SalesArchive, 10) AS C ... |
|
Definition
A. FROM Sales RIGHT JOIN CHANGETABLE (CHANGES Sales, 10) AS C ...
Microsoft.PracticeTest.70-433.v2013-01-17.by.SQLlearner.145q.vce Q11 |
|
|
Term
Query
You administer a Microsoft SQL Server 2008 database that contains tables named Sales.Customer and Sales.SalesOrder. A diagram of the tables is shown in the exhibit. (Click the Exhibit button.)
You need to execute a query to update the value of the CustomerValue field to HV when a customer has more than 5 orders for a total sales amount of more than 5,000 U.S. dollars. Which Transact-SQL statement should you use?
Practice Test SQLLearner.Q76 |
|
Definition
UPDATE Sales.Customer SET CustomerValue = 'HV' FROM Sales.Customer WHERE CustomerID IN (SELECT c.CustomerID FROM Sales.Customer c INNER JOIN Sales.SalesOrder o ON o.CustomerID=c.CustomerID GROUP BY c.CustomerID HAVING COUNT(*) > 5 AND SUM(SalesAmount) > 5000)
UPDATE u SET CustomerValue = 'HV' FROM Sales.Customer u WHERE EXISTS(SELECT c.CustomerID FROMSales.Customer c INNER JOIN Sales.SalesOrder o ON o.CustomerID=c.CustomerID WHERE c.CustomerID=u.CustomerID GROUP BY c.CustomerID HAVING COUNT(*) > 5 AND SUM(SalesAmount) > 5000) |
|
|
Term
Query
You have two tables named Customer and SalesOrder. In the Customer table you have 1000 customers, of which 900 customers have orders in the SalesOrder table. You execute the following query to list all customers that have had at least one sale. SELECT * FROM Customer
WHERE Customer.CustomerID IN (SELECT SalesOrder.CustomerID FROM SalesOrder)
You need to identify the results of the query.
Which results will the query return?
A. No rows
B. The 900 rows in the Customer table with matching rows in the SalesOrder table
C. The 1000 rows in the Customer table
D. A warning message
|
|
Definition
B. The 900 rows in the Customer table with matching rows in the SalesOrder table
|
|
|
Term
Query
You need to generate the following XML document. <ProductExport> <Product Price="99">Product1</Product> <Product Price="199">Product2</Product> <Product Price="299">Product3</Product> <Product Price="399">Product4</Product></ProductExport>
Which query should you use?
A. SELECT Price, ProductName FROM Products FOR XML AUTO, ROOT('ProductExport') B. SELECT Price [@Price],ProductName AS [*] FROM Products FOR XML PATH('Product'),ROOT('ProductExport') C. SELECT Price, ProductName FROM Products AS ProductExport FOR XML PATH('Product') D. SELECT Price [@Price], ProductName AS [*] FROM Products AS ProductExport FOR XML AUTO, ELEMENTS
|
|
Definition
B. SELECT Price [@Price],ProductName AS [*] FROM Products FOR XML PATH('Product'),ROOT('ProductExport')
Microsoft.PracticeTest.70-433.v2013-01-17.by.SQLlearner.145q.vce Q 132
|
|
|
Term
Query Processing - 01
What is the logical order of query processing? |
|
Definition
1. FROM
(1-J1) Cartesian Product
( ) JOIN table
(1-J2) ON Filter or join condition
(1-J3) Add Outer Rows.
2. WHERE Predicates / Clauses
3. GROUP BY Columns
4. HAVING Condition
5. SELECT
5a. Evaluate expressions
5b. Apply DISTINCT clause
5c Apply TOP option
6. ORDER BY
6a. TOP / OFFSET-FETCH
9. FOR XML
SQL.CheatSheet.2008.MidnightDBA.(11.07.13).pdf
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf
|
|
|
Term
Query Processing - 02a
Describe the Perform Cartesian Product phase.
|
|
Definition
1. This is the first of three subphases that are applicable to a join table operator. This subphase performs a Cartesian product (a cross join, or an unrestricted join) between the two tables involved in the join and, as a result, generates virtual table VT1-J1. 2. If the left table contains n rows and the right table contains m rows, VT1-J1 will contain n×m rows. The columns in VT1-J1 are qualified (prefixed) with their source table names (or table aliases, if you specified them in the query).
3. In the subsequent steps (step 1-J2 and on), a reference to a column name that is ambiguous (appears in more than one input table) must be table-qualifi ed (for example, C.customerid).
4. Specifying the table qualifier for column names that appear in only one of the inputs is optional (for example, O.orderid or just orderid).
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 02a
Describe the FROM phase |
|
Definition
(1) The FROM phase identifies the query’s source tables and processes table operators.
Each table operator applies a series of subphases.
For example, the phases involved in a join are:
(1-J1) Cartesian Product,
(1-J2) ON Filter,
(1-J3) Add Outer Rows.
■ (1-J1) Cartesian Product This phase performs a Cartesian product (cross join) between the two tables involved in the table operator, generating VT1-J1.
■ (1-J2) ON Filter This phase fi lters the rows from VT1-J1 based on the predicate that appears in the ON clause (<on_predicate>). Only rows for which the predicate evaluates to TRUE are inserted into VT1-J2.
■ (1-J3) Add Outer Rows If OUTER JOIN is specified (as opposed to CROSS JOIN or INNER JOIN), rows from the preserved table or tables for which a match was not found are added to the rows from VT1-J2 as outer rows, generating VT1-J3.
The FROM phase generates virtual table VT1-J1 or VT-J2 or VT-J3
ebook_Inside_Microsoft_Server_2008_T_SQL_Querying.Ben-Gan.pdf |
|
|
Term
Query Processing - 02a
Describe the FROM phase. |
|
Definition
1. The FROM phase identifies the table or tables that need to be queried, and if table operators are specified, this phase processes those operators from left to right.
2. Each table operator operates on one or two input tables and returns an output table. The result of a table operator is used as the left input to the next table operator—if one exists—and as the input to the next logical query processing phase otherwise.
3. Each table operator has its own set of processing subphases.
For example, the subphases involved in a join are:
(1-J1) Cartesian Product
(1-J2) ON Filter
(1-J3) Add Outer Rows.
Here I will provide a description of the subphases involved in a join; later in the chapter, under “Table Operators,” I’ll describe the other table operators. The FROM phase generates virtual table VT1.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 02b
Describe the APPLY ON Filter (Join Condition). |
|
Definition
1. The ON filter is the first of three possible fi lters (ON, WHERE, and HAVING) that can be specified in a query.
2. The predicate in the ON fi lter is applied to all rows in the virtual table returned by the previous step (VT1-J1).
3. Only rows for which the on_predicate> is TRUE become part of the virtual table returned by this step (VT1-J2).
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 02c
Describe Add Outer Rows phase |
|
Definition
1. This step occurs only for an outer join. For an outer join, you mark one or both input tables as preserved by specifying the type of outer join (LEFT, RIGHT, or FULL).
2.Marking a table as preserved means that you want all of its rows returned, even when filtered out by the <on_predicate>.
3. A left outer join marks the left table as preserved, a right outer join marks the right one, and a full outer join marks both.
4. Step 1-J3 returns the rows from VT1-J2, plus rows from the preserved table(s) for which a match was not found in step 1-J2. These added rows are referred to as outer rows.
5. NULLs are assigned to the attributes (column values) of the nonpreserved table in the outer rows. As a result, virtual table VT1-J3 is generated.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 02c
Describe the Add Outer Rows subphase. |
|
Definition
1. This step occurs only for an outer join. For an outer join, you mark one or both input tables as preserved by specifying the type of outer join (LEFT, RIGHT, or FULL).
2. Marking a table as preserved means that you want all of its rows returned, even when fi ltered out by the <on_predicate>.
3. A left outer join marks the left table as preserved, a right outer join marks the right one, and a full outer join marks both.
4. Step 1-J3 returns the rows from VT1-J2, plus rows from the preserved table(s) for which a match was not found in step 1-J2.
5. These added rows are referred to as outer rows. NULLs are assigned to the attributes (column values) of the nonpreserved table in the outer rows. As a result, virtual table VT1-J3 is generated.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 03
Describe the WHERE phase. |
|
Definition
(2) WHERE This phase fi lters the rows from VT1 based on the predicate that appears in the WHERE clause (<where_predicate>). Only rows for which the predicate evaluates to TRUE are inserted into VT2.
Caution 1. Because the data is not yet grouped, you cannot use aggregates here—for example, you cannot write WHERE orderdate = MAX(orderdate).
2. Also, you cannot refer to column aliases created by the SELECT list because the SELECT list was not processed yet—for example, you cannot write SELECT YEAR(orderdate) AS orderyear . . . WHERE orderyear > 2008.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 03b
What is the difference between WHERE and ON in query containing an outer join? |
|
Definition
A confusing aspect of queries containing an OUTER JOIN clause is whether to specify a logical expression in the ON filter or in the WHERE filter.
The main difference between the two is that ON is applied before adding outer rows (step 1-J3), while WHERE is applied afterwards.
An elimination of a row from the preserved table by the ON filter is not final because step 1-J3 (Add Outer Rows) will add it back; an elimination of a row by the WHERE filter, by contrast, is final. Bearing this in mind should help you make the right choice.
Tip This logical difference between the ON and WHERE clauses exists only when using an outer join. When you use an inner join, it doesn’t matter where you specify your logical expressions because step 1-J3 is skipped. The filters are applied one after the other with no intermediate step between them.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 04
Describe thed GROUP BY phase |
|
Definition
3) GROUP BY This phase arranges the rows from VT2 in groups based on the column list specifi ed in the GROUP BY clause, generating VT3. Ultimately, there will be one result row per group.
The GROUP BY phase associates rows from the table returned by the previous step to groups according to the <group_by_specification>. I will discuss this specification in detail in Chapter 8, “Aggregating and Pivoting Data,” but for now, assume that it specifies a single list of attributes to group by. This list is called the grouping set. In this phase, the rows from the table returned by the previous step are arranged in groups. Each unique combination of values of the attributes that belong to the grouping set identifies a group. Each base row from the previous step is associated to one and only one group.
Virtual table VT3 consists of the rows of VT2 arranged in groups (the raw information) along with the group identifiers (the groups information).
Eventually, a query that contains a GROUP BY clause will generate one row per group (unless filtered out). Consequently, when GROUP BY is specified in a query, all subsequent steps (HAVING, SELECT, and so on) can specify only expressions that have a scalar (singular) value per group.
These expressions can include columns or expressions from the GROUP BY list—such as C.customerid in the sample query here—or aggregate functions, such as COUNT(O.orderid).
This phase considers NULLs as equal. That is, all NULLs are grouped into one group, just like a known value.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 05
Describe the HAVING phase. |
|
Definition
(4) HAVING This phase filters the groups from VT3 based on the predicate that appears in the HAVING clause (<having_predicate>). Only groups for which the predicate evaluates to TRUE are inserted into VT4.
The HAVING filter is applied to the groups in the table returned by the previous step. Only groups for which the <having_predicate> is TRUE become part of the virtual table returned by this step (VT4).
The HAVING filter is the only filter that applies to the grouped data.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 06
Describe the SELECT phase |
|
Definition
(5) SELECT This phase processes the elements in the SELECT clause, generating VT5. (5-1) Evaluate Expressions This phase evaluates the expressions in the SELECT list, generating VT5-1. (5-2) DISTINCT This phase removes duplicate rows from VT5-1, generating VT5-2. (5-3) TOP This phase fi lters the specifi ed top number or percentage of rows from VT5-2 based on the logical ordering defi ned by the ORDER BY clause, generating the table VT5-3.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 06a
Describe the DISTINCT phase |
|
Definition
If a DISTINCT clause is specifi ed in the query, duplicate rows are removed from the virtual table returned by the previous step, and virtual table VT5-2 is generated.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 06b
Describe the role of DISTINCT in implementing the relational model. |
|
Definition
Note
1. SQL deviates from the relational model by allowing a table to have duplicate rows (when a primary key or unique constraint is not enforced) and a query to return duplicate rows in the result.
2. A relation in the relational model represents a set from set theory, and a set (as opposed to a multiset) has no duplicates.
3. Using the DISTINCT clause you can ensure that a query returns unique rows and in this sense conform to the relational model.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 06c
Describe the TOP option. |
|
Definition
1. The TOP option is a feature specifi c to T-SQL that allows you to specify a number or percentage of rows (rounded up) to return.
2. The specified number of rows is selected based on the query’s ORDER BY clause.Traditionally, and according to the ANSI SQL standard, ORDER BY is supposed to serve a presentation purpose.
3. However, when the TOP option is specified, the ORDER BY clause also serves a logical purpose— answering the question “top according to what order?” Table VT5-3 is generated.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 06d
Describe the relationship between TOP and ORDER BY and comment on deterministic and nondeterministic results. |
|
Definition
1. The TOP option processing relies on the query’s ORDER BY clause to determine which rows are considered the “first” requested number of rows.
2. If an ORDER BY clause with a unique ORDER BY list is specified in a query, the result is deterministic. That is, only one correct result is possible, containing the first requested number of rows based on the specified order.
3. Similarly, when an ORDER BY clause is specified with a non-unique ORDER BY list but the TOP option is specified WITH TIES, the result is also deterministic. SQL Server inspects the last row that was returned and returns all other rows from the table that have the same sort values as the last row. 4. However, when a non-unique ORDER BY list is specified without the WITH TIES option, or ORDER BY is not specifi ed at all, a TOP query is nondeterministic.
5. That is, the rows returned are the ones that SQL Server happened to access first, and there might be different results that are considered correct.
6. If you want to guarantee determinism, a TOP query must have either a unique ORDER BY list or the WITH TIES option.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf
|
|
|
Term
Query Processing - 07a
Describe the ORDER BY phase. |
|
Definition
6) ORDER BY This phase sorts the rows from VT5-3 according to the column list specified in the ORDER BY clause, generating the cursor VC6.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 07a
Describe the ORDER BY phase. |
|
Definition
1. The rows from the previous step are sorted according to the column list specified in the ORDER BY clause, returning the cursor VC6.
2. The ORDER BY clause is the only step where column aliases created in the SELECT phase can be reused. 3. If DISTINCT is specified, the expressions in the ORDER BY clause have access only to the virtual table returned by the previous step (VT5).
4. If DISTINCT is not specified, expressions in the ORDER BY clause can access both the input and the output virtual tables of the SELECT phase.
That is, in the ORDER BY clause you can specify any expression that would have been allowed in the SELECT clause. Namely, you can sort by expressions that you don’t end up returning in the final result set.
5. There is a reason for not allowing access to expressions you’re not returning if DISTINCT is specified. When adding expressions to the SELECT list, DISTINCT can potentially change the number of rows returned. Without DISTINCT, of course, changes in the SELECT list don’t affect the number of rows returned.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - 07a
What is an important difference between the ORDER BY phase and all other steps in query processing? |
|
Definition
Important
1. This step is different than all other steps in the sense that it doesn’t return a valid table; instead, it returns a cursor.
2. Remember that SQL is based on set theory. A set doesn’t have a predetermined order to its rows: It’s a logical collection of members, and the order of the members shouldn’t matter.
3. A query with a presentation ORDER BY clause returns an object with rows organized in a particular order. ANSI calls such an object a cursor.
4. Understanding this step is one of the most fundamental steps to correctly understanding SQL. |
|
|
Term
Query Processing - 07b
What is the implication of the ORDER BY phase returning a cursor? |
|
Definition
1. Because this step doesn’t return a table (it returns a cursor), a query with a presentation ORDER BY clause cannot be used to define a table expression—that is, a view, an inline table-valued function, a derived table, or a common table expression (CTE).
2. Rather, the result must be returned to the client application that can consume cursor records one at a time, in order.
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf |
|
|
Term
Query Processing - All-at-Once Operations
1. Explain this concept.
2. Give an example. |
|
Definition
SQL supports a concept called all-at-once operations, which means that all expressions that appear in the same logical query processing phase are evaluated logically at the same point in time.
SELECT col1, col2 FROM dbo.T1 WHERE col1 <> 0 AND col2/col1 > 2;
You can see that if SQL Server decides to process the expression 10/col1 > 2 first, this query might fail because of a divide-by-zero error.
SQL.microsoft_sql_server_2012_t-sql_fundamentals.Ben-Gan.pdf, p. 60 |
|
|
Term
Query Processing - All-at-Once Operations
Explain the CASE statement overcoming a pitfull of All-at-Once Operations. |
|
Definition
For example, the order in which the WHEN clauses of a CASE expression are evaluated is guaranteed. So you could revise the query as follows. SELECT col1, col2 FROM dbo.T1 WHERE CASE WHEN col1 = 0 THEN 'no' -- or 'yes' if row should be returned WHEN col2/col1 > 2 THEN 'yes' ELSE 'no' END = 'yes';
Note: Better solution: (Objective: avoid dividing by zero).
SELECT col1, col2 FROM dbo.T1 WHERE (col1 > 0 AND col2 > 2*col1) OR (col1 < 0 AND col2 < 2*col1);
SQL.microsoft_sql_server_2012_t-sql_fundamentals.Ben-Gan.pdf, p. 60 |
|
|
Term
SQL Server - Instances
What are SQL Server instances? |
|
Definition
An instance of the Database Engine is a copy of the sqlservr.exe executable that runs as an operating system service. Each instance manages several system databases and one or more user databases. Each computer can run multiple instances of the Database Engine. Applications connect to the instance in order to perform work in a database managed by the instance. http://technet.microsoft.com/en-us/library/hh231298.aspx
Beginning with SQL Server 2000, you can run multiple copies of the software, using what Microsoft calls Instances. Instances share a few files between them, mostly dealing with client tools. This allows you to have two different system administrators (sa accounts) and other server-level security on the same hardware. So if you have different security needs, say running more than one company with different administrators, you can install multiple copies of SQL Server on the same hardware. http://www.informit.com/guides/content.aspx?g=sqlserver&seqNum=29
You can run multiple instances of the Database Engine on a computer. One instance can be the default instance. The default instance has no name. If a connection request specifies only the name of the computer, the connection is made to the default instance. A named instance is one where you specify an instance name when installing the instance. A connection request must specify both the computer name and instance name in order to connect to the instance. There is no requirement to install a default instance; all of the instances running on a computer can be named instances. http://technet.microsoft.com/en-us/library/hh231298.aspx |
|
|
Term
SQL Server - Instances
1. What is a named instance?
2. How do you install a named instance?
3. How do you identtify named instance?
|
|
Definition
2. You can create a named instance as the first instance you install. Or you can install a default instance first. Then you can put the CD back into the slot and repeat the installation, this time choosing the option ot install a new instance. You must give the this new (second or greater instance) a name.
3. For named Instances: NameOfComputer\NameOfInstance
http://www.informit.com/guides/content.aspx?g=sqlserver&seqNum=29
|
|
|
Term
SQL Server - Instances
What is a default instance?
|
|
Definition
When you install SQL Server on a system, one copy of the software can be (but doesn’t have to be) designated as the Default Instance.
It doesn’t have a special network name; it works by using the name of the computer. So in any client tools or programs, when you want to talk to a Default SQL Server Instance you just enter the name of the computer it runs on, like BUCKTEST for the BUCKTEST Windows Server. The network information for the Default Instance for named pipes connections is \\.\pipe\sql\query.
You can only have one version of SQL Server as the Default Instance; that is, you can’t have two Default Instances. That kind of stands to reason, since only the computer name is used to identify the Instance.
http://www.informit.com/guides/content.aspx?g=sqlserver&seqNum=29 |
|
|
Term
Schemabinding - View
What is schemabinding for a view? |
|
Definition
Once you create a view with schemabinding, you cannot change the underlying tables in a way that would break the view. Examples of this would be removing columns or dropping tables that are specified in the view.
When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition. The view definition itself must first be modified or dropped to remove dependencies on the table that is to be modified. When you use SCHEMABINDING, the select_statement (in the view) must include the two-part names (schema.object) of tables, views, or user-defined functions that are referenced. All referenced objects must be in the same database.
Views or tables that participate in a view created with the SCHEMABINDING clause cannot be dropped unless that view is dropped or changed so that it no longer has schema binding. Otherwise, the Microsoft SQL Server 2005 Database Engine raises an error. Also, executing ALTER TABLE statements on tables that participate in views that have schema binding fail when these statements affect the view definition.
SCHEMABINDING cannot be specified if the view contains alias data type columns.
|
|
|
Term
Subquery
What are 4 important facts regarding subqueries in the FROM section.
Hints:
A subquery in FROM section:
1. Creates _________ table.
2. Useful for breaking _______ queries.
3. Subquery in FROM section must be _________.
4. In FROM section, subquery is also known as ________ table. |
|
Definition
A subquery in FROM section:
1. Creates a dynamic table
2. Useful for breaking down queries
3. Query must be aliased.
4. Also known as derived table. (See Chapter 05, page 157 SQL.TSQLFundamentals2012.Ben-Gan.pdf)
Pluralsight; SQL Server 2012 Querying (70-461) Part 1; Slide title: FROM line
|
|
|
Term
Subquery
What is most important thing about placing Subquery into the SELECT line. |
|
Definition
Subquery must return a scalar value.
|
|
|
Term
Subquery
What is value of placing a subquery into a WHERE statement? |
|
Definition
<img src="data:image/png;base64,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 |
|
|
Term
Subquery
What predicates are used with subqueries?
NOTE: Definition was lost in conversion from HTML. |
|
Definition
|
|
Term
Subquery
1. What are the key subquery concepts?
2. What can you "sneak in" to a subquery in the WHERE statement?
|
|
Definition
|
|
Term
Subquery
What is example of subquery in SELECT section? |
|
Definition
[image]
Pluralsight; SQL Server 2012 Querying (70-461) Part 1; Slide title: SELECT line |
|
|
Term
Subquery - 01
1. Where are the 3 places you can put subqueries?
2. In one of these 3 places, the subquery is also known as a _______ ________ or a table _________.
|
|
Definition
1. You can put subquery
1. SELECT section
2. FROM section
3. WHERE section
2. In a FROM section, the subquery is also known as a derived table or a table subquery.
SQL.TSQLFundamentals2012.Ben-Gan.pdf |
|
|
Term
Subquery - Correlated
What is another name for "correlated" subquery? |
|
Definition
|
|
Term
Subquery - Correlated
1. What is one really important requirement for a subquery in a SELECT statement?
2. What is example of correclated subquery in a SELECT statement? |
|
Definition
1. A correlated subquery in a SELECT statement must return a scalar (single) value for each row returned by the outer query.
2.
SELECT SalesOrderNumber, SubTotal, OrderDate,
CASE WHEN
( SELECT SUM(LineTotal)
FROM Sales.SalesOrderDetail d WHERE d.SalesOrderID = h.SalesOrderID ) = h.SubTotal THEN 'balanced'
ELSE 'not balanced' END AS LineTotals
FROM Sales.SalesOrderHeader h; |
|
|
Term
Subquery - Correlated
What is a correlated subquery? |
|
Definition
1. Correlated subquery refers to attributes from the table that appears in the outer query.
2. The subquery is dependent on the outer query and cannot be invoked independently.
3. Logically, the subquery is executed / evaluated separately for each outer row. 4. Logically, the outer query feeds the subquery row by row.
|
|
|
Term
Subquery - Correlated
Where can you put correlated subqueries? |
|
Definition
You can put correlated subqueries in
1. SELECT statements
2. WHERE clauses |
|
|
Term
Subquery - Derived Table
1. What is another name for a subquery in the FROM clause?
2. What does a subquery in a FROM clause return? |
|
Definition
1. A derived table.
2. A subquerty in a FROM clause can return a table (row set). It is NOT limited to scalar result set.
www.simple-talk.com/content/print.aspx?article=1297 |
|
|
Term
Subquery - Derived Table
How do you specify the query that defines the derived table?
Hints:
You specify the query that defines the derived table ________ __________, followed by the __________ clause and the derived table _________. |
|
Definition
You specify the query that defines the derived table within parentheses, followed by the AS clause and the derived table name |
|
|
Term
Subquery - Derived Table
Please explain derived table. |
|
Definition
SELECT p.ProductID, p.Name AS ProductName, p.ProductSubcategoryID AS SubcategoryID, ps.Name AS SubcategoryName FROM Production.Product p INNER JOIN ( SELECT ProductSubcategoryID, Name FROM Production.ProductSubcategory WHERE Name LIKE '%bikes%' ) AS ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID;
--------------
The first thing to notice is that the subquery returns a derived table that includes two columns and multiple rows.
Because the subquery returns a table, I can join that table, which I’ve named ps, to the results from the Product table (p).
As the join demonstrates, you treat a subquery used in the FROM clause just as you would treat any table.
I could have just as easily created a view or temporary table—or even added a regular table to the database—that accesses the same data as that available through the subquery.
I defined the join based on the subcategory ID in the derived table and Product table. I was then able to include columns from both these tables in the SELECT list, as I would any type of join. The following table shows a subset of the results returned by the outer query.
https://www.simple-talk.com/content/print.aspx?article=1297 |
|
|
Term
Subquery - WHERE NOT IN and NULL logic
What is one fix to explicitly avoid the NOT IN and NULL problems?
|
|
Definition
All queries that you write should consider all 3 possible truth values of 3-valued logic: (TRUE, FALSE and UNKNOWN).
When you want to check whether a customer ID appears in the set of known values and ignore the NULLs, you should exclude the NULLs explicity or implicitly:
Explcity:
SELECT custid, copanyname
FROM Sales.Customers AS C
WHERE custid NOT IN (SELECT O.custid
FROM Sales.Orders AS O
WHERE O.custid IS NOT NULL)
Microsoft SQL Server 2008 Fundamentals, Ben-Gan, Page 148 |
|
|
Term
Subquery - WHERE NOT IN and NULL logic
What is the method for implicitly avoiding the NULL logic gotcha in subqueries? |
|
Definition
Use NOT EXISTS
SELECT custid, companyname
FROM Sales.Customers as C
WHERE NOT EXISTS (SELECT * FROM Sales.Orders as O
WHERE O.custid = C.custid
Unlike IN, EXIST uses 2-valued predicate logic . EXISTS always returns TRUE or FALSE and never returns UNKNOWN. When the subquery stumbles into a NULL in O.custid, the expression evaluates to UNKNOWN and the is filtered out (because it is not TRUE and it is not FALSE)
Microsoft SQL Server 2008 Fundamentals, Ben-Gan, Page 148. |
|
|
Term
Subquery - WHERE NOT IN and Null logic
1. What is the "gotcha" regarding the following query when there is at least one NULL marker as a custid in the table Sales.Orders?
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE custid NOT IN (SELECT O.custid
FROM Sales.Orders A O)
|
|
Definition
1. When you use the NOT IN predicate against a subquery that returns at least one NULL, the outer query always returns an empty set.
Reason: A NULL is UNKNOWN. Negating the UNKNOWN with the NOT (NOT IN) operator still yields UNKNOWN and UNKNOWN in a query filter is filtered out. This means that in a case where it is unknown whether a customer ID appears in a set, it also unknown whether it does not appear in the set.
Microsoft SQL Server fundamentals, Ben-Gan Page 148. |
|
|
Term
Subquery -- Derived Table
What is scope of existence of Derived Table? |
|
Definition
Their scope of existence is the outer query. As soon as the outer query is finished, the derived table is gone. |
|
|
Term
TABLES / VIEWS
Implementing Tables and Views
WITH ENCRYPTION clause
1. Where is it used?
2. What is it used for?
3. What does it prevent?
http://www.ucertify.com/?action=Next&chapter_guid=00QII&item_sequence=23&total_notes=109&func=navigate_flashcard&useraction=
|
|
Definition
WITH ENCRYPTION clause
1. The WITH ENCRYPTION clause is used with a view or stored procedure definition.
2. Using the WITH ENCRYPTION clause changes the view or stored procedure definition to an encrypted form.
3. This prevents anyone from viewing the statement used to create the view or stored procedure.
To enable TDE (transparent data encryption), you must have the normal permissions associated with creating a database master key and certificates in the master database. You must also have CONTROL permissions on the user database.
http://www.ucertify.com/?action=Next&chapter_guid=00QII&item_sequence=23&total_notes=109&func=navigate_flashcard&useraction= |
|
|
Term
TABLES / VIEWS
Implementing Tables and Views
WITH SCHEMABINDING clause
1. What does it safeguard against?
2. What does it prevent?
WITH VIEW_METADATA clause
3. When you want to a view's metadata, what do you do?
4. What does it allow to be returned? |
|
Definition
WITH SCHEMABINDING clause
1. The WITH SCHEMABINDING clause safeguards a view definition against any structural modification of the underlying table.
2. If a view is created with the WITH SCHEMABINDING clause, the underlying tables cannot be deleted or altered in a way that affects the view definition.
WITh VIEW_METADATA clause
3. The view s. pecified with the VIEW_METADATA clause can return the DBLIB, ODBC, and the OLEDB APIs.
4. When the metadata information about a view is to be viewed, it is created with the VIEW_METADATA option.
Modifications can be made in an existing view by using the ALTER VIEW statement.
Implementing Tables and Views
http://www.ucertify.com/?action=Next&chapter_guid=00QII&item_sequence=24&total_notes=109&func=navigate_flashcard&useraction= |
|
|
Term
TSQL Language Structure
1. What are the 4 main elements of TSQL? |
|
Definition
DML (Data Manipulation Language) - Affect records in a table
SELECT
INSERT
UPDATE
DELETE
DDL (Data Definition Language) - Handle design of database objects
CREATE
ALTER
DROP
DCL (Data Control Language) - Control level of access to securables
GRANT
REVOKE
DENY
TCL (Transaction Control Language) - Allow you to manage transactions
BEGIN TRAN
COMMIT TRAN
ROLLBACK TRAN
Source
|
|
|
Term
Table Expression
What is a table expression? |
|
Definition
A table expression is a named query expression that represents a valid relational table.
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chapter 5. |
|
|
Term
Table Expression
When you query a table expression, what happens to the inner query?
Hint:
The ______ query and the ________ query are ________ into _____ query. |
|
Definition
When you query a table expression, the inner query gets unnested. In other words, the outer query and the inner query are merged into one query directly against the underlying objects.
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chap 5 |
|
|
Term
Table Expressions
Are table expressions materialized or are they virtual? |
|
Definition
Table expressions are not physically materialized anywhere—they are virtual.
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chap 5. |
|
|
Term
Table Expressions
What are the 4 types of table expressions that SQL Server supports? |
|
Definition
Microsoft SQL Server supports four types of table expressions:
1. derived tables
2. common table expressions (CTEs)
3. views
4. inline table-valued functions (inline TVFs)
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chap 5. |
|
|
Term
Table Expressions
What are the benefits of using table expressions?
Hints:
1. Are the benefits logical or performance based?
2. Table expression help you ________ code by using a _________ approach. |
|
Definition
1. The benefits of using table expressions are typically related to logical aspects of your code and not to performance.
2. Table expressions help you simplify your solutions by using a modular approach
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chap 5 |
|
|
Term
Table Expressions
What is key benefit of table expressions with regard to column aliases?
Hint:
In any clause of the ________ query, you can refer to column aliases assigned in the SELECT clause of the _________ query. |
|
Definition
Table expressions give you the ability to refer to column aliases assigned in the SELECT clause in query clauses that are logically processed before the SELECT clause.
In other words:
One of the benefits of using table expressions is that, in any clause of the outer query, you can refer to column aliases that were assigned in the SELECT clause of the inner query.
SQL.TSQLFundamentals2012.Ben-Gan.pdf Chap 5 |
|
|
Term
Tables / Views
What are the 4 types of table expressions? |
|
Definition
These are the types of table expressions:
1. Views
2. An inline table-valued functio
3. Derived table
4. Common table expression (CTE) |
|
|
Term
Tables / Views - Truncate and Delete
What will truncate do?
What is syntax? |
|
Definition
Basic Function: TRUNCATE TABLE is a statement that quickly deletes all records in a table by deallocating the data pages used by the table.
Pros: This reduces the resource overhead of logging the deletions, as well as the number of locks acquired;
Pros: The advantage to using TRUNCATE TABLE is that in addition to removing all rows from the table it resets the IDENTITY back to the SEED, and the deallocated pages are returned to the system for use in other areas.
Cons: however, it bypasses the transaction log, and the only record of the truncation in the transaction logs is the page deallocation.
Cons: Records removed by the TRUNCATE TABLE statement cannot be restored.
Cons: You cannot specify a WHERE clause in a TRUNCATE TABLE statement-it is all or nothing.
Cons: TRUNCATE TABLE statements cannot be used for tables involved in replication or log shipping, since both depend on the transaction log to keep remote databases consistent.
Cons: TRUNCATE TABLE cannot used be used when a foreign key references the table to be truncated, since TRUNCATE statements do not fire triggers. This could result in inconsistent data because ON DELETE/UPDATE triggers would not fire.
If a TRUNCATE TABLE statement is issued against a table and there is foreign key referencing the table, you must drop the index and recreate it.
http://www.mssqltips.com/sqlservertip/1080/deleting-data-in-sql-server-with-truncate-vs-delete-commands/ |
|
|
Term
Tables / Views - Truncate and Delete
When do you use DELETE?
What are pros / cons?
What is syntax? |
|
Definition
DELETE TABLE statements delete rows one at a time
Pro: logging each row in the transaction log, as well as maintaining log sequence number (LSN) information.
Pro: these transactions can be rolled back if necessary
Pro: You can also specify a WHERE clause to narrow down the rows to be deleted.
Con: DELETE consumes more database resources and locks,
Con: When you delete a large number of rows using a DELETE FROM statement, the table may hang on to the empty pages requiring manual release using DBCC SHRINKDATABASE (db_name).
DELETE equivalent to TRUNCATE:
When large tables require that all records be deleted and TRUNCATE TABLE cannot be used, the following statements can be used to achieve the same result as TRUNCATE TABLE:
- DELETE from "table_name"
- DBCC CHECKIDENT("table_name", RESEED, "reseed_value")
[image]
http://www.mssqltips.com/sqlservertip/1080/deleting-data-in-sql-server-with-truncate-vs-delete-commands/ |
|
|
Term
Triggers #01
INSTEAD OF DELETE
INSTEAD OF INSERT |
|
Definition
The primary advantage of INSTEAD OF triggers is that they enable views that would not be updatable to support updates. A view based on multiple base tables must use an INSTEAD OF trigger to support inserts, updates, and deletes that reference data in more than one table. Another advantage of INSTEAD OF triggers is that they enable you to code logic that can reject parts of a batch while letting other parts of a batch to succeed.
INSTEAD OF triggers are a special type of trigger that executes alternate code instead of executing the statement that they were fired from.
It is important to realize that with an INSTEAD OF trigger, only the code in the trigger is executed. A very common use case for INSTEAD OF triggers is to allow views that are based on multiple base tables to be updatable
http://msdn.microsoft.com/en-us/library/ms175521(v=sql.105).aspx |
|
|
Term
Triggers #02
INSTEAD OF INSERT
INSTEAD OF DELETE |
|
Definition
An INSTEAD OF trigger can take actions such as:
-
Ignoring parts of a batch.
-
Not processing a part of a batch and logging the problem rows.
-
Taking an alternative action when an error condition is encountered.
|
|
|
Term
Views - Partioned Views
1. What does a partitioned view allow?
2. What is the role of CHECK constraint?
3. What is role of UNION ALL?
4. In processing a SELECT on the partitioned view, what does the query optimizer use to determine which member table(s) to search? |
|
Definition
1. Partitioned views allow the data in a large table to be split into smaller member tables. The data is partitioned between the member tables based on ranges of data values in one of the columns.
2. The data ranges for each member table are defined in a CHECK constraint specified on the partitioning column.
3. A view that uses UNION ALL to combine selects of all the member tables into a single result set is then defined.
4. When SELECT statements referencing the view specify a search condition on the partition column, the query optimizer uses the CHECK constraint definitions to determine which member table contains the rows. |
|
|
Term
WHERE or HAVING.
When do you use WHERE clause?
When do you use HAVING clause? |
|
Definition
1) Are you filtering literal against column?
Use WHERE clause
2) Are you filtering column against column?
Use WHERE clause
3) Are testing column againt aggregate?
Subquery with WHERE clause
SELECT * FROM Sales.LT.Product
WHERE ListPrice > (
SELECT AVE(ListPrice) FROM SalesLT.Product
(
4) Are you testing an aggregate against literal?
Use HAVING clause
5) Are you testing aggregate against an aggregate
Use HAVING clause
LearnItFirst, Chapter 6
06_04-DecideBetweenWHEREHAVINGOrSimpleSubquery.png |
|
|
Term
What are the 2 ways to validate data? |
|
Definition
1. Using declarative data integrity.
Uses CONSTRAINTS with CREATE TABLE or ALTER TABLE.
2. Using procedural data integrity.
Uses stored procedures or triggers.
70-433_Training_Kit_MS_SQL_Server_2008_Database_Development.pdf |
|
|
Term
What are the 5 types of constraints for implementing declarative integrity? |
|
Definition
1. Primary Key
2. Unique
3. Foreign Key
4. Check
5. Default
70-433_Training_Kit_MS_SQL_Server_2008_Database_Development.pdf |
|
|
Term
What are the 5 ways to enforce / implement data integrity? |
|
Definition
[image]
6232BD-ENU-TrainerHandbook-Vol2.pdf p 14-8 |
|
|
Term
What does COUNT(DISTINCT columnname) do? |
|
Definition
|
|
Term
XML
1. What is <note id="501">?
2. What role is it playing in this XML expression?
<messages> <note id="501"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <note id="502"> <to>Jani</to> <from>Tove</from> <heading>Re: Reminder</heading> <body>I will not</body> </note> < /messages> |
|
Definition
1. It is an element containing an attibute
2. It is metadata about each "note". |
|
|
Term
XML
1. What is an XML Stream?
2. How do you get SQL to return an XML Stream? |
|
Definition
XML Stream is data in XML format (with tags, elements and attributes).
The FOR XML clause instructs SQL Server to return data as an XML stream rather than a rowset.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 650-651). . Kindle Edition.
|
|
|
Term
XML
1. What is an XML element?
2. What is an XML attribute?
3. Are there rules about when to use attributes vs. elements?
4. What is the best practice?
5. Why?
6. When is it a best practice to use attributes?
7. In the SQL enviornment, what XML object (attribute or element) typically corresponds to which SQL object? |
|
Definition
1a. It is a row in an XML stream. (This is not the same as a row in a SQL table.)
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Location 664). . Kindle Edition.
1b. An XML element is everything from (including) the element's start tag to (including) the element's end tag.
An element can contain:
- other elements
- text
- attributes
- or a mix of all of the above...
2. Attributes provide additional information about an element. Attribute values must always be quoted. Either single or double quotes can be used. For a person's sex, the person element can be written like this: <person sex="female">
or like this:
<person sex='female'>
or you can use character entities:
<gangster name="George "Shotgun" Ziegler">
3. No.
4. Use Elements instead of Attributes.
5.
Some of the problems with using attributes are:
- attributes cannot contain multiple values (elements can)
- attributes cannot contain tree structures (elements can)
- attributes are not easily expandable (for future changes)
Attributes are difficult to read and maintain. Use elements for data. Use attributes for information that is not relevant to the data.
6. Metadata (data about data) should be stored as attributes, and the data itself should be stored as elements.
Source: 1b thu 6: http://www.w3schools.com/xml/xml_attributes.asp
7. Column / field
Source: Gary's observation
|
|
|
Term
XML
1. What is the XSINIL option used for?
2. What is the syntax?
|
|
Definition
The XSINIL option allows you to force a tag(s) to be present, even if the underlying data is NULL.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 616-617). . Kindle Edition.[image] |
|
|
Term
XML
1. What is the best FOR XML mode for most solutions?
2. Why is it the best for most solutions? |
|
Definition
1. FOR XML PATH mode is the best choice of the different FOR XML modes for most solutions.
2. PATH mode allows for the easy creation of different XML structures by simply interpreting column names specified using an XPath-like expression when generating the XML result.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf p 272
|
|
|
Term
XML
1. What is the role of tags??
2. What is the name (term) for XML parts?
3. What is the form / syntax for a beginning tag?
4. What is the form / syntax for an ending tag?
5. What is the form / syntax if an element has no nested elements?
6. Can elements be nested?
7. What is the rule of interleaving tags?
8. What is a well-formed XML document? |
|
Definition
1. XML uses tags to name parts of an XML document.
2. These parts are called elements.
3. and 4. Every begin tag, such as <Customer>, must have a corresponding end tag, in this case </Customer>.
5. If an element has no nested elements, the notation can be abbreviated to a single tag that denotes the beginning and end of an element, such as <Order … />.
6. Elements can be nested.
7. Tags cannot be interleaved; the end tag of a parent element must be after the end tag of the last nested element.
8. If every begin tag has a corresponding end tag, and if tags are nested properly, the XML document is well-formed. |
|
|
Term
XML
How do you bulk load XML data? |
|
Definition
Example: Loading XML from Files
This example shows how to insert a row in table T. The value of the XML column is loaded from file C:\MyFile\xmlfile.xml as CLOB, and the integer column is supplied the value 10.
INSERT INTO T SELECT 10, xCol FROM (SELECT * FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_CLOB) AS xCol) AS R(xCol)
http://technet.microsoft.com/en-us/library/bb522655.aspx
|
|
|
Term
XML
What are 6 key points regarding FOR XML RAW option? |
|
Definition
- The RAW option can be used with the ROOT or ELEMENTS keywords or both to customize your expected XML stream.
- The ROOT and ELEMENTS keywords are optional
- The raw mode likes to store all of its data as attributes.
- Attributes: data stored inside of a beginning tag.
- FOR XML RAW defaults to making a <row> tag.
- You can change this to anything you like by using the optional parentheses ( ) after the word RAW.
- FOR XML RAW – – Results in <row…>
- FOR XML RAW(‘Emp’) – – Results in <Emp…>
- FOR XML RAW command by default does not create a root.
- Root element: also known as the root node; the element which begins and ends a well-formed XML.
- XML is considered complete (known as well-formed XML) only if it has a root tag which encompasses all other tags.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 654-658). . Kindle Edition. |
|
|
Term
XML
What are the 2 forms of XML data? |
|
Definition
|
|
Term
XML
What are two common reasons why you might want to retrieve data as XML instead of a SQLServer table?
|
|
Definition
Two common reasons why you might want to retrieve data as XML instead of a SQLServer table could be:
- Publishing data to a website.
- Retrieving data to exchange with a trading partner who should not have direct access to your SQL Server.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 652-654). . Kindle Edition.
|
|
|
Term
XML
What is a SQL Server stream? |
|
Definition
Stream: the forming of the data in the way which a program or process prefers to output information. In SQL Server terms, a stream resembles a table: the gridlike presentation of rows and columns that you get when you run a query.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 678-679). . Kindle Edition. |
|
|
Term
XML
What is example syntax for SELECT ... FOR XML PATH? |
|
Definition
SELECT c.CustomerID AS "@Id" ,c.AccountNumber AS "@AccountNumber" ,c.RowGuid AS "comment()" ,CAST('<Test/>' AS XML) AS "node()" ,c.CustomerType AS "AdditionalInfo/@Type" ,c.ModifiedDate AS "AdditionalInfo/text()" ,c.rowguid AS "node()" FROM Sales.Customer AS c WHERE c.CustomerID IN (1, 2) FOR XML PATH('Customer'), ROOT('Customers'); Here is the result: <Customers> <Customer Id="1" AccountNumber="AW00000001"> <!--3F5AE95E-B87D-4AED-95B4-C3797AFCB74F--> <Test /> <AdditionalInfo Type="S">2004-10-13T11:15:07.263</AdditionalInfo> </Customer> <Customer Id="2" AccountNumber="AW00000002"> <!--E552F657-A9AF-4A7D-A645-C429D6E02491--> <Test /> <AdditionalInfo Type="S">2004-10-13T11:15:07.263</AdditionalInfo> </Customer> </Customers> In the XML result, you can see the following: n The @Id column resulted in the attribute Id in the Customer element. n The @AccountNumber column resulted in the attribute AccountNumber in the Customer element. n The comment() column resulted in the value of the RowGuid column being returned as an XML comment. n The node() column resulted in the XML constant in the query being placed directly into the XML result without ending up in a subelement. n The AdditionalInfo/@Type column resulted in the attribute Type in the subelement AdditionalInfo. n The AdditionalInfo/text() column resulted in the text of the subelement AdditionalInfo being set.
ms-sql-server-2008-database-development-training-kit-exam-70-433.NODRM.pdf p 272
|
|
|
Term
XML
What is modification for "FOR XML RAW" that replaces "<row>" tag with other text? |
|
Definition
FOR XML RAW defaults to making a <row> tag, you can change this to anything you like by using the optional parentheses ( ) after the word RAW.
FOR XML RAW – – Results in <row…>
FOR XML RAW(‘Emp’) – – Results in <Emp…>
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 656-658). . Kindle Edition. |
|
|
Term
XML
What is the SELECT statement that provides XML data that shows the root, elements within the root? |
|
Definition
|
Term
XML
What is the simplest mode where all data is considered at the same level with no nesting? |
|
Definition
Raw is the simplest mode where all data is considered to be at the same level with no nesting. The XML RAW command by default does not create a root.
Morelan, Rick (2011-07-05). SQL Interoperability Joes 2 Pros: A Guide to Integrating SQL Server with XML, C#, and PowerShell (Sql Exam Prep Series 70-433) (Volume 5) (Kindle Locations 567-568). . Kindle Edition. |
|
|
Term
XML
You are the database developer for a Microsoft SQL Server 2008 database that contains tables named order and product. The tables have the following definitions: CREATE TABLE [order] (OrderID INT, ProductID INT, CustomerID INT, OrderDate DATETIME);
CREATE TABLE product (ProductID INT, ProductName VARCHAR(100), SalePrice money, ManufacturerName VARCHAR(100));
You need to write a query that will extract a valid XML result set of all ordered products. You also need to ensure that the query conforms to the following schema:
<?xml version="1.0" encoding="utf-16"?><xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="OrderedProducts"> <xsd:complexType> <xsd:sequence> <xsd:element name="ProductID" type="xsd:int" /> <xsd:element name="ProductName" type="xsd:string" /> <xsd:element name="SalePrice" type="xsd:decimal" /> <xsd:element name="ManufacturerName" type="xsd:string" /> <xsd:element name="OrderDate" type="xsd:dateT ime" /> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
Which SQL query should you use? (Choose Two - complete answers)
A. SELECTp.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName,o.OrderDate FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML AUTO ('OrderedProducts'); B. SELECTp.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName,o.OrderDate FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML AUTO; C. SELECTp.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName,o.OrderDate FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML PATH ('OrderedProducts'); D. SELECT'<OrderedProducts>',p.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName, o.OrderDate,'</OrderedProducts>' FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML PATH; E. SELECT1 as Tag,0 as Parent,p.ProductID as [OrderedProducts!1!ProductID!ELEMENT],p.ProductName as [OrderedProducts!1!ProductName!ELEMENT],p.SalePrice as [OrderedProducts!1!SalePrice!ELEMENT],p.ManufacturerName as [OrderedProducts!1!ManufacturerName!ELEMENT],o.OrderDate as [OrderedProducts!1!OrderDate!ELEMENT] FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML EXPLICIT; F. SELECT1 as Tag,0 as Parent,p.ProductID as [OrderedProducts!1!ProductID!ELEMENT],p.ProductName as [OrderedProducts!1!ProductName!ELEMENT],p.SalePrice as [OrderedProducts!1!SalePrice!ELEMENT],p.ManufacturerName as [OrderedProducts!1!ManufacturerName!ELEMENT],o.OrderDate as [OrderedProducts!1!OrderDate!ELEMENT] FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML EXPLICIT ('OrderedProducts'); G. SELECT p.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName,o.OrderDate FROM product p INNER JOIN [order] o ON p.ProductID = o.ProductID FOR XML RAW; H. SELECTp.ProductID,p.ProductName,p.SalePrice,p.ManufacturerName,o.OrderDate FROM product p INNER JOIN[order] o ON p.ProductID = o.ProductID FOR XML RAW ('OrderedProducts'); |
|
Definition
Correct Answer: CE
Microsoft.PracticeTest.70-433.v2013-01-17.by.SQLlearner.pdf |
|
|
Term
XML You have a table named Customer that has an XML column named Locations. This column stores an XML fragment that contains details of one or more locations, as show in the following examples. <Location City="Sydney" Address="..." PhoneNumber="..." /><Location City="Chicago" Address="..." PhoneNumber="..." /><Location City="London" Address="..." PhoneNumber="..." /> You need to write a query that returns a row for each of the customer's locations. Each resulting row must include the customer name, city, and an XML fragment that contains the location details. Which query should you use? A. SELECT CustomerName,Loc.value('@City','varchar(100)'),Loc.query('.') FROM Customer CROSS APPLY Customer.Locations.nodes ('/Location') Locs(Loc) B. SELECT CustomerName,Locations.query('for $i in /Location return data($i/@City)'),Locations.query('for $i in /Location return $i') FROM Customer C. SELECT CustomerName,Locations.query('data(/Location/@City)'),Locations.query('/Location') FROM Customer D. SELECT CustomerName,Locations.query('for $i in /Location return element Location {$i/@City,$i}') FROM Customer |
|
Definition
A. SELECT CustomerName,Loc.value('@City','varchar(100)') ,Loc.query('.') FROM Customer CROSS APPLY Customer.Locations.nodes ('/Location') Locs(Loc)
Microsoft.PracticeTest.70-433.v2013-01-17.by.SQLlearner.pdf
QUESTION 133 |
|
|
Term
node.ToString()
1. What is it used for
2. What is syntax?
3. What is it functionally equivalent to? |
|
Definition
1. Use the node.ToString() method to convert the hierarchyid value to the logical representation as a nvarchar(4000) data type.
2. Transact-SQL syntax node.ToString ( )
-- This is functionally equivalent to the following syntax
-- which implicitly calls ToString():
3. CAST(node AS nvarchar(4000))
http://msdn.microsoft.com/en-us/library/bb677195.aspx |
|
|
Term
Query Processing - 01
1. What are the steps in logical query processing? |
|
Definition
(1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
| (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
| (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>
| (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias>
(2) WHERE <where_predicate>
(3) GROUP BY <group_by_specification>
(4) HAVING <having_predicate>
(5) SELECT
(6) ORDER BY <order_by_list>;
(7) FOR XML
SQL.ebook_Inside_Microsoft_Server_2008_T_SQL_Querying_Ben-Gan.pdf
|
|
|
|