06 - Osnove SQL-a

Šta je SQL?

  • SQL = Structured Query Language
  • SQL je standardni jezik za pristup i manipulaciju bazama podataka

Šta SQL radi?

  • Izvršava upite nad bazom podataka
  • Preuzima podatke iz baze podataka
  • Umeće zapise u bazu podataka
  • Menja zapise u bazi podataka
  • Briše zapise iz baze podataka
  • Kreira nove baze podataka
  • Kreira nove tabele u bazi podataka
  • Kreira uskladištene procedure u bazi podataka
  • Kreira poglede u bazi podataka
  • Postavlja dozvole na tabelama, procedurama i pogledima

Korišćenje SQL-a na sajtu

  • Za izradu sajta koji prikazuje podatke iz baze podataka potrebno je:
    • Program za rad sa relacionim bazama podataka (MS Access, SQL Server, MySQL)
    • Serverski skript jezik, npr. PHP ili ASP
    • SQL za pristup željenim podacima
    • HTML/CSS za sam sajt

SQL sintaksa

  • Tabele
    • Baza podataka sadrži jednu ili više tabela koje se prepoznaju po imenu
    • Tabela je sastavljena od redova podataka (zapisa) i kolona (polja)
  • SQL izraz
    • Većina akcija koje se primenjuju nad bazom podataka vrše se korišćenjem SQL-a
    • SELECT * FROM Customers;
    • SQL ne razlikuje mala i velika slova, ali je uobičajeno da se ključne reči u SQL-u pišu velikim slovima
    • Uglavnom nije obavezno, ali se često svaki SQL izraz završava sa ;
  • Neke važnije naredbe
    • SELECT - Izdvaja podatke iz baze
    • UPDATE - Menja podatke u bazi
    • DELETE - Briše podatke iz baze
    • INSERT INTO - Umeće nove podatke u bazu
    • CREATE DATABASE - Kreira novu bazu podataka
    • ALTER DATABASE - Menja bazu
    • CREATE TABLE - Kreira novu tabelu
    • ALTER TABLE - Menja tabelu
    • DROP TABLE - Briše tabelu
    • CREATE INDEX - Kreira indeks (ključ za pretragu)
    • DROP INDEX - Briše indeks

SELECT

  • SELECT izraz se koristi za izdvajanje podataka iz baze podataka
  • Rezultat se smešta u tabelu rezultata, tzv. result-set
  • SELECT column_name,column_name
    FROM table_name;
  • SELECT * FROM table_name;

SELECT DISTINCT

  • SELECT DISTINCT izraz se koristi za izdvajanje samo međusobno različitih vrednosti
  • SELECT DISTINCT column_name,column_name
    FROM table_name;

WHERE

  • WHERE klauzula se koristi za filtriranje zapisa
  • Pomoću nje se izdvajaju samo oni zapisi koji zadovoljavaju navedeni uslov
  • SELECT column_name,column_name
    FROM table_name
    WHERE column_name operator value;
  • Za tekstualne vrednosti koriste se apostrofi (mada dosta sistema će dozvoliti i navodnike)
  • Operatori
    • = - Jednako
    • <> - Nije jednako, a u nekim verzijama SQL-a koristi se i !=
    • > - Veće od
    • < - Manje od
    • >= - Veće od ili jednako
    • <= - Manje od ili jednako
    • BETWEEN - Između inkluzivnog opsega
    • LIKE - Traži zadati šablon
    • IN - Za nabrajanje više mogućih vrednosti za kolonu

AND i OR

  • Operatori AND i OR se koriste za filtriranje zapisa na osnovu više od jednog uslova
  • AND i OR se mogu i kombinovati korišćenjem zagrada
  • SELECT * FROM Customers
    WHERE Country='Germany'
    AND (City='Berlin' OR City='München');

ORDER BY

  • ORDER BY se koristi za sortiranje rezultata po jednoj ili više kolona
  • Podrazumevani je rastući redosled (ASC), a moguće je zahtevati i opadajući (DESC)
  • SELECT column_name,column_name
    FROM table_name
    ORDER BY column_name,column_name ASC|DESC;

