--1) FROM
--2) ON
--3) JOIN
--4) WHERE
--5) GROUP BY
--6) WITH CUBE or WITH ROLLUP
--7) HAVING
--8) SELECT
--9) DISTINCT
--10) ORDER BY
--11) TOP

USE [AdventureWorks2019];

--Следующий SQL запрос выбирает первые три записи из таблицы Sales.SalesOrderDetail

SELECT
	TOP 3 *
FROM
	Sales.SalesOrderDetail;

--Следующий запрос с сортировкой по убыванию по OrderQty:

SELECT
	TOP 3 *
FROM
	Sales.SalesOrderDetail
ORDER BY
	[OrderQty] DESC;

--Следующий запрос с сортировкой по убыванию по OrderQty WITH TIES:

SELECT
	TOP 3 WITH TIES * 
FROM
	Sales.SalesOrderDetail
ORDER BY
	[OrderQty] DESC;

--Следующий SQL инструкция выбирает ВСЕ значения из столбца «PersonType» в таблице «Person»

SELECT
	ALL PersonType
FROM
	Person.Person;​

--Аналогично

SELECT
	PersonType
FROM
	Person.Person;​

--Следующий SQL инструкция выбирает только УНИКАЛЬНЫЕ значения из столбца «PersonType» в таблице «Person»

SELECT
	DISTINCT PersonType
FROM
	Person.Person;​


--Следующий SQL запрос выбирает всех людей из города "LONDON" в таблице "Person.Address"

SELECT
	*
FROM
	Person.Address
WHERE
	City = 'London';​

--Следующий SQL запрос выбирает всех людей с AddressID = 667 в таблице «Person.Address»

SELECT
	*
FROM
	Person.Address
WHERE
	AddressID = 667;​

--Следующий SQL запрос выбирает все поля из таблицы «HumanResources.Employee», где JobTitle - «Design Engineer» И Gender - «M»

SELECT
	*
FROM
	HumanResources.Employee
WHERE
	JobTitle='Design Engineer' AND
	Gender='M';​ 
		 
--Следующий SQL запрос выбирает все поля из таблицы "HumanResources.Employee" JobTitle - "Design Engineer" ИЛИ "Senior Design Engineer"
                         
SELECT
	*
FROM
	HumanResources.Employee
WHERE
	JobTitle='Design Engineer' OR
	JobTitle='Senior Design Engineer';​ 

--Следующий SQL запрос выбирает все поля из таблицы "HumanResources.Employee", где Gender (пол) НЕ равен "F" (женский)
​
SELECT
	*
FROM
	HumanResources.Employee
WHERE
	NOT Gender='F';​ --или Gender!='F' или Gender<>'F'

--Следующий SQL запрос выбирает все поля из таблицы «HumanResources.Employee», где Gender - «M» И JobTitle - «Design Engineer» ИЛИ «Senior Design Engineer» (используйте круглые скобки для формирования сложных выражений)
        
SELECT
	*
FROM
	HumanResources.Employee
WHERE
	Gender='M' AND
	(JobTitle='Design Engineer' OR
	JobTitle='Senior Design Engineer');
		 
--Следующий SQL запрос выбирает все города из таблицы «Person.Address», отсортированные по столбцу «City»
                   
SELECT
	AddressID,
	City 
FROM
	Person.Address 
ORDER BY
	City; 

--Следующий SQL запрос выбирает весь город из таблицы «Person.Address», отсортированные по столбцу «City» по убыванию
                   
SELECT
	AddressID,
	City 
FROM
	Person.Address 
ORDER BY
	City DESC; 
		 
--Следующий SQL запрос выбирает весь город из таблицы «Person.Address», отсортированные по двум столбцам

--Вариант 1

SELECT
	AddressID,
	City
FROM
	Person.Address 
ORDER BY
	AddressID, City; 

--Вариант 2

SELECT
	AddressID,
	City
FROM
	Person.Address 
ORDER BY
	City, AddressID; 
		 
--Следующий SQL запрос выводит записи со значением NULL в поле «AddressLine1» или «AddressLine2»

SELECT
	*
FROM
	Person.Address
WHERE
	AddressLine1 IS NULL OR
	AddressLine2 IS NULL;
	   
--Следующий SQL запрос выводит записи со значением NOT NULL в поле «AddressLine2»
         
