[Baze podataka]

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Odgovori
linux_n00b
Postovi: 172
Pridružen/a: 02 ožu 2010, 14:36
Spol: M
OS: ArchLinux
Lokacija: Split-Pujanke
Kontakt:

[Baze podataka]

Post Postao/la linux_n00b »

Evo, pozdrav svima.

Zanima me odakle početi učiti raditi s bazama.
Trebam neki IDE gdje mogu raditi s bazama.

Hvala.
The Acacia Strain
Postovi: 1464
Pridružen/a: 12 kol 2008, 00:06
Spol: M

Re: [Baze podataka]

Post Postao/la The Acacia Strain »

linux_n00b je napisao/la:Evo, pozdrav svima.

Zanima me odakle početi učiti raditi s bazama.
Trebam neki IDE gdje mogu raditi s bazama.

Hvala.
sto se mysqla tice, najbolje je instalirat LAMP ili XAMP (ako ces i u windowsima vjezbat)
mysql ima odlican manual, tako da ga mozes s njihove strane preuzet, a i ima masa tutoriala po netu..
http://dev.mysql.com/doc/
DebianResources
DebianHandbook
devil je napisao/la:nije neka tamo kanta pametnija od nas tu.
Avatar
drone
Moderator
Postovi: 3293
Pridružen/a: 01 pro 2010, 23:50
OS: Arch/KDE, Debian/Armbian
Lokacija: Nova Gradiška

Re: [Baze podataka]

Post Postao/la drone »

Pretpostavljam da želiš učiti o SQL bazama. Na netu imaš ogroman broj tutorijala i dokumentacije. Mislim da bi MySQL bio dobar izbor s obzirom na raširenost. Evo jedan tutorijal: http://www.webdevelopersnotes.com/tutor ... index.php3 i još jedan: http://www.programmingvideotutorials.co ... troduction
Također, imaš i službenu dokumentaciju na http://dev.mysql.com/doc/

Meni je za učenje bolja konzola. GUI-ja za rad s bazama imaš isto popriličan broj, free i za novce. Vrlo raširen je phpMyAdmin, ali za njega moraš imati i webserver instaliran. Još jedno besplatno rješenje je MySQL Workbench http://www.mysql.com/products/workbench/

EDIT: nije mi se dalo mijenjati već napisani post, a neke stvari su u gotovo isto vrijeme napisane u postu iznad, pa odatle slični savjeti :)
1986-1990: Commodore64 / 1990-1994: Amiga 500 / 1995-1996: Amiga 1200 / 1997-2001: N/A@home /
2002-2004: Windows98, XP /
2004-2005: Knoppix, Mandrake / 2005: Mandriva, Ubuntu / 2005-2009: LFS / 2009-2010: Mint /
2010-... Arch
linux_n00b
Postovi: 172
Pridružen/a: 02 ožu 2010, 14:36
Spol: M
OS: ArchLinux
Lokacija: Split-Pujanke
Kontakt:

Re: [Baze podataka]

Post Postao/la linux_n00b »

Pa vi mi preporučite, dali Postgree ili Mysql.

Ne, nemam Windowse ni ne planiram ih imati.

Nije problem instalirati nikakav server doma.
Avatar
hightech
Postovi: 119
Pridružen/a: 21 vel 2013, 01:00
Spol: M
OS: wheezy, slekver ;)
Lokacija: /dev/hda2, etc
Kontakt:

Re: [Baze podataka]

Post Postao/la hightech »

MYSQL
-------------------
Prvo

Kod: Označi sve

sudo aptitude install mysql-server mysql-client
Pa definisati root lozinku, zatim mysql sigurna instalacija:

Kod: Označi sve

sudo mysql_secure_installation
Ukucati root lozinku za mysql koju ste definisali malopre prilikom instalacije mysql servera.

Kod: Označi sve

remove anonymous users? [Y/n] y
 ... success!
disallow root login remotely? [Y/n] y
 ... success!
remove test database and access to it? [Y/n] y
 - dropping test database...
reload privilege tables now? [Y/n] y
 ... success!
