Miesięczne archiwum: Kwiecień 2017

SQL INSERT INTO SELECT

Chciałbym Wam dzisiaj opisać działanie składni INSERT INTO SELECT. Jak już widzimy po słowach kluczowych coś wstawiamy (INSERT) i określamy skąd i co wrzucamy (SELECT). Żeby jakieś dane wziąć i gdzieś dodać musimy określić dwie rzeczy źródło i zakres danych do pobrania oraz cel, czyli gdzie te pobrane dane chcemy "wrzucić". To gdzie chcemy "wrzucić" określamy po słówkach INSERT INTO, a to co i skąd chcemy pobrać określamy po słówku SELECT, tutaj będziemy konstruowali po prostu zapytanie. Składnia całej konstrukcji poniżej. PAMIĘTAJ, że struktura danych kopiowanych i struktura danych do której te dane kopiujemy muszą być zgodne.


    


Składnia SQL INSERT INTO SELECT

INSERT INTO tabela_cel(nazwy_kolumn_po_przecinkach)
SELECT nazwy_kolumn_po_przecinkach FROM tabela_źródło
— opcjonalnie możemy dodać "sekcję" WHERE


Przykład zastosowania INSERT INTO SELECT (baza: Northwind)

Do przykładu wykorzystamy treningową bazę Northwind. Dodamy do niej nową tabelę "Customers_tmp" z kolumnami (CustomersID, CompanyName, City). Zrzut z tworzenia tabeli poniżej.

sql-insert-into-select

Teraz "skopiujemy" rekord o CustomersID = 'ALFKI' z tabeli Customers (ale tylko dane z kolumn: CustomersID, CompanyName, City) do tabeli "Customers_tmp" z takimi samymi kolumnami. Zapytanie poniżej.

INSERT INTO Customers_tmp
SELECT CustomerID, CompanyName, City FROM Customers WHERE CustomerID = 'ALFKI'

czyli do tabeli "Customers_tmp" wrzucimy dane z rekordu o CustomersID = 'ALFKI z tabeli "Customers", ale tylko dane z kolumn: CustomerID, CompanyName, City.
Uruchamiamy zapytanie i o poprawności wykonania zapytania mówi nam komunikat poniżej.

sql-insert-into-select

teraz żeby sprawdzić czy wszystko zadziałało musimy odpytać tabelę "Customers_tmp" o wszystkie rekordy.

SELECT
    *
FROM
    Customers_tmp

wynik zapytania poniżej

sql-insert-into-select

Na zrzucie widzimy, że w tabeli "Customers_tmp" znajdują się nowe dane, co potwiedza poprawność działania naszego zapytani.


Przykład zastosowania INSERT INTO SELECT (baza: Adventureworks)

W poprzednim przykładzie kopiowaliśmy tylko jeden rekord. Teraz spóbujmy skopiować więcej rekordow i do tego celu wykorzystam bazę AdventureWorks2008R2.

Tworzymy nową tabelę o nazwie "Person_SP" (skrót SP od Sales Person) do której będziemy kopiowali osoby z tabeli "Person.Person" ale tylko takie którę są sprzedawcami. Zakres kopiowanych danych to: BusinessEntityID, FirstName, LastName.

Tworzymy nową tabelę "Person_SP"

sql-insert-into-select

Teraz tworzymy strukturę z INSERT INTO SELECT gdzie w części SELECT zbudujemy zapytanie które pobierze nam dane (BusinessEntityID, FirstName, LastName) o osobach które sa sprzedawcami.

INSERT INTO Person_SP
SELECT BusinessEntityID, FirstName, LastName FROM Person.Person WHERE PersonType = 'SP'

W tabeli "Person.Person" takich osób jest 17 więc dane tylu osób powinny być skopiowane do tabeli "Person_SP"

Uruchamiamy zapytanie (F5).
Powinniśmy otrzymać komunikat o poprawnym wykonaniu naszej konstrukcji.

sql-insert-into-select

Teraz żeby sprawdzić czy w tabeli "Person_SP" jest 17 rekordów z danymi budujemy zapytanie.

SELECT
    *
FROM
    Person_SP

Wynikiem zapytanie powinno wyć wygenerowanie 17-tu rekordow, co widzimy na zrzucie poniżej.

sql-insert-into-select

 


    

Adventureworks 37. Oblicz i wyświetl wartość pierwszego i ostatniego zamówienia.

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Baza: AdventureWorks

Zadanie nr: 37

Treść:  Oblicz i wyświetl wartość pierwszego i ostatniego zamówienia.

Polecenia/funkcje w zapytaniu: SELECT, SELECT TOP, FROM, ORDER BY, GROUP BY, JOIN, SUM()


SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.


Rozwiązanie:

Pomocniczy schemat

Adventureworks 37. Oblicz i wyświetl wartość pierwszego i ostatniego zamówienia.

