title
Please take a moment to fill out this form. We will get back to you as soon as possible.
All fields marked with an asterisk (*) are mandatory.
Azure SQL Data Warehouse Architecture and SQL
Course Description
Overview
This Azure SQL Data Warehouse Architecture and SQL course is designed to provide students with a deeper knowledge and understanding of the architecture of Microsoft’s Azure SQL Data Warehouse. Students will also attain a deep understanding of the Azure SQL Data Warehouse T-SQL and how to write it. This course begins with a focus on the Azure SQL Data Warehouse, and then dives into T-SQL at a basic level and continues to an advanced level, providing students with many examples along the way. In addition, students will gain practical experience with hands-on exercises.Objectives
- Understand the Microsoft Azure SQL Data Warehouse
- Summarize the Microsoft Azure SQL Data Warehouse Table Structure
- Utilize Hashing and Data Distribution
- Apply CREATE Statistics
- Understand Basic SQL Functions
- Use the WHERE Clause
- Demonstrate Distinct Vs. Group By
- Utilize the Aggregation Function
- Apply Join, Date, Format, and OLAP Functions
- Understand Temporary Tables
- Use Sub-query Functions
- Apply Substrings and Positioning Functions
- Interrogate Data
- Use View Functions
- Set Operators Functions
- Create Tables
- Summarize Data Manipulation Language (DML)
Audience
- IT Professionals
Prerequisites
- None
Topics
- Introduction to the Family of SQL Server Products
- Introduction to the Family Continued
- Microsoft Azure SQL Data Warehouse
- Symmetric Multi-Processing (SMP)
- What is Parallel Processing?
- The Basics of a Single Computer
- Data in Memory is Fast as Lightning
- Parallel Processing of Data
- A Table has Columns and Rows
- The Azure SQL Data Warehouse has Linear Scalability
- The Architecture of the Azure SQL Data Warehouse
- Nexus is now Available on the Microsoft Azure Cloud
- The MPP Engine is the Optimizer
- The Azure SQL Data Warehouse System
- The Azure SQL Data Warehouse System is Scalable
- The Control Node
- The Data Rack
- The Landing Zone
- The Backup Node
- Software as a Service (SaaS) and the Elastic Database
- Azure Data Lake
- Azure Disaster Recovery
- Security and Compliance
- How to Get an EXPLAIN Plan
- The 5 Concepts of Azure SQL Data Warehouse Tables
- Tables are Either Distributed by Hash or Replicated (1 of 5)
- Table Rows are Either Sorted or Unsorted (2 of 5)
- Tables are Stored in Either Row or Columnar Format (3 of 5)
- Tables can be Partitioned (4 of 5)
- There are Permanent, Temporary and External Tables (5 of 5)
- Creating a Table With a Distribution Key
- Creating a Table that is Replicated
- Distributed by Hash vs. Replication
- The Concept is All About the Joins
- Creation of a Hash Distributed Table with a Clustered Index
- A Clustered Index Sorts the Data Stored on Disk
- Each Node Has 8 Distributions
- How Hashed Tables are Stored Among a Single Node
- Hashed Tables Will Be Distributed Among All Distributions
- Creation of a Replicated Table
- How Replicated Tables are Stored Among a Single Node
- Replicated Table will be Duplicated among Each Node
- Distributed by Replication
- How Hashed and Replicated Tables Work Together
- Tables are Stored as Row-based or Column-based
- Creation of a Columnar Table that is Hashed
- How Hashed Columnar Tables are Stored on a Single Node
- How Hashed Columnar Tables are Stored on All Distributions
- Comparing Normal Table Vs. Columnar Tables
- Columnar can move just One Segment to Memory
- Segments on Distributions are Aligned to Rebuild a Row
- Why Columnar?
- Columnar Tables Store Each Column in Separate Pages
- Visualize the Data – Rows vs. Columns
- Creation of a Columnar Table that is Replicated
- Creating a Partitioned Table Per Month
- A Visual of One Year of Data with Range Per Month
- Another Create Example of a Partitioned Table
- Creating a Partitioned Table Per Month That is a Columnstore
- Visual of Row Partitioning and Columnar Storage
- CREATE TABLE AS (CTAS) Example
- Creating a Temporary Table
- Facts About Tables
- Distribution Keys Hashed on Unique Values Spread Evenly
- Distribution Keys With Non-Unique Values Spread Unevenly
- Best Practices for Choosing a Distribution Key
- The Hash Map Determines which Distribution owns the Row
- The Hash Map Determines which Node will Own the Row
- A Review of the Hashing Process
- Non-Unique Distribution Keys have Skewed Data
- Every Node has the Exact Same Tables
- Hashed Tables are spread across All Distributions
- The Table Header and the Data Rows are Stored Separately
- A Distribution Stores the Rows of a Table inside a Data Block
- To Read a Data Block a Node Moves the Block into Memory
- A Full Table Scan Means All Nodes Must Read All Rows
- Rows are Organized inside a Page
- Moving Data Blocks is Like Checking In Luggage
- As Row-Based Tables Get Bigger, the Page Splits
- Data Pages are Processed One at a Time Per Unit
- Creating a Table that is a Heap
- Heap Page
- Extents
- Creating a Table that has a Clustered Index
- Clustered Index Page
- The Row Offset Array is the Guidance System for Every Row
- The Row Offset Array Provides Two Search Options
- The Row Offset Array Helps With Inserts
- B-Trees
- The Building of a B-Tree for a Clustered Index
- When Do I Create a Clustered Index?
- When Do I Create a Non Clustered Index?
- B-Tree for Non Clustered Index on a Clustered Table
- Adding a Non Clustered Index To A Heap
- B-Tree for Non Clustered Index on a Heap Table
- Max Levels on the Azure SQL Data Warehouse
- Azure SQL Data Warehouse Data Types
- Character Data Types for SQL Server
- Numeric Data Types for SQL Server
- Date and Time Data Types for SQL Server
- Additional Data Types for SQL Server
- CREATE Statistics Syntax
- CREATE Statistics on a Percentage of a Table
- CREATE Statistics on a Sample by Using the System Default
- CREATE Statistics on a Multi-Column Join Key
- What to Column(s) to CREATE Statistics On
- CREATE Statistics Using a WHERE Clause
- Updating All Statistics on a Table
- Updating Only Certain Statistics on a Table
- Dropping Statistics on Certain Statistics on a Table
- Showing the Statistics
- DBCC SHOW_STATISTICS
- DBCC SHOW_STATISTICS WITH HISTOGRAM
- Introduction
- Naming of Objects
- Setting Your Default Database
- SELECT * (All Columns) in a Table
- Fully Qualifying a Database, Schema and Table
- SELECT Specific Columns in a Table
- Commas in the Front or Back?
- Place your Commas in front for better Debugging Capabilities
- Sort the Data with the ORDER BY Keyword
- ORDER BY Defaults to Ascending
- Use the Name or the Number in your ORDER BY Statement
- Two Examples of ORDER BY using Different Techniques
- Changing the ORDER BY to Descending Order
- NULL Values sort First in Ascending Mode (Default)
- NULL Values sort Last in Descending Mode (DESC)
- Major Sort vs. Minor Sorts
- Multiple Sort Keys using Names vs. Numbers
- Sorts are Alphabetical, NOT Logical
- Using A CASE Statement to Sort Logically
- An Order By That Uses an Expression
- How to ALIAS a Column Name
- Aliasing a Column Name with Spaces or Reserved Words
- A Missing Comma can by Mistake become an Alias
- Comments using Double Dashes are Single Line Comments
- Comments for Multi-Lines
- Comments for Multi-Lines as Double Dashes Per Line
- A Great Technique for Comments to Look for SQL Errors
- sp_help at the Database Level
- sp_help at the Object Level
- Getting System Information
- Getting Additional System Information
- The WHERE Clause limits Returning Rows
- Double Quoted Aliases are for Reserved Words and Spaces
- Using A Column ALIAS in a WHERE Clause
- Using A Column ALIAS in a ORDER BY Clause
- In What Order Does SQL Server Process A Query?
- Character Data needs Single Quotes in the WHERE Clause
- Character Data needs Single Quotes, but Numbers Don’t
- Declaring a Variable
- Comparisons against a Null Value
- NULL means UNKNOWN DATA so Equal (=) won’t Work
- Use IS NULL or IS NOT NULL when dealing with NULLs
- NULL is UNKNOWN DATA so NOT Equal won’t Work
- Use IS NULL or IS NOT NULL when dealing with NULLs
- Using Greater Than or Equal To (>=)
- AND in the WHERE Clause
- Troubleshooting AND
- OR in the WHERE Clause
- Troubleshooting Or
- Troubleshooting Character Data
- Using Different Columns in an AND Statement
- Quiz – How many rows will return?
- LIKE command Underscore is Wildcard for one Character
- LIKE command using a Range of Values
- LIKE command Using a NOT Range of Values
- LIKE Command Works Differently on Char Vs Varchar
- Troubleshooting LIKE Command on Character Data
- Introducing the RTRIM Command
- Quiz – What Data is Left Justified and What is Right?
- Numbers are Right Justified and Character Data is Left
- An Example of Data with Left and Right Justification
- A Visual of CHARACTER Data vs. VARCHAR Data
- RTRIM command Removes Trailing spaces on CHAR Data
- Using Like with an AND Clause to Find Multiple Letters
- Using Like with an OR Clause to Find Either Letters
- Declaring a Variable and Using it with the LIKE Command
- Escape Character in the LIKE Command changes Wildcards
- Escape Characters Turn off Wildcards in the LIKE Command
- Quiz – Turn off that Wildcard
- The Distinct Command
- Distinct vs. GROUP BY
- Quiz – How many rows come back from the Distinct?
- TOP Command
- TOP Command is brilliant when ORDER BY is used!
- TOP Command with Ties
- TOP Command Using a Variable
- Quiz – You calculate the Answer Set in your own Mind
- The 3 Rules of Aggregation
- There are Five Aggregates
- Quiz – How many rows come back?
- Troubleshooting Aggregates
- GROUP BY when Aggregates and Normal Columns Mix
- GROUP BY delivers one row per Group
- Count_Big
- Limiting Rows and Improving Performance with WHERE
- WHERE Clause in Aggregation limits unneeded Calculations
- Keyword HAVING tests Aggregates after they are Totaled
- Group By Grouping Sets
- Group By Rollup
- Answer Set for Group By Rollup Query
- Creating a Cube
- Answer Set for Cube Query
- An Easy Example of Creating a Cube
- Quiz - GROUP BY GROUPING SETS Challenge
- Getting the Average Values Per Column
- Average Values per Column for all Columns in a Table
- The Azure SQL Data Warehouse Join Quiz
- Redistribution
- Big Table Small Table Join Strategy
- Duplication of the Smaller Table across All-Distributions
- If the Join Condition is the Distribution Key no Movement
- Matching Rows That Are On The Same Node Naturally
- What if the Join Condition Columns are Not Primary Indexes
- Strategy 1 of 4 – The Merge Join
- Quiz – Redistribute the Employees by their Dept_No
- Quiz –Dept_No landed on Distribution with Matches
- Quiz – Redistribute the Orders to the Proper Distribution
- Strategy 2 of 4 – The Hash Join
- Strategy 4 of 4 – The Product Join
- A Two-Table Join Using Traditional Syntax
- A two-table join using Non-ANSI Syntax with Table Alias
- You Can Fully Qualify All Columns
- A two-table join using ANSI Syntax
- Both Queries have the same Results and Performance
- Quiz – Can You Finish the Join Syntax?
- Quiz – Can You Find the Error?
- Super Quiz – Can You Find the Difficult Error?
- Quiz – Which rows from both tables won’t Return?
- LEFT OUTER JOIN
- LEFT OUTER JOIN Results
- RIGHT OUTER JOIN
- RIGHT OUTER JOIN Example and Results
- FULL OUTER JOIN
- FULL OUTER JOIN Results
- Which Tables are the Left and which Tables are Right?
- INNER JOIN with Additional AND Clause
- ANSI INNER JOIN with Additional AND Clause
- ANSI INNER JOIN with Additional WHERE Clause
- OUTER JOIN with Additional WHERE Clause
- OUTER JOIN with Additional AND Clause
- OUTER JOIN with Additional AND Clause Results
- Quiz – Why is this considered an INNER JOIN?
- Evaluation Order for Outer Queries
- The DREADED Product Join
- The DREADED Product Join Results
- The Horrifying Cartesian Product Join
- The ANSI Cartesian Join will ERROR
- Quiz – Do these Joins Return the Same Answer Set?
- The CROSS JOIN
- The CROSS JOIN Answer Set
- The Self Join
- The Self Join with ANSI Syntax
- Quiz – Will both queries bring back the same Answer Set?
- Quiz – Will both queries bring back the same Answer Set?
- How would you Join these two tables?
- An Associative Table is a Bridge that Joins Two Tables
- Quiz – Can you write the 3-Table Join?
- Quiz – Can you write the 3-Table Join to ANSI Syntax?
- Quiz – Can you Place the ON Clauses at the End?
- The 5-Table Join – Logical Insurance Model
- Quiz - Write a Five Table Join Using ANSI Syntax
- Quiz - Write a Five Table Join Using Non-ANSI Syntax
- Quiz –Re-Write this putting the ON clauses at the END
- Current_Timestamp
- Getdate
- Date and Time Keywords
- SYSDATETIMEOFFSET Provides the Timezone Offset
- Using Both CAST and CONVERT in Literal Values
- The DATEADD Function
- The DATEDIFF Function
- DATEADD Function
- A Real World Example for DateAdd Using the Order Table
- DATEPART Function
- DATEPART Function Examples
- YEAR, MONTH, and DAY Functions
- A Better Technique for YEAR, MONTH, and DAY Functions
- DATENAME Function
- ISDATE Function
- Temporary Tables
- CREATING A Derived Table
- Naming the Derived Table
- Aliasing the Column Names in the Derived Table
- Multiple Ways to Alias the Columns in a Derived Table
- CREATING a Derived Table using the WITH Command
- The Same Derived Query shown Three Different Ways
- MULTIPLE Derived Tables using the WITH Command
- Column Alias Can Default For Normal Columns
- Most Derived Tables Are Used To Join To Other Tables
- A Join Example Showing Different Column Alias Styles
- The Three Components of a Derived Table
- Visualize This Derived Table
- Our Join Example With The WITH Syntax
- Quiz - Answer the Questions
- Clever Tricks on Aliasing Columns in a Derived Table
- A Derived Table lives only for the lifetime of a single query
- An Example of Two Derived Tables in a Single Query
- RECURSIVE Derived Table Hierarchy
- RECURSIVE Derived Table Query
- RECURSIVE Derived Table Definition
- WITH RECURSIVE Derived Table Seeding
- WITH RECURSIVE Derived Table Looping
- RECURSIVE Derived Table Looping in Slow Motion
- RECURSIVE Derived Table Looping Continued
- Six rows are added in the third loop. RECURSIVE Derived Table Ends the Looping
- RECURSIVE Derived Table Ends the Looping
- RECURSIVE Derived Table Definition
- RECURSIVE Derived Table Answer Set
- What is TEMPDB?
- Creating a Temporary Table
- The Three Steps to Use a Private Temporary Table
- Creating a Temporary Table With a Clustered Index
- Creating a Columnstore Temporary Table From a CTAS
- An IN List is much like a Subquery
- An IN List Never has Duplicates – Just like a Subquery
- An IN List Ignores Duplicates
- The Subquery
- The Three Steps of How a Basic Subquery Works
- These are Equivalent Queries
- The Final Answer Set from the Subquery
- Quiz- Answer the Difficult Question
- Should you use a Subquery of a Join?
- Quiz- Write the Subquery
- Quiz- Write the More Difficult Subquery
- Quiz – Write the Extreme Subquery
- Quiz- Write the Subquery with an Aggregate
- Quiz- Write the Correlated Subquery
- The Basics of a Correlated Subquery
- The Top Query always runs first in a Correlated Subquery
- Correlated Subquery Example vs. a Join with a Derived Table
- Quiz- A Second Chance to Write a Correlated Subquery
- Quiz- A Third Chance to Write a Correlated Subquery
- Quiz- Last Chance To Write a Correlated Subquery
- Quiz – Write the Extreme Correlated Subquery
- Quiz- Write the NOT Subquery
- Quiz- Write the Subquery using a WHERE Clause
- Quiz – Write the Triple Subquery
- Quiz – How many rows return on a NOT IN with a NULL?
- How to handle a NOT IN with Potential NULL Values
- Using a Correlated Exists
- How a Correlated Exists matches up
- The Correlated NOT Exists
- The Correlated NOT Exists Answer Set
- Quiz – How many rows come back from this NOT Exists?
- The Row_Number Command
- Quiz – How did the Row_Number Reset?
- Using a Derived Table and Row_Number
- Ordered Analytics OVER
- RANK and DENSE RANK
- RANK Defaults to Ascending Order
- Getting RANK to Sort in DESC Order
- RANK() OVER and PARTITION BY
- Cumulative Sum
- The ANSI CSUM – Getting a Sequential Number
- Troubleshooting The ANSI OLAP on a GROUP BY
- Reset with a PARTITION BY Statement
- PARTITION BY only Resets a Single OLAP not ALL of them
- Sorting in DESC Order
- Moving Average
- Casting a Moving Average
- Partition By Resets an ANSI OLAP
- COUNT OVER for a Sequential Number
- Quiz – What caused the COUNT OVER to Reset?
- The MAX OVER Command
- MAX OVER with PARTITION BY Reset
- MAX OVER Without Rows Unbounded Preceding
- The MIN OVER Command
- Quiz – Fill in the Blank
- How Ntile Works
- Ntile
- Ntile Continued
- Ntile Percentile
- Another Ntile Example
- Using Quartiles (Partitions of Four)
- NTILE Buckets
- NTILE Using a Value of 10
- NTILE With a Partition
- Using LAG and LEAD
- Using LEAD
- Using LEAD With and Offset of 2
- LEAD
- LEAD With Partitioning
- Using LAG
- Using LAG With an Offset of 2
- LAG
- LAG with Partitioning
- SUM(SUM(n))
- The ASCII Function
- The CHAR Function
- The UNICODE Function
- The NCHAR Function
- The LEN Function
- The DATALENGTH Function
- Concatenation
- The RTRIM and LTRIM Command trims Spaces
- The SUBSTRING Command
- Using SUBSTRING to move Backwards
- How SUBSTRING Works with a Starting Position of -1
- How SUBSTRING Works with an Ending Position of 0
- Concatenation and SUBSTRING
- SUBSTRING and Different Aliasing
- The LEFT and RIGHT Functions
- Four Concatenations Together
- The DATALENGTH Function and RTRIM
- A Visual of the TRIM Command Using Concatenation
- CHARINDEX Function Finds a Letter(s) Position in a String
- The CHARINDEX Command is brilliant with SUBSTRING
- The CHARINDEX Command Using a Literal
- PATINDEX Function
- PATINDEX Function to Find a Character Pattern
- SOUNDEX Function to Find a Sound
- DIFFERENCE Function to Quantile a Sound
- The REPLACE Function
- LEN and REPLACE Functions for Number of Occurrences
- REPLICATE Function
- STUFF Function
- STUFF without Deleting Function
- UPPER and lower Functions
- Quiz – What would the Answer be?
- The NULLIF Command
- Quiz – Fill in the Answers for the NULLIF Command
- The COALESCE Command – Fill In the Answers
- The COALESCE Answer Set
- COALESCE is Equivalent to This CASE Statement
- The Basics of CAST (Convert and Store)
- Some Great CAST (Convert and Store) Examples
- A Rounding Example
- Quiz - CAST Examples
- Quiz - The Basics of the CASE Statements
- Using an ELSE in the Case Statement
- Using an ELSE as a Safety Net
- Rules For a Valued Case Statement
- Rules for a Searched Case Statement
- Valued Case Vs. A Searched Case
- Quiz - Valued Case Statement
- Quiz - Searched Case Statement
- Quiz - When NO ELSE is present in CASE Statement
- Quiz -When an Alias is NOT used in a CASE Statement
- Combining Searched Case and Valued Case
- A Trick for getting a Horizontal Case
- Nested Case
- Put a CASE in the ORDER BY
- Creating a Database
- Creating a Table that is a Heap
- Heap Page
- Extents
- Creating a Table That Has a Clustered Index
- Clustered Index Page
- When Do I Create a Clustered Index?
- B-Trees
- The Building of a B-Tree for a Clustered Index
- The Row Offset Array is the Guidance System For Every Row
- The Row Offset Array Provides Two Search Options
- The Row Offset Array Helps With Inserts
- What is a Uniquefier?
- Adding an Index
- When Do I Create a Non Clustered Index?
- B-Tree for Non Clustered Index on a Clustered Table
- Adding a Non Clustered Index To A Heap
- B-Tree for Non Clustered Index on a Heap Table
- Default Values
- The Fundamentals of Views
- Creating a Simple View to Restrict Sensitive Columns
- Creating a Simple View to Restrict Rows
- Basic Rules for Views
- Two Exceptions to the ORDER BY Rule inside a View
- Views sometimes CREATED for Row Security
- Creating a View to Join Tables Together
- You Select From a View
- Another Way to Alias Columns in a View CREATE
- The Standard Way Most Aliasing is done
- What Happens When Both Aliasing Options Are Present
- Resolving Aliasing Problems in a View CREATE
- Answer to Resolving Aliasing Problems in a View CREATE
- Aggregates on View Aggregates
- Altering a Table
- Altering a Table after a View has been Created
- A View that Errors After an ALTER
- Troubleshooting a View
- Loading Data through a View
- INSERT Syntax # 1
- INSERT Example with Syntax 1
- INSERT Syntax #2
- INSERT Example with Syntax 2
- INSERT/SELECT Command
- INSERT/SELECT Example using All Columns (*)
- INSERT/SELECT Example with Less Columns
- The UPDATE Command Basic Syntax
- Two UPDATE Examples
- Subquery UPDATE Command Syntax
- Example of Subquery UPDATE Command
- Join UPDATE Command Syntax
- Example of an UPDATE Join Command
- The DELETE Command Basic Syntax
- Two DELETE Examples to DELETE ALL Rows in a Table
- To DELETE or to TRUNCATE
- A DELETE Example Deleting only Some of the Rows
- Subquery and Join DELETE Command Syntax
- Example of Subquery DELETE Command
- MERGE INTO
- Rules of Set Operators
- INTERSECT Explained Logically
- UNION Explained Logically
- UNION ALL Explained Logically
- EXCEPT Explained Logically
- Another EXCEPT Example
- EXCEPT Explained Logically in Reverse Order
- An Equal Amount of Columns in both SELECT List
- Columns in the SELECT list should be from the same Domain
- The Top Query handles all Aliases
- The Bottom Query does the ORDER BY
- Great Trick: Place your Set Operator in a Derived Table
- UNION Vs UNION ALL
- Using UNION ALL and Literals
- A Great Example of how EXCEPT works
- USING Multiple SET Operators in a Single Request
- Changing the Order of Precedence with Parentheses
- Building Grouping Sets Using UNION
- Three Grouping Sets Using a UNION
- Creating a Stored Procedure
- Executing a Stored Procedure
- There are Three Ways to Execute a Stored Procedure
- Creating a Stored Procedure with a CASE Statement
- Our Answer Set
- Dropping a Stored Procedure
- Passing an Input Parameter to a Stored Procedure
- Executing With Positional Parameter vs. Named Parameters
- Passing an Output Parameter to a Stored Procedure
- Changing a Stored Procedure with an ALTER
- Answer Set for the Altered Stored Procedure
- Using a Stored Procedure to Delete a Row
- A Different Method to Delete a Row
- Deleting a Row Using an Input Parameter
- Using Loops in Stored Procedures
- Stored Procedure Workshop
- Looping with a WHILE Statement
- The Stats Table
- Above, is the Stats_Table data in which we will use in our statistical examples
- The VAR and VARP Functions
- A VAR Example
- A VARP Example
- The STDEV and STDEVP Functions
- A STDEV Example
- A STDEVP Example
- System Views
- sys.all_columns
- sys.all_objects
- sys.all_sql_modules
- sys.all_views
- sys.columns
- sys.data_spaces
- sys.database_files
- sys.database_principals
- sys.database_role_members
- sys.databases
- sys.filegroups
- sys.identity_columns
- sys.objects
- sys.partition_range_values
- sys.schemas
- sys.server_role_members
- sys.sql_logins
Related Courses
-
Microsoft Azure Security Technologies
MOC-AZ-500T00- Duration: 4 Days
- Delivery Format: Classroom Training, Online Training
- Price: 2,380.00 USD
-
Microsoft Azure Fundamentals (1 Day)
MOC-AZ-900T00- Duration: 1 Day
- Delivery Format: Classroom Training, Online Training
- Price: 595.00 USD
Self-Paced Training Info
Learn at your own pace with anytime, anywhere training
- Same in-demand topics as instructor-led public and private classes.
- Standalone learning or supplemental reinforcement.
- e-Learning content varies by course and technology.
- View the Self-Paced version of this outline and what is included in the SPVC course.
- Learn more about e-Learning
Course Added To Shopping Cart
bla
bla
bla
bla
bla
bla
Self-Paced Training Terms & Conditions
Exam Terms & Conditions
Sorry, there are no classes that meet your criteria.
Please contact us to schedule a class.

STOP! Before You Leave
Save 0% on this course!
Take advantage of our online-only offer & save 0% on any course !
Promo Code skip0 will be applied to your registration
Purchase Information
title
Please take a moment to fill out this form. We will get back to you as soon as possible.
All fields marked with an asterisk (*) are mandatory.