INSERT INTO

  • INSERT INTO izraz se koristi za umetanje novih zapisa u tabelu
  • INSERT INTO table_name
    VALUES (value1,value2,value3,...);
  • INSERT INTO table_name (column1,column2,column3,...)
    VALUES (value1,value2,value3,...);
  • Ako se navede manje kolona/vrednosti one izostavljene će imati vrednost null osim ako nisu Autoincrement polja

UPDATE

  • UPDATE izraz se koristi za menjanje postojećih zapisa u tabeli
  • WHERE klauzula određuje koji će se zapisi menjati, a ako se ona ne koristi menjaju se svi zapisi u tabeli
  • UPDATE table_name
    SET column1=value1,column2=value2,...
    WHERE some_column=some_value;

DELETE

  • DELETE izraz služi za brisanje zapisa u tabeli
  • WHERE klauzula određuje koji će se zapisi brisati, a ako se ona ne koristi brišu se svi zapisi u tabeli
  • DELETE FROM table_name
    WHERE some_column=some_value;
  • DELETE FROM table_name; ili DELETE * FROM table_name;

SQL ubacivanje (Injection)

  • Zlonamerni korisnici mogu da ubace SQL naredbe u SQL izraz korišćenjem polja za unos podataka na stranici
  • Ubačene SQL naredbe tako menjaju SQL izraz da ugrožavaju sigurnost web aplikacije
  • SQL ubacivanje zasnovano na 1=1 je uvek true
    • txtUserId = getRequestString("UserId");
      txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
    • UserId: 105 or 1=1
    • SELECT * FROM Users WHERE UserId = 105 or 1=1
  • SQL ubacivanje zasnovano na ""="" je uvek true
    • uName = getRequestString("UserName");
      uPass = getRequestString("UserPass");
      sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"
    • uName: " or ""="
      uPass: " or ""="
    • SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
  • SQL ubacivanje zasnovano na nanizanim SQL izrazima
    • Većina baza podataka dozvoljava da se više SQL izraza naniže tako što se razdvoje sa ;
    • txtUserId = getRequestString("UserId");
      txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
    • UserId: 105; DROP TABLE Suppliers
    • SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers
  • Korišćenje SQL parametara radi zaštite od ubacivanja
    • SQL parametri su vrednosti koje se dodaju SQL upitu u toku izvršavanja
    • U SQL izrazu označavaju se sa @
    • $stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) 
      VALUES (:nam, :add, :cit)");
      $stmt->bindParam(':nam', $txtNam);
      $stmt->bindParam(':val', $txtAdd);
      $stmt->bindParam(':cit', $txtCit);
      $stmt->execute();

SELECT TOP

  • SELECT TOP klauzula se koristi za ograničavanje broja vraćenih zapisa
  • SELECT TOP number|percent column_name(s)
    FROM table_name;
  • MySQL koristi LIMIT umesto SELECT TOP
  • SELECT column_name(s)
    FROM table_name
    LIMIT number;

LIKE

  • Operator LIKE se koristi u klauzuli WHERE kada se u koloni traži određeni šablon
  • Podržava upotrebu specijalnih znakova
  • SELECT column_name(s)
    FROM table_name
    WHERE column_name LIKE pattern;

SQL specijalni znaci

  • Specijalni znak se može koristiti kao zamena za bilo koji drugi znak/znakove
  • U SQL-u ovi znaci se koriste uz operator LIKE
  • % - Zamena za nula ili više znakova
  • _ - Zamena za jedan znak
  • [charlist] - Skup i opseg znakova za poređenje
  • [^charlist] ili [!charlist] - Uparuje se samo sa znacima koji nisu unutar zagrada

IN

  • Operator IN omogućava da se u klauzuli WHERE navede više vrednosti
  • SELECT column_name(s)
    FROM table_name
    WHERE column_name IN (value1,value2,...);

