[[oktatas:adatbázis-kezelés:mysql|< MySQL]]
====== MySQL jegyzet ======
* **Szerző:** Sallai András
* Copyright (c) 2012, Sallai András
* Szerkesztve: 2012, 2014, 2015
* Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]]
* Web: https://szit.hu
===== A MySQL-ről =====
Többfelhasználós, többszálú relációs adatbázis-kezelő szerver.
A MySQL 1995-ben készítette a svéd MySQL AB. A MySQL adatbázis szerver a legnépszerűbb lett a webalkalmazások használatában.
A MySQL AB kettős licenccel hozta forgalomba. Egy GNU GPL és egy zárt forráskódú változatban. Kezdetben csak Linuxra valósították meg.
A MySQL-t az Oracle Corporation felvásárolta 2005 októberben.
===== Kapcsolódás a MySQL adatbázishoz =====
Telepítés után, kapunk egy parancssoros kliens programot, melynek neve
mysql. Az adatbázis-kezelőben pedig alapértelmezetten három adatbázist
látunk. Ezek rendre:
* information_schema
* mysql
* performance_schema
Ezekből valódi adatbázis a mysql, amely rendszer felhasználóit, az adatbázisokhoz és a
felhasználókhoz tartozó jogokat tartalmazza. A másik két schem nevű adatbázis
a rendszerről informál minket.
A MySQL szerverhez kapunk egy parancssoros kliens programot is, amelynek a neve
csak egyszerűen:
mysql
A mysql parancsot elindítva kapcsolódhatunk az adatbázisszerverhez, és
ott SQL nyelven tetszőleges tevékenységet végezhetünk, a joginknak megfelelően.
A következő mintában parancssorból kiadjuk a mysql utasítást:
mysql -u root -p
Paraméterként megadjuk a milyen felhasználóval szeretnénk elérni az adatbázisszervert.
A "-p" kapcsoló azt jelenti, szeretnénk bekérni a jelszót.
A parancsot kiadhatjuk szimpla felhasználóként, mivel a
MySQL szerver nem értékeli a linuxos környezetet.
===== MySQL SQL =====
A MySQL 5.x verziók a ANSI SQL 99 szabványra épülnek, számos kiegészítéssel.
A MySQL-ben minden SQL parancsot pontosvesszővel zárunk. A pontosvessző az úgynevezett delimiter,
amely jelzi, hogy vége a parancsnak. Hasznos, ha több sorba szeretnénk írni az SQL utasítást.
Az Enter hatására nem hajtódik végre az SQL utasítás, csak akkor, ha azt megelőzte egy ";"
karakter is.
A delimiter megváltoztatható a "delimiter" paranccsal.
Legyen például "|":
delimiter |
A MySQL státuszából kiderül az aktuális delimiter:
status
===== Felhasználó felvétele =====
A MySQL szerveren természetesen nem root felhasználóként szoktunk
tevékenykedni, ezért első feladatunk egy felhasználó létrehozása.
GRANT ALL PRIVILEGES ON databasenev.* TO 'valaki'@'localhost' IDENTIFIED BY 'titkosjelszo';
A parancs létrehozza a valaki nevű felhasználót ha az nem létezik, és jelszót is ad neki. A databasenev nevű adatbázis minden táblájához hozzáférhet a felhasználó.
A végén a jogokat ki kell írni a memóriából:
FLUSH PRIVILEGES;
===== Jelszóváltoztatás =====
==== Általános jelszóváltás ====
Saját jelszó változtatása:
set password = password('titok') ;
Más jelszavának megváltoztatása:
set password for 'jozsi'@'localhost' = password('titok') ;
Persze lehet így is:
UPDATE mysql.user SET Password=PASSWORD('titok')
WHERE User='jozsi' AND Host='%.valahol.hu';
FLUSH PRIVILEGES;
Esetleg jog adása közben:
GRANT USAGE ON *.* TO 'jozsi'@'%.valahol.hu' IDENTIFIED BY 'titok';
==== Root jelszó reset ====
=== Első ===
invoke-rc.d mysql stop
mysql_safe --skip-grant-tables &
mysql -u root
use mysql
UPDATE user SET Password=PASSWORD(‘titok’) WHERE User=’root’;
FLUSH PRIVILEGES;
invoke-rc.d mysql start
=== Második ===
mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('titok');
=== Harmadik ===
mysqladmin -u root password regijelszo "titok"
Ha nincs beállítva a jelszó:
mysqladmin -u root password "titok"
=== Negyedik ===
Debian GNU/Linuxon 5.1-es MySQL szerverrel:
dpkg-reconfigure mysql-server-5.1
===== MySQL típusok =====
^ Egész típusok ^^^
^ típus ^ méret ^ leírás ^
| TINYINT | 1 bájt | 8 bit \\ -128 .. 127 közötti szám \\ TINYINT UNSIGNED megadásával 0 .. 255 |
| SMALLINT | 2 bájt | 16 bit \\ -32768 .. 32767 \\ előjel nélkül 0 .. 65535 |
| MEDIUMINT | 3 bájt | 24 bit \\ -8 388 608 .. 8 388 607 |
| INT vagy INTEGER | 4 bájt | 32 bit \\ -2 147 483 648 .. 2 147 483 647 |
| BIGINT | 8 bájt | 64 bit \\ -9,22E+18 .. 9,22E18-1 \\ előjel nélkül: 0 .. 1,0E20 |
^ Lebegőpontos számok ^^^
^ típus ^ méret ^ leírás ^
| FLOAT | 4 bájt | -3,402823466E+38 .. 1,175494351E-38 negatív számok \\ 1,175494351E-38 .. 3,402823466E+38 pozitív szám |
| DOUBLE vagy REAL | 8 bájt | -1,7976931348623157E+308 .. -2,2250738585072014E-308 közötti negatív számok, \\ 0 és \\ 2,2250738585072014E-308 .. 1,7976931348623157E+308 közötti pozitív számok |
^ Fixpontos valós számok ^^^
^ típus ^ méret ^ leírás ^
| DECIMAL, DEC vagy NUMERIC | pontosság + 2 bájt | megadható pontosság |
^ Karaktersorozatok ^^^
^ típus ^ méret ^ leírás ^
| VARCHAR(méret) | 1 .. 255 bájt | |
| CHAR(méret) | 1 .. 265 bájt | |
| BINARY | | |
| TINYTEXT | | |
| TEXT | 0 .. 65 535 bájt | |
| MEDIUMTEXT | | |
| LONGTEXT | | |
^ Dátum ^^^
^ típus ^ méret ^ leírás ^
| DATE | 3 bájt | ÉÉÉÉ-HH-NN formában tárolt dátum \\ 1000-01-01 .. 9999-12-31 közötti dátum |
| TIME | 3 bájt | óó:pp:mm formájú idő \\ 00:00:00 .. 23:59:59 közötti időérték |
| DATETIME | 8 bájt | ÉÉÉÉ-HH-NN óó:pp:mm formában dátum és idő \\ 1000-01-01 00:00:00 .. 9999-12-31 23:59:59 közötti érték |
| YEAR | 1 bájt | 1970 .. 2069 közötti szám |
| TIMESTAMP | 4 bájt | A rekord változásakor automatikusan aktualizálódik. \\ A tábla módosításainak nyomon követésére. |
^ Összetett típusok ^^^
^ típus ^ méret ^ leírás ^
| enum(érték1, érték2, ...) | 1-255 elem 1 bájt \\ 256-65535 elem 2 bájt | A cellában csak az adott érték szerepelhet majd |
| set(érték1, érték2, ...) | 1-8 elem 1 bájt \\ 9-16 elem 2 bájt \\ 17-24 elem 3 bájt \\ 25-32 elem 4 bájt \\ 33-64 elem 8 bájt | több érték is szerepelhet egy cellában |
^ Bináris típusok ^^^
^ típus ^ méret ^ leírás ^
| TINYBLOB | 1 .. 255 bájt | kép, hang, bármilyen bináris adat vagy szöveg tárolására; méret tárolt adat + 1..4 bájt |
| BLOB | 1 .. 65 535 bájt | |
| MEDIUMBLOB | 1 .. 16 777 215 bájt | |
| LONGBLOB | 1 .. 4 294 967 295 | |
| BIT vagy BIT(...) | | 1..64 hosszú bináris adat \\ BIT == BIT(1) |
===== Tábla létrehozása =====
CREATE TABLE user (
User varchar(30) NOT NULL default ,
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default ,
PRIMARY KEY (User)
) TYPE=MyISAM
Kicsit összetettebb:
CREATE TABLE `test`.`szemely` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nev` VARCHAR( 30 ) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL DEFAULT '''Névtelen''',
`fiz` INT( 4 ) NOT NULL
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_hungarian_ci;
Tábla létrehozása meglévő tábla alapján. Az új táblánk felveszi a másik szerkezetét:
create table újtábla like regitábla
Tábla felépítése:
describe Táblanév;
Például a Személy tábla mezői:
mysql> describe Személy;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| Az | int(11) | NO | PRI | NULL | auto_increment |
| Név | varchar(50) | NO | | NULL | |
| Település | varchar(50) | NO | | NULL | |
| Lakcím | varchar(50) | NO | | NULL | |
| Születés | date | NO | | NULL | |
| Fizetés | double | NO | | NULL | |
| Juttatás | double | NO | | NULL | |
| Saját kocsi | tinyint(4) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
8 rows in set (0.03 sec)
===== Mentés, visszaállítás =====
Egy adatbázis mentése:
mysqldump -u root -p adatbazisnev > adatbazisnev.sql
Karakterkódolás:
mysqldump database -u user --default-character-set=latin1 -r outfile.sql
Karakterkódolás a következők lehetnek:
* latin1
* latin2
* utf8
* stb.
Visszaállítás:
mysql -u root -p adatbazisnev < adatbazisnev.sql
Az adatbázisnak léteznie kell.
Egy tábla mentése:
mysqldump -u root -p adatbazisnev --table tablanev > adatbazisnev.sql
Csak az adatstuktúrák mentése:
mysqldump -u username -p --no-data database_name > dump.sql
Az összes adatbázis mentése:
mysqldump -u username -p --all-databases > dump.sql
Az information_schema kivételével minden adatbázist ment, beleértve a mysql is.
===== Information_schema =====
A MySQL 5 verziójától, amikor futtatjuk a show databases parancsot, az information_schema tartalmazza az adatbázisok listáját. Az information_schema egy virtuális adatbázis, amely miden adatbázisról tárolja a metainformációkat.
Tipikusan amikor futtatod a DESCRIBE vagy a SHOW parancsot, metainformációkat kapsz. Az information_schema tábláin futtathatod az alapértelmezett SELECT SQL parancsot.
Az információs séma nem egy fizikai adatbázis. Amikor futtatod a SELECT parancsot a information_schema tábláin, akkor valójában a többi tábla adatait és a rendszerváltozókat kérdezed le.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bugs |
| mysql |
| sugarcrm |
+--------------------+
4 rows in set (0.00 sec)
A következő táblák férhetőek hozzá az information_schema-ban:
mysql> use information_schema;
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| PROFILING |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
17 rows in set (0.00 sec)
Az 5 legnagyobb tábla lekérdezése:
mysql> SELECT concat(table_schema,'.',table_name) table_name,
-> concat(round(data_length/(1024*1024),2),'M') data_length
-> FROM information_schema.TABLES
-> ORDER BY data_length DESC LIMIT 5;
+--------------------+-------------+
| table_name | data_length |
+--------------------+-------------+
| bugs.attach_data | 706.89M |
| bugs.longdescs | 3.45M |
| bugs.bugs_activity | 1.45M |
| bugs.series_data | 0.75M |
| bugs.attachments | 0.51M |
+--------------------+-------------+
5 rows in set (0.05 sec)
Az 1000 sornál több sort tartalmazó táblák lekérdezése
mysql> select concat(table_schema,'.',table_name) as table_name,table_rows
-> from information_schema.tables where table_rows > 1000
-> order by table_rows desc;
+----------------------------------+------------+
| table_name | table_rows |
+----------------------------------+------------+
| bugs.series_data | 52778 |
| bugs.bugs_activity | 26436 |
| bugs.longdescs | 21473 |
| bugs.email_setting | 5370 |
| bugs.attachments | 4714 |
| bugs.attach_data | 4651 |
| bugs.cc | 4031 |
| bugs.bugs | 2190 |
| bugs.namedqueries_link_in_footer | 1228 |
+----------------------------------+------------+
9 rows in set (0.04 sec)
===== Saját függvény =====
mysql> delimiter |
mysql> CREATE FUNCTION sajatfuggveny(szam1 int, szam2 int)
-> returns int deterministic
-> begin
-> declare result int;
-> SET result = szam1 * 2;
-> SET result = result + szam2;
-> RETURN result;
-> end|
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select sajatfuggveny(3,4);
+--------------------+
| sajatfuggveny(3,4) |
+--------------------+
| 10 |
+--------------------+
1 row in set (0.00 sec)
mysql>
Saját függvények listázása:
show function status;
A függvény megvalósításának megjelenítése:
show create function sajatfuggveny;
===== Trigger =====
==== A triggerekről ====
A triggerek speciális eljárások, amelyk az INSERT, UPDATE, DELETE, TRUNCATE függvények előtt vagy után hajtódnak végre.
==== Példa ====
Létrehozok egy két mezőből álló táblát:
^ proba ^^
| nev | username |
Beállítok egy triggert, amely mindig felülírja a username mezőt user() függvény tartalmával.
A gyakorlatban:
use test;
create table proba ( names varchar(10), users varchar(10));
create trigger userIns before insert on proba for each row set new.users=user();
Ez után, ha beszúrok egy sort, például:
insert into proba values ("Tibi", "tibi");
Ellenőrizzük:
select * from proba;
Ha volt már egy Lajos név beszúrva, ehhez hasonlót láthatunk:
+---------+-------------+
| names | users |
+---------+-------------+
| Lajos | joska@local |
| Tibi | joska@local |
+---------+-------------+
2 rows in set (0.00 sec)
A fenti SQL parancsot a joska felhasználó adata ki.
===== Mentés, visszaállítás (Backup, Restore) =====
Visszaállítása:
mysql database < backup.sql
===== Külső parancs futtatása =====
Parancssorban:
mysql database < backup.sql
MySQL parancssorban:
source batch_file.sql
===== Munka dátummal =====
Hány évesek vagyunk
Select from_days(datediff(now(), '1979-07-31'))
===== Külső adat importálása =====
LOAD DATA LOCAL INFILE '/importfile.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(mezo1, mezo2, mezo3);
LOAD DATA LOCAL INFILE 'C:\\file.csv' ...
mysql -u**** -p**** database --execute="LOAD DATA LOCAL INFILE 'C:\\import.csv' INTO TABLE table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (field1, field2, field3)"
Debian GNU/Linux alatt rendelkezésre áll még:
mysqlimport
Szintaxis:
mysqlimport [options] db_name textfile1 [textfile2 ...]
===== Rendezés IP cím alapján =====
SELECT ip FROM dhcp
ORDER BY INET_ATON(ip);
===== Riport készítése =====
* http://sourceforge.net/projects/dmyreports/
===== Adatbázis-motor =====
A MySQL alapértelmezett adatbázismotorja a MyISAM. Ez azonban nem támogatja a tranzakciókat és a külső kulcs hivatkozásokat.
Ha ilyet szeretnénk, akkor használjuk InnoDB adatbázismotort.
^ Funkció ^ MyISAM ^ InnoDB ^
| tranzakció | nem | igen |
| külső kulcs | nem | igen |
| táblazárolás | igen | igen |
| rekord zárolás | nem | igen |
| gyorsaság szélsőséges esetben \\ (egymáshoz képest) | jobb | kevésbé |
| teljes szöveg | igen | nem |
===== MySQL SSL =====
A most következő leírás Debian GNU/Linux 6-os rendszeren mutatja be az SSL telepítését a MySQL adatbázishoz.
mysql -u root -p
show variables like '%ssl%';
Valami ehhez hasonlót kell lássunk:
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
7 rows in set (0.00 sec)
nano /etc/mysql/my.cnf
# For generating SSL certificates I recomemend the OpenSSL GUI "tinyca"
ssl
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
invoke-rc.d mysql restart
Ezek után nézzük meg újra egy sql paranccsal a ssl tartalmú változókat:
show variables like '%ssl%';
A kimenetben az ssl valami hasonló kell legyen:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+-------+
7 rows in set (0.00 sec)
Hogy távolról is elérhető legyen tegyük megjegyzésbe a bind-address = 127.0.0.1-es sort:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
invoke-rc.d mysql restart
Újraindítás után ellenőrizzük:
netstat -tap | grep mysql
A kimenet ehhez hasonló kell legyen:
tcp 0 0 *:mysql *:* LISTEN 19925/mysqld
Vegyük észre a tcp 0 0 után a csillagot. A beállítás előtt itt localhost volt.
Most le kell gyártani a tanúsítványokat, a my.cnf-ben beállítani azokat, megint újraindítani,
majd készen vagyunk.
mkdir /etc/mysql/certs && cd /etc/mysql/certs
Telepítsük az openssl-t ha még nem lenne feltelepítve:
apt-get install openssl
CA tanúsítvány:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Szerver tanúsítvány:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Kliens tanúsítvány (amit a kliensek gépére másolhatunk):
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
ssl-ca=/etc/mysql/certs/ca-cert.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem
GRANT ALL PRIVILEGES ON adatbazis.* TO 'felhasznalo'@'%' IDENTIFIED BY 'titok' REQUIRE SSL;
A REQUIRE SSL opcionális. Ha megadjuk az SSL használata kötelező.
===== Karakterkódolás =====
==== A karakterkódolásról ====
Előfordulhat, hogy bár az adatbázisunk UTF-8, a kliens program UTF-8-cal dolgozik mégis helytelenek a karakterek.
Például szeretnénk MySQL adatbázisban tartani a Linux felhasználókat. Minden működik, de a
grafikus bejelentkező felületen a teljes névnél az ékezetes karakterek helytelenül jelennek meg.
Ha beállítjuk a my.cnf állományt a problémák megszűnnek:
==== A szerver beállításai ====
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
Az utolsó mysql szakasz valójában a parancssoros mysql program beállítása.
Ha változtattunk a szerver beállításain akkor ellenőrizhetjük a szintaktikailag helyes-e:
service mysql stop
mysqld --verbose --help 1>/dev/null
==== Konvertálás ====
ALTER DATABASE Adatbázisnév charset=utf8;
mysqldump -uzoldzrt -ptitok -e -c --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B zoldzrt > dump.sql
sed 's/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_hungarian_ci/' | sed 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' > dump-fixed.sql
mysql -uzoldzrt -ptitok < dump-fixed.sql
===== Idegenkulcs használata =====
==== Hivatkozási integritás ====
A MySQL-ben hivatkozási integritás az idegenkulcs beállításával valósítható meg.
Hivatkozási integritás:
* új rekord felvétel csak akkor lehetséges, ha az idegenkulcsban megjelölt érték létezik a kapcsolt táblában
* az elsődleges táblában nem módosítható az elsődleges kulcs értéke, ha a kapcsolt táblában hivatkoznak rá
* az elsődleges táblából nem törölhetünk olyan rekordot, amelyre hivatkoznak egy másik táblából
CREATE TABLE ugyfelek (
ugyfelAz INT NOT NULL,
nev VARCHAR (50 ),
PRIMARY KEY( ugyfelAz )
) ENGINE=InnoDB
CREATE TABLE rendelesek (
rendelesAz INT NOT NULL,
koltseg INT,
ugyfelAz INT NOT NULL,
PRIMARY KEY(rendelesAz),
INDEX ( ugyfelAz ),
FOREIGN KEY(ugyfelAz)
REFERENCES ugyfelek(ugyfelAz)
) ENGINE = InnoDB;
==== Kaszkádolt frissítés ====
Kapcsolt (kaszkádolt) frissítés, amikor mindkét kapcsolódó táblában egyszerre változtatjuk az értéket.
ON DELETE CASCADE ON UPDATE CASCADE
CREATE TABLE rendelesek (
rendelesAz INT NOT NULL,
koltseg INT,
ugyfelAz INT NOT NULL,
PRIMARY KEY(rendelesAz),
INDEX( ugyfelAz ),
FOREIGN KEY(ugyfelAz)
REFERENCES ugyfelek(ugyfelAz)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB
===== Operátorok =====
A MySQL precedencia szabályai alapján rendre:
* BINARY
* NOT
* - (egyoperandusú operátor)
* * / %
* + -
* << >>
* &
* |
* < <= > >= = <=> <> IN IS LIKE REGEXP
* BETWEEN
* AND
* OR
==== BINARY ====
mysql> SELECT 'a' = 'A';
-> 1
mysql> SELECT BINARY 'a' = 'A';
-> 0
mysql> SELECT 'a' = 'a ';
-> 1
mysql> SELECT BINARY 'a' = 'a ';
-> 0
==== MOD ====
A MOD megfelel a % operátornak. Egy osztás maradékát kapjuk.
select 3 % 2
select 3 MOD 2
Mindkettő eredménye: 1
==== DIV ====
Egész osztás
select 3 div 2
Eredménye: 2
==== IS ====
Legyen a példa kedvéért egy ugyfelek tábla, amelyben van egy nev tábla.
Ha a nev mező nincs megadva, akkor alapértelmezésben NULL értéket kap.
Ekkor van értelme azon rekordok megjelenítésének, amelyek nincsenek megadva.
SELECT * FROM `ugyfelek`
WHERE nev IS NULL
Tagadhatjuk is. Csak azon sorok megjelenítése, amelyek nem tartalmaznak NULL értéket.
SELECT * FROM `ugyfelek`
WHERE nev IS NOT NULL
Ha egy mező nem tartalmaz NULL értékét, és nem is rendelkezik értékkel (üres karaktersorozat),
akkor hagyományosan így kérdezzük le az üres sorokat:
SELECT * FROM `ugyfelek`
WHERE nev = ""
===== Függelék =====
==== PHPMyAdmin nyelve ====
php_admin_value mbstring.func_overload 0
==== MySQL szöveges típusokról ====
=== Szöveges típusokról ===
| char() | Mindig a zárójelben, megadott méretet foglaljon a memóriában |
| varchar() | Csak annyi helyet foglal a memóriában amilyen hosszú a tartalom + 1 byte \\ (255 karakter felett + 2 byte), \\ de max a zárójelben megadott méret |
| text | Nem a rekord mellett tárolódik. Ott csak egy mutató lesz rá. |
=== Indexelés ===
Az "index prefix length" azt jelenti, az indexelés során csak ennyi karaktert szeretnénk figyelembe venni.
A char és varchar esetén ezt nem kötelező megadni, text esetén viszont kötelező.
=== Fulltext (Teljes szöveg) index ===
A MySQL támogatja a full-text típusú keresést és indexelést.
A full-text index egy MySQL index típus: FULLTEXT.
A full-text index csak a MyISAM táblák esetén használhatók,
azon belüli is CHAR, VARCHAR és TEXT típusú mezők esetén.
A FULLTEXT index típus a CREATE TABLE utasításban kell megadni,
vagy később az ALTER TABLE vagy CREATE INDEX utasításokban.
Nagy adathalmazoknál gyorsabb az adatok betöltése FULLTEXT
index mellett mint nélküle.
A full-text keresés a MATCH() ... AGAINST segítségével valósítható meg.
A MATCH zárójelében megadjuk azokat a mezőket vesszővel elválasztva,
amelyekben keresni szeretnénk. Az AGAINST egy módosító, amelyet nem
kötelező megadni, a keresés típusát állíthajuk be vele.
A full-text keresésnek három típusa van:
* logikai keresés
* természetes nyelvi keresés
* lekérdezés bővítő keresés
Szintaxis:
MATCH (mező1,mező2,...) AGAINST (expr [keresésmódosító])
Keresésmódosítók: { IN BOOLEAN MODE | WITH QUERY EXPANSION }
Full-text mező beállítása:
CREATE TABLE táblanév(mező1 TEXT,FULLTEXT(mező1)) TYPE=MyISAM;
Full-text beállítása később:
ALTER TABLE táblanév ADD FULLTEXT(mező1)
==== Tranzakció ====
Tárolt eljáráshoz szükséges: MySQL 5.0+ és MySQLi vagy PDO
Az első utasítás (beszúrás) csak akkor lesz érvényes, ha a többi is sikeres.
START TRANSACTION;
INSERT INTO uj_tabla
SELECT * FROM regi_tabla
WHERE mezonev = 'kriterium';
DELETE FROM regi_tabla WHERE mezonev = 'kriterium';
COMMIT;
A tranzakciót a Commit utasítással zárjuk.
==== Eljárás ====
DELIMITER $$
DROP PROCEDURE IF EXISTS `masolEsTorol` $$
CREATE PROCEDURE `masolEsTorol` (az INT)
BEGIN
INSERT INTO ujTabla SELECT * from regiTabla WHERE regiTabla.azMezo=az;
DELETE FROM regiTabla where azMezo=az;
END $$
DELIMITER ;
A függvény meghívása:
CALL masolEsTorol(4);
==== Kódolás ====
password("nyílt szöveg")
md5("nyílt szöveg")
SHA = Secure Hash Algorithm
Ah sha1() függvény 160 bit hosszú hasht állít elő.
sha1("nyílt_szöveg");
Ajánlott: sha2() függvény használata. Szintaxisa:
sha2("nyílt_szöveg", bitek_száma)
Az SHA-224, SHA-256, SHA-384, és SHA-512 család különböző hosszúságú formáival használhatjuk.
==== Néhány információs függvény ====
select version()
select database()
select user()
==== Néhány információ ====
show variables;
show variables like "autocommit";
select @@autocommit
A rendszerváltozókat két kukackarakterrel tudjuk megjeleníteni.
A tranzakciók izolációs szintje:
select @@tx_isolation;
select @@global.tx_isolation;
Teljesítmény vizsgálat:
SELECT BENCHMARK(1000000,ENCODE('hello','goodbye'));
===== Külső hivatkozások =====
* http://dev.mysql.com/doc/
* http://dev.mysql.com/doc/refman/5.6/en/
* http://dev.mysql.com/doc/refman/5.6/en/show.html
* http://dev.mysql.com/doc/refman/5.6/en/connector-j-reference-using-ssl.html (SSL)
* http://www.thegeekstuff.com/2008/11/overview-of-mysql-information_schema-database-with-practical-examples/ (information_scheam)
* http://nullstring.blog.hu/2009/03/06/triggerek_tarolt_eljarasok_fuggvenyek_mysql_ben_1
* http://nullstring.blog.hu/2009/02/12/jabber_mysql_auto_add_contact_on_register
* http://nullstring.blog.hu/2008/02/20/kereses_mysql_adatbazisban_ekezetek_es_html_tag_ek_mint_zavaro_tenyezok
* http://support.modwest.com/content/6/253/en/how-do-i-import-delimited-data-into-mysql.html (Importálás)
* http://lcb.hu/linux/sql_alapok.html
* http://www.stud.u-szeged.hu/Palatinus.Endre/db/PHP_MySQL_halado.pdf
* http://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-debian-lenny (SSL)
* http://stackoverflow.com/questions/4663061/mysql-jdbc-over-ssl-problem (SSL használata)
* http://php.net/manual/en/configuration.changes.php (PHP beállítások cseréje)
* http://wiki.phpmyadmin.net/pma/Config (PhpMyAdmin konfig)
* http://www.phpmyadmin.net/documentation/ (PhpMyAdmin használat)
* http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html (Full-text keresés)
* http://www.databasejournal.com/sqletc/article.php/1578331/Using-Fulltext-Indexes-in-MySQL---Part-1.htm
* http://www.jveweb.net/en/archives/2011/03/managing-mysql-from-the-command-line.html (MySQL parancssorból)