Odnowa blog’a…. informatyk.pro

Od kilku dni pracuję nad odnową i przywróceniem do życia bloga: informatyk.pro.

Planuję docelowo przenieść stąd wszystkie wpisy w nowe miejsce, sprawdzając przy okazji czy przedstawione rozwiązania nadal są aktualne.

Tym czasem zapraszam do korzystania z it.dth.pl oraz zapoznania się z odświeżonym: informatyk.pro

Funkcje tekstowe mySQL – Kurs języka SQL (mySQL)

Ten wpis został przeniesiony pod adres:

https://informatyk.pro/funkcje-tekstowe-mysql-kurs-jezyka-sql/

Funkcje tekstowe mySQL – Kurs języka SQL

CREATE, UPDATE, ALTER, VIEW – tworzenie i modyfikacja widoków – Kurs języka SQL

Widok/perspektywa (VIEW) – jest pewnym rodzajem tabeli, którą tworzymy na podstawie już istniejących tabel, danych, warunków wykorzystując zapytanie typu “SELECT”. Widoki tworzone są po to, aby ograniczyć dostęp do innych danych z istniejących już tabel użytkownikom nieuprawnionym. Możemy także ich użyć w przypadku, kiedy korzystamy często z konkretnych zapytań SQL wraz z warunkami. Tworząc widoki często przyczyniamy się do zwiększenia wydajności naszych zapytań w skryptach czy też aplikacjach.

Poniżej przedstawię w jaki sposób możemy tworzyć, modyfikować, czy też usuwać widoki (perspektywy) w języku SQL.

Zanim jednak przejdziemy do widoków, przygotujmy sobie tabele na których będziemy “ćwiczyć”. W naszym przykładzie będziemy mieli dwie tabele: pracownik oraz wynagrodzenie.
Celem naszego ćwiczenia będzie utworzenie widoku opierającego się na obu tabelach i zwracającego dane imie, nazwisko, miesiac, rok, pensje wybranego pracownika.

CREATE TABLE pracownik
(
id_pracownika INT(5) NOT NULL,
imie CHAR(20) NOT NULL,
nazwisko CHAR(50) NOT NULL,
data_dodania DATETIME,
data_mod DATETIME,
PRIMARY KEY (id_pracownika)
);

CREATE TABLE wynagrodzenie
(
id_pracownika INT(5) NOT NULL,
miesiac INT(2) NOT NULL,
rok INT(4) NOT NULL,
pensja FLOAT(6,2) NOT NULL
);

INSERT INTO pracownik (id_pracownika, imie, nazwisko, data_dodania, data_mod) VALUES (1, 'Jan', 'Nowak', '2015-02-02 08:00:00', '2016-03-06 09:00:00');
INSERT INTO pracownik (id_pracownika, imie, nazwisko, data_dodania, data_mod) VALUES (2, 'Adam', 'Kowalski', '2015-05-02 08:00:00', '2016-02-02 08:00:00');
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (1, 1, 2016, 1000.0);
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (1, 2, 2016, 1100.0);
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (1, 3, 2016, 1100.0);
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (2, 1, 2016, 50.0);
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (2, 2, 2016, 75.0);
INSERT INTO wynagrodzenie (id_pracownika, miesiac, rok, pensja) VALUES (2, 3, 2016, 80.0);

Tworzenia widoku

Widok tworzymy poleceniem:

CREATE VIEW nazwa_widoku AS
SELECT kolumna1, kolumna2, kolumna2 FROM tabela WHERE kolumna1='wartość';

W naszym przykładzie utworzymy widok o nazwie v_pensja, który zwróci nam imię, nazwisko oraz wynagrodzenie pracownika w miesiącu 3 roku 2016. Polecenie zatem wyglądać będzie następująco:

CREATE VIEW v_pensja AS
SELECT p.imie, p.nazwisko, w.pensja FROM wynagrodzenie w
LEFT JOIN pracownik p on p.id_pracownika=w.id_pracownika
WHERE w.miesiac='3' and w.rok='2016';

Odczytanie zawartości widoku pensja odbywa się tak samo jak w przypadku tabeli. Zatem polecenie:

SELECT * FROM v_pensja;

zwróci nam poniższą zawartość:

imie nazwisko pensja
Jan Nowak 1100.0
Adam Kowalski 80.0

Modyfikacja widoku

Mamy utworzyony widok, czas go teraz zmodyfikować. Zmiany widoku (perspektywy) możemy wykonać na dwa sposoby.

Pierwszym z nich jest opcja REPLACE. Zmodyfikujmy zatem nasz widok, tak aby zwracał on jeszcze numer miesiąca dla którego pokazywana jest pensja oraz z warunku WHERE usuniemy ograniczenie miesiąca.
Składa SQL wygląda zatem następująco:

CREATE or replace VIEW v_pensja AS
SELECT p.imie, p.nazwisko, w.miesiac, w.pensja FROM wynagrodzenie w
LEFT JOIN pracownik p ON p.id_pracownika=w.id_pracownika
WHERE w.rok='2016';

a “odczytanie” widoku:

SELECT * FROM v_pensja;

zwróci nam wynik:

imie nazwisko miesiac pensja
Jan Nowak 1 1000.0
Jan Nowak 2 1100.0
Jan Nowak 3 1100.0
Adam Kowalski 1 50.0
Adam Kowalski 2 75.0
Adam Kowalski 3 80.0

Drugą opcją zmiany widoku jest opcja ALTER. Jej składnia wygląda następująco:

alter VIEW v_pensja AS
SELECT p.imie, p.nazwisko, w.miesiac, w.pensja FROM wynagrodzenie w
LEFT JOIN pracownik p on p.id_pracownika=w.id_pracownika
WHERE w.rok='2016'

Jej działanie i wynik jest analogiczny jak w przypadku opcji REPLACE.

Na widokach możemy dokonywać operacji modyfikacji danych.

Modyfikacja danych w widoku

Naszym zadaniem będzie teraz modyfikacja zawartości widoku pensja i pola pensja z widoku – zwiększenie o 25% w miesiącu marcu. Konstrukcja zapytania jest następująca:

UPDATE nazwa_widoku SET pole_widoku='wartosc' WHERE pole_widoku='wartosc';

Zatem dla naszego widoku pensja SQL wygląda następująco:

UPDATE v_pensja SET pensja=pensja*1.25 WHERE miesiac='3';

Nasz widok zawiera teraz zmodyfikowane dane:

imie nazwisko miesiac pensja
Jan Nowak 1 1000.0
Jan Nowak 2 1100.0
Jan Nowak 3 1375.0
Adam Kowalski 1 50.0
Adam Kowalski 2 75.0
Adam Kowalski 3 100.0

Należy pamiętać, modyfikując dane w widoku modyfikujemy dane w tabelach źródłowych.

Usunięcie widoku

Aby skasować widok należy użyć komendy:

DROP VIEW nazwa_widoku;

W naszym przypadku będzie to zatem:

DROP VIEW v_pensja;

Dobrą praktyką przy tworzeniu widoków jest odpowiednie nazewnictwo – dobrze jest poprzedzać nazwę widoku jakimś wyróżnikiem np: “v_”, “wiev_” itp. tak aby odróżnić widok od tabeli w bazie danych.

Perl – jak sprawdzić czy plik istnieje

W Perl’u możemy sprawdzić czy plik istnieje na kilka sposobów. Poniżej prezentuje dwa z nich:

1. IF

$filename = '/sciezka/twojplik.dat';
if (-e $filename)
{
print "Plik istnieje";
}
else
{
print "Plik nie istnieje";
};

2. UNLESS

$filename = '/sciezka/twojplik.dat';
unless (-e $filename) {
print "Plik nie istnieje";
};

Oracle SQL Lista tabel systemowych