BETWEEN

  • Operator BETWEEN selektuje vrednosti unutar opsega
  • Vrednosti mogu biti numeričkog, tekstualnog ili datumskog tipa
  • SELECT column_name(s)
    FROM table_name
    WHERE column_name BETWEEN value1 AND value2;
  • SELECT * FROM Orders
    WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;
  • Za negaciju se koristi NOT BETWEEN operator
  • Da li se granične vrednosti uključuju u rezultat zavisi od baze podataka!

SQL alijasi

  • SQL alijasi se koriste da privremeno promene ime tabeli ili koloni u tabeli
  • Obično se koriste kada:
    • Više od jedne tabele se koriste u upitu
    • Koriste se funkcije u upitu
    • Imena kolona su dugačka ili teško razumljiva
    • Dve ili više kolona se kombinuju zajedno
  • Ako ime sadrži razmake koriste se navodnici ili srednje zagrade
  • SELECT column_name(s)
    FROM table_name AS alias_name;
  • SELECT column_name AS alias_name
    FROM table_name;
  • SELECT CustomerName, Address+', '+City+', '+PostalCode+', '+Country AS Address
    FROM Customers;

SQL spojevi (Joins)

  • SQL spojevi se koriste za kombinovanje redova iz dve ili više tabela na osnovu zajedničkog polja
  • Vrste spojeva
    • INNER JOIN - Vraća one redove u kojima zajednička vrednost postoji u obe spojene tabele
    • LEFT JOIN - Vraća sve redove iz prve tabele u odredbi FROM SQL naredbe i samo one redove iz druge tabele u kojima polje spajanja sadrži vrednosti zajedničke za obe tabele
    • RIGHT JOIN - Vraća sve redove iz druge tabele u odredbi FROM SQL naredbe i samo one redove iz prve tabele u kojima polje spoja sadrži vrednosti zajedničke za obe tabele
    • FULL JOIN - Vraća sve redove gde polje sadrži vrednost u jednoj od tabela
  • INNER JOIN
    • SELECT column_name(s)
      FROM table1
      INNER JOIN table2
      ON table1.column_name=table2.column_name;
    • SELECT column_name(s)
      FROM table1
      JOIN table2
      ON table1.column_name=table2.column_name;

inner join

  • LEFT JOIN
    • SELECT column_name(s)
      FROM table1
      LEFT JOIN table2
      ON table1.column_name=table2.column_name;
    • SELECT column_name(s)
      FROM table1
      LEFT OUTER JOIN table2
      ON table1.column_name=table2.column_name;

left join

  • RIGHT JOIN
    • SELECT column_name(s)
      FROM table1
      RIGHT JOIN table2
      ON table1.column_name=table2.column_name;
    • SELECT column_name(s)
      FROM table1
      RIGHT OUTER JOIN table2
      ON table1.column_name=table2.column_name;

right join

  • FULL JOIN
    • SELECT column_name(s)
      FROM table1
      FULL OUTER JOIN table2
      ON table1.column_name=table2.column_name;

full join

UNION

  • Operator UNION kombinuje rezultate dva ili više SELECT izraza
  • SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2;
  • Operator UNION ALL dozvoljava da se vrednosti ponavljaju više puta
  • SELECT column_name(s) FROM table1
    UNION ALL
    SELECT column_name(s) FROM table2;

SELECT INTO

  • Izraz SELECT INTO kopira podatke iz jedne tabele i umeće ih u novu tabelu
  • Nova tabela se formira sa imenima i tipovima kolona kako je definisano u SELECT izrazu, a ako se želi drugačije treba koristiti klauzulu AS
  • SELECT *
    INTO newtable [IN externaldb]
    FROM table1;
  • SELECT column_name(s)
    INTO newtable [IN externaldb]
    FROM table1;

INSERT INTO SELECT

  • Izraz INSERT INTO SELECT kopira podatke iz jedne tabele i umeće ih u postojeću tabelu
  • INSERT INTO table2
    SELECT * FROM table1;
  • INSERT INTO table2
    (column_name(s))
    SELECT column_name(s)
    FROM table1;

CREATE DATABASE

  • Izraz CREATE DATABASE se koristi za kreiranje nove baze podataka
  • CREATE DATABASE dbname;

CREATE TABLE

  • Izraz CREATE TABLE se koristi za kreiranje nove tabele u bazi podataka
  • CREATE TABLE table_name
    (
    column_name1 data_type(size),
    column_name2 data_type(size),
    column_name3 data_type(size),
    ....
    );
    • column_name - Ime kolone u tabeli
    • data_type - Određuje koji tip podataka se može smestiti u kolonu
    • size - Maksimalna dužina podataka u koloni

SQL ograničenja (Constraints)

  • SQL ograničenja se koriste da se definišu pravila za podatke u tabeli
  • Ograničenja se navode prilikom kreiranja tabele (CREATE TABLE) ili prilikom njenog menjanja (ALTER TABLE)
  • CREATE TABLE table_name
    (
    column_name1 data_type(size) constraint_name,
    column_name2 data_type(size) constraint_name,
    column_name3 data_type(size) constraint_name,
    ....
    );
  • Vrste ograničenja
    • NOT NULL - Kolona ne može da sadrži NULL vrednost
    • UNIQUE - Obezbeđuje da svaki red u koloni mora imati jednistvenu vrednost
    • PRIMARY KEY - Kombinacija NOT NULL i UNIQUE, obezbeđuje da kolona, ili kombinacija više kolona, ima jedinstvenu vrednost što olakšava i ubrzava pronalaženje određenog zapisa u tabeli
    • FOREIGN KEY - Obezbeđuje referencijalni integritet podatak u jednoj tabeli koji se uparuju sa vrednostima u drugoj tabeli
    • CHECK - Obezbeđuje da vrednost u koloni ispunjava određeni uslov
    • DEFAULT - Definiše podrazumevanu vrednost polja za slučaj da nije navedna vrednost
  • NOT NULL
    • Ovo ograničenje praktično znači da se za određeno polje uvek mora navesti vrednost pri umetanju novog zapisa ili prilikom menjanja zapisa
    • CREATE TABLE PersonsNotNull
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255)
      )
  • UNIQUE
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      UNIQUE (P_Id)
      )
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
      )
    • ALTER TABLE Persons
      ADD UNIQUE (P_Id)
    • ALTER TABLE Persons
      ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
    • ALTER TABLE Persons
      DROP INDEX uc_PersonID
  • PRIMARY KEY
    • Većina tabela treba da ima primarni ključ i svaka treba da ima samo jedan primarni ključ
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      PRIMARY KEY (P_Id)
      )
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
      )
    • ALTER TABLE Persons
      ADD PRIMARY KEY (P_Id)
    • ALTER TABLE Persons
      ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
    • ALTER TABLE Persons
      DROP PRIMARY KEY
  • FOREIGN KEY
    • FOREIGN KEY iz jedne tabele pokazuje na PRIMARY KEY u drugoj tabeli
    • FOREIGN KEY ograničenje se koristi da se spreče akcije koje mogu da prekinu veze između tabela
    • FOREIGN KEY ograničenje onemogućava da se nevažeći podatak unese u tu kolonu jer on mora da bude jedna od vrednosti koja postoji u koloni na koji pokazuje spoljni ključ
    • CREATE TABLE Orders
      (
      O_Id int NOT NULL,
      OrderNo int NOT NULL,
      P_Id int,
      PRIMARY KEY (O_Id),
      FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
      )
    • CREATE TABLE Orders
      (
      O_Id int NOT NULL,
      OrderNo int NOT NULL,
      P_Id int,
      PRIMARY KEY (O_Id),
      CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
      REFERENCES Persons(P_Id)
      )
    • ALTER TABLE Orders
      ADD FOREIGN KEY (P_Id)
      REFERENCES Persons(P_Id)
    • ALTER TABLE Orders
      ADD CONSTRAINT fk_PerOrders
      FOREIGN KEY (P_Id)
      REFERENCES Persons(P_Id)
    • ALTER TABLE Orders
      DROP FOREIGN KEY fk_PerOrders
  • CHECK
    • Ukoliko se podesi CHECK ograničenje na jednoj koloni onda ono dozvoljava samo određene vrednosti u toj koloni
    • Ukoliko se podesi CHECK ograničenje na tabeli onda je moguće ograniči vrednosti u jednoj koloni na osnovu vrednosti u drugim kolonama
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      CHECK (P_Id>0)
      )
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255),
      CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
      )
    • ALTER TABLE Persons
      ADD CHECK (P_Id>0)
    • ALTER TABLE Persons
      ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
    • ALTER TABLE Persons
      DROP CHECK chk_Person
  • DEFAULT
    • CREATE TABLE Persons
      (
      P_Id int NOT NULL,
      LastName varchar(255) NOT NULL,
      FirstName varchar(255),
      Address varchar(255),
      City varchar(255) DEFAULT 'Sandnes'
      )
    • CREATE TABLE Orders
      (
      O_Id int NOT NULL,
      OrderNo int NOT NULL,
      P_Id int,
      OrderDate date DEFAULT GETDATE()
      )
    • ALTER TABLE Persons
      ALTER City SET DEFAULT 'SANDNES'
    • ALTER TABLE Persons
      ALTER City DROP DEFAULT

CREATE INDEX

  • CREATE INDEX izraz se koristi za kreiranje indeksa za tabelu
  • Indeksi omogućavaju da se podaci brzo pronađu bez potrebe za pretragom cele tabele
  • Korisnici ne vide indekse, oni se samo koriste da ubrzaju pretragu/upite
  • Menjanje podataka u tabeli sa indeksima traje duže nego bez njih, zato je preporuka da se indeksi kreiraju samo na kolonama (i tabelama) koje će se često pretraživati
  • CREATE INDEX index_name
    ON table_name (column_name)
  • CREATE UNIQUE INDEX se koristi za indekse koji ne dozvoljavaju ponavljanje vrednosti
  • CREATE UNIQUE INDEX index_name
    ON table_name (column_name)

DROP

  • Izraz DROP se koristi za brisanje indeksa, tabela i baza podataka
  • ALTER TABLE table_name DROP INDEX index_name
  • DROP TABLE table_name
  • DROP DATABASE database_name
  • TRUNCATE TABLE se koristi kada se želi samo brisanje podataka unutar tabele, a ne cele tabele
    • TRUNCATE TABLE table_name

ALTER TABLE

  • Izraz ALTER TABLE se koristi za dodavanje, brisanje ili menjanje kolona u postojećoj tabeli
  • Dodavanje kolone
    • ALTER TABLE table_name
      ADD column_name datatype
  • Brisanje kolone
    • ALTER TABLE table_name
      DROP COLUMN column_name
  • Promena tipa podataka za kolonu
    • ALTER TABLE table_name
      MODIFY COLUMN column_name datatype

AUTO INCREMENT polje

  • AUTO INCREMENT omogućava generisanje jedinstvenog broja kada se dodaje novi zapis u tabelu
  • Podrazumevano je da AUTO INCREMENT vrednost počinje od 1 i povećava se za po 1 za svaki nowi zapis
  • CREATE TABLE Persons
    (
    ID int NOT NULL AUTO_INCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    PRIMARY KEY (ID)
    )
  • Ako je potrebno da AUTO INCREMENT počne od neke druge vrednosti može se iskoristiti:
    • ALTER TABLE Persons AUTO_INCREMENT=100

SQL pogledi (Views)

  • Pogled je virtuelna tabela zasnovana na rezultatu SQL izraza
  • Kreiranje pogleda
    • CREATE VIEW view_name AS
      SELECT column_name(s)
      FROM table_name
      WHERE condition
  • Ažuriranje pogleda
    • CREATE OR REPLACE VIEW view_name AS
      SELECT column_name(s)
      FROM table_name
      WHERE condition
  • Brisanje pogleda
    • DROP VIEW view_name