Samo još jedna stvar pre nego se ulogujemo u mysql shell kao korisnik - kreirati korisnika i dati mu dozvole samo nad njegovom bazom:
Prvo se ulogovati kroz terminal u root-mysql shell:

Kod: Označi sve

sudo mysql -u root -p
Ukucati root lozinku i ispisaće se ovakav odzivnik:

Kod: Označi sve

mysql>
Napraviti bazu, korisnika te baze (kucati samo posle odzivnika "mysql>" i odrediti mu privilegije nad tom bazom:

Kod: Označi sve

mysql> CREATE DATABASE korisnikova_baza;
mysql> CREATE USER 'korisnik_baze' IDENTIFIED BY 'lozinka_korisnika_baze';
mysql> GRANT ALL PRIVILEGES ON korisnikova_baza.* TO 'korisnik_baze';
mysql> exit;
DONE!
Ponovo cete dobiti ovakav odzivnik:
korisnik@host:~$
Zatim se ulogovati u mysql shell kao aj korisnik:

Kod: Označi sve

mysql -u korisnik_baze -p
I to bi trebalo prilikom uspesnog logovanja izgledati ovako:
korisnik@host:~$ mysql -u korisnik_baze -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 5.5.29-0ubuntu0.12.04.1 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
PGSQL
--------------------------

Kod: Označi sve

sudo apt-get install postgresql postgresql-client
passwd postgres
pa ukucajte pass za novog usera, zatim

Kod: Označi sve

su - postgres
i nakon uspesnog logovanja dobicete ovakav odzivnik:
postgres@host:~$
Pa kucajte

Kod: Označi sve

createdb test
psql test
Izgleda ovako:
postgres@host:~$ createdb test
postgres@host:~$ psql test
psql (9.1.7)
Type "help" for help.
test=#
i dobicete ovakav odzivnik:
test=#
Sada kreirati tabelu i izlistati vrednosti:

Kod: Označi sve

CREATE TABLE tabela (tabela_id int, ime varchar, prezime varchar);
INSERT INTO tabela VALUES (1, 'high', 'tech');
INSERT INTO tabela VALUES (2, 'tech', 'net');
SELECT * FROM tabela;
to izgleda ovako:
test=# CREATE TABLE tabela (tabela_id int, ime varchar, prezime varchar);
CREATE TABLE
test=# INSERT INTO tabela VALUES (1, 'high', 'tech');
INSERT 0 1
test=# INSERT INTO tabela VALUES (2, 'tech', 'net');
INSERT 0 1
test=# SELECT * FROM tabela;
tabela_id | ime | prezime
-----------+------+---------
1 | high | tech
2 | tech | net
(2 rows)
test=#
nastavice se...
... šta god da učiniš ... NISI DOBRO IZRAČUNAO ...
... for good fun and advanced thinking join WS1 ...
... do Boga je put dosta kratak, ne moras dalje od svog srca ...
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: [Baze podataka]

Post Postao/la jurastublic »

Pronađi negdje tutorial o osnovama planiranja relacijskih baza podataka. Dobro planiranje i dizajn baze su važniji i od samog programskog jezika a pomoći će ti nevjerojatno.
"Hodor bre foobar"
masteroman

Re: [Baze podataka]

Post Postao/la masteroman »

Naredbe za rad s podacima u tablici


Za rad s podacima u tablici koriste se 4 osnovne naredbe:
SELECT - izdvajanje podataka iz jedne ili više tablica ili upita
INSERT - umetanje novih slogova u tablicu
DELETE - brisanje podataka iz tablice
UPDATE - promjena podataka u tablici

Umetanje podataka – INSERT

Nakon što je otvorena baza podataka i definirane tablice, može se pristupiti upisivanju podataka u tablicu.

Primjer upisa jednog sloga u tablicu kupci.

Kod: Označi sve

INSERT INTO  kupci  ( id_kupac, kupac_ime, kupac_prezime, kupac_ulica,
                kupac_grad, kupac_drzava, kupac_zip, kupac_telefon,
                kupac_email)
        VALUES ( 1,'Ivo', 'Ivić',null,null,null,null,null,null) ;

U gornjem primjeru moguće je null upotrijebiti nad poljima tablice koji NEMAJU opciju NOT NULL u definiciji tablice.

Umjesto da navodimo sva polja tablice možemo gornji primjer napisati i ovako:

Kod: Označi sve

INSERT INTO  kupci  
        VALUES ( 1,'Ivo', 'Ivić',null,null,null,null,null,null) ;


Izdvajanje podataka – SELECT

Naredba SELECT se koristi za izdvajanje jednog ili više redaka iz tablice ili upita. Najjednostavniji oblik ove naredbe je dohvat svih podataka iz tablice.
Tako možemo izdvojiti sve podatke iz tablice kupci na slijedeći način:

Kod: Označi sve

SELECT * FROM kupci ;

U ovom primjeru se može vidjeti da je nakon riječi SELECT upisana zvjezdica. Ona označava dohvat svih polja iz tablice kupci.
Za dohvat samo jednog ili točno određenih polja, potrebno je umjesto zvjezdice upisati njihova imena i međusobno ih odvojiti zarezom.
Za dohvat svim imena i prezimena kupaca iz tablice kupci potrebno je upisati:

Kod: Označi sve

SELECT kupac_ime, kupac_prezime FROM kupci ;

Naredba SELECT može sadržavati i WHERE klauzulu. Ona omogućava prikaz samo onih redaka koji zadovoljavaju zadani uvjet.
Tako je za ispisivanje samo prezimena i identifikacijskog broja kupaca koji se zovu 'Pero' potrebno napisati:

Kod: Označi sve

SELECT id_kupac, kupac_prezime
    FROM kupci
    WHERE kupac_ime = 'Pero' ;

Ako želimo izdvojiti kupce čije ime počinje s slovom P tada se to izvodi ovako:

Kod: Označi sve

SELECT id_kupac, kupac_prezime
    FROM kupci
    WHERE kupac_ime  LIKE 'P%' ;

U gornjem je primjeru korišten operator LIKE koji se koristi kao operator usporedbe. Pri korištenju ovog operatora, može se koristiti :

znak '%' - zamjenjuje bilo koji niz znakova
znak '_' - zamjenjuje jedan znak
znak '\' - ukida specijalno značenje znakova % i _ ispred kojeg
je upisan

Kod WHERE uvjeta možemo koristiti :
relacijske operatore ( = , > ,…)
logičke operatore ( AND , OR, NOT )
specijalne operatore ( LIKE, NOT LIKE ,IN, NOT IN,BETWEEN, IS NULL, IS NOT NULL )
Primjeri:

Kod: Označi sve

… WHERE cijena >100 AND cijena < 200
Izdvojeni će biti slogovi kod kojih je cijena između 100 i 200

Kod: Označi sve

… WHERE cijena BETWEEN 100 AND 200
Izdvojeni će biti slogovi kod kojih je cijena između 100 i 200

… WHERE naziv LIKE :
Izdvojeni će biti slogovi ovisno o nizu znakova koji mora sadržavati naziv
'S%' naziv počinje s S
'%ec' naziv završava s ec
'%ak%' naziv sadrži ak
'S_' naziv počinje s S a ima još barem 1 znak
'%_ec' naziv završava s ec a prije toga ima barem 1 znak
'%_ec_%' naziv sadrži ec a prije njega i nakon njega ima bar 1 znak

Što ako želimo izvršiti pretragu ovakvu: LIKE '%prvi_drugi%' ?
U tom slučaju problem bi bio znak _. To se rješava znakom \

LIKE '%prvi\_drugi%' ESCAPE '\'.

U tom će slučaju znak _ biti dio stringa koji se pretražuje a ne zamjenjujući znak.
Ako koristimo izraz NOT LIKE tada će rezultat pretraživanja biti taj da će se odabrati slogovi koji nisu obuhvaćeni LIKE izrazom.

Kod: Označi sve

… WHERE cijena IN ( 100, 105, 120 ) .
Izdvojeni će biti slogovi kod kojih je cijena jednaka 100 ili 105 ili 120.

Kod: Označi sve

… WHERE cijena NOT IN ( 100, 105, 120 )
Izdvojeni će biti slogovi čija cijena je različita od 100 , 105 i 120.

Kod: Označi sve

… WHERE naziv IS NULL
Izdvojeni će biti slogovi koji nemaju definiranu vrijednost za naziv.

Kod: Označi sve

… WHERE naziv IS NOT NULL
Izdvojeni će biti slogovi koji imaju definiranu vrijednost za naziv.

Ako želimo sortirati izdvojene slogove po nekim pojmovima tada koristimo ORDER BY izraz i to
ORDER BY ASC - za uzlazni sort ( A-Z) ( default)
ORDER BY DESC - za silazni sort ( Z-A)
Slijedeći primjer daje popis svih kupaca sortiranih po prezimenima i to uzlazno:

Kod: Označi sve

SELECT id_kupac, kupac_ime, kupac_prezime
FROM kupci
ORDER BY kupac_prezime;

Ako pak želimo sortirati podatke po više pojmova to je moguće tako da iza ORDER BY izraza navedemo pojmove odvojene zarezom.

Slijedeći primjer daje popis svih kupaca sortiranih prvo po prezimenima te unutar toga još i po imenima :

Kod: Označi sve

SELECT id_kupac, kupac_ime, kupac_prezime
FROM kupci
ORDER BY kupac_prezime, kupac_ime ;

Brisanje podataka – DELETE

Brisanje jednog ili više redaka iz tablice ostvaruje se naredbom DELETE.
Za brisanje svih redaka iz tablice kupci potrebno je upisati:

Kod: Označi sve

DELETE FROM kupci ;

Za brisanje određenog sloga ili više njih potrebno je koristiti WHERE uvjet. Tako, na primjer , za brisanje kupca koji ima identifikator id_kupac jednak 1 potrebno je napisati:

Kod: Označi sve

DELETE FROM kupci
        WHERE id_kupac = 2 ;

Za brisanje kupaca koji imaju identifikator veći od 1000 pišemo:

Kod: Označi sve

DELETE FROM kupci
        WHERE id_kupac > 1000 ;

Za brisanje svih kupaca koji se zovu 'Ivo' ili 'Marko' pišemo:

Kod: Označi sve

DELETE FROM kupci WHERE kupac_ime = 'Ivo' OR kupac_ime = 'Marko' ;


Promjena podataka – UPDATE

Izmjena jednog ili više podataka u tablici obavlja se naredbom UPDATE. Uz tu naredbu upotrebljava se opcija WHERE slično kao i kod naredbi SELECT i DELETE.

Ako želimo izmijenit mjesto stanovanja kupcu iz tablice kupci koji ima identifikator = 2 , onda to radimo ovako:

Kod: Označi sve

UPDATE kupci
    SET kupac_grad = 'Zagreb'
    WHERE id_kupac = 2 ;

Ako se je gore navedenom kupci izmijenio i poštanski broj tada bi promjena izgledala ovako:

Kod: Označi sve

UPDATE kupci
    SET kupac_grad = 'Zagreb' , kupac_zip = 10000
    WHERE id_kupac = 2 ;

Ako ne bi koristili WHERE uvjet, tada bi se svi slogovi tablice promijenili.

Kod: Označi sve

UPDATE kupci
    SET kupac_grad = 'Zagreb' ;

U gornjem primjeru svi slogovi iz tablice kupci bili bi promijenjeni tako da bi kupac_grad polje dobilo vrijednost 'Zagreb'.
Equi-join ( Inner join)

Pogledajmo malo tablice kupci i narudzbe. Postoje kupci koju su nešto naručili, ali i oni koji do sada nisu ništa naručili. Zanima nas popis svih kupaca koji su nešto naručili.

To ćemo realizirati slijedećom naredbom:

Kod: Označi sve

SELECT kupci.id_kupac, kupci.kupac_ime, kupci.kupac _prezime,
        narudzbe.id_narudzba
FROM kupci, narudzbe
WHERE kupci.id_kupac = narudzbe.id_kupac ;

Gornji primjer predstavlja Equi-join primjer. U stvari se radi o presjeku podataka vezanih uz tablice kupci i narudžbe.

Godine 1992 uvedeno je proširenje sintakse SQL-a uvođenjem JOIN izraza. Time je standard SQL-92 zamijenio standard SQL-89.

Gornje primjer možemo napisati i ovako:

Kod: Označi sve

SELECT kupci.id_kupac, kupci.kupac_ime, kupci.kupac _prezime,
        narudzbe.id_narudzba
FROM kupci INNER JOIN narudzbe
ON kupci.id_kupac = narudzbe.id_kupac ;

Ovdje ulogu WHERE uvjeta preuzima ON join uvjet.

Općenito za Inner join dviju tablica sintaksa izgleda ovako:

Kod: Označi sve

SELECT polje1, polje2, …., poljeN
FROM tablica1 INNER JOIN tablica2
ON tablica1.primarni_ključ = tablica2.vanjski_ključ ;

Primijetimo da se iza FROM izraza prvo navodi primarna tablica, a iza INNER JOIN izraza sekundarna tablica.

SELECT unutar SELECT-a ( Nesting Subqueries )

To je kompletna SELECT naredba koja se uključuje unutar druge SELECT naredbe.

Opći oblik takve konstrukcije je slijedeći:

Kod: Označi sve

SELECT polje1,…, poljeN
FROM tablica1
WHERE operator ( SELECT polje1,…, poljeM
                    FROM tablica2
                  WHERE uvjet ) ;       

Postoje dva generalna slučaja:
slučaj kada je unutarnji upit nezavisan od vanjskog
( uncorrelated subquery )
slučaj kada je unutarnji upit zavisan od vanjskog
(correlated subquery )

U prvom slučaju se unutarnji upit izvodi u cijelosti i to jedanput, te se njegov rezultat predaje vanjskom upitu koji se onda izvršava.

U drugom se slučaju moraju vanjski i unutarnji upit izvršavati paralelno što produljuje vrijeme izvršenja cijelog upita. Unutarnji se upit u tom slučaju izvršava više puta.

Ako usporedimo JOIN konstrukciju s nezavisnim podupitima, tada se predlaže korištenje podupita jer će se oni brže izvesti pogotovu nad tablicama s mnogo slogova. JOIN konstrukcija se izvršava tako da se tablice povezane JOIN uvjetom prebacuju zajedno u memoriju računala, dok kod nezavisnog podupita to nije slučaj.
Promotrimo to na jednom primjeru.

Kod: Označi sve

SELECT narudzbe.datum_narudzbe, narudzbe.id_kupac
FROM narudzbe INNER JOIN narudzbe_detalji  
ON narudzbe.id_narudzba = narudzbe_detalji.id_narudzba
WHERE isbn = '0-131-4966-9' ;
Umjesto JOIN konstrukcije to možemo izvesti ovako:

Kod: Označi sve

SELECT narudzbe. datum_narudzbe, narudzbe.id_kupac
FROM narudzbe
WHERE id_narudzba IN ( SELECT id_narudzba
                           FROM narudzbe_detalji
                           WHERE isbn = '0-131-4966-9' ) ;  


Prvo se izvodi unutarnji SELECT koji izdvaja sve id_narudzba-e iz tablice narudzbe_detalji. Nakon toga se izvršava vanjski SELECT koji izdvaja sve kupce i datume narudžbi iz tablice narudzbe s uvjetom da se id_narudzba nalazi u skupu vrijednosti kreiranom prethodnim unutarnjim upitom.

Napomenimo da umjesto IN operatora možemo koristiti i NOT IN i ANY operatore.

Gornji primjer identičan je ovome:

Kod: Označi sve

SELECT narudzbe. datum_narudzbe, narudzbe.id_kupac
FROM narudzbe
WHERE id_narudzba = ANY ( SELECT id_narudzba
                           FROM narudzbe_detalji
                           WHERE isbn = '0-131-4966-9' ) ;   
 
ANY je fleksibilniji operator jer s njim možemo umjesto = koristiti se i ostalim relacijskim operatorima ( , = ).

EDIT: fino podešavanje teksta :)
Odgovori