11546

Общая структура запроса SELECT

Лабораторная работа

Информатика, кибернетика и программирование

Разделы SELECT и FROM обязательно должны присутствовать в каждом запросе; остальные разделы могут присутствовать частично или отсутствовать вовсе...

Русский

2013-04-08

70 KB

6 чел.

1. Общая структура запроса SELECT

SELECT [DISTINCT] <список столбцов>

FROM <таблица(-ы) источников>

[WHERE <ограничения>]

[GROUP BY <столбцы из раздела SELECT или операция над этими столбцами>]

[HAVING <ограничения на результаты GROUP BY>]

[ORDER BY <список столбцов>]

[FOR XML …]

Разделы SELECT и FROM обязательно должны присутствовать в каждом запросе; остальные разделы могут присутствовать частично или отсутствовать вовсе.

2. Примеры запросов

--2.1. Выбрать название и вес деталей

SELECT detail_name, weight

FROM detail

--2.2. Выбрать всю информацию из таблицы материалов

SELECT *

FROM material

----------------------------------------------------DISTINCT----------------------------------------------------------

--2.3. Выбрать уникальные коды поставщиков из таблицы поставок

SELECT DISTINCT supplier_id

FROM supply

----------------------------------------------------WHERE-------------------------------------------------------------

--2.4. Выбрать количество и даты поставки детали с кодом 2

SELECT supply_quantity, supply_date

FROM supply

WHERE detail_id = 2

--2.5. Выбрать названия поставщиков с кодами 1, 2 и 6

SELECT supplier_name

FROM supplier

WHERE supplier_id = 1 OR supplier_id = 2 OR supplier_id = 6

--или

SELECT supplier_name

FROM supplier

WHERE supplier_id in (1, 2, 6)

--2.6. Выбрать всю информацию о поставках, сделанных до 1.10.2008

SELECT *

FROM supply

WHERE supply_date <= '1.10.2008'

--2.7. Выбрать всю информацию о деталях, не начинающихся на букву «В» (в любом регистре) и чей вес меньше 50

SELECT *

FROM detail

WHERE UPPER (detail_name) NOT LIKE 'В%' AND weight < 50

--2.8. Выбрать название и код материала для деталей с весом между 5 и 10 или имеющих в названии букву «н» в третьей позиции

SELECT detail_name, material_id

FROM detail

WHERE (weight BETWEEN 5 AND 10) OR (detail_name LIKE '__н%')

--2.9. Выбрать названия поставщиков длиной не больше 15-и символов

SELECT supplier_name

FROM supplier

WHERE LEN (supplier_name) <= 15

--2.10. Выбрать месяца и годы поставок деталей

SELECT MONTH (supply_date) AS 'Месяц', YEAR (supply_date) AS 'Год'

FROM supply

------------------------------------------ORDER BY-------------------------------------------------------------------

--2.11. Упорядочить поставки сначала по коду поставщика, а затем по дате поставки

SELECT *

FROM supply

ORDER BY supplier_id, supply_date

--2.12. Выбрать названия поставщиков с кодами 2, 3 и 6, упорядоченных по алфавиту в обратном порядке

SELECT supplier_name

FROM supplier

WHERE supplier_id in (2, 3, 6)

ORDER BY supplier_name DESC

---------------------------------------Агрегация, GROUP BY-------------------------------------------------------

--2.13. Посчитать количество деталей, для которых задан вес

SELECT COUNT (*) AS 'Количество'

FROM detail

WHERE weight IS NOT NULL

--или

SELECT COUNT (weight) AS 'Количество'

FROM detail

--2.14. Определить средний вес деталей из материала с кодом 2

SELECT AVG (weight) AS 'Средний вес'

FROM detail

WHERE material_id = 2

--2.15. Из поставок, совершенных до 1.10.2008, выбрать самую крупную поставку и самую мелкую

SELECT MAX (supply_quantity) AS 'Крупная поставка', MIN (supply_quantity) AS 'Мелкая поставка'

FROM supply

WHERE supply_date < '1/10/2008'

--2.16. Для поставщиков с кодами 1 и 2 посчитать суммарное количество поставленных ими деталей

SELECT supplier_id, SUM (supply_quantity) AS 'Всего поставлено деталей'

FROM supply

WHERE supplier_id BETWEEN 1 AND 2

GROUP BY supplier_id

--2.17. Посчитать количество поставленных деталей в каждом месяце каждого года; результаты упорядочить в порядке убывания года и месяца

SELECT MONTH (supply_date) AS 'Месяц', YEAR (supply_date) AS 'Год',

COUNT (detail_id) AS 'Количество'

FROM supply

GROUP BY YEAR (supply_date),  MONTH (supply_date)

ORDER BY 2, 1

---------------------------------------------------HAVING-------------------------------------------------------------

--2.18. Выбрать материалы, для которых суммарный вес выполненных из них деталей не больше 20

SELECT material_id, SUM (weight) AS 'Вес'

FROM detail

GROUP BY material_id

HAVING SUM (weight) !> 20

--2.19. Из поставок 2008-го года выбрать детали, поставлявшиеся более одного раза

SELECT detail_id, COUNT (*)

FROM supply

WHERE supply_date >= '1.01.2008'

GROUP BY detail_id

HAVING COUNT (*) >1