SQL datumske funkcije

  • Najteži deo u radu sa datumima je da se obezbedi da je format datuma koji se umeće isti kao format datuma u nekoj koloni u tabeli
  • Jednostavnija varijanta je dok podaci sadrže samo datum, stvari se komplikuju kad se doda i vreme
  • MySQL datumske funkcije:
    • NOW() - Vraća tekući datum i vreme
    • CURDATE() - Vraća tekući datum
    • CURTIME() - Vraća tekuće vreme
    • DATE() - Izdvaja datum iz datumskog ili datumski/vremenskog izraza
    • EXTRACT() - Izdvaja jedan deo datuma/vremena
    • DATE_ADD() - Dodaje određeni vremenski interval datumu
    • DATE_SUB() - Oduzima određeni vremenski interval datumu
    • DATEDIFF() - Vraća broj dana između dva datuma
    • DATE_FORMAT() - Prikazuje datum/vreme u različitim formatima
  • MySQL datumski tipovi podataka
    • DATE - Format YYYY-MM-DD
    • DATETIME - Format YYYY-MM-DD HH:MM:SS
    • TIMESTAMP - Format YYYY-MM-DD HH:MM:SS
    • YEAR - Format YYYY ili YY

NULL vrednosti

  • NULL vrednost predstavlja nedostatak nepoznatog podatka
  • Ako je kolona u tabeli opciona moguće je dodati novi i izmeniti postojeći zapis bez navođenja vrednosti za tu kolonu, pa će ona biti sačuvana sa vrednošću NULL
  • NULL nije isto kao i nula i ne mogu se porediti
  • IS NULL
    • Izdvajaju se zapisi koji imaju NULL vrednost
    • SELECT LastName,FirstName,Address FROM Persons
      WHERE Address IS NULL
  • IS NOT NULL
    • Izdvajaju se zapisi koji imaju vrednost različitu od NULL
    • SELECT LastName,FirstName,Address FROM Persons
      WHERE Address IS NOT NULL

NULL funkcije

  • Potrebno je da se nekako definiše kako se tretiraju NULL vrednosti pri izračunavanju izraza
  • SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
    FROM Products
  • SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
    FROM Products

MySQL tipovi podataka

  • Tekst
    • CHAR(size) - String fiksne dužine, može da sadrži slova, cifre i specijalne znakove, najviše 255 znakova
    • VARCHAR(size) - String promenljive dužine, može da sadrži slova, cifre i specijalne znakove, najviše 255 znakova, ako se navede više od toga pretvara se u TEXT
    • TINYTEXT - String maksimalne dužine 255 zankova
    • TEXT - String maksimalne dužine 65.535 zankova
    • BLOB - Binary Large OBjects, čuva do 65.535 bajtova podataka
    • MEDIUMTEXT - String maksimalne dužine 16.777.215 znakova
    • MEDIUMBLOB - Binary Large OBjects, čuva do 16.777.215 bajtova podataka
    • LONGTEXT - String maksimalne dužine 4.294.967.295 znakova
    • LONGBLOB - Binary Large OBjects, čuva do 4.294.967.295 bajtova podataka
    • ENUM(x,y,z,etc.) - Za unos liste mogućih vrednosti, može se navesti do 65.535 vrednosti; ako se unese vrednost koja nije u listi u tabelu se upiše prazna vrednost
    • SET - Slično kao ENUM osim što SET može da sadrži do 64 stavke i može da čuva više od jedne vrednosti
  • Numeričke vrednosti - navodi se maksimalan broj cifri i decimala
    • TINYINT(size) - od -128 do 127, odnosno od 0 do 255 UNSIGNED
    • SMALLINT(size) - od -32768 do 32767, odnosno od 0 do 65535 UNSIGNED
    • MEDIUMINT(size) - od -8388608 do 8388607, odnosno od 0 to 16777215 UNSIGNED
    • INT(size) - od -2147483648 do 2147483647, odnosno od 0 do 4294967295 UNSIGNED
    • BIGINT(size) - od -9223372036854775808 do 9223372036854775807, odnosno od 0 do 18446744073709551615 UNSIGNED
    • FLOAT(size,d) - Mali broj sa pokretnim zarezom
    • DOUBLE(size,d) - Veliki broj sa pokretnim zarezom
    • DECIMAL(size,d) - DOUBLE sačuvan kao string omogućavajući fiksni zarez
  • Datum
    • DATE() - Datum, format YYYY-MM-DD, od '1000-01-01' do '9999-12-31'
    • DATETIME() - Kombinacija datuma i vremena, format YYYY-MM-DD HH:MM:SS, od '1000-01-01 00:00:00' do '9999-12-31 23:59:59'
    • TIMESTAMP() - Vremenska oznaka, vrednosti se čuvaju kao broj sekundi od '1970-01-01 00:00:00' UTC, format YYYY-MM-DD HH:MM:SS, od '1970-01-01 00:00:01' UTC do '2038-01-09 03:14:07' UTC
    • TIME() - Vreme, format HH:MM:SS, od '-838:59:59' do '838:59:59'
    • YEAR() - Godina sa dve ili četiri cifre, od 1901 do 2155 ili od 70 do 69 (1970 do 2069)

