Advertisement
S_Madanska

решения ден 2 зад

Sep 21st, 2022 (edited)
1,556
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 19.31 KB | None | 0 0
  1. ---------------------------
  2. ---------inserts-----------
  3. ---------------------------
  4. use TRADECOMPANY
  5.  
  6. insert into REGIONS (NAME)
  7. values ('Източна Европа')
  8.  
  9. select * from CUSTOMERS
  10.  
  11. insert into COUNTRIES (COUNTRY_ID, name, REGION_ID)
  12. values('BG', 'БЪЛГАРИЯ', 1)
  13.  
  14. INSERT INTO CUSTOMERS (CUSTOMER_ID, COUNTRY_ID, FNAME, LNAME, ADDRESS, EMAIL, GENDER)
  15. VALUES (1, 'BG', 'ПЕТЪР', 'МАРИНОВ', 'УЛ.РОДОПИ ГР.ПЛД','[email protected]', DEFAULT)
  16.  
  17. INSERT INTO JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
  18. VALUES ('TP', 'ТЪРГОВСКИ ПРЕДСТАВИТЕЛ', 2000, 5000)
  19.  
  20. INSERT INTO DEPARTMENTS (DEPARTMENT_ID, NAME, MANAGER_ID, COUNTRY_ID, CITY,
  21. STATE, ADDRESS, POSTAL_CODE)
  22. VALUES (1, 'ПРОДАЖБИ', NULL, 'BG', 'ПЛД', 'ПЛД','УЛ.РОДОПИ ПЛД', 4000 )
  23.  
  24. INSERT INTO EMPLOYEES (EMPLOYEE_ID, FNAME, LNAME, EMAIL,
  25. PHONE, HIRE_DATE,SALARY, JOB_ID, DEPARTMENT_ID)
  26. VALUES (1, 'МАРИЯ', 'ИЛИЕВА', '[email protected]', '0986324667', CONVERT(DATE , '21-09-2022', 105), 3000, 'TP', 1)
  27.  
  28. INSERT INTO PRODUCTS (PRODUCT_ID, NAME, PRICE, DESCR )
  29. VALUES(1, 'FLASH', 20, 'ADATA')
  30.  
  31. INSERT INTO ORDERS (ORDER_ID, ORDER_DATE, CUSTOMER_ID, EMPLOYEE_ID, SHIP_ADDRESS)
  32. VALUES (100, GETDATE(), 1, 1, 'УЛ.РОДОПИ ПЛД')
  33.  
  34. INSERT INTO ORDER_ITEMS(ORDER_ID, PRODUCT_ID, UNIT_PRICE, QUANTITY)
  35. VALUES(100, 1, 20, 2)
  36.  
  37. --Демо:
  38. --Промяна на заплатата на служител с даден идентификатор:
  39.  UPDATE EMPLOYEES
  40.  SET SALARY = 4000
  41.  WHERE EMPLOYEE_ID = 1
  42.  
  43.  SELECT * FROM EMPLOYEES
  44.  
  45. --Демо:
  46. --Поръчката е анулирана -  изтрий реда ѝ  от таблицата ORDERS:
  47.  DELETE FROM ORDERS     --- ПОРАДИ --ON DELETE CASCADE ON UPDATE CASCADE /БЕЗ НЕГО ЩЕШЕ ДА Е НУЖНО ДА СЕ ИЗТРИЕ ПЪРВО ОТ ORDER_ITEMS ПОСЛЕ ОТ ORDERS
  48.  WHERE ORDER_ID = 100  
  49.  
  50.  
  51.  SELECT * FROM ORDER_ITEMS
  52.  
  53. /*Задача 3-1.
  54. Да се изтрият всички редове от всички таблици в базата от данни, след което да
  55. се въведат данните чрез командите от inserts_mssql.sql файла. */
  56.  DELETE FROM ORDERS
  57.  DELETE FROM PRODUCTS
  58.  DELETE FROM COUNTRIES
  59.  DELETE FROM EMPLOYEES
  60.  DELETE FROM JOBS
  61.  DELETE FROM DEPARTMENTS
  62.  DELETE FROM CUSTOMERS
  63.  DELETE FROM COUNTRIES
  64.  DELETE FROM REGIONS
  65.  
  66.  SELECT * FROM EMPLOYEES
  67.  
  68. /*Задача 3-2.
  69. Да се увеличи количеството с 2 броя
  70. и да се намали единичната цена с 5%
  71. на продукт с идентификатор 2254
  72. в поръчка с идентификатор 2354.*/
  73. SELECT *
  74. FROM ORDER_ITEMS
  75. WHERE PRODUCT_ID = 2254 AND ORDER_ID = 2354
  76.  
  77. UPDATE ORDER_ITEMS
  78. SET QUANTITY +=2,  UNIT_PRICE *= 0.95
  79. WHERE PRODUCT_ID = 2254 AND ORDER_ID = 2354
  80.  
  81. --Задача 3-3.
  82. --Да се изтрие служител с идентификатор 183.
  83.  DELETE FROM EMPLOYEES
  84.  WHERE EMPLOYEE_ID = 183
  85. -------------------------------------------------------------------------------------------
  86. --Пример 4-1.
  87. --Да се изведат имената, датите на назначаване и заплатите на всички служители.
  88. SELECT FNAME, LNAME, HIRE_DATE, SALARY
  89. FROM EMPLOYEES
  90.  
  91. /*Пример 4-2.
  92. Да се изведат всички данни за продуктите, с цена по-голяма от 2000.
  93. Резултатът нека бъде подреден по цена на продукт възходящо.*/
  94. SELECT * FROM PRODUCTS
  95. WHERE PRICE > 2000
  96. ORDER BY PRICE ASC
  97.  
  98. --Пример 4-3.
  99. --Да се изведе броя на всички служители.
  100. SELECT COUNT(EMPLOYEE_ID) AS [COUNT EMP] -- []
  101. FROM EMPLOYEES
  102.  
  103. --Пример 4-4.
  104. --Да се изведе броя служители, групирани по отдела, в който работят.
  105. SELECT COUNT(EMPLOYEE_ID) AS [COUNT EMP], DEPARTMENT_ID
  106. FROM EMPLOYEES
  107. GROUP BY DEPARTMENT_ID
  108.  
  109. --АКО ИСКАМЕ ОТДЕЛЪТ ДА СЕ ИЗВЕДЕ ВМЕСТО С ИДЕНТИФИКАТОР, С ИМЕ:
  110. --SELECT COUNT(E.EMPLOYEE_ID), D.NAME
  111. --FROM DEPARTMENTS D FULL JOIN EMPLOYEES E
  112. --ON D.DEPARTMENT_ID = E.DEPARTMENT_ID
  113. --GROUP BY D.DEPARTMENT_ID,  D.NAME
  114.  
  115. -------------------------------------------------------------------------------------------
  116. --Задача 4-1.
  117. --Да се изведат имената, заплатите и идентификаторите на длъжностите на
  118. --служителите, работещи в отдели 50 и 80.
  119. --Резултатът да е подреден по фамилия на служител във възходящ ред.
  120.  SELECT CONCAT(FNAME, ' ', LNAME) AS NAME
  121.        , JOB_ID
  122.        , SALARY
  123.  FROM EMPLOYEES
  124.  WHERE DEPARTMENT_ID = 50 OR DEPARTMENT_ID = 80
  125.  
  126. --Задача 4-2.
  127. --Да се изведат общата сума на заплатите и броя служители в отдел 60.
  128.  SELECT SUM(SALARY), COUNT(EMPLOYEE_ID)
  129.  FROM EMPLOYEES
  130.  WHERE DEPARTMENT_ID = 60
  131.  
  132. --Задача 4-3.
  133. --За всички поръчки да се изведат идентификатор на поръчка и обща стойност на
  134. --поръчката. Резултатът да е подреден по стойност на поръчката в низходящ ред.
  135.  SELECT ORDER_ID, SUM(QUANTITY*UNIT_PRICE) AS SUMMARY
  136.  FROM ORDER_ITEMS
  137.  GROUP BY ORDER_ID
  138.  
  139.  -------------------------------------
  140.  ---ПРИМЕРНА ЗАДАЧА:
  141.  ---ИЗВЕДИ КЛИЕНТИ,
  142.  ---КОИТО СА НА АДРЕС В СОФИЯ
  143.  ---/ИЗПОЛЗВАЙ WILDCARDS:
  144.  --https://pastebin.com/TGnyW70m/
  145. SELECT * FROM Customers
  146. WHERE ADDRESS LIKE '%, София%'
  147. --------------------------------------
  148.  
  149.  
  150. -------------------------------------------------------------------------------------------
  151. -------------------------------------Set operators-----------------------------------------
  152. --Условия:
  153. --Броят на колоните във всички заявки трябва да бъде еднакъв;
  154. --Колоните трябва да бъдат от съвместими типове от данни.
  155.  
  156. ---------------------------------------UNION ----------------------------------------------
  157. /*  Резултатни набори, които се обединяват. В целия израз може да присъства само една клауза ,
  158.     ORDER BY накрая сортираща обединения резултат. */
  159.  
  160. --Пример 4-5.
  161. --Да се изведат идентификаторите на държавите,
  162. --в които има клиенти или отдели на фирмата.
  163.  SELECT COUNTRY_ID FROM CUSTOMERS
  164.  UNION
  165.  SELECT COUNTRY_ID FROM DEPARTMENTS
  166.  
  167. --Пример 4-6.
  168. --Да се изведат идентификаторите на държавите,
  169. --в които има клиенти или отдели на фирмата.
  170. --Нека в резултатния набор участват и дублиращите се записи.
  171.  SELECT COUNTRY_ID FROM CUSTOMERS
  172.  UNION ALL
  173.  SELECT COUNTRY_ID FROM DEPARTMENTS
  174.  
  175. /*Задача 4-4.
  176. Да се изведат всички малки имена на клиенти и служители с евентуалните
  177. повторения, сортирани в низходящ ред по име. */
  178.  SELECT FNAME FROM CUSTOMERS
  179.  UNION ALL
  180.  SELECT FNAME FROM EMPLOYEES
  181.  ORDER BY FNAME DESC
  182.  
  183. ----------------------------------INTERSECT(сечение)---------------------------------------
  184. /*Резултатът съдържа общите за двата резултатни набора редове, без дубликати.
  185.  
  186. Пример 4-7.
  187. Да се изведат id на държавите, в които има клиенти и отдели на фирмата едновременно.*/
  188.  SELECT COUNTRY_ID FROM DEPARTMENTS
  189.  INTERSECT
  190.  SELECT COUNTRY_ID FROM CUSTOMERS
  191.  
  192. --Задача 4-6.
  193. --Да се изведат общите собствени имена на клиенти и служители.
  194. SELECT FNAME FROM EMPLOYEES
  195. INTERSECT
  196. SELECT FNAME FROM CUSTOMERS
  197.  
  198. ----------------------------------EXCEPT---------------------------------------------------
  199. /*връща редовете, върнати от първата заявка, които не се срещат измежду редове от втората. */
  200.  
  201. --Пример 4-8.
  202. --Изведи id на държавите, в които има клиенти и в същото време
  203. --няма отдели на фирмата.
  204.  SELECT COUNTRY_ID FROM CUSTOMERS
  205.  EXCEPT
  206.  SELECT COUNTRY_ID FROM DEPARTMENTS
  207.  
  208. /*Задача 4-7.
  209. Да се изведат собствени имена на клиенти, които не се срещат сред тези на служители.*/
  210. SELECT FNAME FROM CUSTOMERS
  211. EXCEPT
  212. SELECT FNAME FROM EMPLOYEES
  213. -------------------------------------------------------------------------------------------
  214. ------------------------------------ JOIN -------------------------------------------------
  215. --JOIN се използва за извличане на данни от две или повече таблици,
  216. --като редовете им се
  217. --комбинират чрез логическа връзка между таблиците,
  218. --която може да бъде във FROM или WHERE.
  219. --Обикновено тази връзка е първичен/външен ключ, но не задължително.
  220.  
  221.  
  222. -----------------------------------------------------------------------------------------
  223. -----------------------------INNER JOIN или просто JOIN----------------------------------
  224. -----------------------------------------------------------------------------------------
  225. --Извеждат редовете от две/повече таблици, които имат съвпадащи стойности в колоните,
  226. --посочени в условието за сравнение.
  227.  
  228. --Пример 4-10.
  229. --  Да се изведат държавите и регионите, в които се намират.
  230. SELECT * FROM COUNTRIES
  231. SELECT * FROM REGIONS
  232.  
  233. SELECT *
  234. FROM REGIONS R  FULL JOIN COUNTRIES C
  235. ON R.REGION_ID = C.REGION_ID
  236. -------------------------------------------------------------------------------------
  237. --1. [INNER] JOIN
  238.                                 ---- SYNTAX:     --T1 JOIN T2 ON    ........
  239.                                 --           /--OR/
  240.                                 --               --T1 ,    T2 WHERE ........
  241. -------------------------------------------------------------------------------------
  242. --2. [OUTER] JOIN
  243.      --2.1 LEFT [OUTER] JOIN
  244.      --2.2 RIGHT[OUTER] JOIN
  245.      --2.3 FULL [OUTER] JOIN
  246.  
  247.                                 ---- SYNTAX:     --T1 LEFT  JOIN T2 ON .......
  248.                                             -- /--OR/
  249.                                                  --T1 RIGHT JOIN T2 ON .......
  250.                                             -- /--OR/
  251.                                                  --T1 FULL  JOIN T2 ON .......
  252. -------------------------------------------------------------------------------------
  253. --3. CROSS JOIN
  254.                                 ---- SYNTAX:
  255.                                                  --T1 CROSS JOIN T2
  256.                                             -- /--OR/
  257.                                                  --T1 , T2
  258.  -------------------------------------------------------------------------------------
  259. --Пример 4-11.
  260. --  Изведи имена на клиенти, имена на държавите от които са,
  261. --и имена на регионите на държавите.
  262. SELECT CU.FNAME, CU.LNAME, CO.NAME
  263. FROM CUSTOMERS CU JOIN COUNTRIES CO ON CU.COUNTRY_ID = CO.COUNTRY_ID
  264.                   JOIN REGIONS R ON R.REGION_ID = CO.REGION_ID
  265.  
  266. SELECT CU.FNAME, CU.LNAME, CO.NAME
  267. FROM CUSTOMERS CU, COUNTRIES CO, REGIONS R
  268. WHERE CU.COUNTRY_ID = CO.COUNTRY_ID AND R.REGION_ID = CO.REGION_ID
  269.  
  270.  --INNER JOIN
  271.  --T1 JOIN T2 ON ........
  272.  --T1 , T2 WHERE ........
  273.  
  274. -----------------------------------------------------------------------------------------
  275. -------------------------------Видове OUTER JOIN-----------------------------------------
  276. -----------------------------------------------------------------------------------------
  277.  
  278. --Пример 4-12.
  279. --  Да се изведат регионите и държавите, които се намират в тях.
  280. --  Резултатният набор да включва и регионите, в които няма
  281. --  въведени държави.
  282.  SELECT *
  283.  FROM REGIONS R LEFT JOIN COUNTRIES C
  284.  ON R.REGION_ID = C.REGION_ID
  285.  
  286. --Пример 4-13.
  287. --  Да се изведат държавите и регионите, в които се намират.
  288. --  Резултатния набор да включва държавите,
  289. -- за които няма въведен регион.
  290.  SELECT *
  291.  FROM REGIONS R RIGHT JOIN COUNTRIES C
  292.  ON R.REGION_ID = C.REGION_ID
  293.  
  294.  SELECT *
  295.  FROM COUNTRIES C LEFT JOIN REGIONS R
  296.  ON R.REGION_ID = C.REGION_ID
  297.  
  298. /*Пример 4-14.
  299. Да се изведат държавите и регионите, в които се намират.
  300. Резултатния набор да включва държавите,
  301. за които няма въведен регион и регионите,
  302. за които няма въведени държави.*/
  303.  SELECT *
  304.  FROM COUNTRIES C FULL JOIN REGIONS R
  305.  ON R.REGION_ID = C.REGION_ID
  306.  
  307. -----------------------------------------------------------------------------------------
  308. ----------------------------4.6.6. Други JOIN вариации---------------------------------
  309. -----------------------------------------------------------------------------------------
  310.  
  311. /*Пример 4-16.
  312. Да се изведат отделите, в които има назначени служители.*/
  313.  SELECT NAME
  314.  FROM DEPARTMENTS D
  315.  WHERE EXISTS ( SELECT *
  316.                 FROM EMPLOYEES E
  317.                 WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID)
  318.  
  319. --Пример 4-17.
  320. --  Да се изведат имената на клиентите,
  321. -- които все още не са правили поръчки.
  322.  SELECT FNAME, LNAME
  323.  FROM CUSTOMERS
  324.  WHERE CUSTOMER_ID NOT IN (SELECT CUSTOMER_ID FROM ORDERS)
  325.  
  326. --Пример 4-18.
  327. --  Да се изведат комбинациите от всички региони и държави,
  328. --  сортирани по име на държава.
  329.  SELECT * FROM REGIONS --6
  330.  SELECT * FROM COUNTRIES ---29
  331.  
  332.  --CROSS JOIN
  333.  --SELECT ... FROM T1 CROSS JOIN T2
  334.  --SELECT ... FROM T1 , T2
  335.  
  336. --НАЧИН 1
  337. SELECT * FROM REGIONS R, COUNTRIES C
  338. ---WHERE R.REGION_ID = C.REGION_ID
  339.  
  340. --НАЧИН 2:
  341. SELECT * FROM REGIONS R CROSS JOIN COUNTRIES C
  342.  
  343. --Задача 4-8.
  344. --  Извлечи идентификатори, дати на поръчките и имена
  345. -- на служители, които са ги обработили.
  346. SELECT O.ORDER_ID, O.ORDER_DATE, E.FNAME, E.LNAME
  347. FROM EMPLOYEES E JOIN ORDERS O
  348. ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  349.  
  350. --Задача 4-9.
  351. --  Да се изведат имената на всички клиенти и id на поръчките им.
  352. --  В резултатния набор да участват и клиентите, които все още не са правили поръчки.
  353.  SELECT C.FNAME, C.LNAME, O.ORDER_ID
  354.  FROM CUSTOMERS C LEFT JOIN ORDERS O
  355.  ON C.CUSTOMER_ID = O.CUSTOMER_ID
  356.  
  357. --Задача 4-11.
  358. --  Да се изведат имената на всички клиенти,
  359. --които са от държави в регион „Западна Европа“
  360.  
  361. SELECT CU.FNAME, CU.LNAME, R.NAME, CO.NAME
  362. FROM REGIONS R, COUNTRIES CO,  CUSTOMERS CU
  363. WHERE R.REGION_ID = CO.REGION_ID AND CU.COUNTRY_ID = CO.COUNTRY_ID
  364. AND R.NAME = 'Западна Европа'
  365.  
  366. -----------------------------------------------------------------------------------------
  367. ---------------------------------4.7.1. TOP ---------------------------------------------
  368. --  TOP връща първите N реда в неопределен ред, за желаната подредба използваме ORDER BY!
  369. -----------------------------------------------------------------------------------------
  370.  
  371. -- Пример 4-19.
  372. -- 7-те продукта с най-ниска цена.
  373. SELECT TOP 7 *
  374. FROM PRODUCTS
  375. ORDER BY PRICE
  376.  
  377. -- + SIMILAR PRICE TO THE 7-TH
  378. SELECT TOP 7 WITH TIES *
  379. FROM PRODUCTS
  380. ORDER BY PRICE
  381.  
  382. --Задача 01
  383. --Изведи имента на клиентите, които са от 'DE', но не са правили поръчки до момента
  384.  
  385. -----------------------------------------------------------------------------------------
  386. ---------------------------------4.7.2. OFFSET и FETCH ----------------------------------
  387. -----------------------------------------------------------------------------------------
  388.  
  389. /* Пример 4-21.
  390. петимата служители, започвайки от 10-ти ред, подредени по дата на постъпване.
  391. Първата заявка ще покаже всички за демонстрация, втората ще извърши подбора.*/
  392.  SELECT * FROM EMPLOYEES
  393.  ORDER BY HIRE_DATE
  394.  OFFSET 9 ROWS
  395.  FETCH NEXT 5 ROWS ONLY
  396.  
  397. /*Задача 4-12.
  398. вторите 10 най-добре платени служители (подредени по заплата низходящо).*/
  399.  SELECT * FROM EMPLOYEES
  400.  ORDER BY SALARY DESC
  401.  OFFSET 10 ROWS
  402.  FETCH NEXT 10 ROWS ONLY
  403.  
  404. /* Задача 4-13.
  405. Да се изведат име, фамилия и пол на клиентите, направили последните 5 поръчки.*/
  406.  SELECT C.FNAME, C.LNAME, C.GENDER, O.ORDER_DATE
  407.  FROM CUSTOMERS C JOIN ORDERS O
  408.  ON C.CUSTOMER_ID = O.CUSTOMER_ID
  409.  ORDER BY O.ORDER_DATE DESC
  410.  OFFSET 0 ROWS
  411.  FETCH NEXT 5 ROWS ONLY
  412.  
  413.  SELECT TOP 5 C.FNAME, C.LNAME, C.GENDER, O.ORDER_DATE
  414.  FROM CUSTOMERS C JOIN ORDERS O
  415.  ON C.CUSTOMER_ID = O.CUSTOMER_ID
  416.  ORDER BY O.ORDER_DATE DESC
  417.  
  418. ----------------------------------------------------------------------------------------
  419. -----------------------------Изгледи = Views--------------------------------------------
  420. -----------------------------Създаване на изгледи---------------------------------------
  421.  
  422. --Пример 5-1.
  423. --Да се създаде изглед, който съдържа име и фамилия на клиентите, както и
  424. --номер и дата на поръчките, които те са направили.
  425. CREATE VIEW MY_FIST_VIEW
  426. AS
  427. SELECT C.FNAME, C.LNAME, O.ORDER_ID, O.ORDER_DATE
  428. FROM CUSTOMERS C JOIN ORDERS O
  429. ON C.CUSTOMER_ID = O.CUSTOMER_ID
  430.  
  431. SELECT * FROM MY_FIST_VIEW
  432.  
  433. -----------------------------Промяна на изгледи-----------------------------------------
  434. --Пример 5-2.
  435. --Да се модифицира горният изглед така, че да съдържа и колона с името на
  436. --съответния служител, обработил поръчката.
  437. ALTER VIEW MY_FIST_VIEW
  438. AS
  439. SELECT C.FNAME + ' ' + C.LNAME AS CUSTOMER,
  440.        E.FNAME + ' ' + E.LNAME AS EMPLOYEE,
  441.        O.ORDER_ID, O.ORDER_DATE
  442. FROM CUSTOMERS C JOIN ORDERS O ON C.CUSTOMER_ID = O.CUSTOMER_ID
  443.                  JOIN EMPLOYEES E ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  444.  
  445. SELECT * FROM MY_FIST_VIEW
  446.  
  447.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement