SELECT "Nazwa Firmy", "Płeć", "Imię", "Nazwisko", "Stanowisko", "Tel", "Email", "Komórka" UNION SELECT c.name, CASE cc.is_man WHEN 2 THEN "K" WHEN 1 THEN 'M' ELSE '-' END, cc.firstname, cc.lastname, IFNULL(cc.stanowisko, "-"), IFNULL(cc.tel, "-"), IFNULL(cc.email,"-"), IFNULL(cc.kom,"-") FROM company_contacts cc INNER JOIN companies c ON c.id = cc.company_id ORDER BY cc.company_id, cc.lastname, cc.firstname LIMIT 20 INTO OUTFILE '/tmp/company_contacts.csv' CHARACTER SET CP1250 FIELDS ENCLOSED BY "" TERMINATED BY ';' ESCAPED BY '\\' LINES TERMINATED BY '\n' ;
Kategoria: MySQL
LoadData – import danych z csv do mysql
1. Excell zapisujemy w formacie .csv UTF-8
MariaDB instalacja najnowszej wersji
Instrukcja instalacji https://mariadb.org
Grant – Revoke
Przydzielanie, sprawdzanie i wycofywanie uprawnień
CREATE USER bob@'165.129.76.20' IDENTIFIED BY 'superpassword';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON myDb.* TO bob@'165.129.76.20'
SHOW GRANTS FOR bob@'165.129.76.20';
REVOKE ALL PRIVILEGES ON myDb.* FROM bob@'165.129.76.20';
Trigger – powiązane tabele
Trigger powiązany jest z tabelą, pozwala na automatyzację i sprawdzanie danych:
- wylicza pola pochodne np. oblicza brutto z netto i vat, wiek z daty urodzenia
- sprawdza poprawność zakresu np. 0 – 100%
- może operować na innych tabelach
mysql – UPDATE xxxx INNER JOIN
Aktualizuje rekordy powiązane z inną tabelą
UPDATE projects p INNER JOIN companies c ON c.id=p.company_id SET p.manager_id = c.manager_id WHERE c.manager_id <> p.manager_id AND (p.prev_manager_id <> p.manager_id OR p.prev_manager_id IS NULL); AND c.manager_id = 1023;
Mysql – sortowanie ciągu znaków jako INT
Sortowanie po 3 kategoriach. Ostatnia kategoria jest typu znakowego ale przechowuje numery np. 5, 5a, 5b, 6, 6a. Chcemy sortować tak jak liczby
$query->order(['Procedures.proc_type_id', 'Procedures.proc_category_id']); -- numer jest polem typu varchar, wartości: 5, 5a, 5b, 6, 6a ... $query->orderAsc( function($exp, $q) { return $q->func()->cast('numer','UNSIGNED'); });
Trigger
Obliczanie ilości dni na podstawie daty początku i końca – przy wstawianiu nowego rekordu
Ładowanie danych z pliku do tabeli – procedurą składowaną
Zakładamy że
- zainstalowane jest biblioteka mysqludf
Czytaj dalej Ładowanie danych z pliku do tabeli – procedurą składowaną
Instrukcje warunkowe
Jest wiele rodzajów
Funkcja – jeśli warunek jest prawdziwy zwraca expr1 w przeciwnym wypadku expr2
IF(warunek, expr1, expr2)
Stringi – Funkcje
Pozycje liczone są od nr. 1
INSTR zwraca pozycję wystąpienia separatora / znaku.
> SELECT INSTR('foobarbar', 'bar'); -> 4
mysqludf – mysql user defined functions
Mysql zmiana hasła usera
> UPDATE mysql.user SET Password = PASSWORD('nowe_hasło') WHERE User = 'user_name' AND Host = 'localhost'; > FLUSH PRIVILEGES;
Grupowanie towarów wg. ilości w sklepach
Towary powiązane z produktami i wersjami – zliczamy ilości w każdym sklepie
Przeszukiwanie różnych fragmentów tekstu rozdzielonych spacjami.
$search = preg_replace('/\s+/', '%', $search_str);
CakePHP 3 MySQL – funkcje składowane
Utworzenie funkcji składowanej w MySQL
CakePHP MySQL – procedury składowane
Utworzenie procedury składowanej w MySQL
DELIMITER $$ CREATE PROCEDURE low_amount() BEGIN SELECT ip.id, ip.product_id, ip.brand_id, ip.amount_alert, ip.is_ordered, SUM(ip.amount) AS suma, p.name AS product, b.initials, b.name AS brand FROM item_packs ip INNER JOIN products p ON p.id=ip.product_id INNER JOIN brands b ON b.id=ip.brand_id GROUP BY ip.product_id, ip.brand_id HAVING suma <= ip.amount_alert; END $$ DELIMITER ;
SHOW PROCEDURE STATUS -- wszystkie procedury SHOW PROCEDURE STATUS [LIKE 'my_procedure' | WHERE search_condition] SHOW CREATE PROCEDURE my_procedure;
DROP PROCEDURE [IF EXISTS] my_procedure; SHOW PROCEDURE STATUS WHERE Db='myDababaseName' \G
DELIMITER $ CREATE PROCEDURE user_projects(p_user_id INT) BEGIN SELECT p.id, p.status_id, COUNT(*) AS count, SUM(p.price) AS total, SUM(p.price * (ch.percent / 100)) AS weighted FROM projects p LEFT JOIN chances ch ON p.chance_id=ch.id WHERE p.manager_id = p_user_id AND p.status_id <> 3 -- bez odrzuconych GROUP BY p.status_id ; END $ DELIMITER ;
Wywołanie procedury w CakePHP 3
$connection = \Cake\Datasource\ConnectionManager::get('default'); $results = $connection->execute('CALL low_amount()')->fetchAll('assoc'); $this->set(compact('results'));
MySQL – foreign key – lista powiązanych kluczy
W jaki sposób sprawdzić które tabele mają zdefiniowane klucze obce do tabeli users.
SELECT
TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME, -- <<-- Nazwa potrzebna do skasowania
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME =
'users'\G
+------------+-------------+-----------------+-----------------------+------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME | +------------+-------------+-----------------+-----------------------+------------------------+ | articles | user_id | user_key | users | id | | bookmarks | user_id | ub_key | users | id | +------------+-------------+-----------------+-----------------------+------------------------+
Druga wersja
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+--------------+---------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | +--------------+---------------+-------------+-----------------+ | intranet | articles | user_id | user_key | | intranet | articles_tags | article_id | article_key | | intranet | articles_tags | tag_id | tag_key | | intranet | bookmarks | user_id | ub_key | +--------------+---------------+-------------+-----------------+
MySQL wiersz podsumowania
# SELECT DATE(created) AS data, SUM(price) AS przychod FROM transactions GROUP BY data WITH ROLLUP;
+------------+----------+
| data | przychod |
+------------+----------+
| 2019-06-10 | 406.00 |
| 2019-06-11 | 612.00 |
...................
| 2019-06-19 | 987.00 |
| 2019-06-21 | -3.00 |
| NULL | 7617.00 |
+------------+----------+
MySQL – zmienne
Definiowanie zmiennych – kilka wersji
W procedurach
DECLARE user CHAR(77) CHARACTER SET utf8;
SET user = (SELECT CURRENT_USER());
SELECT CONCAT('Witaj, ', user, '!') AS greeting;
MySQL – daty
Porównywanie dat
SELECT * FROM president WHERE birth >= '1970-01-01' AND birth < '1980-01-01';
MySQL – order, format
Losowy rekord
# SELECT * FROM president ORDER BY RAND() LIMIT 1;
Zmiana domyślnej kolejności sortowania kolumny NULL
# SELECT * FROM president ORDER BY IF(death IS NULL, 0, 1), death DESC, last_name;
Oblicza pierwiastek kwadratowy i podaje wynik z 3 cyframi po przecinku
# SELECT FORMAT( SQRT(25), 3);
mysql – dostęp z sieci – GRANT
User z dostępem z sieci
mysql> GRANT SELECT,INSERT,UPDATE,DELETE, EXECUTE ON dbname.* TO 'username'@'%' IDENTIFIED BY 'passwd';
Uprawnienia, użytkownik
GRANT SELECT,INSERT,UPDATE,DELETE ON intranet.* TO 'intranet'@'localhost' IDENTIFIED BY 'secret';
SHOW GRANTS FOR 'intranet'@'localhost';
mysql_secure_installation
zabezpieczenie mariaDB po instalacji
sql – update z podzapytaniem
Tabela łącząca posiada wpisy powiązane z usuniętymi rekordami suits. Dla tych rekordów zerujemy klucz obcy.
UPDATE ingredients_suits si SET suit_id = 0 WHERE NOT EXISTS ( SELECT id FROM suits s WHERE s.id = si.suit_id );
Można skasować rekordy tabeli łączącej które mają wyzerowany klucz obcy
DELETE FROM ingredients_suits WHERE suit_id=0;
MySQL – MATCH() AGAINST()
Wyszukiwanie tekstu w wielu polach tabeli
WHERE MATCH (title, body) AGAINST ('any text');
MySQL – extract()
Zwraca składnik z daty np. rok
SELECT EXTRACT( MONTH FROM "2017-06-15" );
SQL Update INNER JOIN
MySQL DATE_FORMAT()
DATE_FORMAT("2017-06-15", "%Y")
MySQL Adddate()
Zwraca nową datę po dodaniu odcinka czasu
ADDDATE( date, INTERVAL expr unit) ); ADDDATE( expr, days) );
Dodaje 10 dni do podanej daty (pierwszy argument)
SELECT ADDDATE( '2010-02-15', INTERVAL 10 DAY ) AS new_date; new_date -------------- 2010-02-25