Upload
julian-harrell
View
228
Download
1
Embed Size (px)
Citation preview
Advanced SQLAggregations, Grouping,
SQL Functions, DDL
SoftUni TeamTechnical TrainersSoftware Universityhttp://softuni.bg
Table of Contents
1. Nested SELECT Statements
2. Aggregating Data Group Functions: COUNT, SUM, MIN, MAX Grouping with GROUP BY
3. Microsoft SQL Server Functions
4. Data Definition Language (DDL) Creating Tables in MS SQL Server
5. Transactions in MS SQL Server2
SQL LanguageNested SELECT Statements
SQL
SQL
SQL
SQL
4
SELECT statements can be nested in the WHERE clause
Note: prefer joins to nested SELECT for better performance
Nested SELECT Statements
SELECT FirstName, LastName, SalaryFROM EmployeesWHERE Salary = (SELECT MAX(Salary) FROM Employees)
SELECT FirstName, LastName, DepartmentID, SalaryFROM EmployeesWHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE Name='Sales')
FirstName LastName SalaryKen Sanchez 125500.00
5
Tables from the outer SELECT can be referred in the inner SELECT by aliases
Example: find the highest salary for each department and the employee that takes it
Nested SELECT with Table Aliases
SELECT FirstName, LastName, DepartmentID, SalaryFROM Employees eWHERE Salary = (SELECT MAX(Salary) FROM Employees WHERE DepartmentID = e.DepartmentID)ORDER BY DepartmentID
6
Using the EXISTS operator in SELECT statements Find all employees with managers from the first department
Using the EXISTS Operator
SELECT FirstName, LastName, EmployeeID, ManagerIDFROM Employees eWHERE EXISTS (SELECT EmployeeID FROM Employees m WHERE m.EmployeeID = e.ManagerID AND m.DepartmentID = 1)
FirstName LastName EmployeeID ManagerIDRoberto Tamburello 3 12Rob Walters 4 3… … … …
SQL LanguageAggregating Data with Group Functions
8
Group functions operate over sets of rows to return one single result (per group)
Group Functions
EmployeeID Salary1 12500.002 13500.003 43300.004 29800.005 25000.00... ...
MAX(Salary)125500.00
9
COUNT(*) – count of the selected rows COUNT(column) – count of the non-null values in given
column SUM(column) – sum of the values in given column MIN(column) – the minimal value in given column MAX(column) – the maximal value in given column AVG(column) – average of the values in given column
Group Functions in SQL
10
You can use MIN() and MAX() for almost any data type (int, datetime, varchar, ...)
Show the first and last employee's name in alphabetical order:
MIN() and MAX() Functions
SELECT MIN(HireDate) MinHD, MAX(HireDate) MaxHDFROM Employees
MinHD MaxHD1996-07-31 2003-06-03
SELECT MIN(LastName), MAX(LastName)FROM Employees
11
You can use AVG() and SUM() only for numeric data types
AVG() and SUM() Functions
SELECT AVG(Salary) [Average Salary], MAX(Salary) [Max Salary], MIN(Salary) [Min Salary], SUM(Salary) [Salary Sum]FROM EmployeesWHERE JobTitle = 'Production Technician'
Average Salary Max Salary Min Salary Salary Sum12267.5159 15000.00 9500.00 1926000.00
12
COUNT(*) returns the number of rows in the result record set
COUNT(expr) returns the number of rows with non-null values
The COUNT(…) Function
SELECT COUNT(*) Cnt FROM EmployeesWHERE DepartmentID = 3
Cnt18
SELECT COUNT(ManagerID) MgrCount, COUNT(*) AllCountFROM EmployeesWHERE DepartmentID = 16
MgrCount AllCount1 2
13
Group functions ignore NULL values in the target column
If each NULL value in the ManagerID column were considered as 0 in the calculation, the result would be 106
Group Functions and NULLs
SELECT AVG(ManagerID) Avg, SUM(ManagerID) / COUNT(*) AvgAllFROM Employees
Avg AvgAll108 106
14
Find the earliest hired employee for each department
Group Functions in Nested Queries
SELECT e.FirstName, e.LastName, e.HireDate, d.Name as DeptFROM Employees e JOIN Departments d ON e.DepartmentID = d.DepartmentIDWHERE e.HireDate = (SELECT MIN(HireDate) FROM Employees WHERE DepartmentID = d.DepartmentID)
FirstName LastName HireDate DeptGuy Gilbert 1998-07-31 00:00:00 ProductionKevin Brown 1999-02-26 00:00:00 Marketing… … … …
SQL LanguageGroup Functions with GROUP BY
72000
108600
185600
16
Aggregating Groups of Data
DepartmentID Salary12 1030012 1680012 1680012 1030012 178002 288002 250002 298002 2500016 12550016 60100... ...
DepartmentID SUM (Salary)
12 72000
2 108600
16 185600
... ...
17
The GROUP BY clause: split the table rows into groups The SELECT + GROUP BY syntax:
The <group_by_expression> is a list of columns
The GROUP BY Statement
SELECT <columns>, <group_function(column)>FROM <table>[WHERE <condition>][GROUP BY <group_by_expression> ][HAVING <filtering_expression>][ORDER BY <columns>]
18
Example of grouping data:
The GROUP BY column is not required to be in the SELECT list
The GROUP BY Statement (2)
SELECT DepartmentID, SUM(Salary) as SalariesCostFROM EmployeesGROUP BY DepartmentID
DepartmentID SalariesCost12 720002 10860016 185600... ...
19
Grouping by Several Columns
39700
77000
52800
65000
43300
DepartmentID JobTitle Salary
11 Network Manager 39700
11 Network Administrator 32500
11 Network Administrator 32500
11 Database Administrator 38500
11 Database Administrator 38500
10 Accountant 26400
10 Accountant 26400
10 Finance Manager 43300
... ... ...
DepartmentID JobTitle Salary
11 Network Manager 39700
11 Network Administrator 65000
11 Database Administrator 77000
10 Accountant 52800
10 Finance Manager 43300
... ... ...
20
Example of grouping data by several columns:
Grouping by Several Columns – Example
SELECT DepartmentID, JobTitle, SUM(Salary) as Salaries, COUNT(*) as CountFROM EmployeesGROUP BY DepartmentID, JobTitle
DepartmentID JobTitle Salaries Count2 Senior Tool Designer 58600 22 Tool Designer 50000 27 Production Supervisor 525000 217 Production Technician 1926000 157... ... ... ...
21
This SELECT statement is illegal:
Can not combine columns with group functions unless the columns are in the GROUP BY clause
This SELECT statement is also illegal:
Can not use WHERE for group functions
Illegal Use of Group Functions
SELECT DepartmentID, COUNT(LastName) FROM Employees
SELECT DepartmentID, AVG(Salary)FROM EmployeesWHERE AVG(Salary) > 30GROUP BY DepartmentID
22
When using groups we can select only columns listed in theGROUP BY and grouping functions over the other columns
Can not select columns not listed in the GROUP BY clause It is allowed to apply group functions over the columns in the GROUP BY clause, but this has no sense
Restrictions for Grouping
SELECT DepartmentID, JobTitle, SUM(Salary) AS Cost, MIN(HireDate) as StartDateFROM EmployeesGROUP BY DepartmentID, JobTitle
23
HAVING works like WHERE but is used for the grouping functions
Using GROUP BY with HAVING Clause
SELECT DepartmentID, COUNT(EmployeeID) as EmpCount, AVG(Salary) as AverageSalaryFROM EmployeesGROUP BY DepartmentIDHAVING COUNT(EmployeeID) BETWEEN 3 AND 5DepartmentID EmpCount AverageSalary2 4 2715012 5 14400… … …
24
Grouping can be applied on columns from joined tables
Using Grouping Functions and Table Joins
SELECT COUNT(*) AS EmpCount, d.Name AS DeptNameFROM Employees e JOIN Departments d ON e.DepartmentID = d.DepartmentIDWHERE e.HireDate BETWEEN '1999-2-1' AND '2002-12-31'GROUP BY d.NameHAVING COUNT(*) > 5ORDER BY EmpCount DESC
EmpCount DeptName95 Production8 Finance… …
SQL LanguageSQL Server Functions
26
Single-row functions String functions Mathematical functions Date functions Conversion functions
Multiple-row functions Aggregate functions
Standard Functions in MS SQL Server
SQL
27
ISNULL(<value>,<default_value>) Converts NULL values to given default value
ISNULL() Function
SELECT Name AS [Projects Name], ISNULL(EndDate, GETDATE()) AS [End Date]FROM Projects
Projects Name End DateClassic Vest 2015-02-11 16:43:00Cycling Cap 2003-06-01 00:00:00.000Full-Finger Gloves 2003-06-01 00:00:00.000... ...
EndDate is NULL, so the current date is returned instead
28
Changing the character casing: LOWER(), UPPER() String manipulation functions: SUBSTRING(), LEN(), LEFT(), RIGHT(), TRIM(), REPLACE()
String Functions
SELECT LastName, LEN(LastName) AS LastNameLen, UPPER(LastName) AS UpperLastNameFROM EmployeesWHERE RIGHT(LastName, 3) = 'son'
LastName LastNameLen UpperLastNameErickson 8 ERICKSONJohnson 7 JOHNSON... ... ...
29
Mathematical functions: ROUND, FLOOR, POWER, ABS, SQRT, …
Date functions: GETDATE, DATEADD, DAY, MONTH, YEAR, …
Conversion functions: CONVERT, CAST
Other Functions
SELECT FLOOR(3.14) 3SELECT ROUND(5.86, 0) 6.00
SELECT CONVERT(DATETIME, '20051231', 112) 2005-12-31 00:00:00.000-- 112 is the ISO formatting style YYYYMMDD
SELECT DATEADD(day, 15, GETDATE())
30
We can combine functions to achieve more complex behavior
Combining Functions
SELECT Name AS [Projects Name], ISNULL(CONVERT(nvarchar(50), EndDate), 'Not Finished') AS [Date Finished]FROM Projects
Projects Name Date FinishedHL Mountain Front Wheel Jun 1 2003 12:00AMLL Touring Handlebars Not FinishedHL Touring Handlebars Not FinishedLL Road Front Wheel Jun 1 2003 12:00AM... ...
31
We can aggregate strings with STUFF function.
SQL Aggregation
SELECT STUFF(( SELECT ', ' + Name FROM Towns FOR XML PATH('')), 1, 2, '') AS Towns
TownsRedmond, Calgary, Edmonds, Seattle, Bellevue, Issaquah, Everett, Bothell, San Francisco, Index, Snohomish, Monroe, Renton, Newport Hills, Carnation, Sammamish, Duvall, Gold Bar, Nevada, Kenmore, Melbourne, Kent, Cambridge, Minneapolis, Portland, Duluth, Detroit, Memphis, Ottawa, Bordeaux, Berlin, Sofia
SQL LanguageData Definition Language (DDL)
33
Data Definition Language (DDL) for defining / editing objects CREATE ALTER DROP
Data Control Language (DCL) for managing access permissions GRANT REVOKE DENY
DDL and DCL Commands
34
The SQL CREATE command: CREATE TABLE <name> (<field_definitions>) CREATE VIEW <name> AS <select> CREATE <object> <definition>
Creating Database Objects
CREATE TABLE Persons ( PersonID int IDENTITY, Name nvarchar(100) NOT NULL, CONSTRAINT PK_Persons PRIMARY KEY(PersonID))GO
CREATE VIEW [First 10 Persons] ASSELECT TOP 10 Name FROM Persons
35
Creating Objects – More Examples
CREATE TABLE Countries ( CountryID int IDENTITY, Name nvarchar(100) NOT NULL, CONSTRAINT PK_Countries PRIMARY KEY(CountryID))
GO
CREATE TABLE Cities ( CityID int IDENTITY, Name nvarchar(100) NOT NULL, CountryID int NOT NULL, CONSTRAINT PK_Cities PRIMARY KEY(CityID))
36
The SQL ALTER command ALTER TABLE <name> <command> ALTER <object> <command>
Modifying Database Objects
-- Add a foreign key constraint Cities --> CountryALTER TABLE CitiesADD CONSTRAINT FK_Cities_Countries FOREIGN KEY (CountryID) REFERENCES Countries(CountryID)
-- Add a column Population to the table CountryALTER TABLE Countries ADD Population int
-- Remove the column Population from the table CountryALTER TABLE Countries DROP COLUMN Population
37
DROP command DROP TABLE <name> DROP TRIGGER <name> DROP INDEX <name> DROP <object>
Deleting Database Objects
DROP TABLE Persons
ALTER TABLE CitiesDROP CONSTRAINT FK_Cities_Countries
38
GRANT command
Example:
REVOKE command
Example:
Managing Access Permissions
GRANT <persmission> ON <object> TO <role>
GRANT SELECT ON Persons TO public
REVOKE <persmission> ON <object> FROM <role>
REVOKE SELECT ON Employees FROM public
Creating Tables in SQL ServerBest Practices
40
Creating a new table: Define the table name
Should have good name Define the columns and their types
Use proper data type Define the table primary key
Use IDENTITY for enabling auto increment of the primary key Define foreign keys and constraints
Creating Tables in SQL Server
41
CREATE TABLE Groups ( GroupID int IDENTITY, Name nvarchar(100) NOT NULL, CONSTRAINT PK_Groups PRIMARY KEY(GroupID))
CREATE TABLE Users ( UserID int IDENTITY, UserName nvarchar(100) NOT NULL, GroupID int NOT NULL, CONSTRAINT PK_Users PRIMARY KEY(UserID), CONSTRAINT FK_Users_Groups FOREIGN KEY(GroupID) REFERENCES Groups(GroupID))
Creating Tables in SQL Server – Examples
TransactionsBegin / Commit / Rollback in SQL Server
43
Pessimistic concurrency (default in SQL Server) Locks table data during each data modification Concurrent users wait until the lock is released
Optimistic concurrency (default in MySQL and Oracle) No locks are performed when data is being read or changed Concurrent users don’t see the changes until they are committed /
rolled-back Supported with the SNAPSHOT isolation level in SQL Server
What Is Concurrency Control?
44
Transactions start with BEGIN TRANSACTION (or just BEGIN TRAN)
Use COMMIT to confirm changes and finish the transaction Use ROLLBACK to cancel changes and abort the transaction Example:
Transactions
BEGIN TRANDELETE FROM EmployeesProjects;DELETE FROM Projects;ROLLBACK TRAN
45
What is implicit transactions mode? Automatically start a new transaction after each commit or
rollback Nested transactions are not allowed Transaction must be explicitly completed with COMMIT or ROLLBACK TRANSACTION
By default, IMPLICIT_TRANSACITONS setting is switched off
The Implicit Transactions Option
SET IMPLICIT_TRANSACTIONS ON
46
1. How do we nest SELECT statements?
2. How do we aggregate data in SQL? Explain the group functions in SQL Explain the GROUP BY clause
3. Explain a few MS SQL Server functions?
4. What are the DDL commands in SQL? How to create a table in MS SQL Server?
5. How to start / commit / cancel a transaction?
Summary
Questions??
??
?
?
??
?
?
https://softuni.bg/courses/databases
Advanced SQL
License
This course (slides, examples, demos, videos, homework, etc.)is licensed under the "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International" license
48
Attribution: this work may contain portions from "Databases" course by Telerik Academy under CC-BY-NC-SA license
Free Trainings @ Software University Software University Foundation – softuni.org Software University – High-Quality Education,
Profession and Job for Software Developers softuni.bg
Software University @ Facebook facebook.com/SoftwareUniversity
Software University @ YouTube youtube.com/SoftwareUniversity
Software University Forums – forum.softuni.bg