------------------------------------------Преобразование типов (CAST)----------------------------------------------

--2.20. Получить сведения о датах поставок в текстовом виде

SELECT CAST (supply_date AS varchar) AS 'Дата поставки'

FROM supply

--2.21. Получить сведения из таблицы деталей в виде строк «Деталь X имеет вес Y»

SELECT 'Деталь ' + detail_name + ' имеет вес ' + CAST (weight AS varchar)

FROM detail

----------------------------------------------Функция CASE-------------------------------------------------------------

--2.22. Разделить детали на легкие (весом до 20), средние (между 20 и 50) и тяжелые

SELECT detail_name, CASE WHEN weight < 20 THEN 'Легкая деталь'

                                               WHEN weight >= 20 AND weight <50 THEN 'Средняя деталь'

                                               ELSE 'Тяжелая деталь'

                                     END AS weight

FROM detail

---------------------------------------Обработка NULL-значений-----------------------------------------------------

-- 2.23. Получить сведения о деталях и их весах, причем если у некоторой детали вес не задан, то вместо NULL-значения написать -100

SELECT detail_name, CASE WHEN weight IS NULL THEN -100

                                                ELSE weight

                                    END AS weight

FROM detail

--или

SELECT detail_name, ISNULL (weight, -100)

FROM detail

--------------------------------------------------------EXISTS-------------------------------------------------------------

--2.24. Выбрать название и код материала только тех деталей, которые когда-либо поставлялись

SELECT detail_name, material_id

FROM detail d

WHERE EXISTS (SELECT *

                              FROM supply s

                              WHERE s.detail_id = d.detail_id)

--2.25. Выбрать названия тех материалов, из которых не изготовлена ни одна деталь

SELECT material_name

FROM material m

WHERE NOT EXISTS (SELECT material_id

                                       FROM detail d

                                       WHERE d.material_id = m.material_id)

--------------------------------------------------------Подзапросы-------------------------------------------------------

--2.26. Получить сведения о самой последней (по дате) поставке

SELECT *

FROM supply

WHERE supply_date = (SELECT MAX (supply_date) FROM supply)

--2.27. Получить все поставки деталей из материала с кодом 2

SELECT *

FROM supply

WHERE detail_id IN (SELECT detail_id from detail WHERE material_id = 2)

--2.28. Для каждого поставщика получить сведения о самой первой (по дате) его поставке

SELECT *

FROM supply s1

WHERE s1.supply_date = (SELECT MIN (s2.supply_date)

                                           FROM supply s2

                                           WHERE s1.supplier_id = s2.supplier_id)

--2.29. Для каждого поставщика получить его имя и дату последнего заказа

SELECT supplier_name, (SELECT MAX (supply_date)

                                         FROM supply

                                         WHERE supply.supplier_id = supplier.supplier_id)

FROM supplier

---------------------------------------------Объединения таблиц-------------------------------------------------------

--2.30. Получить таблицу вида: название детали, название материала, из которого выполнена эта деталь

SELECT detail_name, material_name

FROM detail INNER JOIN material

ON detail.material_id = material.material_id

--или

SELECT detail_name, material_name

FROM detail CROSS JOIN material

WHERE detail.material_id = material.material_id

--или

SELECT detail_name, material_name

FROM detail, material

WHERE detail.material_id = material.material_id

--2.31. Получить таблицу вида: название поставщика, название детали, количество и дата поставки для деталей, у которых задан вес

SELECT supplier_name, detail_name, supply_quantity, supply_date

FROM supplier sr JOIN supply s

ON sr.supplier_id = s.supplier_id

JOIN detail d

ON d.detail_id = s.detail_id

WHERE weight IS NOT NULL

--2.32. Выбрать всю информацию о тех деталях, которые когда-либо поставлялись

SELECT DISTINCT d.detail_id, detail_name, weight, material_id

FROM detail d JOIN supply s ON d.detail_id = s.detail_id

--2.33. Для каждого поставщика посчитать суммарную величину его поставок

SELECT supplier_name, SUM (supply_quantity)

FROM supplier LEFT JOIN supply

ON supplier.supplier_id = supply.supplier_id

GROUP BY supplier_name

--2.34. Получить названия всех материалов и выполненных из них деталей

SELECT material_name, detail_name

FROM detail d RIGHT JOIN material m

ON d.material_id = m.material_id

--2.35. Получить все данные о поставщиках, поставках и деталях

SELECT *

FROM supplier s1 FULL JOIN supply s2

ON s1.supplier_id = s2.supplier_id

 FULL JOIN detail d

 ON s2.detail_id = d.detail_id

--2.36. Получить таблицу названий и весов деталей, причем последняя строка таблицы должна содержать итоги в виде суммарного веса всех деталей

SELECT detail_name, weight

FROM detail

UNION

SELECT 'Итого', SUM (weight)

FROM detail

ORDER BY weight

--2.37. Получить таблицу из двух полей, где первое поле – название детали, материала, поставщика или дата поставки, а второе поле – длина строки из первого поля

SELECT material_name, LEN (material_name)

FROM material

UNION

SELECT detail_name, LEN (detail_name)

FROM detail

UNION

SELECT supplier_name, LEN (supplier_name)

FROM supplier

UNION

SELECT CAST (supply_date AS varchar), LEN (supply_date)

FROM supply