GithubHelp home page GithubHelp logo

tmp-mssql-proj's Introduction

master> create database db1 master> use db1 db1> create schema dbo

Практическое задание №1

-- 1. создание таблицы dept
create table dept
(
    dept_id int
        constraint dept_pk
            primary key nonclustered,
    dname   varchar(20)
);

-- 1. создание таблицы emp
create table emp
(
    emt_id  int
        constraint emp_pk
            primary key nonclustered,
    dept_id int
        constraint emp_dept_dept_id_fk
            references dept,
    ename   varchar(15),
    salary  numeric(6, 2)
);

-- 2. вставляем данные в таблицу dept
INSERT INTO dept (dept_id, dname)
VALUES (1, 'Marketing'),
       (2, 'RD');

-- 2. вставляем данные в таблицу emp
INSERT INTO emp (emt_id, dept_id, ename, salary)
VALUES (1, 1, 'James', 1000),
       (2, 2, 'Smith', 2000);

-- 3. создание таблицы dept_arch
create table dept_arch
(
    dept_id int
        constraint dept_arch_pk
            primary key nonclustered,
    dname   varchar(20)
);

-- 4. вставить в таблицу dept_arch все данные из таблицы dept
INSERT INTO dept_arch SELECT * FROM dept;

-- 5. Увеличьте на 15% зарплату сотруднику Smith
UPDATE emp SET salary = salary * 1.15 WHERE ename='Smith';

-- 6. Убедитесь, что в таблицу dept нельзя вставить такую запись: (2, 'Sales'). Почему?
-- INSERT INTO dept (dept_id, dname) VALUES (2, 'Sales');
-- [23000][2627] Violation of PRIMARY KEY constraint 'dept_pk'. Cannot insert duplicate key in object 'dbo.dept'. The duplicate key value is (2).
-- Получили ошибку Cannot insert duplicate key. Так как уже есть запись, где dept_id=2

-- 7. Убедитесь, что в таблицу emp нельзя вставить такую запись: (3, 4, 'Black', 3000, 'Active'). Почему?
-- INSERT INTO emp (emt_id, dept_id, ename, salary) VALUES (3, 4, 'Black', 3000, 'Active');
-- [S0001][110] There are fewer columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
-- Получили ошибку There are fewer columns. То есть у нас в VALUES указаны лишние значения, и база не знает, куда вставлять значение 'Active'

-- 8. Измените название отдела RD на RandD (таблица dept)
UPDATE dept SET dname='RandD' WHERE dname='RD';

-- 9. Удалите из таблицы emp запись с emp_id = 1.
DELETE FROM emp WHERE emt_id=1;

-- 10. Удалите из таблицы emp все записи
-- DELETE FROM emp WHERE 1;
TRUNCATE TABLE emp;

-- 11. Удалите таблицу emp
DROP TABLE emp;

Практическое задание №2

-- Создать схему
create table person
(
    person_code varchar(3)
        constraint person_pk
            primary key nonclustered,
    first_name  varchar(15),
    last_name   varchar(20),
    hiredate    DATE
);

create table product
(
    product_name     varchar(25)
        constraint product_pk
            primary key nonclustered,
    product_price    numeric(8, 2),
    quantity_on_hand numeric(5),
    laststockdate    date
);

create table purchase
(
    product_name  varchar(25)
        constraint purchase_product_product_name_fk
            references product,
    salesperson   varchar(3)
        constraint purchase_person_person_code_fk
            references person,
    purchase_date date,
    quantity      numeric(4, 2)
);

create table purchase_archive
(
    product_name  varchar(25),
    salesperson   varchar(3),
    purchase_date date,
    quantity      numeric(4, 2)
);

create table old_item
(
    item_id   char(20),
    item_desc char(25)
);

-- Заполнить таблицы
INSERT INTO person (person_code, first_name, last_name, hiredate)
VALUES ('VAN', 'Ivan', 'Ivanov', '2010-02-01'),
       ('SER', 'Sergey', 'Serov', '2020-08-07'),
       ('BAL', 'Alex', 'Balabanov', '2020-08-07'),
       ('SMT', 'Smith', 'Smith', '2010-01-01'),
       ('BOB', 'Vasiliy', 'Bobrov', '2010-01-01'),
       ('SOL', 'Sokol', 'Soloviov', '2010-01-01');