System Table Description
ALL_ARGUMENTS Arguments in object accessible to the user
ALL_CATALOG All tables, views, synonyms, sequences accessible to the user
ALL_COL_COMMENTS Comments on columns of accessible tables and views
ALL_CONSTRAINTS Constraint definitions on accessible tables
ALL_CONS_COLUMNS Information about accessible columns in constraint definitions
ALL_DB_LINKS Database links accessible to the user
ALL_ERRORS Current errors on stored objects that user is allowed to create
ALL_INDEXES Descriptions of indexes on tables accessible to the user
ALL_IND_COLUMNS COLUMNs comprising INDEXes on accessible TABLES
ALL_LOBS Description of LOBs contained in tables accessible to the user
ALL_OBJECTS Objects accessible to the user
ALL_OBJECT_TABLES Description of all object tables accessible to the user
ALL_SEQUENCES Description of SEQUENCEs accessible to the user
ALL_SNAPSHOTS Snapshots the user can access
ALL_SOURCE Current source on stored objects that user is allowed to create
ALL_SYNONYMS All synonyms accessible to the user
ALL_TABLES Description of relational tables accessible to the user
ALL_TAB_COLUMNS Columns of user’s tables, views and clusters
ALL_TAB_COL_STATISTICS Columns of user’s tables, views and clusters
ALL_TAB_COMMENTS Comments on tables and views accessible to the user
ALL_TRIGGERS Triggers accessible to the current user
ALL_TRIGGER_COLS Column usage in user’s triggers or in triggers on user’s tables
ALL_TYPES Description of types accessible to the user
ALL_UPDATABLE_COLUMNS Description of all updatable columns
ALL_USERS Information about all users of the database
ALL_VIEWS Description of views accessible to the user
DATABASE_COMPATIBLE_LEVEL Database compatible parameter set via init.ora
DBA_DB_LINKS All database links in the database
DBA_ERRORS Current errors on all stored objects in the database
DBA_OBJECTS All objects in the database
DBA_ROLES All Roles which exist in the database
DBA_ROLE_PRIVS Roles granted to users and roles
DBA_SOURCE Source of all stored objects in the database
DBA_TABLESPACES Description of all tablespaces
DBA_TAB_PRIVS All grants on objects in the database
DBA_TRIGGERS All triggers in the database
DBA_TS_QUOTAS Tablespace quotas for all users
DBA_USERS Information about all users of the database
DBA_VIEWS Description of all views in the database
DICTIONARY Description of data dictionary tables and views
DICT_COLUMNS Description of columns in data dictionary tables and views
GLOBAL_NAME global database name
NLS_DATABASE_PARAMETERS Permanent NLS parameters of the database
NLS_INSTANCE_PARAMETERS NLS parameters of the instance
NLS_SESSION_PARAMETERS NLS parameters of the user session
PRODUCT_COMPONENT_VERSION version and status information for component products
ROLE_TAB_PRIVS Table privileges granted to roles
SESSION_PRIVS Privileges which the user currently has set
SESSION_ROLES Roles which the user currently has enabled.
SYSTEM_PRIVILEGE_MAP Description table for privilege type codes. Maps privilege type numbers to type names
TABLE_PRIVILEGES Grants on objects for which the user is the grantor, grantee, owner, or an enabled role or PUBLIC is the grantee
TABLE_PRIVILEGE_MAP Description table for privilege (auditing option) type codes. Maps privilege (auditing option) type numbers to type names

Error Code: 1175. You are using safe update mode… MySQL Workbench

Jeżeli poprzez MySQL Workbench próbujesz wykonać zapytanie UPDATE, bądź DELETE na swojej bazie danych i otrzymujesz komunikat:

Error Code: 1175. You are using safe update mode…

Oznacza to, że masz w programie włączony tryb “Safe Updates”.

Jeżeli chcesz szybko rozwiązać ten problem wystarczy, że przed zapytaniem UPDATE czy DELETE dodasz poniższy kod.  Tryb zostanie tylko wyłączony dla bieżącej sesji.

SET SQL_SAFE_UPDATES=0;

Jeżeli chcesz na stałe wyłączyć tryb: “Safe Updates” postępuj zgodnie z poniższą instrukcją:

1. Idź kolejno: Edit -> Preferences -> zakładka SQL Queries
2. Odznacz "Safe Updates". Forbid UPDATEs and DELETEs with no ket in WHERE clause or no LIMIT clause...
3. Zrestartuj swoje połączenie z bazą danych

SHOW TABLES – jak wyświetlić wszystkie tablice w bazie danych MySQL

Aby wyświetlić wszystkie tablice w bazie danych posłużymy się poleceniem:

show tables in lub show tables from

Przykład:

show tables in nazwa_bazy;
show tables from nazwa_bazy;

Oba powyższe polecenia zwrócą nam ten sam wynik, kolumnę z listą tablic w bazie danych (“nazwa_bazy”).

W przypadku, gdy chcielibyśmy przefiltrować wynik zapytania możemy posłużyć się poleceniem:

Triger / Wyzwalacz – MySQL opis i przykłady

Triger, zwany także wyzwalaczem jest to skrypt (fragment kodu) wykonywany w przypadku zajścia jakiegoś zdarzenia w bazie danych (np. dodania danych, ich modyfikacji, czy usunięcia).

Trigery dostępne są w następujących bazach danych:

Microsoft SQL Server,
PostgreSQL,
Sybase,
Oracle,
Firebird,
SQLite,
InterBase SQL,
MySQL

Istnieje kilka typów wyzwalaczy, tutaj skoncentrujemy się konkretnie na dwóch: BEFORE i AFTER.

Dla każdego typu istnieją trzy zdarzenia powodujące wykonanie wyzwalacza i są to:

AFTER DELETE – wykonanie wyzwalacza po operacji usunięcia rekordu
AFTER INSERT – wykonanie wyzwalacza po dodaniu rekordu
AFTER UPDATE – wykonanie wyzwalacza po zmodyfikowaniu rekordu