SELECT
	*
FROM
	Person.Address
WHERE
	AddressLine2 IS NOT NULL;
			 
--Следующий инструкция SQL выбирает первые 50% записей из таблицы «Sales.SalesOrderDetail»
                           
SELECT
	TOP 50 PERCENT * 
FROM
	Sales.SalesOrderDetail;​

--Следующий SQL запрос находит самую дешевую цену продукта

SELECT
	MIN(UnitPrice) AS SmallestPrice 
FROM
	Sales.SalesOrderDetail;​
	   
--Следующий SQL запрос находит самую дорогую цену продукта

SELECT
	MAX(UnitPrice) AS LargestPrice 
FROM
	Sales.SalesOrderDetail;​

--Следующий SQL запрос находит количество продуктов

SELECT
	COUNT(ProductID)
FROM
	Sales.SalesOrderDetail;

--Следующий SQL запрос находит количество уникальных продуктов

SELECT
	COUNT(DISTINCT ProductID)
FROM
	Sales.SalesOrderDetail;

--Следующий SQL запрос выводит просто список идентификаторов продуктов

SELECT
	ProductID
FROM
	Sales.SalesOrderDetail;
	   
--Следующий SQL запрос находит среднюю цену всех продуктов

SELECT
	AVG(UnitPrice) AS AveragePrice
FROM
	Sales.SalesOrderDetail;​
	  
--Следующий SQL запрос находит сумму поля «Price» в таблице «Sales.SalesOrderDetail»

SELECT
	SUM(UnitPrice) AS TotalPrice
FROM
	Sales.SalesOrderDetail;​
	  
--Следующий SQL запрос выбирает всех людей с JobTitle, которая начинается с "a"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle LIKE 'a%';

--Следующий SQL запрос выбирает всех людей с JobTitle, которая начинается с "a" и имеет четвертую букву l

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle LIKE 'a__l%';

--Следующий SQL запрос выбирает всех людей с JobTitle, которая заканчивается на "r"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle LIKE '%r';
		 
--Следующий SQL запрос выбирает всех людей с JobTitle, у которых в названии есть буквосочетание «or» в любой позиции

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle LIKE '%or%';
		 
--Следующий SQL запрос выбирает всех людей с JobTitle, которая НЕ начинается с "a"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle NOT LIKE 'a%';

--Следующий SQL запрос выбирает всех людей с JobTitle, которая начинается с "a" или "d"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle NOT LIKE '[AD]%';

--Следующий SQL запрос выбирает всех людей с JobTitle, которая НЕ начинается с "a" или "d"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle NOT LIKE '[^AD]%';

--Следующий SQL запрос выбирает всех людей с JobTitle, которая начинается на буквы в диапазоне с "a" до "d"

SELECT
	JobTitle
FROM
	HumanResources.Employee 
WHERE
	JobTitle NOT LIKE '[A-D]%';
		 
--Следующий SQL запрос выбирает всех работников, которые являются «Engineering Manager», «Senior Design Engineer» или «Design Engineer»

SELECT
	*
FROM
	HumanResources.Employee
WHERE
	JobTitle IN
		('Engineering Manager', 'Senior Design Engineer', 'Design Engineer');​

--Следующий SQL запрос выбирает всех работников, которые НЕ являются «Engineering Manager», «Senior Design Engineer» или «Design Engineer»

SELECT
	*
FROM
	HumanResources.Employee
WHERE
	JobTitle IN
		('Engineering Manager', 'Senior Design Engineer', 'Design Engineer');
		 
--Следующий SQL запрос выбирает все продукты с ценой между 10 и 100 включительно

SELECT
	*
FROM
	Sales.SalesOrderDetail
WHERE
	UnitPrice BETWEEN 10 AND 100;​
		 
--Следующий SQL запрос создает псевдоним Price для столбца UnitPrice

SELECT
	UnitPrice AS Price 
FROM
	Sales.SalesOrderDetail;​
	   
--Следующий SQL запрос выбирает все продукты с информацией о цене за единицу

SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Sales.SalesOrderDetail AS SOD
INNER JOIN
	Production.Product AS P
		ON SOD.ProductID = P.ProductID
ORDER BY
	P.Name;
	   
--Следующий SQL запрос выберет все продукты и любую цену, которую они могут иметь

SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Production.Product AS P
LEFT JOIN
	Sales.SalesOrderDetail AS SOD
		ON SOD.ProductID = P.ProductID
ORDER BY
	P.Name;

--Следующий SQL запрос вернет всех сотрудников и все заказы, которые они могли сделать

SELECT
	P.Name,
	PCH.StandardCost
FROM
	Production.ProductCostHistory AS PCH
RIGHT JOIN
	Production.Product AS P
		ON PCH.ProductID = P.ProductID
ORDER BY
	P.Name;
	   
--Следующий SQL запрос выбирает всех клиентов и все заказы

SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Production.Product AS P
FULL OUTER JOIN
	Sales.SalesOrderDetail AS SOD
		ON SOD.ProductID = P.ProductID
ORDER BY
	P.Name;

--FULL OUTER JOIN - это сумма результатов запросов INNER JOIN + LEFT JOIN + RIGHT JOIN

--INNER JOIN
SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Production.Product AS P
INNER JOIN
	Sales.SalesOrderDetail AS SOD
		ON SOD.ProductID = P.ProductID
ORDER BY
	P.Name;	   

--LEFT JOIN
SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Production.Product AS P
LEFT JOIN
	Sales.SalesOrderDetail AS SOD
		ON SOD.ProductID = P.ProductID
WHERE
	SOD.ProductID IS NULL
ORDER BY
	P.Name;	

--RIGHT JOIN
SELECT
	P.Name,
	SOD.UnitPrice
FROM
	Production.Product AS P
RIGHT JOIN
	Sales.SalesOrderDetail AS SOD
		ON SOD.ProductID = P.ProductID
WHERE
	P.ProductID IS NULL
ORDER BY
	P.Name;	

--Следующий SQL запрос сопоставляет Business Entit, которые находятся в том же месте

SELECT
	A.BusinessEntityId AS PersonName1,
	B.BusinessEntityId AS PersoName2,
	A.AddressId
FROM
	Person.BusinessEntityAddress A,
	Person.BusinessEntityAddress B
WHERE
	A.BusinessEntityId <> B.BusinessEntityId AND
	A.AddressId = B.AddressId
ORDER BY
	A.AddressId;
	   

--Следующий SQL запросе указано количество BusinessEntity в каждом Location

SELECT
	COUNT(BusinessEntityId),
	AddressId
FROM
	Person.BusinessEntityAddress
GROUP BY
	AddressId;

--В следующем SQL запросе указано количество BusinessEntity в разделении по Gender

SELECT
	COUNT(BusinessEntityId),
	Gender
FROM
	HumanResources.Employee
GROUP BY
	Gender;

--В следующем SQL запросе указано количество отделов в каждой группе. Включены только те группы, в которых больше или равно 5 отделов

SELECT
	COUNT(DepartmentId),
	GroupName
FROM
	HumanResources.Department
GROUP BY
	GroupName
HAVING
	COUNT(DepartmentId) >= 5;
	  
--Следующий SQL запрос упорядочит OrderId по количеству.

SELECT
	SalesOrderID,
	OrderQty,
	CASE
		WHEN OrderQty < 2 THEN 'The quantity the quantity is too small'
		WHEN OrderQty > 2 THEN 'The quantity  is OK'
		ELSE 'The quantity is 2'
	END AS QuantityText
FROM
	Sales.SalesOrderDetail;

--Автоувеличение номера строки
CREATE TABLE Students (​
	StudentId INT IDENTITY(1,1) PRIMARY KEY,​
	LastName VARCHAR(255) NOT NULL,​
	FirstName VARCHAR(255),​
	Age INT);​

SELECT
	*
FROM
	[dbo].[Students];

INSERT INTO
	dbo.Students (FirstName, LastName)
VALUES
	('Ivan','Ivanov');

INSERT INTO
	dbo.Students (FirstName, LastName, Age)
VALUES
	('John','Orlov', 56);

--Что произойдет если выполнить следующий запрос?
INSERT INTO
	dbo.Students (StudentId, FirstName, LastName)
VALUES
	(3,'Iryna','Ivanova');

--При этом следюущий запрос сработает
INSERT INTO
	dbo.Students (FirstName, LastName)
VALUES
	('Iryna','Ivanova');