Zapytanie:

    SELECT
         'Pierwsze zamówienie' AS Info
        ,SUM(OD.OrderQty*OD.UnitPrice)AS Wartosc
    FROM    
        (
        SELECT TOP 1 O.SalesOrderID
        FROM Sales.SalesOrderHeader O
        ORDER BY O.OrderDate, SalesOrderID
        ) AS SQ
        JOIN Sales.SalesOrderHeader OH ON SQ.SalesOrderID = OH.SalesOrderID
        JOIN Sales.SalesOrderDetail OD ON SQ.SalesOrderID = OD.SalesOrderID
    GROUP BY
        OH.SalesOrderID

    UNION ALL

       SELECT
         'Ostatnie zamówienie' AS Info
        ,SUM(OD.OrderQty*OD.UnitPrice)AS Wartosc
    FROM    
        (
        SELECT TOP 1 O.SalesOrderID
        FROM Sales.SalesOrderHeader O
        ORDER BY O.OrderDate DESC, SalesOrderID DESC
        ) AS SQ
        JOIN Sales.SalesOrderHeader OH ON SQ.SalesOrderID = OH.SalesOrderID
        JOIN Sales.SalesOrderDetail OD ON SQ.SalesOrderID = OD.SalesOrderID
    GROUP BY
        OH.SalesOrderID

Wynik:

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Pobierz skrypt sql


SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.


 

Adventureworks 36. Jak prezentowała się liczba zamówień w poszczególnych latach dla sklepu „Twin Cycles”

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Baza: AdventureWorks

Zadanie nr: 36

Treść:  Jak prezentowała się liczba zamówień w poszczególnych latach dla sklepu "Twin Cycles". Liczbe zamówień pogrupuj wg lat rosnąco.

Polecenia/funkcje w zapytaniu: SELECT, FROM, WHERE, GROUP BY, YEAR(), COUNT()


SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.


Rozwiązanie:

Pomocniczy schemat

Adventureworks 36. Jak prezentowała się liczba zamówień w poszczególnych latach dla sklepu "Twin Cycles"

Zapytanie:

SELECT
     S.Name AS NazwaSklepu
    ,YEAR(O.OrderDate) AS Rok
    ,COUNT(*) AS IloscZamowien
FROM
    Sales.SalesOrderHeader O
    JOIN Sales.Customer C ON O.CustomerID = C.CustomerID
    JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID
WHERE
    S.Name = 'Twin Cycles'        
GROUP BY
    S.Name, YEAR(O.OrderDate)

Wynik:

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Pobierz skrypt sql


SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.36. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.


 

Co zawiera jabłko i jego właściwości.

Co zawiera jabłko i jego właściwości.

Co zawiera jabłko i jego właściwości

Jabłko to jedno z najpopularniejszych owoców w naszym kraju. Chyba nie ma osoby która nie zjadłaby choćby jednego jabłka w swoim życiu. Każdy znajdzie coś dla siebie, jedni lubią odmiany kwaśne, inni lubią odmiany słodkie i soczyste. Ja najbardziej lubię odmiany cortland i jonathan. Od młodych lat słyszymy jedz jabłka bo są zdrowe. W niektórych krajach są nawet powiedzenia nt. jabłek np. anglicy mają takie "

An apple a day keeps the doctor away.
(w wolnym tłumaczeniu: Jedno jabłko dziennie utrzyma Cię z dala od lekarza.)

Ale co tam naprawdę zawiera jabłko?

Co zawiera jabłko i jego właściwości. antyoksydanty
Co zawiera jabłko i jego właściwości. pektyna
Co zawiera jabłko i jego właściwości. białko
Co zawiera jabłko i jego właściwości. błonnik
Co zawiera jabłko i jego właściwości. kwas askorbinowy
Co zawiera jabłko i jego właściwości. potas
Co zawiera jabłko i jego właściwości. wapń
Co zawiera jabłko i jego właściwości. witamina A
Co zawiera jabłko i jego właściwości. witamina C

Jakie właściwości przypisuje się jabłku?

Co zawiera jabłko i jego właściwości. działania antynowotworowe (szczególnie przy nowotworach: wątroby, jelita oraz piersi)
Co zawiera jabłko i jego właściwości. oczyszcza organizm ze szkodliwych substancji
Co zawiera jabłko i jego właściwości. poprawia trawienie
Co zawiera jabłko i jego właściwości. wspomaga wypróżnianie

Uwaga

Co zawiera jabłko i jego właściwości. Pamiętaj przed spożyciem zawsze umyj jabłko
Co zawiera jabłko i jego właściwości. Jabłka mogą powodować wzdęcia i bóle brzucha, wtedy ogranicz ich spożywanie

Zobacz także:

Właściwości lecznicze czosnku.
Właściwości lecznicze pokrzywy.

T-SQL pętla WHILE

[T-SQL] Pętla WHILE służy do wielokrotnego wykonywania fragmentu kodu, aż do momentu spełnienia zadeklarowanego przez nas warunku.

Składnia T-SQL WHILE

WHILE warunek
    BIGIN
        fragment kodu który będzie się powtarzał
        — w pętli musimy także "odnieść" się do
        — warunku żeby np. zwiększyć wartość zmiennej
        — która występuje w warunku w celu
        — żeby w konsekwencji warunek został spełniony
    END

