Brian Alderman | MCT, CEO / Founder of MicroTechPoint
Tobias Ternstrom | Microsoft SQL Server Program Manager Querying Microsoft SQL Server 2012 Jump Start 01 | Introducing SQL Server 2012 SQL Server types of statements; other SQL statement elements; basic SELECT statements 02 | Advanced SELECT Statements DISTINCT, Aliases, scalar functions and CASE, using JOIN and MERGE; Filtering and sorting data, NULL values 03 | SQL Server Data Types Introduce data types, data type usage, converting data types, understanding SQL Server function types 04 | Grouping and Aggregating Data Aggregate functions, GROUP BY and HAVING clauses, subqueries; self-contained, correlated, and EXISTS; Views, inline-table valued functions, and derived tables | Lunch Break Eat, drink, and recharge for the afternoon session STDEV STDEVP VAR VARP
SUM MIN MAX AVG COUNT COUNT_BIG CHECKSUM_AGG GROUPING GROUPING_ID
Common Statistical Other UniqueOrders Avg_UnitPrice Min_OrderQty Max_LineTotal ------------- ------------ ------------ ------------- 31465 465.0934 1 27893.619000 SELECT COUNT (DISTINCT SalesOrderID) AS UniqueOrders, AVG(UnitPrice) AS Avg_UnitPrice, MIN(OrderQty)AS Min_OrderQty, MAX(LineTotal) AS Max_LineTotal FROM Sales.SalesOrderDetail; SELECT SalesPersonID, YEAR(OrderDate) AS OrderYear, COUNT(CustomerID) AS All_Custs, COUNT(DISTINCT CustomerID) AS Unique_Custs FROM Sales.SalesOrderHeader GROUP BY SalesPersonID, YEAR(OrderDate);
SalesPersonID OrderYear All_Custs Unique_custs ----------- ----------- ----------- ------------ 289 2006 84 48 281 2008 52 27 285 2007 9 8 277 2006 140 57 SELECT <select_list> FROM <table_source> WHERE <search_condition> GROUP BY <group_by_list>; SELECT SalesPersonID, COUNT(*) AS Cnt FROM Sales.SalesOrderHeader GROUP BY SalesPersonID; Logical Order Phase Comments 5 SELECT 1 FROM 2 WHERE 3 GROUP BY Creates groups 4 HAVING Operates on groups 6 ORDER BY SELECT productid, MAX(OrderQty) AS largest_order FROM Sales.SalesOrderDetail GROUP BY productid; SELECT CustomerID, COUNT(*) AS cnt FROM Sales.SalesOrderHeader GROUP BY CustomerID; SELECT CustomerID, COUNT(*) AS Count_Orders FROM Sales.SalesOrderHeader GROUP BY CustomerID HAVING COUNT(*) > 10; Using a COUNT(*) expression in HAVING clause is useful to solve common business problems: Show only customers that have placed more than one order:
Show only products that appear on 10 or more orders: SELECT Cust.Customerid, COUNT(*) AS cnt FROM Sales.Customer AS Cust JOIN Sales.SalesOrderHeader AS Ord ON Cust.CustomerID = ORD.CustomerID GROUP BY Cust.CustomerID HAVING COUNT(*) > 1; SELECT Prod.ProductID, COUNT(*) AS cnt FROM Production.Product AS Prod JOIN Sales.SalesOrderDetail AS Ord ON Prod.ProductID = Ord.ProductID GROUP BY Prod.ProductID HAVING COUNT(*) >= 10; Working with subqueries Writing scalar subqueries SELECT SalesOrderID, ProductID, UnitPrice, OrderQty FROM Sales.SalesOrderDetail WHERE SalesOrderID = (SELECT MAX(SalesOrderID) AS LastOrder FROM Sales.SalesOrderHeader); Writing multi-valued subqueries SELECT CustomerID, SalesOrderId,TerritoryID FROM Sales.SalesorderHeader WHERE CustomerID IN ( SELECT CustomerID FROM Sales.Customer WHERE TerritoryID = 10); Writing queries using EXISTS with subqueries SELECT CustomerID, PersonID FROM Sales.Customer AS Cust WHERE EXISTS ( SELECT * FROM Sales.SalesOrderHeader AS Ord WHERE Cust.CustomerID = Ord.CustomerID); SELECT CustomerID, PersonID FROM Sales.Customer AS Cust WHERE NOT EXISTS ( SELECT * FROM Sales.SalesOrderHeader AS Ord WHERE Cust.CustomerID = Ord.CustomerID); CREATE VIEW HumanResources.EmployeeList AS SELECT BusinessEntityID, JobTitle, HireDate, VacationHours FROM HumanResources.Employee;
SELECT * FROM HumanResources.EmployeeList CREATE FUNCTION Sales.fn_LineTotal (@SalesOrderID INT) RETURNS TABLE AS RETURN SELECT SalesOrderID, CAST((OrderQty * UnitPrice * (1 - SpecialOfferID)) AS DECIMAL(8, 2)) AS LineTotal FROM Sales.SalesOrderDetail WHERE SalesOrderID = @SalesOrderID ; Writing queries with derived tables SELECT <column_list> FROM ( <derived_table_definition> ) AS <derived_table_alias>; Derived Tables Must Have an alias Have names for all columns Have unique names for all columns Not use an ORDER BY clause (without TOP or OFFSET/FETCH) Not be referred to multiple times in the same query Derived Tables May Use internal or external aliases for columns Refer to parameters and/or variables Be nested within other derived tables DECLARE @emp_id INT = 9; SELECT orderyear, COUNT(DISTINCT custid) AS cust_count FROM ( SELECT YEAR(orderdate) AS orderyear, custid FROM Sales.Orders WHERE empid=@emp_id ) AS derived_year GROUP BY orderyear; WITH CTE_year AS ( SELECT YEAR(OrderDate) AS OrderYear, customerID FROM Sales.SalesOrderHeader ) SELECT orderyear, COUNT(DISTINCT CustomerID) AS CustCount FROM CTE_year GROUP BY OrderYear; STDEV STDEVP VAR VARP
SUM MIN MAX AVG COUNT COUNT_BIG CHECKSUM_AGG GROUPING GROUPING_ID
Common Statistical Other Views are named tables expressions with definitions stored in a database that can be referenced in a SELECT statement just like a table
Views are defined with a single SELECT statement and then saved in the database as queries
Table-valued functions are created with the CREATE FUNCTION. They contain a RETURN type of table
Derived tables allow you to write more modular queries as named query expressions that are created within an outer SELECT statement. They represent a virtual relational table so are not stored in the database
CTEs are similar to derived tables in scope and naming requirements but unlike derived tables, CTEs support multiple definitions, multiple references, and recursion
Querying Microsoft SQL Server 2012 Jump Start 01 | Introducing SQL Server 2012 SQL Server types of statements; other SQL statement elements; basic SELECT statements 02 | Advanced SELECT Statements DISTINCT, Aliases, scalar functions and CASE, using JOIN and MERGE; Filtering and sorting data, NULL values 03 | SQL Server Data Types Introduce data types, data type usage, converting data types, understanding SQL Server function types 04 | Grouping and Aggregating data Aggregate functions, GROUP BY and HAVING clauses, subqueries; self-contained, correlated, and EXISTS; Views, inline-table valued functions, and derived tables | Lunch Break Eat, drink, and recharge for the afternoon session 2013 Microsoft Corporation. All rights reserved. Microsoft, Windows, Office, Azure, System Center, Dynamics and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.