Admin
Administrator
Joined: 22 Jun 2009
Posts: 27
Read: 0 topics
Warns: 0/5
|
Posted: Tue 17:44, 05 Dec 2017 Post subject: SQL |
|
|
nieistotna kolejnosc wierszy/krotek ani kolumn/atrybutow
wiele wiele zawsze jako dwie relacje 1:N
pelna nazwa kazdego obiektu jest czteroczlonowa: <nazwa_serwera>.<nazwa_bazy_danych>.<nazwa_schematu>.<nazwa_obiektu>
sprawdzanie jaki schemat jest domyślny
select SCHEMA_NAME() as DefaultSchema;
wybranie calej tabeli z okreslonego schematu z okreslonej bazy
use AdventureWorks2008
go
Select * from Person.Person
tworzenie wlasnych baz danych
CREATE DATABASE Testowa
informacje o liczbie pracowników, pracujących w zespołach wieloosobowych (więcej niż jeden pracownik) w ramach Działu IT. Końcowy wynik posortujemy rosnąco po liczbie pracowników.
SELECT Zespol, COUNT( IdPrac ) AS LiczbaPracowników
FROM dbo.Pracownicy
WHERE Dzial = 'IT'
GROUP BY Zespol
HAVING COUNT ( IdPrac ) > 1
ORDER BY LiczbaPracowników
mogą się w SELECT pojawić np.: DISTINCT – czyli usuwanie duplikatów oraz TOP – ograniczenie wyników
SELECT * FROM (
VALUES (1, 'pierwszy'), (2, 'drugi'), (3, 'trzeci')
) AS Tabelka(Id,Nazwa)
SELECT *
FROM (
SELECT 'raz' AS kolA
UNION
SELECT 'dwa' ) AS Tabelka
select FirstName, LastName from HeadQuarter.AdventureWorks2008.Person.Person
wyswietlanie trzech najbardziej wartosciowych zamowien kazdego klienta wedlug wartosci zamowienia malejaco
USE AdventureWorks2008
Go
SELECT *
FROM
( -- zbiór elementów jako wynik kwerendy (podzapytania)
SELECT o.TotalDue, p.BusinessEntityID, p.LastName, p.FirstName ,
ROW_NUMBER() OVER(Partition by p.BusinessEntityID Order by o.TotalDue DESC) as BestNo
FROM [Person].[Person] p inner join [Sales].[SalesOrderHeader] o
on p.BusinessEntityID= o.SalesPersonID
) as TabelaPosrednia
WHERE BestNo<4
teraz sortuje je wedlug dwoch cech:
ROW_NUMBER() OVER(PARTITION BY PSC.Name ORDER BY P.ListPrice DESC , P.Name ) AS PriceRank
STRONNICOWANIE:
with paging as (
SELECT P.Name Product, P.ListPrice,
ROW_NUMBER() OVER( ORDER BY P.ListPrice DESC) AS Pozycja
FROM Production.Product P
)
-- np. 10 strona, wiersze od 91-100
select * from paging where Pozycja between 91 and 100
go
& AND, | OR (lub) ^ XOR (albo)
select Name, Color, ListPrice
from Production.Product
WHERE ( Color = 'White' OR Color = 'Grey' ) and ListPrice > 9
-- wszystkie rekordy, dla których wartość kolumny City zaczyna się od „par”
select distinct city // distinct usuwa ze zbioru wynikowego duplikaty
from Person.Address
where City LIKE 'par%' // zastepuje ciag znakow
where City LIKE '%par%'
where City LIKE '_par%' // zastepuje jeden dowolny znak
where City LIKE '%ring[td]%' // Wszystkie rekordy zawierające w kolumnie City „ringt” lub „ringd”.
where City LIKE '%ring[^td]%' // zawiera ring i kolejnym znakiem nie jest t lub d.
where City LIKE '[ab][n-p]%' // elementy zaczynające się na a lub b, i mające drugą literę z przedziału n – p.
Te dwa zapisy sa rownowazne:
SELECT SalesOrderNumber, OrderDate, TotalDue
FROM Sales.SalesOrderHeader
WHERE TotalDue >= 870 AND TotalDue <= 1000
And OrderDate >= '2002-01-01' AND OrderDate <= '2002-06-30'
SELECT SalesOrderNumber, OrderDate, TotalDue
FROM Sales.SalesOrderHeader
WHERE TotalDue BETWEEN 870 AND 1000
and OrderDate BETWEEN '2002-01-01' AND'2002-06-30'
Te zapisy sa rownowazne:
where FirstName in('Joan', 'John' ,'Joanna') i where FirstName = 'Joan' or FirstName = 'John' or FirstName = 'Joanna'
where FirstName like 'Jo[ah]%' and LEN(FirstName)<7 //dlugosc stringa
ANY (to to samo co SOME):
SELECT Name,ListPrice
FROM Production.Product
WHERE ListPrice >= ANY // zwraca wartosci wieksze badz rowne od ktoregokolwiek z wynikow podzapytania
(
SELECT MAX (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID)
WHERE ListPrice >= ALL // zwraca wartosci wieksze badz rowne od wszystkich wynikow podzapytania
SELECT Title, Country, COUNT(*) as EmQty, // Count(*) pokazuje nam liczebnosc kazdej grupy
AVG( YEAR(Getdate()) - YEAR(BirthDate) ) as AvgAge, // sr wiek, getdate() zwraca aktualna date, year wyciaga rok
MAX( YEAR(Getdate()) - YEAR(BirthDate) ) as MaxAge, // maks wiek
MIN( YEAR(Getdate()) - YEAR(BirthDate) ) as MinAge // min wiek
from dbo.Employees
GROUP BY Country,Title
ORDER BY AvgAge
trzy sposoby przypisania nowych nazw kolumnom:
select LastName AS Nazwisko, FirstName Imie, LastName [Pierwsze Imię] // [] potrzebne gdy nowa nazwa ma spacje
wszystkie kolumny z jednej tabeli:
select p.*
from dbo.Products as p
inner join dbo.Categories as c on p.CategoryID = c.CategoryID
deklaracja dodatkowego atrybutu (dodawanie kolumny do tabeli):
select LastName, FirstName, 'Oddział 1' as Division
from dbo.Employees
Różnica dat (np. w latach) to datediff:
select LastName, FirstName, BirthDate,
YEAR(BirthDate) as BirthYear,
DATEDIFF(yy, BirthDate, getdate()) as Years
from dbo.Employees
Wykonywanie obliczeń (z zadanym zaokrągleniem):
select UnitPrice, Quantity, Discount,
Round((UnitPrice*Quantity*(1-Discount))*1.23 , 2) as TotalBrutto
from dbo.[Order Details]
złączenie tekstów, operacje na stringach, skracanie nazw:
select LastName + ' ' + FirstName as ImieNazwisko,
LEFT(FirstName,1) + '. ' + LastName as ImieNazwisko2
from dbo.Employees
CASE WHEN THEN i wpisywanie wyników do nowej tabeli:
CASE WHEN Gender = 'F' THEN 'Female'
ELSE 'Male' END as Gender,
CASE WHEN MaritalStatus = 'M' THEN 'Married' END as MarriedSt
Deklarowanie zmiennych:
USE NORTHWIND
GO
declare @stawaVat decimal (2,2)
Set @stawaVat = 0.23
select @stawaVat as Stawka_VAT
select UnitPrice, Quantity, Discount,
(UnitPrice*Quantity*(1-Discount))*(@stawaVat+1) as TotalBrutto // mozemy uzywac naszych zmiennych do obliczen ale z @
from dbo.[Order Details]
Zmienne globalne systemowe:
Select @@Version as Wersja, @@Servername as NazwaSerwera
select DISTINCT FirstName // usuwa duplikaty
select TOP 10 FirstName, LastName // wyswietli pierwsze 10
select TOP 10 PERCENT FirstName, LastName // wysw pierwsze 10% wynikow
Z "remisami" (podium, zawody), [zawsze z order by!!!]:
select TOP 10 WITH TIES FirstName, LastName
from Person.Person
order by LastName
jak mamy
select FirstName as Imie,
LastName as Nazwisko,
to order by Nazwisko, FirstName to to samo co order by 2, 1
mozemy sortowac po kolumnach nieokreslonych w select, czyli (kontynuujac przyklad):
order by Nazwisko, FirstName, BusinessEntityID
sortowanie w kolejnosci losowej:
select FirstName as Imie,
LastName as Nazwisko,
PersonType
from Person.Person
order by NEWID()
albo
select NEWID() as RandomValue ,FirstName as Imie,
LastName as Nazwisko,
PersonType
from Person.Person
order by 1
sortuje rosnaco domyslnie a jesli chcemy malejaco to lecimy:
order by Nazwisko, FirstName DESC
sortowanie stringow (a<A, a<ą, PACZEK jest przed pączek):
select * from collate_test
order by opis collate Polish_CS_AI
spłaszczenie stringów do sortowania, czyli zignorowanie polskich znaków i dużych liter:
select * from collate_test
order by opis collate Azeri_Cyrillic_90_CI_AI
zbior wynikowy z pominieciem pierwszych n wierszy:
ORDER BY RN OFFSET 1000 ROWS
Czwarta strona wyników na ktorej wyswietlamy 10 rekordow:
ORDER BY RN OFFSET 30 ROWS
--FETCH FIRST 10 ROWS ONLY -– FIRST/NEXT oraz ROW/ROWS
-- są synonimami zgodnymi ze standardem ANSI
-- możemy je stosować wymiennie
FETCH NEXT 10 ROWS ONLY
wybranie tych pracownikow ktorzy maja samochod (laczenie wewnetrzne tabel)
SELECT *
FROM dbo.EMP as e INNER JOIN dbo.CAR as c ON e.IdPrac=c.IdPrac
laczenie zewnetrzne:
SELECT e.Imie, e.Nazwisko, e.Stanowisko , c.Marka
-- LEFT JOIN oraz LEFT OUTER JOIN oznaczają dokładnie to samo
FROM dbo.EMP e LEFT JOIN dbo.CAR c ON e.IdPrac=c.IdPrac // wtedy mamy pracownikow i informacje czy ma samochod a nie tylko tych
pracownikow ktorzy maja samochod
select c.Marka, c.NrRej, c.Rocznik, e.Imie + ' ' + e.Nazwisko as Pracownik
from dbo.EMP e RIGHT JOIN dbo.CAR c on e.IdPrac=c.IdPrac // tutaj dokladne informacje o samochodach i imienazw pracownika
FULL JOIN to suma right i left:
SELECT e.Imie, e.Nazwisko, e.Stanowisko , c.Marka
-- FULL JOIN to skrót od FULL OUTER JOIN
FROM dbo.EMP e FULL JOIN dbo.CAR c ON e.IdPrac=c.IdPrac
opcja Include Actual Execution Plan pozwala sledzic plan wykonania polecen
OPTION (FORCE ORDER) dodane na koncu kodu wymusza wykonywanie polecen od lewej do prawej
jakiekolwiek porownanie z nullem daje null daltego jak piszemy zeby wyswietlil te ktore != null to nie wyswietli niczego bo to daje null. porownanie null z null tez daje null
dlatego zamiast tego musimy uzywac:
where Region IS NOT NULL
Wszystkie operacje z udziałem wartości nieznanej – dają zawsze w wyniku NULL
NULL cd- zastapienie pustym stringiem
SELECT FirstName + ' ' + ISNULL(MiddleName,'') + ' ' + LastName AS FullName
FROM Person.Person
COALESCE ( wartosc_1 , wartosc_2 … wartosc_n ) – zwraca pierwszą nie-nullową wartość z listy
NULLIF (wartosc1, wartosc2) – porównuje dwie wartości i zwraca NULL jeśli są równe
operacje pionowe:
UNION – suma zbiorów
EXCEPT – odejmowanie zbiorów
INTERSECT – iloczyn (część wspólna)
ABC i CDE:
UNION: ABCDE
UNION ALL: ABCCDE
EXCEPT: AB
INTERSECT: C (istnieje tez intersect distinct usuwajacy duplikaty)
laczenie kwerend o roznej liczbie kolumn:
select kol1, kol2, kol3
From tabela1
union
select kol1, kol2, NULL
from tabela2
WIELOKROTNE GRUPOWANIE
GROUP BY ROLLUP( Year(Orderdate) , DatePart(q,Orderdate) ) // 2 rzeczy wpisane wiec 3 operacje
GROUP BY CUBE(Year(Orderdate) , DatePart(q,Orderdate)) // 2 rzeczy wpisane, wiec 2^2 operacji
SUBSTRINGI WYCINKI
SELECT PESEL FROM moje_dane
substr(PESEL,1,2) as rok
1900 + cast(substr(PESEL,1,2) as float) as rok, //(1,2) oznacza ze zaczynamy od pierwszej cyfry i bierzemy dwie kolejne
KWANTYLE
quantile(AVG_DOCH_NETTO,75)
liczy nam wszystkie rekordy danych typów wykszałcenia, COUNT(*) zlicza nam każdą kolumnę tabeli
SELECT COUNT(WYKSZTALCENIE) FROM moje_dane
GROUP BY WYKSZTALCENIE
SORTOWANIE PO SUBSTRINGACH
order by substr(PESEL, length(PESEL)-1,2)
SUMA BIEŻĄCA CZĘŚCIOWA wyliczanie sumy bieżącej dla wartości kolumny
SELECT SUM(AVG_DOCH_NETTO) FROM moje_dane
AS RUNNING_TOTAL
REGEXP - sprawdzenie czy dane w kolumnie mają pożądany format
-- . - obojętna wartość, \d - cyfry, \s - spacja bądź tab, możemy też po prostu wpisac spację,
-- \w - litery, \D,\S,\W - zaprzeczenie dowolnego po prostu z wielkiej litery
-- 3? - czy występuje bądź nie dana wartość, (0000)? - czy występują bądź nie, wiele wartości
-- wtedy zwraca nam wartość 1 jeśli dana wartość występuja lub nie występuje
-- ponieważ kropka jest znakiem specjalnym musimy użyć \. aby program wiedział, że chodzi nam o kropkę
-- w ten sposób możemy wyszukać niepożądane wartości: WHERE WOJ_ZAMIESZ NOT REGEXP ...
-- 0{n} - chcemy aby wartość 0 wystąpiła przed naszym ciągiem znaków dokładnie n razy
-- 0{n,m} - od n do m razy
-- \s+ - występuje jeden lub więcej razy
-- REGEXP '[aąbcćdeęfghijklłmnńoóprsśtuwxyzżź]\w' w ten sposób zadajemy zbiór, z którego chcemy żeby występowały nam znaki
-- '(\w{3})\.\s\w{5,15}' - jeśli wrzucimy jakieś wyrażenie w nawias okragły to program zapamiętuje dokłandnie to słowo,
--które tam jest, pózniej jeśli chcemy zadać właśnie to słowo to używamy z \1 - program numeruje te nawiasy lub też
-- (?1) - jeśli chcemy odwołać się nie do wartości, a to samej formuły
WHERE TEL_KOM NOT REGEXP '\+48\d{9}' AND TEL_KOM NOT REGEXP '\d{9}'
-- .* - zero lub dowolna ilość powtórzeń dowolnego znaku, zadajemy z jakiej zmiennej, 1 odnosi się do tej wartości którą chcemy stamtąd wyciągnąć
SELECT WOJ_ZAMIESZ, REGEXP_GROUP ('.*(\d{9}).*',WOJ_ZAMIESZ, 1) FROM moje_dane
? 0 or 1, greedy
-- ?+ 0 or 1, possessive
-- ?? 0 or 1, lazy
-- * 0 or more, greedy
-- *+ 0 or more, possessive
-- *? 0 or more, lazy
-- + 1 or more, greedy
-- ++ 1 or more, possessive
-- +? 1 or more, lazy
-- {n} exactly n
-- {n,m} at least n, no more than m, greedy
-- {n,m}+ at least n, no more than m, possessive
-- {n,m}? at least n, no more than m, lazy
-- {n,} n or more, greedy
-- {n,}+ n or more, possessive
-- {n,}? n or more, lazy
Greedy: As Many As Possible (longest match)
Lazy: As Few As Possible (shortest match)
Possessive: Don't Give Up Characters
#terauser = 'ti08498'
#terapass = 'xxxxxx'
UPDATE pracownicy
SET pensja = pensja * 1.1
WHERE staz > 2;
Podwyższa o 10% pensję (SET pensja = pensja * 1.1) pracownikom, których staż jest większy niż 2 (np. lata).
DELETE FROM pracownicy
WHERE imie = 'Jan' AND nazwisko = 'Kowalski';
Usuwa z tabeli „pracownicy” wszystkie wiersze (rekordy) dotyczące pracownika o imieniu „Jan” i nazwisku „Kowalski” (czyli takie, w których pole "imię" ma wartość Jan, a pole "nazwisko" – Kowalski).
CREATE TABLE pracownicy
(
imie varchar(255),
nazwisko varchar(255),
pensja float,
staz int
);
Tworzy tabelę „pracownicy” zawierającą pola tekstowe zmiennej długości (varchar) o nazwach „imie” (imię) i „nazwisko”, o maksymalnej długości 255 znaków, zapisaną za pomocą liczby rzeczywistej (float od ang. floating point) pensję oraz zapisany za pomocą liczby całkowitej (int od ang. integer) staż.
DROP TABLE pracownicy;
Usuwa z bazy tabelę „pracownicy”.
ALTER TABLE pracownicy
ADD dzial varchar(255);
Dodaje do struktury tabeli „pracownicy” kolumnę „dzial” (dział), jako pole tekstowe o długości maks. 255 bajtów.
-- Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )
CAST(9.5 AS decimal(6,4)) AS decimal;
-- Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
CONVERT(decimal(6,4), 9.5) AS decimal;
IIF:
DECLARE @a int = 45, @b int = 40;
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result;
Result
--------
TRUE [/b]
CHOOSE:
USE AdventureWorks2012;
GO
SELECT ProductCategoryID, CHOOSE (ProductCategoryID, 'A','B','C','D','E') AS Expression1
FROM Production.ProductCategory;
Last value i first value
USE AdventureWorks2012;
GO
SELECT Department, LastName, Rate, HireDate,
LAST_VALUE(HireDate) OVER (PARTITION BY Department ORDER BY Rate) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph
ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services',N'Document Control');
Lag pomaga brać poprzednią (lub którąś z poprzednich) wartość z danej kolumny: lag(skąd, ile wierszy wstecz, co zwrocic jesli null)
LEAD dziala podobnie tylko w druga strone (nastepne wiersze)
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,
LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');
stdev odchylenie standardowe
stdevp odchstand w populacji
SELECT STDEVP (DISTINCT Quantity) AS Distinct_Values, STDEVP(Quantity) AS All_Values
suma częściowa i średnia częściowa
movingavg i cumulativetotal w sqlfunctions
percentyle (mozna tym mediane i kwantyle)
,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianDisc
ta druga zwraca wartosc ktora na pewno jest w zbiorze a pierwsza usrednia dwie srodkowe (?)
zwracanie jakiegos wycinka daty np. roku miesiaca kwartalu dnia (dzien) sekundy minuty tygodnia
datename(datepart, date)
zwraca ostatni dzien miesiaca
DECLARE @date DATETIME = '12/1/2011';
SELECT EOMONTH ( @date ) AS Result;
dodawanie wierszy rekordów do tabeli
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
wartosci bezwzgledne (moduly)
SELECT ABS(-1.0), ABS(0.0), ABS(1.0);
najwieksza calkowita wieksza badz rowna zadanej (sufit)
i podloga
CEILING ( numeric_expression )
FLOOR ( numeric_expression )
eksponenta liczba eulera logarytm ln logarytm naturalny
SELECT EXP( LOG(20)), LOG( EXP(20))
potegi potegowanie
POWER ( float_expression , y )
okreslanie znaku (-1 dla ujemnych 0 dla 0 1 dla dodatnich, signum)
SIGN ( numeric_expression )
SELECT CONCAT(hd, ' Gb') volume FROM PC WHERE model=1232;
to to samo co
SELECT CAST(hd AS VARCHAR) + ' Gb' volume FROM PC WHERE model = 1232;
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
tworzenie własnych funkcji funkcje
CREATE FUNCTION dbo.LiczbaDniRoboczych
(
-- Funkcja nie uwzględnia świąt, innych dni wolnych poza sobotą i niedzielą
-- określenie parametrów wejściowych – są opcjonalne
-- u nas konieczne są dwa, określające zakres dat
@StartDate datetime,
@EndDate datetime
)
-- określenie typu zwracanej wartości (to obowiązkowo)
RETURNS int
AS
-- ciało funkcji
BEGIN
RETURN (DATEDIFF(dd, @StartDate, @EndDate) + 1)
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = DATENAME(dw,6) THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @EndDate) = DATENAME(dw,5) THEN 1 ELSE 0 END)
END;
wywoływanie funkcji wywołanie
SELECT OrderId, OrderDate, ShippedDate,
dbo.LiczbaDniRoboczych(OrderDate, ShippedDate) as WorkingDays
pivot
select *
from
(
select *
from
(
select top 3 with ties trip_no, ROW_NUMBER() OVER(Order by trip_no DESC) as BestNo
from trip
order by trip_no desc
) as a
union
select *
from
(
select top 3 with ties trip_no, 3+ ROW_NUMBER() OVER(Order by trip_no asc) as BestNo
from trip
order by trip_no asc
) as b
) as c
pivot(min(trip_no) for bestno in([4],[5],[6],[3],[2],[1])) as pvt
The post has been approved 0 times
Last edited by Admin on Fri 13:14, 29 Dec 2017; edited 29 times in total
|
|