BEFORE DELETE – wykonanie wyzwalacza przed operacji usunięcia rekordu
BEFORE INSERT  – wykonanie wyzwalacza przed dodaniu rekordu
BEFORE UPDATE – wykonanie wyzwalacza przed zmodyfikowaniu rekordu

Konstrukcja:

CREATE TRIGGER nazwa_trigera
BEFORE INSERT ON -- zdarzenie określające kiedy triger zostanie wyzwolony
nazwa_tabeli -- tabela na której triger zostanie założony
FOR EACH ROW BEGIN
...  -- skrypt wykonywany przez triger
END

Przykład:

1. Utworzymy najpierw prostą tabelkę na której utworzymy triger. Będzie to tabelka która będzie przechowywała informacje o pracownikach.

CREATE
TABLE pracownik
(
id_pracownika INT(5) NOT NULL,
imie CHAR(20) NOT NULL,
nazwisko CHAR(50) NOT NULL,
pensja FLOAT(6,2) NOT NULL,
data_dodania DATETIME,
data_mod DATETIME,
pop_pensja FLOAT,
PRIMARY KEY (id_pracownika)
)

2. Teraz utworzymy trigera który automatycznie uzupełni nam datę dodania rekordu do bazy. Posłuży nam do tego triger data_dodania, którego utworzymy następującym poleceniem:

CREATE TRIGGER data_dodania
BEFORE INSERT ON pracownik
FOR EACH ROW BEGIN

SET NEW.data_dodania = now();

END

Wyjaśnienie: NEW.data_dodania oznacza nową wartość data_dodania. Triger wywołany przed operacją INSERT spowoduje, że przy dodaniu rekordu do tabeli pracownik wartość pola data_dodania przyjmie aktualną (funkcja now()datę + czas.

3. Kolejnym przykładem będzie triger, który będzie uzupełniał datę ostatniej modyfikacji rekordu, a także wartość pola pop_pensja (poprzednia pensja) – w momencie kiedy pensja pracownika ulegnie zmianie.

CREATE TRIGGER modyfikacja
BEFORE UPDATE ON pracownik
FOR EACH ROW BEGIN

SET NEW.data_mod = now();

IF NEW.pensja!=OLD.pensja THEN
SET NEW.pop_pensja = OLD.pensja;
END IF;

END

Wyjaśnienie: Wykorzystana została funkcja warunkowa IF która sprawdza czy nowa pensja (NEW.pensja) pracownika jest różna od poprzedniej (OLD.pensja). Jeżeli warunek jest spełniony, pole pop_pesja przyjmie wartość poprzedniej pensji, zaś pole pensja przyjmie wartość aktualną.

Sprawdzenie:

1. Sprawdźmy teraz działanie funkcji triger z przykładu 2.

Wykonajmy teraz poniższe zapytanie:

INSERT INTO pracownik (id_pracownika, imie, nazwisko, pensja) VALUES (1, 'Jan', 'Kowalski', '3000');

i sprawdźmy zawartość tabeli pracownik:

select * from pracownik;

Otrzymamy:

1 Jan Kowalski 3000.00 2014-06-06 11:57:04 (null) (null)

Zatem triger uzupełnił pole data_dodania.

2. Sprawdźmy teraz działanie funkcji triger z przykładu 3. Wykonajmy aktualizację pensji:

UPDATE pracownik SET pensja = 3400 WHERE id_pracownika=1

i sprawdźmy zawartość tabeli pracownik:

select * from pracownik;

Otrzymamy:

1 Jan Kowalski 3400.00 2014-06-06 11:57:04 2014-06-06 12:03:40 3000.0

Triger uzupełnił pola z datą modyfikacji oraz poprzednią pensją.

 

Jeżeli macie jakieś pytania, bądź potrzebujecie jakiś przykład – proszę pisać w komentarzach.

 

bcdedit /set disabledynamictick yes

bcdedit /set disabledynamictick yes

Zmiana adresu MAC – Windows programy (MacMake Up, MAC Address Changer)

Wielu z was pewnie próbowało dokonać zmiany adresu MAC z poziomu systemu Windows. Można zrobić to na kilka sposobów.

Pierwszy z nich to zmiana adresu we właściwościach karty sieciowej w zakładce Zaawansowane (Network Address).

Drugi już nieco trudniejszy dla mniej zaawansowanych użytkowników, poprzez edycje odpowiedniego wpisu w rejestrze (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\…).

Trzecia opcja to użycie programu do zmiany adresu MAC. Poniżej zamieściłem dwa programy:

MacMakeUp 1.95d

Rozmiar: 558 KB
Download: www.it.dth.pl/files/MacMakeUp1.95d.zip


MAC Address Changer 1.0

Rozmiar: 153 KB
Download: www.it.dth.pl/files/MACAddressChanger.zip