SQL funkcije

  • Agregatne funkcije vraćaju jednu vrednost izračunatu na osnovu vrednosti u koloni
    • AVG() - Prosečna vrednost
    • COUNT() - Broj redova
    • FIRST() - Prva vrednost
    • LAST() - Poslednja vrednost
    • MAX() - Najveća vrednost
    • MIN() - Najmanja vrednost
    • SUM() - Suma vrednosti
  • Skalarne funkcije vraćaju jednu vrednost na osnovu unete vrednosti
    • UCASE() - Pretvara polje u velika slova
    • LCASE() - Pretvara polje u mala slova
    • MID() - Izdbaja znakove iz tekstualnog polja
    • LEN() - Dužina tekstualnog polja
    • ROUND() - Zaokružuje numeričko polje na zadati broj deciala
    • NOW() - Tekući sistemski datum i vreme
    • FORMAT() - Formatira način prikaza polja
  • AVG()
    • SELECT AVG(column_name) FROM table_name
  • COUNT()
    • SELECT COUNT(column_name) FROM table_name;
    • SELECT COUNT(*) FROM table_name;
    • SELECT COUNT(DISTINCT column_name) FROM table_name;
  • FIRST()
    • SELECT FIRST(column_name) FROM table_name;
    • U MySQL-u mora zaobilazni način:
      • SELECT column_name FROM table_name
        ORDER BY column_name ASC
        LIMIT 1;
  • LAST()
    • SELECT LAST(column_name) FROM table_name;
    • U MySQL-u mora zaobilazni način:
      • SELECT column_name FROM table_name
        ORDER BY column_name DESC
        LIMIT 1;
  • MAX()
    • SELECT MAX(column_name) FROM table_name;
  • MIN()
    • SELECT MIN(column_name) FROM table_name;
  • SUM()
    • SELECT SUM(column_name) FROM table_name;
  • GROUP BY izraz se koristi zajedno sa agregatnim funkcijama da bi se krupisao rezultat po jednoj ili više kolona
    • SELECT column_name, aggregate_function(column_name)
      FROM table_name
      WHERE column_name operator value
      GROUP BY column_name;
  • HAVING klauzula je uvedena jer WHERE nije moguće koristiti na agregatnim funkcijama
    • SELECT column_name, aggregate_function(column_name)
      FROM table_name
      WHERE column_name operator value
      GROUP BY column_name
      HAVING aggregate_function(column_name) operator value;
  • UCASE()
    • SELECT UCASE(column_name) FROM table_name;
  • LCASE()
    • SELECT LCASE(column_name) FROM table_name;
  • MID()
    • SELECT MID(column_name,start[,length]) AS some_name FROM table_name;
  • LEN()
    • SELECT LEN(column_name) FROM table_name;
  • ROUND()
    • Često DBMS umesto očekivanog koristi zaokruživanje na najbliži paran broj (11,3->12)
    • SELECT ROUND(column_name,decimals) FROM table_name;
  • NOW()
    • SELECT NOW() FROM table_name;
  • FORMAT()
    • SELECT FORMAT(column_name,format) FROM table_name;

 

Vi ste ovde: Home Predavanja Četvrta godina Informatički smer - Web dizajn 06 - Osnove SQL-a