Przykład.

5 razy wyświetl komunikat "To jest wiersz …" i za każdym razem w miejsce kropek wstaw wartość ze zmiennej @liczba którą inkrementuj o "1" za każdym przejściem pętli WHILE.

DECLARE @liczba int = 1;

WHILE @liczba <6
    BEGIN
        print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
        SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
    END

Poniżej wynik uruchomienia zapytania.

sql t-sql adventureworks tutorial practical exercises examples pętla while

pętle WHILE oczywiście możemy zagnieżdżać przykład poniżej

DECLARE @liczba int = 1;
DECLARE @liczba2 int = 1;

WHILE @liczba2 <5
    BEGIN
        print 'Pętla "zewnętrzna" wykonała się '+ CAST(@liczba2 AS VARCHAR) + ' razy'
        WHILE @liczba <6
            BEGIN
                print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
                SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
            END
        SET @liczba = 1
        SET @liczba2 += 1            
    END

Poniżej efekt uruchomienie zapytania

sql t-sql adventureworks tutorial practical exercises examples pętla while

 

Musimy jednak pamiętać o jednej bardzo ważnej rzeczy. W kodzie do pętli "zewnętrznej" (po wykonaniu się pętli "wewnętrznej") musimy ustawić licznik pętli "wewnętrznej" na wartość początkową, bo w przeciwnym razie pętla "wewnętrzna" wykona się tylko jednej raz przy pierwszym przejściu pętli "zewnętrznej".


Często się zdarza, że chcemy wykonać kod w pętli (i chcemy wykorzystać pętlę WHILE) w zależności czy zaistnieją jakieś okoliczności czy też nie np. chcemy zmodyfikować rekord ale nie wiemy czy któryś spełnia warunki wyszukiwania (do późniejszej modyfikacji). Wtedy w warunku do pętli WHILE możemy zastosować funkcję EXIST().

Przy pętlach WHILE musimy pamiętać, że w kodzie w środku pętli musi być taki kod który będzie w jakiś sposób modyfikował warunek bo inaczej zapętlimy pętle i będzie się ona wykonywała w nieskończoność.

Przykład.
W tabeli TabA zamień wszystkie wartości w kolumnie wartość które są równe 'dwa' na wartość 'cztery'.

 DECLARE @identyfikator int;
  WHILE EXISTS(SELECT TOP 1 id FROM TabA WHERE wartosc = 'dwa')
    BEGIN    
        SELECT TOP 1 @identyfikator = id FROM TabA WHERE wartosc = 'dwa'
        UPDATE TabA SET wartosc = 'cztery' WHERE id = @identyfikator
    END

zwróć uwagę że pętla wykona się tyle razy ile razy znajdzie rekord do zmiany (czyli gdzie w kolumnie "wartosc" znajdzie wartość 'dwa'). Jeżeli we wszystkich rekordach zamienimy 'dwa' na 'cztery' to wtedy warunek nie będzie już spełniony i pętla się zakończy.

A co by się stało gdyby warunek w pętli zmienić na EXISTS(SELECT TOP 1 id FROM TabA WHERE id = 1). Wtedy zapętlimy pętlę bo w pętli nigdzie nie modyfikujemy wartości id rekordu o wartości 1 (ID=1).


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.

Adventureworks 35. Wyświetl klientów którzy złożyli największą liczbę zamówień.

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Baza: AdventureWorks

Zadanie nr: 35

Treść:  Wyświetl klienta/ów który złożył największą liczbę zamówień.
    – jeżeli więcej klientów złożyło taką samą liczbę zamówień wyświetl wszystkich
    – Wyniki posortuj id_klienta (rosnąco)
    – policz tylko te zamówienia które są związane z jakimś sklepem        
    
    Wyniki wyświetl w formacie: identyfikator klienta, nazwa sklepu, liczba zamówień.

Polecenia/funkcje w zapytaniu: SELECT, SELECT TOP 1, FROM, GROUP BY, ORDER BY, SUM(), COUNT()


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.


Rozwiązanie:

Pomocniczy schemat

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Zapytanie:

DECLARE @ile int =
        (
            SELECT TOP 1
                COUNT(*)AS LiczbaZamowien
            FROM    
                Sales.SalesOrderHeader O
                JOIN Sales.Customer C ON O.CustomerID = C.CustomerID
                JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID
            GROUP BY
                O.CustomerID, S.Name
            ORDER BY
                COUNT(*) DESC, O.CustomerID
        );

    SELECT
          O.CustomerID AS ID_Klienta
         ,S.Name AS NazwaSklepu
         ,COUNT(*)AS LiczbaZamowien
    FROM    
        Sales.SalesOrderHeader O
        JOIN Sales.Customer C ON O.CustomerID = C.CustomerID
        JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID
    GROUP BY
        O.CustomerID, S.Name
    HAVING
        COUNT(*)= @ile        
    ORDER BY
        COUNT(*) DESC, O.CustomerID

Wynik:

SQL tutorial. AdventureWorks exercises. SQL SERVER.

Pobierz skrypt sql


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER. SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.