INSERT INTO product (product_name, product_price, quantity_on_hand, laststockdate)
VALUES ('milk', 12.50, 2.5, '2020-08-05'),
       ('beaf', 35.50, 5.50, '2020-08-23'),
       ('cheese', null, null, null),
       ('tea', 10.50, 5.50, '2020-08-10'),
       ('Small Widget', 35.50, 5.50, '2020-08-23'),
       ('Medium Widget', 35.50, 5.50, '2020-08-13'),
       ('Large Widget', 35.50, 5.50, '2020-08-03');

INSERT INTO purchase (product_name, salesperson, purchase_date, quantity)
VALUES ('milk', 'VAN', '2020-08-05', 3),
       ('beaf', 'VAN', '2020-08-06', 2.5),
       ('milk', 'SER', '2020-08-07', 24),
       ('milk', 'VAN', '2020-08-07', 20),
       ('beaf', 'SER', '2020-08-08', 2.5),
       ('tea', 'BAL', '2020-08-23', 20),
       ('cheese', 'SER', '2020-08-08', 23);

INSERT INTO purchase_archive
SELECT *
FROM purchase;
INSERT INTO purchase_archive (product_name, salesperson)
VALUES ('milk', 'SOL');

-- 1. Напишите запрос, полностью показывающий таблицу purchase.
SELECT *
FROM purchase;

-- 2. Напишите запрос, выбирающий столбцы product_name и quantity из таблицы Purchase.
SELECT product_name, quantity
FROM purchase;

-- 3. Напишите запрос, выбирающий эти столбцы в обратном порядке.
SELECT quantity, product_name
FROM purchase;

-- 4. Напишите запрос, выводящий для каждой строки таблицы person следующий текст:
-- <first_name> <last_name> started work <hiredate>*. Получаемому столбцу присвоить псевдоним "Started Work”.
SELECT CONCAT(first_name, ' ', last_name, ' started work ', hiredate) as 'Started Work'
FROM person;

-- 5. Напишите запрос,выводящий наименование продуктов product_name (таблица product), для которых цена не определена (NULL).
SELECT product_name
FROM product
WHERE product_price IS NULL;

-- 6. Напишите запрос, выводящий наименование продуктов product_name (таблица purchase), которых продали от 3 до 23 штук.
-- * MSSQL не поддерживает объединение столбцов с типами данных varchar и date. Используйте оператор конветации:  CONVERT(VARCHAR, hiredate)
SELECT product_name
FROM purchase pur
WHERE quantity BETWEEN 3 AND 23
GROUP BY product_name;

-- 7. Напишите запрос, выводящий фамилии сотрудников, которых приняли на работу 1го, 15го и 28го февраля 2010 года.
SELECT last_name
FROM person
WHERE hiredate IN ('2010-02-01', '2010-02-15', '2010-02-28')

-- 8. Напишите запрос, выводящий наименование продуктов product_name (таблица purchase), проданных сотрудниками, фамилии которых начинаются на "B”.
SELECT pur.product_name
FROM purchase pur
         LEFT JOIN person p on pur.salesperson = p.person_code
WHERE p.last_name LIKE 'B%'
GROUP BY pur.product_name;

-- 9. Напишите запрос, выводящий наименование продуктов product_name (таблица purchase), проданных сотрудниками, фамилии которых НЕ начинаются на "B”.
SELECT pur.product_name
FROM purchase pur
         LEFT JOIN person p on pur.salesperson = p.person_code
WHERE p.last_name NOT LIKE 'B%'
GROUP BY pur.product_name;

-- 10. Напишите запрос, выводящий фамилии и дату приема на работу сотрудников, фамилии которых начинаются на "B” и которых приняли на работу раньше 1 марта 2010 года.
SELECT last_name, hiredate
FROM person
WHERE last_name LIKE 'B%'
  AND hiredate < '2010-03-01';

-- 11. Напишите запрос, выводящий наименование продуктов product_name и дату последней поставки laststockdate (таблица product),
-- наименование которых Small Widget, Medium Widget и Large Widget или те, для которых не указана дата последней поставки.
-- Отсортируйте по убыванию даты последней поставки.
SELECT product_name, laststockdate FROM product WHERE product_name IN ('Small Widget', 'Medium Widget', 'Large Widget') OR laststockdate IS NULL ORDER BY laststockdate;


-- drop table purchase;
-- drop table old_item;
-- drop table person;
-- drop table product;
-- drop table purchase_archive;

Практическое задание №3

-- 1. Напишите запрос, выводящий декартово произведение таблиц product и purchase.
SELECT product.*, purchase.*
FROM product
         CROSS JOIN purchase;

-- 2. Напишите запрос, выводящий наименование проданного товара product_name,
-- количество quantity (таблица purchase) и quantity_on_hand (таблица product).
SELECT p.product_name, sum(quantity) qty, sum(quantity_on_hand) on_hand
FROM product p
         LEFT JOIN purchase pur on p.product_name = p.product_name
GROUP BY p.product_name;

-- 3.Напишите запрос, выводящий наименование товара product_name (таблица purchase),
-- дату последней поставки laststockdate (таблица product) и фамилию продавца last_name (таблица person).
SELECT pur.product_name, p.laststockdate, per.last_name
FROM purchase pur
         LEFT JOIN product p on pur.product_name = p.product_name
         LEFT JOIN person per on pur.salesperson = per.person_code;

-- 4. Напишите запрос, выводящий столбцы product_name, first_name, last_name внешнего объединения таблиц purchase и person.
-- Используйте для таблиц короткие псевдонимы.
SELECT product_name
FROM purchase pur
         FULL OUTER JOIN person p on pur.salesperson = p.person_code;
SELECT product_name
FROM purchase pur
         LEFT OUTER JOIN person p on pur.salesperson = p.person_code;

-- 5.Напишите запрос, который выводит коды продавцов salesperson из таблицы purchase_archive , которые не повторяются в таблице purchase.
SELECT a.salesperson
FROM purchase_archive a
EXCEPT
SELECT p.salesperson
FROM purchase p;


-- 6. Напишите запрос, который выводит коды только тех продавцов salesperson из таблицы purchase,
-- которые так же содержаться в таблице purchase_archive.
SELECT a.salesperson
FROM purchase_archive a
INTERSECT
SELECT p.salesperson
FROM purchase p;

-- 7. Напишите запрос, который выводит все (в том числе повторяющиеся) коды продавцов salesperson
-- из таблиц purchase и purchase_archive.
SELECT a.salesperson
FROM purchase_archive a
UNION
SELECT p.salesperson
FROM purchase p;

Практическое задание №4

-- 1. Напишите запрос, показывающий, какой будет цена продукта product_price после увеличения на 15%.
SELECT product_name, product_price * 1.15 as new_price
FROM product
WHERE product_price IS NOT NULL;

-- 2. Напишите запрос, показывающий, сколько всего имеется товаров в таблице product.
SELECT count(*)
FROM product;

-- 3.Напишите запрос, показывающий, для какого количества товаров (таблица product) не указана цена.
SELECT product_name
FROM product
WHERE product_price IS NULL;

-- 4. Напишите запрос, выводящий минимальную и максимальную цену товаров product_price.
SELECT min(product_price), max(product_price)
FROM product;

-- 5. Напишите запрос, показывающий, какая сумма была выручена с продаж товаров каждого наименования.
SELECT pur.product_name, sum(quantity * p.product_price) as sum
FROM purchase pur
         LEFT JOIN product p on pur.product_name = p.product_name
GROUP BY pur.product_name;

-- 6. Напишите запрос, показывающий, какая сумма была выручена с продаж товаров каждого наименования. Вывести только те записи, для которых сумма продаж больше 125.
SELECT pur.product_name, sum(quantity * p.product_price) as sum
FROM purchase pur
         LEFT JOIN product p on pur.product_name = p.product_name
GROUP BY pur.product_name
HAVING sum(quantity * p.product_price) > 125;

Практическое задание №5

-- 1. Напишите запрос, который возвращает всех сотрудников, которых взяли на работу в то же день, что и сотрудника John Smith.
-- Вариант 1
SELECT *
FROM person
WHERE hiredate = (SELECT hiredate FROM person WHERE last_name = 'Smith');
-- Вариант 2
SELECT p1.*
FROM person p1
         RIGHT JOIN person p2 ON p1.hiredate = p2.hiredate AND p2.last_name = 'Smith'
WHERE p1.person_code IS NOT NULL;

-- 2. Напишите запрос, который возвращает все товары, цена которых ниже средней цены.
SELECT product_price
FROM product
WHERE product_price < (SELECT avg(product_price) FROM product);

-- 3. Напишите запрос, который возвращает все товары, которые продавались более одного раза.
SELECT product_name
FROM purchase
GROUP BY product_name
HAVING count(product_name) > 1;

-- 4. Выведите увеличенную на 15% цену товаров, которые продавались более одного раза.
-- Вариант 1
SELECT p.product_name, p.product_price * 1.15 as new_price
FROM purchase pur
         LEFT JOIN product p on pur.product_name = p.product_name
GROUP BY p.product_name, p.product_price
HAVING count(p.product_name) > 1;

-- Вариант 2
SELECT product_name, product_price
FROM product
WHERE product_name IN (
    SELECT product_name
    FROM purchase
    GROUP BY product_name
    HAVING count(product_name) > 1);


-- 5. Используя условие EXISTS, напишите запрос, который возвращает всех сотрудников, которые хотя бы один раз что-либо продали.
SELECT *
FROM person as p1
WHERE EXISTS(
              SELECT *
              FROM purchase pur
              WHERE pur.salesperson = p1.person_code
          );

-- 6. Напишите запрос, который возвращает все товары из таблицы product, цена которых меньше цены любого товара,
-- проданного сотрудником с кодом 'GA'.
-- Замечание. У меня нет сотрудника с кодом 'GA', буду использовать сотрудника с кодом SER
SELECT *
FROM product
WHERE product_price < (
    SELECT min(product_price)
    FROM product p
             LEFT JOIN purchase pur on p.product_name = pur.product_name
    WHERE pur.salesperson = 'SER'
);

-- 7. напишите запрос, который вернет все товары из таблицы product, цена которых меньше цены хотя бы одного товара,
-- проданного сотрудником с кодом 'GA'. Убедитесь, что операторы SOME и ANY взаимозаменяемы.
SELECT *
FROM product p
WHERE p.product_price < SOME (
    SELECT product_price
    FROM product p
             LEFT JOIN purchase pur on p.product_name = pur.product_name
    WHERE pur.salesperson = 'SER'
);

Практическое задание №6

-- 1. Использую функции для работы с датами и числами, посчитайте, сколько вам полных лет.
DECLARE @startdate DATETIME;
DECLARE @enddate DATETIME;
SET @startdate = CONVERT(Datetime, '1988-08-28');
SET @enddate = GETDATE();
SELECT DATEDIFF(year, @startdate, @enddate) - case
                                                  when month(@startdate) < month(@enddate)
                                                      then 0
                                                  when month(@startdate) > month(@enddate)
                                                      then 1
                                                  when day(@startdate) > day(@enddate)
                                                      then 1
                                                  else 0 end;

-- 2. Выведите строку 'я ЗнаЮ тЕкСтовыЕ фУнкциИ' в верхнем и нижнем регистре.
SELECT UPPER(N'я ЗнаЮ тЕкСтовыЕ фУнкциИ'), LOWER(N'я ЗнаЮ тЕкСтовыЕ фУнкциИ');

-- 3. Узнайте длину этой строки.
SELECT LEN('string');
SELECT LEN(N'строка');

-- 4. Работая со столбцом purchase.product_name, выведите:
-- первые три символа
-- все оставшиеся символы, начиная с четвёртого
-- полную строку
SELECT SUBSTRING(product_name, 0, 4), SUBSTRING(product_name, 4, LEN(product_name) - 3), product_name FROM product;

tmp-mssql-proj's People

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.