Advertisement
S_Madanska

27.10.22

Oct 27th, 2022 (edited)
1,238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 12.00 KB | None | 0 0
  1. -------------------------------------------------------------------------------------------
  2. ------------------------------------ JOIN -------------------------------------------------
  3. --JOIN се използва за извличане на данни от две или повече таблици, като редовете им се
  4. --комбинират чрез логическа връзка между таблиците, която може да бъде във FROM или WHERE.
  5. --Обикновено тази връзка е първичен/външен ключ, но не задължително.
  6.  
  7. -------------------------------------INNER JOIN или просто JOIN-----------------------------
  8. --Извежда редовете от две/повече таблици, които имат съвпадащи стойности в колоните,
  9. --посочени в условието за сравнение.
  10.  
  11. --Пример 4-10.
  12. --  Да се изведат държавите и регионите, в които се намират.
  13.     SELECT * FROM COUNTRIES  --29
  14.     SELECT * FROM REGIONS    --6
  15.  
  16.     SELECT *
  17.     FROM COUNTRIES JOIN REGIONS
  18.     ON COUNTRIES.REGION_ID = REGIONS.REGION_ID
  19.  
  20.     SELECT *
  21.     FROM COUNTRIES , REGIONS
  22.     WHERE COUNTRIES.REGION_ID = REGIONS.REGION_ID
  23.  
  24.     -- Пример 4-11.
  25.     -- Изведи имена на клиенти,
  26.     -- имена на държавите от които са,
  27.     -- и имена на регионите на държавите.
  28.  
  29.     --1
  30.     SELECT FNAME, LNAME , REGIONS.NAME, COUNTRIES.NAME
  31.     FROM COUNTRIES , REGIONS, CUSTOMERS
  32.     WHERE COUNTRIES.REGION_ID = REGIONS.REGION_ID
  33.         AND CUSTOMERS.COUNTRY_ID = COUNTRIES.COUNTRY_ID
  34.  
  35.     --2
  36.     SELECT FNAME, LNAME , R.NAME, CO.NAME
  37.     FROM COUNTRIES CO , REGIONS R, CUSTOMERS CU
  38.     WHERE CO.REGION_ID = R.REGION_ID
  39.         AND CU.COUNTRY_ID = CO.COUNTRY_ID
  40.  
  41.     --3
  42.     SELECT FNAME, LNAME , R.NAME, CO.NAME
  43.     FROM COUNTRIES CO JOIN REGIONS R    ON CO.REGION_ID = R.REGION_ID
  44.                       JOIN CUSTOMERS CU ON CU.COUNTRY_ID = CO.COUNTRY_ID
  45.    
  46.  
  47. -----------------------------------------------------------------------------------------
  48. ------------------------OUTER JOIN. Видове: LEFT/RIGHT/FULL------------------------------
  49. -----------------------------------------------------------------------------------------
  50.    
  51.     -- Пример 4-12.
  52.     -- Да се изведат регионите и държавите, които се намират в тях. Резултатният
  53.     -- набор да включва и регионите, в които няма въведени държави.
  54.     --1
  55.     SELECT *
  56.     FROM REGIONS R LEFT JOIN COUNTRIES C
  57.     ON R.REGION_ID = C.REGION_ID
  58.  
  59.     --2
  60.     SELECT R.* , C.*
  61.     FROM COUNTRIES C  RIGHT JOIN REGIONS R
  62.     ON R.REGION_ID = C.REGION_ID
  63.  
  64.     -- Пример 4-13.
  65.     -- Да се изведат държавите и регионите, в които се намират.
  66.     -- Резултатният набор да включва държавите, за които няма въведен регион.
  67.     --1
  68.     SELECT *
  69.     FROM REGIONS R RIGHT JOIN COUNTRIES C
  70.     ON R.REGION_ID = C.REGION_ID
  71.  
  72.     --2
  73.     SELECT *
  74.     FROM  COUNTRIES C LEFT JOIN REGIONS R
  75.     ON R.REGION_ID = C.REGION_ID
  76.  
  77.     -- Пример 4-14.
  78.     -- Да се изведат държавите и регионите, в които се намират.
  79.     -- Резултатният набор да включва държавите, за които няма въведен регион и регионите,
  80.     -- за които няма въведени държави.
  81.  
  82.     SELECT *
  83.     FROM REGIONS R FULL JOIN COUNTRIES C
  84.     ON R.REGION_ID = C.REGION_ID
  85.     -------------------------------------------------------------------------------------
  86.  
  87.     --#1.
  88.     --Изведете наименуванията на длъжностите с минимална заплата над 5000.
  89.     --Сортирайте резултатния набор по мин. заплата низходящо.
  90.     SELECT JOB_TITLE, MIN_SALARY
  91.     FROM JOBS
  92.     WHERE MIN_SALARY > 5000
  93.     ORDER BY MIN_SALARY DESC
  94.  
  95.     --#2.
  96.     --Изведете имената на служителите, наименованията на длъжностите им,
  97.     --и имената на отделите, в които работят.
  98.  
  99.             -----------------------
  100.             SELECT * FROM EMPLOYEES      --> JOB_ID IS a FOREIGN KEY
  101.                                          --> DEPARTMENT_ID IS a FOREIGN KEY
  102.  
  103.             SELECT * FROM JOBS           --> JOB_ID IS the PRIMARY KEY
  104.             SELECT * FROM DEPARTMENTS    --> DEPARTMENT_ID IS the PRIMARY KEY
  105.             -----------------------
  106.  
  107.  
  108.     --1
  109.     SELECT FNAME,  
  110.            LNAME,
  111.            JOB_TITLE,
  112.            NAME
  113.     FROM EMPLOYEES E, JOBS J, DEPARTMENTS D
  114.     WHERE E.JOB_ID = J.JOB_ID AND D.DEPARTMENT_ID =  E.DEPARTMENT_ID
  115.  
  116.     --2
  117.     SELECT FNAME + ' ' + LNAME AS СЛУЖИТЕЛ,
  118.            JOB_TITLE ДЛЪЖНОСТ,  
  119.            NAME AS ОТДЕЛ
  120.     FROM EMPLOYEES E JOIN  JOBS J ON E.JOB_ID = J.JOB_ID
  121.                      JOIN DEPARTMENTS D ON D.DEPARTMENT_ID =  E.DEPARTMENT_ID
  122.  
  123.     --#3.
  124.     --Извeдете имената и броя поръчки, които са изпълнили служителите,
  125.     --като резултатният набор да включва всички служители и тези, които все още
  126.     --не са изпълнявали поръчки. Сортирайте по броя на поръчките във възходящ ред.
  127.     SELECT * FROM EMPLOYEES
  128.     SELECT * FROM ORDERS
  129.  
  130.     SELECT E.FNAME + ' '+ E.LNAME AS служители,
  131.            COUNT(ORDER_ID) 'броя на поръчките'
  132.     FROM EMPLOYEES E LEFT JOIN ORDERS O
  133.     ON O.EMPLOYEE_ID = E.EMPLOYEE_ID
  134.     GROUP BY E.FNAME + ' '+ E.LNAME, E.EMPLOYEE_ID
  135.     ORDER BY 'броя на поръчките'
  136.  
  137.     --#4.
  138.     --Изведете имена, заплата и идентификатор на длъжност на служителите,
  139.     --които работят в отдел 80 и не са обработвали поръчки до момента;
  140.     SELECT FNAME, LNAME, SALARY, JOB_ID, ORDER_ID
  141.     FROM EMPLOYEES E LEFT JOIN ORDERS O
  142.     ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  143.     WHERE DEPARTMENT_ID = 80 AND ORDER_ID IS NULL
  144.  
  145.  
  146.     --#5.
  147.     --Изведете имената на отделите и съответния брой служители, които работят в тях.
  148.     --Нека в резултатния набор да участват само отделите, които се намират в държави
  149.     --с идентификатор 'BG' или 'DE', като в отделите работят не по-малко от 7 служители.
  150.     --Сортирайте резултатния набор по броя на служителите във възходящ ред.
  151.     SELECT NAME,  
  152.            COUNT(EMPLOYEE_ID) AS 'брой служители'
  153.     FROM DEPARTMENTS D JOIN EMPLOYEES E
  154.     ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
  155.     WHERE COUNTRY_ID IN ('BG', 'DE')
  156.     GROUP BY NAME
  157.     HAVING  COUNT(EMPLOYEE_ID) >= 7
  158.     ORDER BY 'брой служители' ASC
  159.  
  160.     --#6.
  161.     --Изведете идентификаторите на клиентите и общата стойност на поръчките им.
  162.     --Нека участват само клиенти с обща стойност на поръчките над 900000 и под 1500000.
  163.     SELECT O.CUSTOMER_ID,
  164.            SUM(UNIT_PRICE*QUANTITY)  'общата стойност'
  165.     FROM ORDERS O JOIN ORDER_ITEMS OI
  166.     ON O.ORDER_ID = OI.ORDER_ID
  167.     GROUP BY O.CUSTOMER_ID
  168.     HAVING  SUM(UNIT_PRICE*QUANTITY)  BETWEEN 900000  AND 1500000
  169.  
  170.     -------------------------------------------------------------------------------------
  171.     -- Задача 4-8.
  172.     -- Извлечи идентификатори, дати на поръчките и имена на служители, които са ги обработили.
  173.     SELECT O.ORDER_ID, O.ORDER_DATE, E.FNAME, E.LNAME
  174.     FROM EMPLOYEES E JOIN ORDERS O
  175.     ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  176.    
  177.     -- Задача 4-9.
  178.     -- Да се изведат имената на всички клиенти и id на поръчките им.
  179.     -- В резултатния набор да участват и клиентите, които все още не са правили поръчки.
  180.     -- Нека NULL бъде заменена с низа 'none'
  181.  
  182.     --COALESCE or ISNULL
  183.  
  184.     SELECT FNAME, LNAME, ISNULL(CAST(ORDER_ID AS VARCHAR), 'none')
  185.     FROM CUSTOMERS C LEFT JOIN ORDERS O
  186.     ON  O.CUSTOMER_ID = C.CUSTOMER_ID
  187.  
  188.     -- Задача 4-11.
  189.     -- Да се изведат имената на всички клиенти, които са от държави в регион „Западна Европа“
  190.     SELECT FNAME, LNAME, CO.NAME, R.NAME
  191.     FROM CUSTOMERS CU JOIN COUNTRIES CO ON CO.COUNTRY_ID = CU.COUNTRY_ID
  192.                       JOIN REGIONS R ON R.REGION_ID = CO.REGION_ID
  193.     WHERE R.NAME = 'Западна Европа'
  194.  
  195. -----------------------------------------------------------------------------------------
  196. ------------------------------4.6.6. Други JOIN вариации---------------------------------
  197. -----------------------------------------------------------------------------------------
  198.  
  199.     -- Пример 4-15.
  200.     -- Да се изведат държавите и регионите, в които се намират.
  201.         --EQUI-JOIN /=/
  202.         SELECT *
  203.         FROM REGIONS R, COUNTRIES C
  204.         WHERE R.REGION_ID = C.REGION_ID
  205.  
  206.     -- Пример 4-16.
  207.     -- Да се изведат отделите, в които има назначени служители.
  208.         --SEMI-JOIN /IN/EXISTS/
  209.         SELECT NAME
  210.         FROM DEPARTMENTS
  211.         WHERE  DEPARTMENT_ID IN (SELECT DEPARTMENT_ID
  212.                                  FROM EMPLOYEES)
  213.  
  214.     -- Пример 4-17.
  215.     -- Да се изведат имената на клиентите, които все още не са правили поръчки.
  216.         --ANTI-JOIN /NOT IN/NOT EXISTS/
  217.         SELECT FNAME, LNAME
  218.         FROM CUSTOMERS C
  219.         WHERE NOT EXISTS (SELECT *
  220.                           FROM ORDERS O
  221.                           WHERE O.CUSTOMER_ID = C.CUSTOMER_ID)
  222.  
  223.     -- Пример 4-18.
  224.     -- Да се изведат комбинациите от всички региони и държави, сортирани по име на държава.
  225.         --CROSS (CARTESIAN) JOIN
  226.  
  227.         --1
  228.         SELECT * FROM REGIONS CROSS JOIN COUNTRIES
  229.  
  230.         --2
  231.         SELECT * FROM REGIONS, COUNTRIES
  232.  
  233. -----------------------------------------------------------------------------------------
  234. ---------------------------------4.7.1. TOP ---------------------------------------------
  235. -----------------------------------------------------------------------------------------
  236. -- TOP връща първите N реда в неопределен ред => за желана подредба се използва ORDER BY!
  237.  
  238.     --#7.
  239.     --На коя дата е първата направена поръчка за фирмата?
  240.     SELECT TOP 1 ORDER_DATE, ORDER_ID
  241.     FROM ORDERS
  242.     ORDER BY ORDER_DATE ASC
  243.  
  244.     --#8.
  245.     --На коя дата е назначен първият служител на фирмата и какви са неговите имена?
  246.     --Нека в резултатния набор участват и останалите служители назначени на същата дата
  247.     --(ако има такива).
  248.     SELECT TOP 1 WITH TIES FNAME, LNAME, HIRE_DATE
  249.     FROM EMPLOYEES
  250.     ORDER BY HIRE_DATE ASC
  251.  
  252.     --#9.
  253.     --Изведете седемте продукта с най-ниска складова цена.
  254.     SELECT TOP 7 WITH TIES *
  255.     FROM PRODUCTS
  256.     ORDER BY PRICE ASC
  257.  
  258.     --#10.
  259.     --Изведете имената и единичната цена на 7-те продукта с най-ниска цена,
  260.     --на която са били продадени.
  261.     SELECT DISTINCT TOP 7 WITH TIES P.NAME, UNIT_PRICE
  262.     FROM PRODUCTS P JOIN ORDER_ITEMS OI
  263.     ON OI.PRODUCT_ID = P.PRODUCT_ID
  264.     ORDER BY UNIT_PRICE ASC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement